Merge remote branch 'remotes/origin/groupmanager'

This commit is contained in:
KHobbits 2012-04-15 19:41:06 +01:00
commit 26a0cd0761
29 changed files with 3724 additions and 3443 deletions

View file

@ -177,3 +177,6 @@ v 2.0:
- Expand GlobalGroups.yml and groups.yml to cover the VanishNoPacket plugin. Demonstrating how to negate and add nodes when using the '*' permission with inheritance.
- Fix silly nested throw/catch statements. Errors are now correctly generated when reading yml's.
- Unregister the worldsHolder as a service on a reload/shutdown instead of the whole plugin.
- Update all code formatting to use tabs for indentation.
- Stop using our own deprecated methods as we tell others to do.
- Finally remove all deprecated methods.

View file

@ -23,11 +23,13 @@ public class GMConfiguration {
private YamlConfiguration GMconfig;
public GMConfiguration(GroupManager plugin) {
this.plugin = plugin;
load();
}
public void load() {
if (!plugin.getDataFolder().exists()) {
plugin.getDataFolder().mkdirs();
}
@ -55,17 +57,21 @@ public class GMConfiguration {
}
public boolean isOpOverride() {
return GMconfig.getBoolean("settings.config.opOverrides", true);
}
public boolean isToggleValidate() {
return GMconfig.getBoolean("settings.config.validate_toggle", true);
}
public Map<String, Object> getMirrorsMap() {
// Try to fetch the old mirror path first
if (GMconfig.isConfigurationSection("settings.permission.world.mirror")) {
return (Map<String, Object>) GMconfig.getConfigurationSection("settings.permission.world.mirror").getValues(false);
} else if (GMconfig.isConfigurationSection("settings.mirrors")){
} else if (GMconfig.isConfigurationSection("settings.mirrors")) {
return (Map<String, Object>) GMconfig.getConfigurationSection("settings.mirrors").getValues(false);
}
return null;
@ -73,10 +79,12 @@ public class GMConfiguration {
}
public Integer getSaveInterval() {
return GMconfig.getInt("settings.data.save.minutes", 10);
}
public Integer getBackupDuration() {
return GMconfig.getInt("settings.data.save.hours", 24);
}

View file

@ -24,8 +24,6 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
/**
* @author ElgarL
*
@ -42,6 +40,7 @@ public class GlobalGroups {
protected File GlobalGroupsFile = null;
public GlobalGroups(GroupManager plugin) {
this.plugin = plugin;
load();
}
@ -50,6 +49,7 @@ public class GlobalGroups {
* @return the haveGroupsChanged
*/
public boolean haveGroupsChanged() {
if (this.haveGroupsChanged) {
return true;
}
@ -65,12 +65,15 @@ public class GlobalGroups {
* @return the timeStampGroups
*/
public long getTimeStampGroups() {
return timeStampGroups;
}
/**
* @param timeStampGroups the timeStampGroups to set
*/
protected void setTimeStampGroups(long timeStampGroups) {
this.timeStampGroups = timeStampGroups;
}
@ -79,6 +82,7 @@ public class GlobalGroups {
* the haveGroupsChanged to set
*/
public void setGroupsChanged(boolean haveGroupsChanged) {
this.haveGroupsChanged = haveGroupsChanged;
}
@ -118,7 +122,7 @@ public class GlobalGroups {
try {
allGroups = (Map<String, Object>) GGroups.getConfigurationSection("groups").getValues(false);
} catch (Exception ex) {
//ex.printStackTrace();
// ex.printStackTrace();
throw new IllegalArgumentException("Your " + GlobalGroupsFile.getPath() + " file is invalid. See console for details.", ex);
}
@ -142,6 +146,9 @@ public class GlobalGroups {
throw new IllegalArgumentException("Invalid group name for GlobalGroup entry (" + groupCount + ") in file: " + GlobalGroupsFile.getPath(), ex);
}
/*
* Create a new group with this name.
*/
Group newGroup = new Group(groupName.toLowerCase());
Object element;
@ -185,7 +192,7 @@ public class GlobalGroups {
setTimeStampGroups(GlobalGroupsFile.lastModified());
GroupManager.setLoaded(true);
//GlobalGroupsFile = null;
// GlobalGroupsFile = null;
}
/**
@ -194,7 +201,7 @@ public class GlobalGroups {
public void writeGroups(boolean overwrite) {
//File GlobalGroupsFile = new File(plugin.getDataFolder(), "globalgroups.yml");
// File GlobalGroupsFile = new File(plugin.getDataFolder(), "globalgroups.yml");
if (haveGroupsChanged()) {
if (overwrite || (!overwrite && (getTimeStampGroups() >= GlobalGroupsFile.lastModified()))) {
@ -239,7 +246,7 @@ public class GlobalGroups {
}
removeGroupsChangedFlag();
} else {
//Check for newer file as no local changes.
// Check for newer file as no local changes.
if (getTimeStampGroups() < GlobalGroupsFile.lastModified()) {
System.out.print("Newer GlobalGroups file found (Loading changes)!");
// Backup GlobalGroups file
@ -252,6 +259,7 @@ public class GlobalGroups {
/**
* Backup the BlobalGroups file
*
* @param w
*/
private void backupFile() {
@ -270,6 +278,7 @@ public class GlobalGroups {
* @param groupToAdd
*/
public void addGroup(Group groupToAdd) {
// Create a new group if it already exists
if (hasGroup(groupToAdd.getName())) {
groupToAdd = groupToAdd.clone();
@ -288,6 +297,7 @@ public class GlobalGroups {
* @param newGroup
*/
public Group newGroup(Group newGroup) {
// Push a new group
if (!groups.containsKey(newGroup.getName().toLowerCase())) {
groups.put(newGroup.getName().toLowerCase(), newGroup);
@ -303,6 +313,7 @@ public class GlobalGroups {
* @param groupName
*/
public boolean removeGroup(String groupName) {
// Push a new group
if (groups.containsKey(groupName.toLowerCase())) {
groups.remove(groupName.toLowerCase());
@ -321,6 +332,7 @@ public class GlobalGroups {
* @return true if the group exists
*/
public boolean hasGroup(String groupName) {
return groups.containsKey(groupName.toLowerCase());
}
@ -376,6 +388,7 @@ public class GlobalGroups {
* @return List of all group names
*/
public List<String> getGroupsPermissions(String groupName) {
if (!hasGroup(groupName))
return null;
@ -388,6 +401,7 @@ public class GlobalGroups {
* @return Set containing all group names.
*/
public Set<String> getGlobalGroups() {
return groups.keySet();
}
@ -395,6 +409,7 @@ public class GlobalGroups {
* Resets GlobalGroups.
*/
public void resetGlobalGroups() {
this.groups = new HashMap<String, Group>();
}
@ -403,6 +418,7 @@ public class GlobalGroups {
* @return a collection of the groups
*/
public Collection<Group> getGroupList() {
return groups.values();
}
@ -413,6 +429,7 @@ public class GlobalGroups {
* @return Group object
*/
public Group getGroup(String groupName) {
if (!hasGroup(groupName))
return null;
@ -424,6 +441,7 @@ public class GlobalGroups {
* @return the globalGroupsFile
*/
public File getGlobalGroupsFile() {
return GlobalGroupsFile;
}
@ -431,6 +449,7 @@ public class GlobalGroups {
*
*/
public void removeGroupsChangedFlag() {
setGroupsChanged(false);
for (Group g : groups.values()) {
g.flagAsSaved();

View file

@ -12,7 +12,6 @@ import org.anjocaido.groupmanager.data.Variables;
import org.anjocaido.groupmanager.data.User;
import org.anjocaido.groupmanager.data.Group;
import org.anjocaido.groupmanager.dataholder.OverloadedWorldHolder;
import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@ -29,7 +28,6 @@ import org.anjocaido.groupmanager.dataholder.worlds.WorldsHolder;
import org.anjocaido.groupmanager.events.GMSystemEvent;
import org.anjocaido.groupmanager.events.GMWorldListener;
import org.anjocaido.groupmanager.events.GroupManagerEventHandler;
import org.anjocaido.groupmanager.events.GMGroupEvent.Action;
import org.anjocaido.groupmanager.utils.GMLoggerHandler;
import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.anjocaido.groupmanager.utils.Tasks;
@ -40,20 +38,17 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;
@SuppressWarnings("unused")
/**
*
* @author gabrielcouto
* @author gabrielcouto, ElgarL
*/
public class GroupManager extends JavaPlugin {
// private File configFile;
private File backupFolder;
private Runnable commiter;
private ScheduledThreadPoolExecutor scheduler;
@ -68,6 +63,7 @@ public class GroupManager extends JavaPlugin {
* @return the validateOnlinePlayer
*/
public boolean isValidateOnlinePlayer() {
return validateOnlinePlayer;
}
@ -75,10 +71,10 @@ public class GroupManager extends JavaPlugin {
* @param validateOnlinePlayer the validateOnlinePlayer to set
*/
public void setValidateOnlinePlayer(boolean validateOnlinePlayer) {
this.validateOnlinePlayer = validateOnlinePlayer;
}
private boolean isReady = false;
private static boolean isLoaded = false;
protected GMConfiguration config;
@ -90,14 +86,15 @@ public class GroupManager extends JavaPlugin {
public static final Logger logger = Logger.getLogger(GroupManager.class.getName());
// PERMISSIONS FOR COMMAND BEING LOADED
OverloadedWorldHolder dataHolder = null;
AnjoPermissionsHandler permissionHandler = null;
private OverloadedWorldHolder dataHolder = null;
private AnjoPermissionsHandler permissionHandler = null;
@Override
public void onDisable() {
setLoaded(false);
// Un-register this service.
// Unregister this service.
this.getServer().getServicesManager().unregister(this.worldsHolder);
disableScheduler(); // Shutdown before we save, so it doesn't interfere.
@ -109,6 +106,7 @@ public class GroupManager extends JavaPlugin {
}
}
if (WorldEvents != null)
WorldEvents = null;
// Remove all attachments before clearing
@ -117,14 +115,13 @@ public class GroupManager extends JavaPlugin {
BukkitPermissions = null;
}
// EXAMPLE: Custom code, here we just output some info so we can check that
// all is well
// EXAMPLE: Custom code, here we just output some info so we can check that all is well
PluginDescriptionFile pdfFile = this.getDescription();
System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is disabled!");
GroupManager.logger.removeHandler(ch);
}
//@Override
@Override
public void onEnable() {
try {
@ -143,7 +140,6 @@ public class GroupManager extends JavaPlugin {
globalGroups = new GlobalGroups(this);
worldsHolder = new WorldsHolder(this);
PluginDescriptionFile pdfFile = this.getDescription();
if (worldsHolder == null) {
GroupManager.logger.severe("Can't enable " + pdfFile.getName() + " version " + pdfFile.getVersion() + ", bad loading!");
@ -154,16 +150,15 @@ public class GroupManager extends JavaPlugin {
// Set a few defaults (reloads)
setLoaded(false);
// Initialize the world listener and bukkit permissions to handle
// events.
// Initialize the world listener and bukkit permissions to handle events.
WorldEvents = new GMWorldListener(this);
BukkitPermissions = new BukkitPermissions(this);
enableScheduler();
/*
* Schedule a Bukiit Permissions update for 1 tick later. All plugins
* will be loaded by then
* Schedule a Bukkit Permissions update for 1 tick later.
* All plugins will be loaded by then
*/
if (getServer().getScheduler().scheduleSyncDelayedTask(this, new BukkitPermsUpdateTask(), 1) == -1) {
@ -185,7 +180,7 @@ public class GroupManager extends JavaPlugin {
/*
* Throw an error so Bukkit knows about it.
*/
throw new IllegalArgumentException(ex.getMessage(),ex);
throw new IllegalArgumentException(ex.getMessage(), ex);
}
}
@ -229,19 +224,22 @@ public class GroupManager extends JavaPlugin {
}
public static boolean isLoaded() {
return isLoaded;
}
public static void setLoaded(boolean isLoaded) {
GroupManager.isLoaded = isLoaded;
}
public InputStream getResourceAsStream(String fileName) {
return this.getClassLoader().getResourceAsStream(fileName);
}
private void prepareFileFields() {
// configFile = new File(this.getDataFolder(), "config.yml");
backupFolder = new File(this.getDataFolder(), "backup");
if (!backupFolder.exists()) {
getBackupFolder().mkdirs();
@ -249,16 +247,19 @@ public class GroupManager extends JavaPlugin {
}
private void prepareConfig() {
config = new GMConfiguration(this);
}
public void enableScheduler() {
if (worldsHolder != null) {
disableScheduler();
commiter = new Runnable() {
@Override
public void run() {
try {
worldsHolder.saveChanges(false);
GroupManager.logger.log(Level.INFO, " Data files refreshed.");
@ -268,7 +269,7 @@ public class GroupManager extends JavaPlugin {
}
};
scheduler = new ScheduledThreadPoolExecutor(1);
long minutes = (long)getGMConfig().getSaveInterval();
long minutes = (long) getGMConfig().getSaveInterval();
if (minutes > 0) {
scheduler.scheduleAtFixedRate(commiter, minutes, minutes, TimeUnit.MINUTES);
GroupManager.logger.info("Scheduled Data Saving is set for every " + minutes + " minutes!");
@ -280,6 +281,7 @@ public class GroupManager extends JavaPlugin {
}
public void disableScheduler() {
if (scheduler != null) {
try {
scheduler.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
@ -292,59 +294,11 @@ public class GroupManager extends JavaPlugin {
}
}
/**
* Use the WorldsHolder saveChanges directly instead Saves the data on file
*/
@Deprecated
public void commit() {
if (worldsHolder != null) {
worldsHolder.saveChanges();
}
}
/**
* Use worlds holder to reload a specific world Reloads the data
*/
@Deprecated
public void reload() {
worldsHolder.reloadAll();
}
public WorldsHolder getWorldsHolder() {
return worldsHolder;
}
/**
* The handler in the interface created by AnjoCaido
*
* @return AnjoPermissionsHandler
*/
@Deprecated
public AnjoPermissionsHandler getPermissionHandler() {
return worldsHolder.getDefaultWorld().getPermissionsHandler();
}
/**
* A simple interface, for ones that don't want to mess with overloading.
* Yet it is affected by overloading. But seamless.
*
* @return the dataholder with all information
*/
@Deprecated
public WorldDataHolder getData() {
return worldsHolder.getDefaultWorld();
}
/**
* Use this if you want to play with overloading.
*
* @return a dataholder with overloading interface
*/
@Deprecated
public OverloadedWorldHolder getOverloadedClassData() {
return worldsHolder.getDefaultWorld();
}
/**
* Called when a command registered by this plugin is received.
*
@ -352,9 +306,9 @@ public class GroupManager extends JavaPlugin {
* @param cmd
* @param args
*/
@SuppressWarnings({ "deprecation" })
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
boolean playerCanDo = false;
boolean isConsole = false;
Player senderPlayer = null, targetPlayer = null;
@ -362,7 +316,6 @@ public class GroupManager extends JavaPlugin {
User senderUser = null;
boolean isOpOverride = config.isOpOverride();
// DETERMINING PLAYER INFORMATION
if (sender instanceof Player) {
senderPlayer = (Player) sender;
@ -622,8 +575,8 @@ public class GroupManager extends JavaPlugin {
auxUser.removeSubGroup(auxGroup);
sender.sendMessage(ChatColor.YELLOW + "You removed subgroup '" + auxGroup.getName() + "' from player '" + auxUser.getName() + "' list.");
//targetPlayer = this.getServer().getPlayer(auxUser.getName());
//if (targetPlayer != null)
// targetPlayer = this.getServer().getPlayer(auxUser.getName());
// if (targetPlayer != null)
// BukkitPermissions.updatePermissions(targetPlayer);
return true;
@ -881,7 +834,7 @@ public class GroupManager extends JavaPlugin {
permissionResult = permissionHandler.checkFullGMPermission(auxUser, args[1], false);
if (permissionResult.resultType.equals(PermissionCheckResult.Type.NOTFOUND)) {
//No permissions found in GM so fall through and check Bukkit.
// No permissions found in GM so fall through and check Bukkit.
sender.sendMessage(ChatColor.RED + "The player doesn't have access to that permission");
} else {
@ -1078,8 +1031,7 @@ public class GroupManager extends JavaPlugin {
return false;
}
// Seems OK
// auxString =
// permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
// auxString = permissionHandler.checkUserOnlyPermission(auxUser, args[1]);
if (permissionResult.owner instanceof Group) {
if (permissionResult.resultType.equals(PermissionCheckResult.Type.NEGATION)) {
sender.sendMessage(ChatColor.RED + "The group inherits the a negation permission from group: " + permissionResult.owner.getName());
@ -1118,7 +1070,7 @@ public class GroupManager extends JavaPlugin {
}
// Validating permission
if (permissionHandler.searchGroupInInheritance(auxGroup, auxGroup2.getName(), null)) {
if (permissionHandler.hasGroupInInheritance(auxGroup, auxGroup2.getName())) {
sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " already inherits " + auxGroup2.getName() + " (might not be directly)");
return false;
}
@ -1157,7 +1109,7 @@ public class GroupManager extends JavaPlugin {
}
// Validating permission
if (!permissionHandler.searchGroupInInheritance(auxGroup, auxGroup2.getName(), null)) {
if (!permissionHandler.hasGroupInInheritance(auxGroup, auxGroup2.getName())) {
sender.sendMessage(ChatColor.RED + "Group " + auxGroup.getName() + " does not inherits " + auxGroup2.getName() + ".");
return false;
}
@ -1300,7 +1252,8 @@ public class GroupManager extends JavaPlugin {
if (!auxUser.isSubGroupsEmpty() && auxGroup2 == null)
for (Group subGroup : auxUser.subGroupListCopy()) {
auxGroup2 = permissionHandler.nextGroupWithVariable(subGroup, args[1]);
if (auxGroup2 != null) continue;
if (auxGroup2 != null)
continue;
}
if (auxGroup2 == null) {
sender.sendMessage(ChatColor.RED + "The user doesn't have access to that variable!");
@ -1447,7 +1400,7 @@ public class GroupManager extends JavaPlugin {
return false;
}
// Validating permission
auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1], null);
auxGroup2 = permissionHandler.nextGroupWithVariable(auxGroup, args[1]);
if (auxGroup2 == null) {
sender.sendMessage(ChatColor.RED + "The group doesn't have access to that variable!");
}
@ -1974,7 +1927,7 @@ public class GroupManager extends JavaPlugin {
if (Arrays.asList(this.getServer().getOfflinePlayers()).contains(Bukkit.getOfflinePlayer(playerName))) {
match.add(playerName);
} else {
//look for partial matches
// look for partial matches
for (OfflinePlayer offline : this.getServer().getOfflinePlayers()) {
if (offline.getName().toLowerCase().startsWith(playerName.toLowerCase()))
match.add(offline.getName());
@ -2003,6 +1956,7 @@ public class GroupManager extends JavaPlugin {
* @return the config
*/
public GMConfiguration getGMConfig() {
return config;
}
@ -2010,10 +1964,12 @@ public class GroupManager extends JavaPlugin {
* @return the backupFolder
*/
public File getBackupFolder() {
return backupFolder;
}
public static GlobalGroups getGlobalGroups() {
return globalGroups;
}

View file

@ -5,17 +5,18 @@ import org.anjocaido.groupmanager.GroupManager;
/*
*
* Created by ElgarL
*
*/
public class BukkitPermsUpdateTask implements Runnable {
public BukkitPermsUpdateTask() {
super();
}
@Override
public void run() {
// Signal loaded and update BukkitPermissions.
GroupManager.setLoaded(true);
GroupManager.BukkitPermissions.collectPermissions();

View file

@ -24,21 +24,25 @@ public abstract class DataUnit {
private ArrayList<String> permissions = new ArrayList<String>();
public DataUnit(WorldDataHolder dataSource, String name) {
this.dataSource = dataSource;
this.name = name;
}
public DataUnit(String name) {
this.name = name;
}
/**
* Every group is matched only by their names and DataSources names.
*
* @param o
* @return true if they are equal. false if not.
*/
@Override
public boolean equals(Object o) {
if (o instanceof DataUnit) {
DataUnit go = (DataUnit) o;
if (this.getName().equalsIgnoreCase(go.getName())) {
@ -61,6 +65,7 @@ public abstract class DataUnit {
@Override
public int hashCode() {
int hash = 5;
hash = 71 * hash + (this.name != null ? this.name.toLowerCase().hashCode() : 0);
return hash;
@ -72,6 +77,7 @@ public abstract class DataUnit {
* @param source
*/
public void setDataSource(WorldDataHolder source) {
this.dataSource = source;
}
@ -81,6 +87,7 @@ public abstract class DataUnit {
* @return the dataSource
*/
public WorldDataHolder getDataSource() {
return dataSource;
}
@ -88,10 +95,12 @@ public abstract class DataUnit {
* @return the name
*/
public String getName() {
return name;
}
public void flagAsChanged() {
WorldDataHolder testSource = getDataSource();
String source = "";
@ -101,18 +110,20 @@ public abstract class DataUnit {
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as changed!");
// for(StackTraceElement st: Thread.currentThread().getStackTrace()){
// GroupManager.logger.finest(st.toString());
// }
// for(StackTraceElement st: Thread.currentThread().getStackTrace()){
// GroupManager.logger.finest(st.toString());
// }
sorted = false;
changed = true;
}
public boolean isChanged() {
return changed;
}
public void flagAsSaved() {
WorldDataHolder testSource = getDataSource();
String source = "";
@ -126,10 +137,12 @@ public abstract class DataUnit {
}
public boolean hasSamePermissionNode(String permission) {
return permissions.contains(permission);
}
public void addPermission(String permission) {
if (!hasSamePermissionNode(permission)) {
permissions.add(permission);
}
@ -137,6 +150,7 @@ public abstract class DataUnit {
}
public boolean removePermission(String permission) {
flagAsChanged();
return permissions.remove(permission);
}
@ -144,17 +158,21 @@ public abstract class DataUnit {
/**
* Use this only to list permissions.
* You can't edit the permissions using the returned ArrayList instance
*
* @return a copy of the permission list
*/
public List<String> getPermissionList() {
return Collections.unmodifiableList(permissions);
}
public boolean isSorted() {
return this.sorted;
}
public void sortPermissions() {
if (!isSorted()) {
Collections.sort(permissions, StringPermissionComparator.getInstance());
sorted = true;

View file

@ -25,7 +25,7 @@ public class Group extends DataUnit implements Cloneable {
*/
private ArrayList<String> inherits = new ArrayList<String>();
/**
*This one holds the fields in INFO node.
* This one holds the fields in INFO node.
* like prefix = 'c'
* or build = false
*/
@ -37,6 +37,7 @@ public class Group extends DataUnit implements Cloneable {
* @param name
*/
public Group(WorldDataHolder source, String name) {
super(source, name);
}
@ -46,6 +47,7 @@ public class Group extends DataUnit implements Cloneable {
* @param name
*/
public Group(String name) {
super(name);
}
@ -55,15 +57,18 @@ public class Group extends DataUnit implements Cloneable {
* @return true if this is a global group
*/
public boolean isGlobal() {
return (getDataSource() == null);
}
/**
* Clone this group
*
* @return a clone of this group
*/
@Override
public Group clone() {
Group clone;
if (isGlobal()) {
@ -83,10 +88,12 @@ public class Group extends DataUnit implements Cloneable {
/**
* Use this to deliver a group from a different dataSource to another
*
* @param dataSource
* @return Null or Clone
*/
public Group clone(WorldDataHolder dataSource) {
if (dataSource.groupExists(this.getName())) {
return null;
}
@ -109,9 +116,11 @@ public class Group extends DataUnit implements Cloneable {
* an unmodifiable list of inherits list
* You can't manage the list by here
* Lol... version 0.6 had a problem because this.
*
* @return the inherits
*/
public List<String> getInherits() {
return Collections.unmodifiableList(inherits);
}
@ -119,6 +128,7 @@ public class Group extends DataUnit implements Cloneable {
* @param inherit the inherits to set
*/
public void addInherits(Group inherit) {
if (!isGlobal()) {
if (!this.getDataSource().groupExists(inherit.getName())) {
getDataSource().addGroup(inherit);
@ -135,6 +145,7 @@ public class Group extends DataUnit implements Cloneable {
}
public boolean removeInherits(String inherit) {
if (!isGlobal()) {
if (this.inherits.contains(inherit.toLowerCase())) {
this.inherits.remove(inherit.toLowerCase());
@ -150,6 +161,7 @@ public class Group extends DataUnit implements Cloneable {
* @return the variables
*/
public GroupVariables getVariables() {
return variables;
}
@ -158,6 +170,7 @@ public class Group extends DataUnit implements Cloneable {
* @param varList
*/
public void setVariables(Map<String, Object> varList) {
if (!isGlobal()) {
GroupVariables temp = new GroupVariables(this, varList);
variables.clearVars();

View file

@ -15,6 +15,7 @@ public class GroupVariables extends Variables implements Cloneable {
private Group owner;
public GroupVariables(Group owner) {
super(owner);
this.owner = owner;
addVar("prefix", "");
@ -23,6 +24,7 @@ public class GroupVariables extends Variables implements Cloneable {
}
public GroupVariables(Group owner, Map<String, Object> varList) {
super(owner);
variables = varList;
if (variables.get("prefix") == null) {
@ -46,9 +48,11 @@ public class GroupVariables extends Variables implements Cloneable {
/**
* A clone of all vars here.
*
* @return GroupVariables clone
*/
protected GroupVariables clone(Group newOwner) {
GroupVariables clone = new GroupVariables(newOwner);
for (String key : variables.keySet()) {
clone.variables.put(key, variables.get(key));
@ -59,10 +63,12 @@ public class GroupVariables extends Variables implements Cloneable {
/**
* Remove a var from the list
*
* @param name
*/
@Override
public void removeVar(String name) {
try {
this.variables.remove(name);
} catch (Exception e) {
@ -82,6 +88,7 @@ public class GroupVariables extends Variables implements Cloneable {
*/
@Override
public Group getOwner() {
return owner;
}
}

View file

@ -16,7 +16,6 @@ import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
/**
*
* @author gabrielcouto/ElgarL
@ -40,6 +39,7 @@ public class User extends DataUnit implements Cloneable {
* @param name
*/
public User(WorldDataHolder source, String name) {
super(source, name);
this.group = source.getDefaultGroup().getName();
}
@ -50,6 +50,7 @@ public class User extends DataUnit implements Cloneable {
*/
@Override
public User clone() {
User clone = new User(getDataSource(), this.getName());
clone.group = this.group;
for (String perm : this.getPermissionList()) {
@ -67,6 +68,7 @@ public class User extends DataUnit implements Cloneable {
* @return null if given dataSource already contains the same user
*/
public User clone(WorldDataHolder dataSource) {
if (dataSource.isUserDeclared(this.getName())) {
return null;
}
@ -85,6 +87,7 @@ public class User extends DataUnit implements Cloneable {
}
public Group getGroup() {
Group result = getDataSource().getGroup(group);
if (result == null) {
this.setGroup(getDataSource().getDefaultGroup());
@ -97,6 +100,7 @@ public class User extends DataUnit implements Cloneable {
* @return the group
*/
public String getGroupName() {
Group result = getDataSource().getGroup(group);
if (result == null) {
group = getDataSource().getDefaultGroup().getName();
@ -104,24 +108,13 @@ public class User extends DataUnit implements Cloneable {
return group;
}
/**
* @param group
* the group to set
*/
@Deprecated
public void setGroup(String group) {
this.group = group;
flagAsChanged();
if (GroupManager.isLoaded())
if (!GroupManager.BukkitPermissions.isPlayer_join())
GroupManager.BukkitPermissions.updatePlayer(getBukkitPlayer());
}
/**
* @param group
* the group to set
*/
public void setGroup(Group group) {
setGroup(group, true);
}
@ -131,6 +124,7 @@ public class User extends DataUnit implements Cloneable {
*
*/
public void setGroup(Group group, Boolean updatePerms) {
if (!this.getDataSource().groupExists(group.getName())) {
getDataSource().addGroup(group);
}
@ -157,6 +151,7 @@ public class User extends DataUnit implements Cloneable {
}
public boolean addSubGroup(Group subGroup) {
// Don't allow adding a subgroup if it's already set as the primary.
if (this.group.equalsIgnoreCase(subGroup.getName())) {
return false;
@ -185,18 +180,22 @@ public class User extends DataUnit implements Cloneable {
}
public int subGroupsSize() {
return subGroups.size();
}
public boolean isSubGroupsEmpty() {
return subGroups.isEmpty();
}
public boolean containsSubGroup(Group subGroup) {
return subGroups.contains(subGroup.getName());
}
public boolean removeSubGroup(Group subGroup) {
try {
if (subGroups.remove(subGroup.getName())) {
flagAsChanged();
@ -212,6 +211,7 @@ public class User extends DataUnit implements Cloneable {
}
public ArrayList<Group> subGroupListCopy() {
ArrayList<Group> val = new ArrayList<Group>();
for (String gstr : subGroups) {
Group g = getDataSource().getGroup(gstr);
@ -225,6 +225,7 @@ public class User extends DataUnit implements Cloneable {
}
public ArrayList<String> subGroupListStringCopy() {
return new ArrayList<String>(subGroups);
}
@ -232,6 +233,7 @@ public class User extends DataUnit implements Cloneable {
* @return the variables
*/
public UserVariables getVariables() {
return variables;
}
@ -240,6 +242,7 @@ public class User extends DataUnit implements Cloneable {
* @param varList
*/
public void setVariables(Map<String, Object> varList) {
//UserVariables temp = new UserVariables(this, varList);
variables.clearVars();
for (String key : varList.keySet()) {
@ -254,6 +257,7 @@ public class User extends DataUnit implements Cloneable {
}
public User updatePlayer(Player player) {
if (player != null) {
bukkitPlayer = player;
}
@ -261,6 +265,7 @@ public class User extends DataUnit implements Cloneable {
}
public Player getBukkitPlayer() {
if (bukkitPlayer == null) {
bukkitPlayer = Bukkit.getPlayer(this.getName());
}

View file

@ -15,11 +15,13 @@ public class UserVariables extends Variables {
private User owner;
public UserVariables(User owner) {
super(owner);
this.owner = owner;
}
public UserVariables(User owner, Map<String, Object> varList) {
super(owner);
this.variables = varList;
this.owner = owner;
@ -27,9 +29,11 @@ public class UserVariables extends Variables {
/**
* A clone of all vars here.
*
* @return UserVariables clone
*/
protected UserVariables clone(User newOwner) {
UserVariables clone = new UserVariables(newOwner);
for (String key : variables.keySet()) {
clone.variables.put(key, variables.get(key));
@ -43,6 +47,7 @@ public class UserVariables extends Variables {
*/
@Override
public User getOwner() {
return owner;
}
}

View file

@ -9,7 +9,7 @@ import java.util.Map;
import java.util.Set;
/**
*A class that holds variables of a user/group.
* A class that holds variables of a user/group.
* In groups, it holds the contents of INFO node.
* Like:
* prefix
@ -24,6 +24,7 @@ public abstract class Variables implements Cloneable {
protected Map<String, Object> variables = new HashMap<String, Object>();
public Variables(DataUnit owner) {
this.owner = owner;
}
@ -32,10 +33,12 @@ public abstract class Variables implements Cloneable {
* examples:
* addVar("build",true);
* addVar("prefix","c");
*
* @param name key name of the var
* @param o the object value of the var
*/
public void addVar(String name, Object o) {
if (o == null) {
return;
}
@ -48,19 +51,23 @@ public abstract class Variables implements Cloneable {
/**
* Returns the object inside the var
*
* @param name
* @return a Object if exists. null if doesn't exists
*/
public Object getVarObject(String name) {
return variables.get(name);
}
/**
* Get the String value for the given var name
*
* @param name the var key name
* @return "" if null. or the toString() value of object
*/
public String getVarString(String name) {
Object o = variables.get(name);
try {
return o == null ? "" : o.toString();
@ -75,6 +82,7 @@ public abstract class Variables implements Cloneable {
* @return false if null. or a Boolean.parseBoolean of the string
*/
public Boolean getVarBoolean(String name) {
Object o = variables.get(name);
try {
return o == null ? false : Boolean.parseBoolean(o.toString());
@ -89,6 +97,7 @@ public abstract class Variables implements Cloneable {
* @return -1 if null. or a parseInt of the string
*/
public Integer getVarInteger(String name) {
Object o = variables.get(name);
try {
return o == null ? -1 : Integer.parseInt(o.toString());
@ -103,6 +112,7 @@ public abstract class Variables implements Cloneable {
* @return -1 if null. or a parseDouble of the string
*/
public Double getVarDouble(String name) {
Object o = variables.get(name);
try {
return o == null ? -1.0D : Double.parseDouble(o.toString());
@ -113,34 +123,42 @@ public abstract class Variables implements Cloneable {
/**
* All variable keys this is holding
*
* @return Set of all variable names.
*/
public Set<String> getVarKeyList() {
return variables.keySet();
}
/**
* verify is a var exists
*
* @param name the key name of the var
* @return true if that var exists
*/
public boolean hasVar(String name) {
return variables.containsKey(name);
}
/**
* Returns the quantity of vars this is holding
*
* @return the number of vars
*/
public int getSize() {
return variables.size();
}
/**
* Remove a var from the list
*
* @param name
*/
public void removeVar(String name) {
try {
variables.remove(name);
} catch (Exception e) {
@ -149,6 +167,7 @@ public abstract class Variables implements Cloneable {
}
public static Object parseVariableValue(String value) {
try {
Integer i = Integer.parseInt(value);
return i;
@ -169,6 +188,7 @@ public abstract class Variables implements Cloneable {
}
public void clearVars() {
variables.clear();
owner.flagAsChanged();
}
@ -177,10 +197,12 @@ public abstract class Variables implements Cloneable {
* @return the owner
*/
public DataUnit getOwner() {
return owner;
}
public boolean isEmpty() {
return variables.isEmpty();
}
}

View file

@ -6,8 +6,6 @@ import java.util.Map;
import org.anjocaido.groupmanager.data.Group;
/**
* This container holds all Groups loaded from the relevant groupsFile.
*
@ -31,9 +29,11 @@ public class GroupsDataHolder {
* Constructor
*/
protected GroupsDataHolder() {
}
public void setDataSource(WorldDataHolder dataSource) {
this.dataSource = dataSource;
//push this data source to the users, so they pull the correct groups data.
for (Group group : groups.values())
@ -44,6 +44,7 @@ public class GroupsDataHolder {
* @return the defaultGroup
*/
public Group getDefaultGroup() {
return defaultGroup;
}
@ -51,6 +52,7 @@ public class GroupsDataHolder {
* @param defaultGroup the defaultGroup to set
*/
public void setDefaultGroup(Group defaultGroup) {
this.defaultGroup = defaultGroup;
}
@ -58,6 +60,7 @@ public class GroupsDataHolder {
* @return the groups
*/
public Map<String, Group> getGroups() {
return groups;
}
@ -65,6 +68,7 @@ public class GroupsDataHolder {
* @param groups the groups to set
*/
public void setGroups(Map<String, Group> groups) {
this.groups = groups;
}
@ -72,6 +76,7 @@ public class GroupsDataHolder {
* @return the groupsFile
*/
public File getGroupsFile() {
return groupsFile;
}
@ -79,6 +84,7 @@ public class GroupsDataHolder {
* @param groupsFile the groupsFile to set
*/
public void setGroupsFile(File groupsFile) {
this.groupsFile = groupsFile;
}
@ -86,6 +92,7 @@ public class GroupsDataHolder {
* @return the haveGroupsChanged
*/
public boolean HaveGroupsChanged() {
return haveGroupsChanged;
}
@ -93,6 +100,7 @@ public class GroupsDataHolder {
* @param haveGroupsChanged the haveGroupsChanged to set
*/
public void setGroupsChanged(boolean haveGroupsChanged) {
this.haveGroupsChanged = haveGroupsChanged;
}
@ -100,6 +108,7 @@ public class GroupsDataHolder {
* @return the timeStampGroups
*/
public long getTimeStampGroups() {
return timeStampGroups;
}
@ -107,6 +116,7 @@ public class GroupsDataHolder {
* @param timeStampGroups the timeStampGroups to set
*/
public void setTimeStampGroups(long timeStampGroups) {
this.timeStampGroups = timeStampGroups;
}

View file

@ -26,10 +26,10 @@ public class OverloadedWorldHolder extends WorldDataHolder {
* @param ph
*/
public OverloadedWorldHolder(WorldDataHolder ph) {
super(ph.getName());
this.setGroupsFile(ph.getGroupsFile());
this.setUsersFile(ph.getUsersFile());
//this.setDefaultGroup(ph.getDefaultGroup());
this.groups = ph.groups;
this.users = ph.users;
}
@ -41,6 +41,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
*/
@Override
public User getUser(String userName) {
//OVERLOADED CODE
String userNameLowered = userName.toLowerCase();
if (overloadedUsers.containsKey(userNameLowered)) {
@ -61,6 +62,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
*/
@Override
public void addUser(User theUser) {
if (theUser.getDataSource() != this) {
theUser = theUser.clone(this);
}
@ -89,6 +91,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
*/
@Override
public boolean removeUser(String userName) {
//OVERLOADED CODE
if (overloadedUsers.containsKey(userName.toLowerCase())) {
overloadedUsers.remove(userName.toLowerCase());
@ -105,6 +108,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
@Override
public boolean removeGroup(String groupName) {
if (groupName.equals(getDefaultGroup())) {
return false;
}
@ -140,6 +144,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
*/
@Override
public Collection<User> getUserList() {
Collection<User> overloadedList = new ArrayList<User>();
Collection<User> normalList = getUsers().values();
for (User u : normalList) {
@ -158,6 +163,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
* @return true if user is overloaded.
*/
public boolean isOverloaded(String userName) {
return overloadedUsers.containsKey(userName.toLowerCase());
}
@ -166,6 +172,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
* @param userName
*/
public void overloadUser(String userName) {
if (!isOverloaded(userName)) {
User theUser = getUser(userName);
theUser = theUser.clone();
@ -181,6 +188,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
* @param userName
*/
public void removeOverload(String userName) {
overloadedUsers.remove(userName.toLowerCase());
}
@ -193,6 +201,7 @@ public class OverloadedWorldHolder extends WorldDataHolder {
* @return user object
*/
public User surpassOverload(String userName) {
if (!isOverloaded(userName)) {
return getUser(userName);
}

View file

@ -6,8 +6,6 @@ import java.util.Map;
import org.anjocaido.groupmanager.data.User;
/**
* This container holds all Users loaded from the relevant usersFile.
*
@ -30,9 +28,11 @@ public class UsersDataHolder {
* Constructor
*/
protected UsersDataHolder() {
}
public void setDataSource(WorldDataHolder dataSource) {
this.dataSource = dataSource;
//push this data source to the users, so they pull the correct groups data.
for (User user : users.values())
@ -44,6 +44,7 @@ public class UsersDataHolder {
* @return the users
*/
public Map<String, User> getUsers() {
return users;
}
@ -51,6 +52,7 @@ public class UsersDataHolder {
* @param users the users to set
*/
public void setUsers(Map<String, User> users) {
this.users = users;
}
@ -58,6 +60,7 @@ public class UsersDataHolder {
* @return the usersFile
*/
public File getUsersFile() {
return usersFile;
}
@ -65,6 +68,7 @@ public class UsersDataHolder {
* @param usersFile the usersFile to set
*/
public void setUsersFile(File usersFile) {
this.usersFile = usersFile;
}
@ -72,6 +76,7 @@ public class UsersDataHolder {
* @return the haveUsersChanged
*/
public boolean HaveUsersChanged() {
return haveUsersChanged;
}
@ -79,6 +84,7 @@ public class UsersDataHolder {
* @param haveUsersChanged the haveUsersChanged to set
*/
public void setUsersChanged(boolean haveUsersChanged) {
this.haveUsersChanged = haveUsersChanged;
}
@ -86,6 +92,7 @@ public class UsersDataHolder {
* @return the timeStampUsers
*/
public long getTimeStampUsers() {
return timeStampUsers;
}
@ -93,6 +100,7 @@ public class UsersDataHolder {
* @param timeStampUsers the timeStampUsers to set
*/
public void setTimeStampUsers(long timeStampUsers) {
this.timeStampUsers = timeStampUsers;
}

View file

@ -62,27 +62,30 @@ public class WorldDataHolder {
*/
protected AnjoPermissionsHandler permissionsHandler;
/**
* Prevent direct instantiation
*
* @param worldName
*/
public WorldDataHolder(String worldName) {
name = worldName;
}
/**
* The main constructor for a new WorldDataHolder
*
* @param worldName
* @param groups
* @param users
*/
public WorldDataHolder(String worldName, GroupsDataHolder groups, UsersDataHolder users) {
this.name = worldName;
this.groups = groups;
this.users = users;
//this.defaultGroup = defaultGroup;
// this.defaultGroup = defaultGroup;
}
/**
@ -91,6 +94,7 @@ public class WorldDataHolder {
* This should be called whenever a set of world data is fetched.
*/
public void updateDataSource() {
this.groups.setDataSource(this);
this.users.setDataSource(this);
}
@ -103,6 +107,7 @@ public class WorldDataHolder {
* @return class that manage that user permission
*/
public User getUser(String userName) {
if (getUsers().containsKey(userName.toLowerCase())) {
return getUsers().get(userName.toLowerCase());
}
@ -112,9 +117,11 @@ public class WorldDataHolder {
/**
* Add a user to the list. If it already exists, overwrite the old.
*
* @param theUser the user you want to add to the permission list
*/
public void addUser(User theUser) {
if (theUser.getDataSource() != this) {
theUser = theUser.clone(this);
}
@ -133,10 +140,12 @@ public class WorldDataHolder {
/**
* Removes the user from the list. (he might become a default user)
*
* @param userName the username from the user to remove
* @return true if it had something to remove
*/
public boolean removeUser(String userName) {
if (getUsers().containsKey(userName.toLowerCase())) {
getUsers().remove(userName.toLowerCase());
setUsersChanged(true);
@ -153,14 +162,17 @@ public class WorldDataHolder {
* @return true if we have data for this player.
*/
public boolean isUserDeclared(String userName) {
return getUsers().containsKey(userName.toLowerCase());
}
/**
* Change the default group of the file.
*
* @param group the group you want make default.
*/
public void setDefaultGroup(Group group) {
if (!getGroups().containsKey(group.getName().toLowerCase()) || (group.getDataSource() != this)) {
addGroup(group);
}
@ -172,18 +184,22 @@ public class WorldDataHolder {
/**
* Returns the default group of the file
*
* @return the default group
*/
public Group getDefaultGroup() {
return groups.getDefaultGroup();
}
/**
* Returns a group of the given name
*
* @param groupName the name of the group
* @return a group if it is found. null if not found.
*/
public Group getGroup(String groupName) {
if (groupName.toLowerCase().startsWith("g:"))
return GroupManager.getGlobalGroups().getGroup(groupName);
else
@ -193,10 +209,12 @@ public class WorldDataHolder {
/**
* Check if a group exists.
* Its the same of getGroup, but check if it is null.
*
* @param groupName the name of the group
* @return true if exists. false if not.
*/
public boolean groupExists(String groupName) {
if (groupName.toLowerCase().startsWith("g:"))
return GroupManager.getGlobalGroups().hasGroup(groupName);
else
@ -205,9 +223,11 @@ public class WorldDataHolder {
/**
* Add a group to the list
*
* @param groupToAdd
*/
public void addGroup(Group groupToAdd) {
if (groupToAdd.getName().toLowerCase().startsWith("g:")) {
GroupManager.getGlobalGroups().addGroup(groupToAdd);
GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED);
@ -226,10 +246,13 @@ public class WorldDataHolder {
/**
* Remove the group from the list
*
* @param groupName
* @return true if had something to remove. false the group was default or non-existant
* @return true if had something to remove. false the group was default or
* non-existant
*/
public boolean removeGroup(String groupName) {
if (groupName.toLowerCase().startsWith("g:")) {
return GroupManager.getGlobalGroups().removeGroup(groupName);
}
@ -251,10 +274,12 @@ public class WorldDataHolder {
/**
* Creates a new User with the given name
* and adds it to this holder.
*
* @param userName the username you want
* @return null if user already exists. or new User
*/
public User createUser(String userName) {
if (getUsers().containsKey(userName.toLowerCase())) {
return null;
}
@ -268,10 +293,12 @@ public class WorldDataHolder {
/**
* Creates a new Group with the given name
* and adds it to this holder
*
* @param groupName the groupname you want
* @return null if group already exists. or new Group
*/
public Group createGroup(String groupName) {
if (groupName.toLowerCase().startsWith("g:")) {
Group newGroup = new Group(groupName);
return GroupManager.getGlobalGroups().newGroup(newGroup);
@ -292,6 +319,7 @@ public class WorldDataHolder {
* @return a collection of the groups
*/
public Collection<Group> getGroupList() {
return getGroups().values();
}
@ -300,6 +328,7 @@ public class WorldDataHolder {
* @return a collection of the users
*/
public Collection<User> getUserList() {
return getUsers().values();
}
@ -307,6 +336,7 @@ public class WorldDataHolder {
* reads the file again
*/
public void reload() {
try {
reloadGroups();
reloadUsers();
@ -319,6 +349,7 @@ public class WorldDataHolder {
* Refresh Group data from file
*/
public void reloadGroups() {
GroupManager.setLoaded(false);
try {
// temporary holder in case the load fails.
@ -346,6 +377,7 @@ public class WorldDataHolder {
* Refresh Users data from file
*/
public void reloadUsers() {
GroupManager.setLoaded(false);
try {
// temporary holder in case the load fails.
@ -406,6 +438,7 @@ public class WorldDataHolder {
GroupManager.setLoaded(true);
}
/**
* Returns a NEW data holder containing data read from the files
*
@ -417,11 +450,14 @@ public class WorldDataHolder {
* @throws IOException
*/
public static WorldDataHolder load(String worldName, File groupsFile, File usersFile) throws FileNotFoundException, IOException {
WorldDataHolder ph = new WorldDataHolder(worldName);
GroupManager.setLoaded(false);
if (groupsFile != null) loadGroups(ph, groupsFile);
if (usersFile != null) loadUsers(ph, usersFile);
if (groupsFile != null)
loadGroups(ph, groupsFile);
if (usersFile != null)
loadUsers(ph, usersFile);
GroupManager.setLoaded(true);
return ph;
@ -436,12 +472,14 @@ public class WorldDataHolder {
* @throws FileNotFoundException
* @throws IOException
*/
@SuppressWarnings({"rawtypes", "unchecked"})
@SuppressWarnings({ "rawtypes", "unchecked" })
protected static void loadGroups(WorldDataHolder ph, File groupsFile) throws FileNotFoundException, IOException {
//READ GROUPS FILE
// READ GROUPS FILE
Yaml yamlGroups = new Yaml(new SafeConstructor());
Map<String, Object> groupsRootDataNode;
if (!groupsFile.exists()) {
throw new IllegalArgumentException("The file which should contain groups does not exist!\n" + groupsFile.getPath());
}
@ -457,31 +495,30 @@ public class WorldDataHolder {
groupsInputStream.close();
}
//PROCESS GROUPS FILE
// PROCESS GROUPS FILE
Map<String, List<String>> inheritance = new HashMap<String, List<String>>();
Map<String, Object> allGroupsNode = null;
/*
* Fetch all child nodes under the 'groups' entry.
* Fetch all groups under the 'groups' entry.
*/
Map<String, Object> allGroupsNode = new HashMap<String, Object>();
try {
allGroupsNode = (Map<String, Object>) groupsRootDataNode.get("groups");
} catch (Exception ex) {
//ex.printStackTrace();
throw new IllegalArgumentException("Your " + groupsFile.getPath() + " file is invalid. See console for details.", ex);
}
Iterator<String> groupItr = allGroupsNode.keySet().iterator();
String groupKey;
Integer groupCount = 0;
/*
* loop each group entry
* and read it's data.
* and process it's data.
*/
while (groupItr.hasNext()) {
try {
groupCount++;
// Attempt to fetch the next group name.
@ -493,7 +530,7 @@ public class WorldDataHolder {
/*
* Fetch this groups child nodes
*/
Map<String, Object> thisGroupNode = new HashMap<String, Object>();
Map<String, Object> thisGroupNode = null;
try {
thisGroupNode = (Map<String, Object>) allGroupsNode.get(groupKey);
@ -511,107 +548,153 @@ public class WorldDataHolder {
throw new IllegalArgumentException("I think this Group was declared more than once: " + groupKey + " in file: " + groupsFile.getPath());
}
// DEFAULT NODE
Object nodeData = null;
try {
nodeData = thisGroupNode.get("default");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'permissions' for group: " + groupKey + " in file: " + groupsFile.getPath());
}
if (nodeData == null) {
/*
* If no default node is found set it as false.
* If no 'default' node is found do nothing.
*/
if (thisGroupNode.get("default") == null) {
thisGroupNode.put("default", false);
} else if ((Boolean.parseBoolean(thisGroupNode.get("default").toString()))) {
} else if ((Boolean.parseBoolean(nodeData.toString()))) {
/*
* Set this as the default group.
* Warn if some other group has already claimed that position.
*/
if (ph.getDefaultGroup() != null) {
GroupManager.logger.warning("The group " + thisGrp.getName() + " is claiming to be default where" + ph.getDefaultGroup().getName() + " already was.");
GroupManager.logger.warning("Overriding first request for file: " + groupsFile.getPath());
GroupManager.logger.warning("The group '" + thisGrp.getName() + "' is claiming to be default where '" + ph.getDefaultGroup().getName() + "' already was.");
GroupManager.logger.warning("Overriding first default request in file: " + groupsFile.getPath());
}
ph.setDefaultGroup(thisGrp);
}
//PERMISSIONS NODE
// PERMISSIONS NODE
nodeData = null;
try {
nodeData = thisGroupNode.get("permissions");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'permissions' for '" + groupKey + "' in file: " + groupsFile.getPath());
}
if (nodeData == null) {
/*
* If no permissions node is found, or it's empty
* set an empty permission list
* do nothing.
*/
if (thisGroupNode.get("permissions") == null) {
thisGroupNode.put("permissions", new ArrayList<String>());
} else {
/*
* There is a permission list Which seems to hold some data
*/
if (thisGroupNode.get("permissions") instanceof List) {
if (nodeData instanceof List) {
/*
* Check each entry and add it as a new permission.
*/
for (Object o : ((List) thisGroupNode.get("permissions"))) {
try {
for (Object o : ((List) nodeData)) {
try {
/*
* Only add this permission if it's not empty.
*/
if (!thisGroupNode.get("permissions").toString().isEmpty())
if (!o.toString().isEmpty())
thisGrp.addPermission(o.toString());
} catch (NullPointerException ex) {
// Ignore this entry as it's null. It can be safely dropped
// Ignore this entry as it's null. It can be
// safely dropped
}
}
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid formatting found in permissions section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath(), ex);
throw new IllegalArgumentException("Invalid formatting found in 'permissions' section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath(), ex);
}
}
} else if (thisGroupNode.get("permissions") instanceof String) {
} else if (nodeData instanceof String) {
/*
* Only add this permission if it's not empty.
*/
if (!thisGroupNode.get("permissions").toString().isEmpty())
thisGrp.addPermission((String) thisGroupNode.get("permissions"));
if (!nodeData.toString().isEmpty())
thisGrp.addPermission((String) nodeData);
} else {
throw new IllegalArgumentException("Unknown type of permissions node(Should be String or List<String>) for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
throw new IllegalArgumentException("Unknown type of 'permissions' node(Should be String or List<String>) for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
}
/*
* Sort all permissions so they are in the correct order for checking.
* Sort all permissions so they are in the correct order for
* checking.
*/
thisGrp.sortPermissions();
}
//INFO NODE
// INFO NODE
nodeData = null;
try {
if (thisGroupNode.get("info") instanceof Map) {
Map<String, Object> infoNode = (Map<String, Object>) thisGroupNode.get("info");
if (infoNode != null) {
thisGrp.setVariables(infoNode);
}
} else
throw new IllegalArgumentException("Unknown entry found in Info section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
nodeData = thisGroupNode.get("info");
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid formatting found in info section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath(), ex);
throw new IllegalArgumentException("Bad format found in 'info' section for group: " + groupKey + " in file: " + groupsFile.getPath());
}
//END INFO NODE
if (nodeData == null) {
/*
* No info section was found, so leave all variables as
* defaults.
*/
GroupManager.logger.warning("The group '" + thisGrp.getName() + "' has no 'info' section!");
GroupManager.logger.warning("Using default values: " + groupsFile.getPath());
} else if (nodeData instanceof Map) {
try {
if (nodeData != null) {
thisGrp.setVariables((Map<String, Object>) nodeData);
}
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid formatting found in 'info' section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath(), ex);
}
} else
throw new IllegalArgumentException("Unknown entry found in 'info' section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
// INHERITANCE NODE
nodeData = null;
try {
nodeData = thisGroupNode.get("inheritance");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'inheritance' section for group: " + groupKey + " in file: " + groupsFile.getPath());
}
if (nodeData == null || nodeData instanceof List) {
if (nodeData == null) {
/*
* If no inheritance node is found, or it's empty
* do nothing.
*/
} else if (nodeData instanceof List) {
try {
if (thisGroupNode.get("inheritance") == null || thisGroupNode.get("inheritance") instanceof List) {
Object inheritNode = thisGroupNode.get("inheritance");
if (inheritNode == null) {
thisGroupNode.put("inheritance", new ArrayList<String>());
} else if (inheritNode instanceof List) {
List<String> groupsInh = (List<String>) inheritNode;
for (String grp : groupsInh) {
for (String grp : (List<String>) nodeData) {
if (inheritance.get(groupKey) == null) {
List<String> thisInherits = new ArrayList<String>();
inheritance.put(groupKey, thisInherits);
inheritance.put(groupKey, new ArrayList<String>());
}
inheritance.get(groupKey).add(grp);
}
}
}
}else
throw new IllegalArgumentException("Unknown entry found in inheritance section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid formatting found in inheritance section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath(), ex);
}
throw new IllegalArgumentException("Invalid formatting found in 'inheritance' section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath(), ex);
}
}
} else
throw new IllegalArgumentException("Unknown entry found in 'inheritance' section for group: " + thisGrp.getName() + " in file: " + groupsFile.getPath());
// END GROUP
}
if (ph.getDefaultGroup() == null) {
throw new IllegalArgumentException("There was no Default Group declared in file: " + groupsFile.getPath());
@ -640,7 +723,7 @@ public class WorldDataHolder {
ph.setGroupsFile(groupsFile);
ph.setTimeStampGroups(groupsFile.lastModified());
//return ph;
// return ph;
}
/**
@ -652,10 +735,10 @@ public class WorldDataHolder {
* @throws FileNotFoundException
* @throws IOException
*/
@SuppressWarnings({"rawtypes", "unchecked"})
@SuppressWarnings({ "rawtypes", "unchecked" })
protected static void loadUsers(WorldDataHolder ph, File usersFile) throws FileNotFoundException, IOException {
//READ USERS FILE
// READ USERS FILE
Yaml yamlUsers = new Yaml(new SafeConstructor());
Map<String, Object> usersRootDataNode;
if (!usersFile.exists()) {
@ -674,7 +757,8 @@ public class WorldDataHolder {
}
// PROCESS USERS FILE
Map<String, Object> allUsersNode = new HashMap<String, Object>();
Map<String, Object> allUsersNode = null;
/*
* Fetch all child nodes under the 'users' entry.
@ -682,11 +766,11 @@ public class WorldDataHolder {
try {
allUsersNode = (Map<String, Object>) usersRootDataNode.get("users");
} catch (Exception ex) {
//ex.printStackTrace();
throw new IllegalArgumentException("Your " + usersFile.getPath() + " file is invalid. See console for details.", ex);
}
// Load users if the file is NOT empty
if (allUsersNode != null) {
Iterator<String> usersItr = allUsersNode.keySet().iterator();
@ -706,30 +790,44 @@ public class WorldDataHolder {
try {
thisUserNode = (Map<String, Object>) allUsersNode.get(usersKey);
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in file: " + usersFile.getPath());
throw new IllegalArgumentException("Bad format found for user: " + usersKey + " in file: " + usersFile.getPath());
}
User thisUser = ph.createUser(usersKey);
if (thisUser == null) {
throw new IllegalArgumentException("I think this user was declared more than once: " + usersKey + " in file: " + usersFile.getPath());
}
if (thisUserNode.get("permissions") == null) {
thisUserNode.put("permissions", new ArrayList<String>());
// USER PERMISSIONS NODES
Object nodeData = null;
try {
nodeData = thisUserNode.get("permissions");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'permissions' for user: " + usersKey + " in file: " + usersFile.getPath());
}
if (nodeData == null) {
/*
* If no permissions node is found, or it's empty
* do nothing.
*/
} else {
if (thisUserNode.get("permissions") instanceof List) {
for (Object o : ((List) thisUserNode.get("permissions"))) {
if (nodeData instanceof List) {
for (Object o : ((List) nodeData)) {
/*
* Only add this permission if it's not empty
*/
if (!o.toString().isEmpty())
thisUser.addPermission(o.toString());
}
} else if (thisUserNode.get("permissions") instanceof String) {
} else if (nodeData instanceof String) {
try {
/*
* Only add this permission if it's not empty
*/
if (!thisUserNode.get("permissions").toString().isEmpty())
thisUser.addPermission(thisUserNode.get("permissions").toString());
if (!nodeData.toString().isEmpty())
thisUser.addPermission(nodeData.toString());
} catch (NullPointerException e) {
// Ignore this entry as it's null.
}
@ -737,49 +835,74 @@ public class WorldDataHolder {
thisUser.sortPermissions();
}
//SUBGROUPS LOADING
if (thisUserNode.get("subgroups") == null) {
thisUserNode.put("subgroups", new ArrayList<String>());
// SUBGROUPS NODES
nodeData = null;
try {
nodeData = thisUserNode.get("subgroups");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'subgroups' for user: " + usersKey + " in file: " + usersFile.getPath());
}
if (thisUserNode.get("subgroups") instanceof List) {
for (Object o : ((List) thisUserNode.get("subgroups"))) {
if (nodeData == null) {
/*
* If no subgroups node is found, or it's empty
* do nothing.
*/
} else if (nodeData instanceof List) {
for (Object o : ((List) nodeData)) {
Group subGrp = ph.getGroup(o.toString());
if (subGrp != null) {
thisUser.addSubGroup(subGrp);
} else {
GroupManager.logger.warning("Subgroup " + o.toString() + " not found for user " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath());
GroupManager.logger.warning("Subgroup '" + o.toString() + "' not found for user: " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath());
}
}
} else if (thisUserNode.get("subgroups") instanceof String) {
Group subGrp = ph.getGroup(thisUserNode.get("subgroups").toString());
} else if (nodeData instanceof String) {
Group subGrp = ph.getGroup(nodeData.toString());
if (subGrp != null) {
thisUser.addSubGroup(subGrp);
} else {
GroupManager.logger.warning("Subgroup " + thisUserNode.get("subgroups").toString() + " not found for user " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath());
GroupManager.logger.warning("Subgroup '" + nodeData.toString() + "' not found for user: " + thisUser.getName() + ". Ignoring entry in file: " + usersFile.getPath());
}
}
// USER INFO NODE
//USER INFO NODE
//INFO NODE
if (thisUserNode.get("info") instanceof Map) {
Map<String, Object> infoNode = (Map<String, Object>) thisUserNode.get("info");
if (infoNode != null) {
thisUser.setVariables(infoNode);
nodeData = null;
try {
nodeData = thisUserNode.get("info");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'info' section for user: " + usersKey + " in file: " + usersFile.getPath());
}
} else if (thisUserNode.get("info") != null)
throw new IllegalArgumentException("Unknown entry found in Info section for user: " + thisUser.getName() + " in file: " + usersFile.getPath());
//END INFO NODE
if (nodeData == null) {
/*
* If no info node is found, or it's empty
* do nothing.
*/
} else if (nodeData instanceof Map) {
thisUser.setVariables((Map<String, Object>) nodeData);
} else
throw new IllegalArgumentException("Unknown entry found in 'info' section for user: " + thisUser.getName() + " in file: " + usersFile.getPath());
if (thisUserNode.get("group") != null) {
Group hisGroup = ph.getGroup(thisUserNode.get("group").toString());
// END INFO NODE
// PRIMARY GROUP
nodeData = null;
try {
nodeData = thisUserNode.get("group");
} catch (Exception ex) {
throw new IllegalArgumentException("Bad format found in 'group' section for user: " + usersKey + " in file: " + usersFile.getPath());
}
if (nodeData != null) {
Group hisGroup = ph.getGroup(nodeData.toString());
if (hisGroup == null) {
GroupManager.logger.warning("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName() + ": Set to '" + ph.getDefaultGroup().getName() + "' for file: " + usersFile.getPath());
hisGroup = ph.getDefaultGroup();
//throw new IllegalArgumentException("There is no group " + thisUserNode.get("group").toString() + ", as stated for player " + thisUser.getName());
}
thisUser.setGroup(hisGroup);
} else {
@ -796,10 +919,12 @@ public class WorldDataHolder {
/**
* Write a dataHolder in a specified file
*
* @param ph
* @param groupsFile
*/
public static void writeGroups(WorldDataHolder ph, File groupsFile) {
Map<String, Object> root = new HashMap<String, Object>();
Map<String, Object> groupsMap = new HashMap<String, Object>();
@ -864,26 +989,30 @@ public class WorldDataHolder {
if (GroupManager.isLoaded())
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
/*FileWriter tx = null;
try {
tx = new FileWriter(groupsFile, false);
tx.write(yaml.dump(root));
tx.flush();
} catch (Exception e) {
} finally {
try {
tx.close();
} catch (IOException ex) {
}
}*/
/*
* FileWriter tx = null;
* try {
* tx = new FileWriter(groupsFile, false);
* tx.write(yaml.dump(root));
* tx.flush();
* } catch (Exception e) {
* } finally {
* try {
* tx.close();
* } catch (IOException ex) {
* }
* }
*/
}
/**
* Write a dataHolder in a specified file
*
* @param ph
* @param usersFile
*/
public static void writeUsers(WorldDataHolder ph, File usersFile) {
Map<String, Object> root = new HashMap<String, Object>();
Map<String, Object> usersMap = new HashMap<String, Object>();
@ -902,7 +1031,7 @@ public class WorldDataHolder {
} else {
aUserMap.put("group", user.getGroup().getName());
}
//USER INFO NODE - BETA
// USER INFO NODE - BETA
if (user.getVariables().getSize() > 0) {
Map<String, Object> infoMap = new HashMap<String, Object>();
aUserMap.put("info", infoMap);
@ -910,12 +1039,12 @@ public class WorldDataHolder {
infoMap.put(infoKey, user.getVariables().getVarObject(infoKey));
}
}
//END USER INFO NODE - BETA
// END USER INFO NODE - BETA
aUserMap.put("permissions", user.getPermissionList());
//SUBGROUPS NODE - BETA
// SUBGROUPS NODE - BETA
aUserMap.put("subgroups", user.subGroupListStringCopy());
//END SUBGROUPS NODE - BETA
// END SUBGROUPS NODE - BETA
}
if (!root.isEmpty()) {
@ -940,38 +1069,46 @@ public class WorldDataHolder {
if (GroupManager.isLoaded())
GroupManagerEventHandler.callEvent(GMSystemEvent.Action.SAVED);
/*FileWriter tx = null;
try {
tx = new FileWriter(usersFile, false);
tx.write(yaml.dump(root));
tx.flush();
} catch (Exception e) {
} finally {
try {
tx.close();
} catch (IOException ex) {
}
}*/
/*
* FileWriter tx = null;
* try {
* tx = new FileWriter(usersFile, false);
* tx.write(yaml.dump(root));
* tx.flush();
* } catch (Exception e) {
* } finally {
* try {
* tx.close();
* } catch (IOException ex) {
* }
* }
*/
}
/**
* Don't use this. Unless you want to make this plugin to interact with original Nijikokun Permissions
* This method is supposed to make the original one reload the file, and propagate the changes made here.
* Don't use this. Unless you want to make this plugin to interact with
* original Nijikokun Permissions
* This method is supposed to make the original one reload the file, and
* propagate the changes made here.
*
* Prefer to use the AnjoCaido's fake version of Nijikokun's Permission plugin.
* The AnjoCaido's Permission can propagate the changes made on this plugin instantly,
* Prefer to use the AnjoCaido's fake version of Nijikokun's Permission
* plugin.
* The AnjoCaido's Permission can propagate the changes made on this plugin
* instantly,
* without need to save the file.
*
* @param server the server that holds the plugin
* @deprecated it is not used anymore... unless if you use original Permissions
* @deprecated it is not used anymore... unless if you use original
* Permissions
*/
@Deprecated
public static void reloadOldPlugins(Server server) {
// Only reload permissions
PluginManager pm = server.getPluginManager();
Plugin[] plugins = pm.getPlugins();
for (int i = 0; i < plugins.length; i++) {
//plugins[i].getConfiguration().load();
// plugins[i].getConfiguration().load();
try {
plugins[i].getClass().getMethod("setupPermissions").invoke(plugins[i]);
} catch (Exception ex) {
@ -984,6 +1121,7 @@ public class WorldDataHolder {
* @return the permissionsHandler
*/
public AnjoPermissionsHandler getPermissionsHandler() {
if (permissionsHandler == null) {
permissionsHandler = new AnjoPermissionsHandler(this);
}
@ -994,6 +1132,7 @@ public class WorldDataHolder {
* @param haveUsersChanged the haveUsersChanged to set
*/
public void setUsersChanged(boolean haveUsersChanged) {
users.setUsersChanged(haveUsersChanged);
}
@ -1002,6 +1141,7 @@ public class WorldDataHolder {
* @return true if any user data has changed
*/
public boolean haveUsersChanged() {
if (users.HaveUsersChanged()) {
return true;
}
@ -1017,6 +1157,7 @@ public class WorldDataHolder {
* @param setGroupsChanged the haveGroupsChanged to set
*/
public void setGroupsChanged(boolean setGroupsChanged) {
groups.setGroupsChanged(setGroupsChanged);
}
@ -1025,6 +1166,7 @@ public class WorldDataHolder {
* @return true if any group data has changed.
*/
public boolean haveGroupsChanged() {
if (groups.HaveGroupsChanged()) {
return true;
}
@ -1040,6 +1182,7 @@ public class WorldDataHolder {
*
*/
public void removeUsersChangedFlag() {
setUsersChanged(false);
for (User u : getUsers().values()) {
u.flagAsSaved();
@ -1050,6 +1193,7 @@ public class WorldDataHolder {
*
*/
public void removeGroupsChangedFlag() {
setGroupsChanged(false);
for (Group g : getGroups().values()) {
g.flagAsSaved();
@ -1060,6 +1204,7 @@ public class WorldDataHolder {
* @return the usersFile
*/
public File getUsersFile() {
return users.getUsersFile();
}
@ -1067,6 +1212,7 @@ public class WorldDataHolder {
* @param file the usersFile to set
*/
public void setUsersFile(File file) {
users.setUsersFile(file);
}
@ -1074,6 +1220,7 @@ public class WorldDataHolder {
* @return the groupsFile
*/
public File getGroupsFile() {
return groups.getGroupsFile();
}
@ -1081,6 +1228,7 @@ public class WorldDataHolder {
* @param file the groupsFile to set
*/
public void setGroupsFile(File file) {
groups.setGroupsFile(file);
}
@ -1088,6 +1236,7 @@ public class WorldDataHolder {
* @return the name
*/
public String getName() {
return name;
}
@ -1095,13 +1244,16 @@ public class WorldDataHolder {
* Resets Groups.
*/
public void resetGroups() {
//setDefaultGroup(null);
// setDefaultGroup(null);
groups.setGroups(new HashMap<String, Group>());
}
/**
* Resets Users
*/
public void resetUsers() {
users.setUsers(new HashMap<String, User>());
}
@ -1109,12 +1261,15 @@ public class WorldDataHolder {
* @return the groups
*/
public Map<String, Group> getGroups() {
return groups.getGroups();
}
/**
* @return the users
*/
public Map<String, User> getUsers() {
return users.getUsers();
}
@ -1122,24 +1277,31 @@ public class WorldDataHolder {
* @return the groups
*/
public GroupsDataHolder getGroupsObject() {
return groups;
}
/**
* @param groupsDataHolder the GroupsDataHolder to set
*/
public void setGroupsObject(GroupsDataHolder groupsDataHolder) {
groups = groupsDataHolder;
}
/**
* @return the users
*/
public UsersDataHolder getUsersObject() {
return users;
}
/**
* @param usersDataHolder the UsersDataHolder to set
*/
public void setUsersObject(UsersDataHolder usersDataHolder) {
users = usersDataHolder;
}
@ -1147,12 +1309,15 @@ public class WorldDataHolder {
* @return the timeStampGroups
*/
public long getTimeStampGroups() {
return groups.getTimeStampGroups();
}
/**
* @return the timeStampUsers
*/
public long getTimeStampUsers() {
return users.getTimeStampUsers();
}
@ -1160,16 +1325,20 @@ public class WorldDataHolder {
* @param timeStampGroups the timeStampGroups to set
*/
protected void setTimeStampGroups(long timeStampGroups) {
groups.setTimeStampGroups(timeStampGroups);
}
/**
* @param timeStampUsers the timeStampUsers to set
*/
protected void setTimeStampUsers(long timeStampUsers) {
users.setTimeStampUsers(timeStampUsers);
}
public void setTimeStamps() {
if (getGroupsFile() != null)
setTimeStampGroups(getGroupsFile().lastModified());
if (getUsersFile() != null)

View file

@ -46,7 +46,6 @@ public class WorldsHolder {
private Map<String, String> mirrorsGroup = new HashMap<String, String>();
private Map<String, String> mirrorsUser = new HashMap<String, String>();
//private OverloadedWorldHolder defaultWorld;
private String serverDefaultWorldName;
private GroupManager plugin;
private File worldsFolder;
@ -56,6 +55,7 @@ public class WorldsHolder {
* @param plugin
*/
public WorldsHolder(GroupManager plugin) {
this.plugin = plugin;
// Setup folders and check files exist for the primary world
verifyFirstRun();
@ -66,6 +66,7 @@ public class WorldsHolder {
}
private void initialLoad() {
// load the initial world
initialWorldLoading();
// Configure and load any mirrors and additional worlds as defined in config.yml
@ -75,6 +76,7 @@ public class WorldsHolder {
}
private void initialWorldLoading() {
//Load the default world
loadWorld(serverDefaultWorldName);
//defaultWorld = getUpdatedWorldData(serverDefaultWorldName);
@ -87,9 +89,8 @@ 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())
if ((!worldsData.containsKey(world.getName().toLowerCase())) && ((!mirrorsGroup.containsKey(world.getName().toLowerCase())) || (!mirrorsUser.containsKey(world.getName().toLowerCase()))))
setupWorldFolder(world.getName());
/*
* Loop over all folders within the worlds folder
@ -103,12 +104,11 @@ public class WorldsHolder {
* don't load any worlds which are already loaded
* or fully mirrored worlds that don't need data.
*/
if (!worldsData.containsKey(folder.getName().toLowerCase())
&& ((!mirrorsGroup.containsKey(folder.getName().toLowerCase()))
|| (!mirrorsUser.containsKey(folder.getName().toLowerCase())))) {
if (!worldsData.containsKey(folder.getName().toLowerCase()) && ((!mirrorsGroup.containsKey(folder.getName().toLowerCase())) || (!mirrorsUser.containsKey(folder.getName().toLowerCase())))) {
/*
* Call setupWorldFolder to check case sensitivity
* and convert to lower case, before we attempt to load this world.
* and convert to lower case, before we attempt to load this
* world.
*/
setupWorldFolder(folder.getName());
loadWorld(folder.getName().toLowerCase());
@ -120,6 +120,7 @@ public class WorldsHolder {
@SuppressWarnings("rawtypes")
public void mirrorSetUp() {
mirrorsGroup.clear();
mirrorsUser.clear();
Map<String, Object> mirrorsMap = plugin.getGMConfig().getMirrorsMap();
@ -199,7 +200,7 @@ public class WorldsHolder {
}
// Create a datasource for any worlds not already loaded
for (String world : mirroredWorlds){
for (String world : mirroredWorlds) {
if (!worldsData.containsKey(world.toLowerCase())) {
setupWorldFolder(world);
loadWorld(world, true);
@ -212,6 +213,7 @@ public class WorldsHolder {
*
*/
public void reloadAll() {
// Load global groups
GroupManager.getGlobalGroups().load();
@ -235,6 +237,7 @@ public class WorldsHolder {
* @param worldName
*/
public void reloadWorld(String worldName) {
if (!mirrorsGroup.containsKey(worldName.toLowerCase()))
getWorldData(worldName).reloadGroups();
if (!mirrorsUser.containsKey(worldName.toLowerCase()))
@ -246,6 +249,7 @@ public class WorldsHolder {
* (call this function to auto overwrite files)
*/
public void saveChanges() {
saveChanges(true);
}
@ -253,6 +257,7 @@ public class WorldsHolder {
*
*/
public void saveChanges(boolean overwrite) {
ArrayList<WorldDataHolder> alreadyDone = new ArrayList<WorldDataHolder>();
Tasks.removeOldFiles(plugin, plugin.getBackupFolder());
@ -278,7 +283,7 @@ public class WorldsHolder {
if (w.haveGroupsChanged()) {
if (overwrite || (!overwrite && (w.getTimeStampGroups() >= w.getGroupsFile().lastModified()))) {
// Backup Groups file
backupFile(w,true);
backupFile(w, true);
WorldDataHolder.writeGroups(w, w.getGroupsFile());
//w.removeGroupsChangedFlag();
@ -292,7 +297,7 @@ public class WorldsHolder {
if (w.getTimeStampGroups() < w.getGroupsFile().lastModified()) {
System.out.print("Newer Groups file found (Loading changes)!");
// Backup Groups file
backupFile(w,true);
backupFile(w, true);
w.reloadGroups();
}
}
@ -300,7 +305,7 @@ public class WorldsHolder {
if (w.haveUsersChanged()) {
if (overwrite || (!overwrite && (w.getTimeStampUsers() >= w.getUsersFile().lastModified()))) {
// Backup Users file
backupFile(w,false);
backupFile(w, false);
WorldDataHolder.writeUsers(w, w.getUsersFile());
//w.removeUsersChangedFlag();
@ -314,7 +319,7 @@ public class WorldsHolder {
if (w.getTimeStampUsers() < w.getUsersFile().lastModified()) {
System.out.print("Newer Users file found (Loading changes)!");
// Backup Users file
backupFile(w,false);
backupFile(w, false);
w.reloadUsers();
}
}
@ -324,6 +329,7 @@ public class WorldsHolder {
/**
* Backup the Groups/Users file
*
* @param w
* @param groups
*/
@ -349,6 +355,7 @@ public class WorldsHolder {
* @return OverloadedWorldHolder
*/
public OverloadedWorldHolder getWorldData(String worldName) {
String worldNameLowered = worldName.toLowerCase();
// Find this worlds data
@ -361,12 +368,14 @@ public class WorldsHolder {
}
/**
* Get the requested world data and update it's dataSource to be relevant for this world
* Get the requested world data and update it's dataSource to be relevant
* for this world
*
* @param worldName
* @return updated world holder
*/
private OverloadedWorldHolder getUpdatedWorldData(String worldName) {
String worldNameLowered = worldName.toLowerCase();
if (worldsData.containsKey(worldNameLowered)) {
@ -386,6 +395,7 @@ public class WorldsHolder {
* @return null if matching returned no player, or more than one.
*/
public OverloadedWorldHolder getWorldDataByPlayerName(String playerName) {
List<Player> matchPlayer = plugin.getServer().matchPlayer(playerName);
if (matchPlayer.size() == 1) {
return getWorldData(matchPlayer.get(0));
@ -401,34 +411,41 @@ public class WorldsHolder {
* @return OverloadedWorldHolder
*/
public OverloadedWorldHolder getWorldData(Player player) {
return getWorldData(player.getWorld().getName());
}
/**
* It does getWorld(worldName).getPermissionsHandler()
*
* @param worldName
* @return AnjoPermissionsHandler
*/
public AnjoPermissionsHandler getWorldPermissions(String worldName) {
return getWorldData(worldName).getPermissionsHandler();
}
/**
* Returns the PermissionsHandler for this player data
*
* @param player
* @return AnjoPermissionsHandler
*/
public AnjoPermissionsHandler getWorldPermissions(Player player) {
return getWorldData(player).getPermissionsHandler();
}
/**
* Id does getWorldDataByPlayerName(playerName).
* If it doesnt return null, it will return result.getPermissionsHandler()
*
* @param playerName
* @return null if the player matching gone wrong.
*/
public AnjoPermissionsHandler getWorldPermissionsByPlayerName(String playerName) {
WorldDataHolder dh = getWorldDataByPlayerName(playerName);
if (dh != null) {
return dh.getPermissionsHandler();
@ -450,6 +467,7 @@ public class WorldsHolder {
}
public void setupWorldFolder(String worldName) {
String worldNameLowered = worldName.toLowerCase();
worldsFolder = new File(plugin.getDataFolder(), "worlds");
@ -543,15 +561,18 @@ public class WorldsHolder {
*
* Load a world from file.
* If it already been loaded, summon reload method from dataHolder.
*
* @param worldName
*/
public void loadWorld(String worldName) {
loadWorld(worldName, false);
}
/**
* Load a world from file.
* If it already been loaded, summon reload method from dataHolder.
*
* @param worldName
*/
public void loadWorld(String worldName, Boolean isMirror) {
@ -567,8 +588,8 @@ public class WorldsHolder {
if ((isMirror) || (thisWorldFolder.exists() && thisWorldFolder.isDirectory())) {
// Setup file handles, if not mirrored
File groupsFile = (mirrorsGroup.containsKey(worldNameLowered))? null : new File(thisWorldFolder, "groups.yml");
File usersFile = (mirrorsUser.containsKey(worldNameLowered))? null : new File(thisWorldFolder, "users.yml");
File groupsFile = (mirrorsGroup.containsKey(worldNameLowered)) ? null : new File(thisWorldFolder, "groups.yml");
File usersFile = (mirrorsUser.containsKey(worldNameLowered)) ? null : new File(thisWorldFolder, "users.yml");
if ((groupsFile != null) && (!groupsFile.exists())) {
throw new IllegalArgumentException("Groups file for world '" + worldName + "' doesnt exist: " + groupsFile.getPath());
@ -618,6 +639,7 @@ public class WorldsHolder {
* @return true if world is loaded or mirrored. false if not listed
*/
public boolean isInList(String worldName) {
if (worldsData.containsKey(worldName.toLowerCase()) || mirrorsGroup.containsKey(worldName.toLowerCase()) || mirrorsUser.containsKey(worldName.toLowerCase())) {
return true;
}
@ -631,6 +653,7 @@ public class WorldsHolder {
* @return true if it has its own holder. false if not.
*/
public boolean hasOwnData(String worldName) {
if (worldsData.containsKey(worldName.toLowerCase()) && (!mirrorsGroup.containsKey(worldName.toLowerCase()) || !mirrorsUser.containsKey(worldName.toLowerCase()))) {
return true;
}
@ -641,6 +664,7 @@ public class WorldsHolder {
* @return the defaultWorld
*/
public OverloadedWorldHolder getDefaultWorld() {
return getUpdatedWorldData(serverDefaultWorldName);
}
@ -651,6 +675,7 @@ public class WorldsHolder {
* @return ArrayList<OverloadedWorldHolder> of all loaded worlds
*/
public ArrayList<OverloadedWorldHolder> allWorldsDataList() {
ArrayList<OverloadedWorldHolder> list = new ArrayList<OverloadedWorldHolder>();
for (OverloadedWorldHolder data : worldsData.values()) {
if ((!list.contains(data)) && (!mirrorsGroup.containsKey(data.getName().toLowerCase()) || !mirrorsUser.containsKey(data.getName().toLowerCase()))) {

View file

@ -6,7 +6,6 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
/**
* @author ElgarL
*
@ -20,10 +19,12 @@ public class GMGroupEvent extends Event {
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@ -36,6 +37,7 @@ public class GMGroupEvent extends Event {
protected Action action;
public GMGroupEvent(Group group, Action action) {
super();
this.group = group;
@ -44,30 +46,30 @@ public class GMGroupEvent extends Event {
}
public GMGroupEvent(String groupName, Action action) {
super();
this.groupName = groupName;
this.action = action;
}
public Action getAction(){
public Action getAction() {
return this.action;
}
public Group getGroup() {
return group;
}
public String getGroupName() {
return groupName;
}
public enum Action {
GROUP_PERMISSIONS_CHANGED,
GROUP_INHERITANCE_CHANGED,
GROUP_INFO_CHANGED,
GROUP_ADDED,
GROUP_REMOVED,
GROUP_PERMISSIONS_CHANGED, GROUP_INHERITANCE_CHANGED, GROUP_INFO_CHANGED, GROUP_ADDED, GROUP_REMOVED,
}
public void schedule(final GMGroupEvent event) {
@ -76,6 +78,7 @@ public class GMGroupEvent extends Event {
@Override
public void run() {
Bukkit.getServer().getPluginManager().callEvent(event);
}
}, 1) == -1)

View file

@ -5,7 +5,6 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
/**
* @author ElgarL
*
@ -19,10 +18,12 @@ public class GMSystemEvent extends Event {
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@ -31,20 +32,19 @@ public class GMSystemEvent extends Event {
protected Action action;
public GMSystemEvent(Action action) {
super();
this.action = action;
}
public Action getAction(){
public Action getAction() {
return this.action;
}
public enum Action {
RELOADED,
SAVED,
DEFAULT_GROUP_CHANGED,
VALIDATE_TOGGLE,
RELOADED, SAVED, DEFAULT_GROUP_CHANGED, VALIDATE_TOGGLE,
}
public void schedule(final GMSystemEvent event) {
@ -53,6 +53,7 @@ public class GMSystemEvent extends Event {
@Override
public void run() {
Bukkit.getServer().getPluginManager().callEvent(event);
}
}, 1) == -1)

View file

@ -6,7 +6,6 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
/**
* @author ElgarL
*
@ -20,10 +19,12 @@ public class GMUserEvent extends Event {
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@ -36,6 +37,7 @@ public class GMUserEvent extends Event {
protected Action action;
public GMUserEvent(User user, Action action) {
super();
this.user = user;
@ -44,32 +46,30 @@ public class GMUserEvent extends Event {
}
public GMUserEvent(String userName, Action action) {
super();
this.userName = userName;
this.action = action;
}
public Action getAction(){
public Action getAction() {
return this.action;
}
public User getUser() {
return user;
}
public String getUserName() {
return userName;
}
public enum Action {
USER_PERMISSIONS_CHANGED,
USER_INHERITANCE_CHANGED,
USER_INFO_CHANGED,
USER_GROUP_CHANGED,
USER_SUBGROUP_CHANGED,
USER_ADDED,
USER_REMOVED,
USER_PERMISSIONS_CHANGED, USER_INHERITANCE_CHANGED, USER_INFO_CHANGED, USER_GROUP_CHANGED, USER_SUBGROUP_CHANGED, USER_ADDED, USER_REMOVED,
}
public void schedule(final GMUserEvent event) {
@ -78,6 +78,7 @@ public class GMUserEvent extends Event {
@Override
public void run() {
Bukkit.getServer().getPluginManager().callEvent(event);
}
}, 1) == -1)

View file

@ -6,7 +6,6 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldInitEvent;
/**
* @author ElgarL
*
@ -18,16 +17,19 @@ public class GMWorldListener implements Listener {
private final GroupManager plugin;
public GMWorldListener(GroupManager instance) {
plugin = instance;
registerEvents();
}
private void registerEvents() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onWorldInit(WorldInitEvent event) {
String worldName = event.getWorld().getName();
if (GroupManager.isLoaded() && !plugin.getWorldsHolder().isInList(worldName)) {

View file

@ -3,7 +3,6 @@ package org.anjocaido.groupmanager.events;
import org.anjocaido.groupmanager.data.Group;
import org.anjocaido.groupmanager.data.User;
/**
* @author ElgarL
*
@ -13,30 +12,42 @@ import org.anjocaido.groupmanager.data.User;
public class GroupManagerEventHandler {
protected static void callEvent(GMGroupEvent event) {
event.schedule(event);
}
protected static void callEvent(GMUserEvent event) {
event.schedule(event);
}
protected static void callEvent(GMSystemEvent event) {
event.schedule(event);
}
public static void callEvent(Group group, GMGroupEvent.Action action) {
callEvent(new GMGroupEvent(group, action));
}
public static void callEvent(String groupName, GMGroupEvent.Action action) {
callEvent(new GMGroupEvent(groupName, action));
}
public static void callEvent(User user, GMUserEvent.Action action) {
callEvent(new GMUserEvent(user, action));
}
public static void callEvent(String userName, GMUserEvent.Action action) {
callEvent(new GMUserEvent(userName, action));
}
public static void callEvent(GMSystemEvent.Action action) {
callEvent(new GMSystemEvent(action));
}
}

View file

@ -16,7 +16,6 @@ import org.anjocaido.groupmanager.data.Group;
import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
import org.anjocaido.groupmanager.data.User;
import org.anjocaido.groupmanager.utils.PermissionCheckResult;
import org.anjocaido.groupmanager.utils.PermissionCheckResult.Type;
import org.bukkit.entity.Player;
/**
@ -27,7 +26,7 @@ import org.bukkit.entity.Player;
*
* It holds permissions only for one single world.
*
* @author gabrielcouto
* @author gabrielcouto, ElgarL
*/
public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@ -39,6 +38,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @param holder
*/
public AnjoPermissionsHandler(WorldDataHolder holder) {
ph = holder;
}
@ -51,6 +51,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean has(Player player, String permission) {
return permission(player, permission);
}
@ -63,6 +64,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean permission(Player player, String permission) {
return checkUserPermission(ph.getUser(player.getName()).updatePlayer(player), permission);
}
@ -74,6 +76,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return true if the player has the permission
*/
public boolean permission(String playerName, String permission) {
return checkUserPermission(ph.getUser(playerName), permission);
}
@ -85,6 +88,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String getGroup(String userName) {
return ph.getUser(userName).getGroup().getName();
}
@ -97,6 +101,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public List<String> getAllPlayersPermissions(String userName) {
List<String> perms = new ArrayList<String>();
perms.addAll(getAllPlayersPermissions(userName, true));
@ -143,8 +148,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
boolean negated = (perm.startsWith("-"));
// Perm doesn't already exists and there is no negation for it
// or It's a negated perm where a normal perm doesn't exists (don't allow inheritance to negate higher perms)
if ((!negated && !playerPermArray.contains(perm) && !playerPermArray.contains("-" + perm))
|| (negated && !playerPermArray.contains(perm.substring(1)) && !playerPermArray.contains("-" + perm)))
if ((!negated && !playerPermArray.contains(perm) && !playerPermArray.contains("-" + perm)) || (negated && !playerPermArray.contains(perm.substring(1)) && !playerPermArray.contains("-" + perm)))
playerPermArray.add(perm);
}
}
@ -155,7 +159,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
return playerPermArray;
}
private Set<String> populatePerms (List<String> permsList, boolean includeChildren) {
private Set<String> populatePerms(List<String> permsList, boolean includeChildren) {
// Create a new array so it's modifiable.
List<String> perms = new ArrayList<String>(permsList);
@ -186,7 +190,8 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
/**
* Process child nodes if required,
* or this is a negated node AND we used * to include all permissions,
* or this is a negated node AND we used * to include all
* permissions,
* in which case we need to remove all children of that node.
*/
if ((includeChildren) || (negated && allPerms)) {
@ -236,6 +241,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean inGroup(String name, String group) {
if (hasGroupInInheritance(ph.getUser(name).getGroup(), group)) {
return true;
}
@ -326,6 +332,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String getGroupPrefix(String groupName) {
Group g = ph.getGroup(groupName);
if (g == null) {
return "";
@ -341,6 +348,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String getGroupSuffix(String groupName) {
Group g = ph.getGroup(groupName);
if (g == null) {
return "";
@ -357,6 +365,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean canGroupBuild(String groupName) {
Group g = ph.getGroup(groupName);
if (g == null) {
return false;
@ -374,6 +383,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String getGroupPermissionString(String groupName, String variable) {
Group start = ph.getGroup(groupName);
if (start == null) {
return null;
@ -395,6 +405,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public int getGroupPermissionInteger(String groupName, String variable) {
Group start = ph.getGroup(groupName);
if (start == null) {
return -1;
@ -416,6 +427,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean getGroupPermissionBoolean(String group, String variable) {
Group start = ph.getGroup(group);
if (start == null) {
return false;
@ -437,6 +449,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public double getGroupPermissionDouble(String group, String variable) {
Group start = ph.getGroup(group);
if (start == null) {
return -1;
@ -457,6 +470,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String getUserPermissionString(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return "";
@ -473,6 +487,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public int getUserPermissionInteger(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return -1;
@ -489,6 +504,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean getUserPermissionBoolean(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return false;
@ -505,6 +521,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public double getUserPermissionDouble(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return -1;
@ -523,6 +540,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String getPermissionString(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return "";
@ -562,6 +580,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public int getPermissionInteger(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return -1;
@ -601,6 +620,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public boolean getPermissionBoolean(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return false;
@ -640,6 +660,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public double getPermissionDouble(String user, String variable) {
User auser = ph.getUser(user);
if (auser == null) {
return -1.0D;
@ -676,6 +697,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return PermissionCheckResult
*/
public PermissionCheckResult checkUserOnlyPermission(User user, String permission) {
user.sortPermissions();
PermissionCheckResult result = new PermissionCheckResult();
result.askedPermission = permission;
@ -699,6 +721,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return the node if permission is found. if not found, return null
*/
public PermissionCheckResult checkGroupOnlyPermission(Group group, String permission) {
group.sortPermissions();
PermissionCheckResult result = new PermissionCheckResult();
result.owner = group;
@ -721,6 +744,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return true if permission was found. false if not, or was negated.
*/
public boolean checkUserPermission(User user, String permission) {
PermissionCheckResult result = checkFullGMPermission(user, permission, true);
if (result.resultType == PermissionCheckResult.Type.EXCEPTION || result.resultType == PermissionCheckResult.Type.FOUND) {
return true;
@ -752,6 +776,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return PermissionCheckResult
*/
public PermissionCheckResult checkFullGMPermission(User user, String targetPermission, Boolean checkBukkit) {
PermissionCheckResult result = new PermissionCheckResult();
result.accessLevel = targetPermission;
result.resultType = PermissionCheckResult.Type.NOTFOUND;
@ -798,37 +823,18 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
return result;
}
/**
* Verifies if a given group has a variable. Including it's inheritance.
*
* it redirects to the other method now. This one was deprecated, and will
* be gone in a future release.
*
* @param start
* @param variable
* @param alreadyChecked
* @return returns the closest inherited group with the variable.
* @deprecated use now nextGroupWithVariable(Group start, String
* targetVariable)
*/
@Deprecated
public Group nextGroupWithVariable(Group start, String variable, List<Group> alreadyChecked) {
return nextGroupWithVariable(start, variable);
}
/**
* Returns the next group, including inheritance, which contains that
* variable name.
*
* It does Breadth-first search
*
* @param start
* the starting group to look for
* @param targetVariable
* the variable name
* @param start the starting group to look for
* @param targetVariable the variable name
* @return The group if found. Null if not.
*/
public Group nextGroupWithVariable(Group start, String targetVariable) {
if (start == null || targetVariable == null) {
return null;
}
@ -852,39 +858,18 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
return null;
}
/**
* Check if given group inherits another group.
*
* redirected to the other method. this is deprecated now. and will be gone
* in the future releases.
*
* @param start
* The group to start the search.
* @param askedGroup
* Name of the group you're looking for
* @param alreadyChecked
* groups to ignore(pass null on it, please)
* @return true if it inherits the group.
* @deprecated prefer using hasGroupInInheritance(Group start, String
* askedGroup)
*/
@Deprecated
public boolean searchGroupInInheritance(Group start, String askedGroup, List<Group> alreadyChecked) {
return hasGroupInInheritance(start, askedGroup);
}
/**
* Check if given group inherits another group.
*
* It does Breadth-first search
*
* @param start
* The group to start the search.
* @param askedGroup
* Name of the group you're looking for
* @param start The group to start the search.
* @param askedGroup Name of the group you're looking for
* @return true if it inherits the group.
*/
public boolean hasGroupInInheritance(Group start, String askedGroup) {
if (start == null || askedGroup == null) {
return false;
}
@ -908,25 +893,6 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
return false;
}
/**
* Check if the group has given permission. Including it's inheritance
*
* @param start
* @param permission
* @param alreadyChecked
* @return true if PermissionCheckResult is EXCEPTION or FOUND
* @deprecated use the other checkGroupPermissionWithInheritance for
* everything
*/
@Deprecated
public boolean checkGroupPermissionWithInheritance(Group start, String permission, List<Group> alreadyChecked) {
PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
if (result.resultType.equals(Type.EXCEPTION) || result.resultType.equals(Type.FOUND)) {
return true;
}
return false;
}
/**
* Returns the result of permission check. Including inheritance. If found
* anything, the PermissionCheckResult that retuns will include the Group
@ -942,6 +908,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return PermissionCheckResult
*/
public PermissionCheckResult checkGroupPermissionWithInheritance(Group start, String targetPermission) {
if (start == null || targetPermission == null) {
return null;
}
@ -970,42 +937,6 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
return result;
}
/**
* It uses checkGroupPermissionWithInheritance and cast the owner to Group
* type if result type was EXCEPTION or FOUND.
*
* @param start
* @param permission
* @param alreadyChecked
* @return the group that passed on test. null if no group passed.
* @deprecated use checkGroupPermissionWithInheritance for everything now.
*/
@Deprecated
public Group nextGroupWithPermission(Group start, String permission, List<Group> alreadyChecked) {
PermissionCheckResult result = checkGroupPermissionWithInheritance(start, permission);
if (result.resultType.equals(Type.EXCEPTION) || result.resultType.equals(Type.FOUND)) {
return (Group) checkGroupPermissionWithInheritance(start, permission).owner;
}
return null;
}
/**
* Return whole list of names of groups in a inheritance chain. Including a
* starting group.
*
* it now redirects to the other method. but get away from this one, it will
* disappear in a future release.
*
* @param start
* @param alreadyChecked
* @return the group that passed on test. null if no group passed.
* @deprecated use the other method with same name, instead
*/
@Deprecated
public ArrayList<String> listAllGroupsInherited(Group start, ArrayList<String> alreadyChecked) {
return listAllGroupsInherited(start);
}
/**
* Return whole list of names of groups in a inheritance chain. Including a
* starting group.
@ -1016,6 +947,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return the group that passed on test. null if no group passed.
*/
public ArrayList<String> listAllGroupsInherited(Group start) {
if (start == null) {
return null;
}
@ -1055,6 +987,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
* @return PermissionCheckResult.Type
*/
public PermissionCheckResult.Type comparePermissionString(String userAccessLevel, String fullPermissionName) {
int userAccessLevelLength;
if (userAccessLevel == null || fullPermissionName == null || fullPermissionName.length() == 0 || (userAccessLevelLength = userAccessLevel.length()) == 0) {
return PermissionCheckResult.Type.NOTFOUND;
@ -1080,12 +1013,9 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
}
if (userAccessLevel.charAt(userAccessLevel.length() - 1) == '*') {
return userAccessLevel.regionMatches(true, userAccessLevelOffset, fullPermissionName, fullPermissionNameOffset, userAccessLevelLength - userAccessLevelOffset - 1) ?
result : PermissionCheckResult.Type.NOTFOUND;
return userAccessLevel.regionMatches(true, userAccessLevelOffset, fullPermissionName, fullPermissionNameOffset, userAccessLevelLength - userAccessLevelOffset - 1) ? result : PermissionCheckResult.Type.NOTFOUND;
} else {
return userAccessLevel.regionMatches(true, userAccessLevelOffset, fullPermissionName, fullPermissionNameOffset,
Math.max(userAccessLevelLength - userAccessLevelOffset, fullPermissionName.length() - fullPermissionNameOffset)) ?
result : PermissionCheckResult.Type.NOTFOUND;
return userAccessLevel.regionMatches(true, userAccessLevelOffset, fullPermissionName, fullPermissionNameOffset, Math.max(userAccessLevelLength - userAccessLevelOffset, fullPermissionName.length() - fullPermissionNameOffset)) ? result : PermissionCheckResult.Type.NOTFOUND;
}
}
@ -1099,6 +1029,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public String[] getGroups(String userName) {
ArrayList<String> allGroups = listAllGroupsInherited(ph.getUser(userName).getGroup());
for (Group subg : ph.getUser(userName).subGroupListCopy()) {
allGroups.addAll(listAllGroupsInherited(subg));
@ -1120,6 +1051,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@SuppressWarnings("unused")
private Group breadthFirstSearch(Group start, String targerPermission) {
if (start == null || targerPermission == null) {
return null;
}
@ -1149,11 +1081,13 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Override
public Group getDefaultGroup() {
return ph.getDefaultGroup();
}
@Override
public String getInfoString(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1171,6 +1105,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Override
public int getInfoInteger(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1188,6 +1123,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Override
public double getInfoDouble(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1206,6 +1142,7 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Override
public boolean getInfoBoolean(String entryName, String path, boolean isGroup) {
if (isGroup) {
Group data = ph.getGroup(entryName);
if (data == null) {
@ -1223,21 +1160,25 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
@Override
public void addUserInfo(String name, String path, Object data) {
ph.getUser(name).getVariables().addVar(path, data);
}
@Override
public void removeUserInfo(String name, String path) {
ph.getUser(name).getVariables().removeVar(path);
}
@Override
public void addGroupInfo(String name, String path, Object data) {
ph.getGroup(name).getVariables().addVar(path, data);
}
@Override
public void removeGroupInfo(String name, String path) {
ph.getGroup(name).getVariables().removeVar(path);
}
}

View file

@ -1,18 +1,19 @@
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
package org.anjocaido.groupmanager.permissions;
@ -47,7 +48,6 @@ import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.PluginManager;
/**
*
* BukkitPermissions overrides to force GM reponses to Superperms
@ -67,6 +67,7 @@ public class BukkitPermissions {
* @return the player_join
*/
public boolean isPlayer_join() {
return player_join;
}
@ -74,6 +75,7 @@ public class BukkitPermissions {
* @param player_join the player_join to set
*/
public void setPlayer_join(boolean player_join) {
this.player_join = player_join;
}
@ -92,6 +94,7 @@ public class BukkitPermissions {
}
public BukkitPermissions(GroupManager plugin) {
this.plugin = plugin;
this.collectPermissions();
this.registerEvents();
@ -101,14 +104,15 @@ public class BukkitPermissions {
}
private void registerEvents() {
PluginManager manager = plugin.getServer().getPluginManager();
manager.registerEvents(new PlayerEvents(), plugin);
manager.registerEvents(new BukkitEvents(), plugin);
}
public void collectPermissions() {
registeredPermissions.clear();
for (Permission perm : Bukkit.getPluginManager().getPermissions()) {
@ -118,18 +122,20 @@ public class BukkitPermissions {
}
public void updatePermissions(Player player) {
this.updatePermissions(player, null);
}
/**
* Push all permissions which are registered with GM for this player, on this world to Bukkit
* Push all permissions which are registered with GM for this player, on
* this world to Bukkit
* and make it update for the child nodes.
*
* @param player
* @param world
*/
public void updatePermissions(Player player, String world) {
if (player == null || !GroupManager.isLoaded()) {
return;
}
@ -159,11 +165,12 @@ public class BukkitPermissions {
Boolean value = false;
for (String permission : playerPermArray) {
value = (!permission.startsWith("-"));
newPerms.put((value? permission : permission.substring(1)), value);
newPerms.put((value ? permission : permission.substring(1)), value);
}
/**
* This is put in place until such a time as Bukkit pull 466 is implemented
* This is put in place until such a time as Bukkit pull 466 is
* implemented
* https://github.com/Bukkit/Bukkit/pull/466
*/
try { // Codename_B source
@ -194,15 +201,15 @@ public class BukkitPermissions {
List<String> result = new ArrayList<String>();
for (String key : permList) {
String a = key.charAt(0) == '-'? key.substring(1):key;
String a = key.charAt(0) == '-' ? key.substring(1) : key;
Map<String, Boolean> allchildren = GroupManager.BukkitPermissions.getAllChildren(a, new HashSet<String>());
if (allchildren != null) {
ListIterator<String> itr = result.listIterator();
while (itr.hasNext()){
while (itr.hasNext()) {
String node = (String) itr.next();
String b = node.charAt(0) == '-'? node.substring(1):node;
String b = node.charAt(0) == '-' ? node.substring(1) : node;
// Insert the parent node before the child
if (allchildren.containsKey(b)) {
@ -219,7 +226,6 @@ public class BukkitPermissions {
return result;
}
/**
* Fetch all permissions which are registered with superperms.
* {can include child nodes)
@ -254,7 +260,8 @@ public class BukkitPermissions {
* null is empty
*
* @param node
* @param playerPermArray current list of perms to check against for negations
* @param playerPermArray current list of perms to check against for
* negations
* @return Map of child permissions
*/
public Map<String, Boolean> getAllChildren(String node, Set<String> playerPermArray) {
@ -269,7 +276,7 @@ public class BukkitPermissions {
Map<String, Boolean> children = getChildren(now);
if ((children != null) && (!playerPermArray.contains("-"+now))) {
if ((children != null) && (!playerPermArray.contains("-" + now))) {
for (String childName : children.keySet()) {
if (!alreadyVisited.containsKey(childName)) {
stack.push(childName);
@ -279,13 +286,15 @@ public class BukkitPermissions {
}
}
alreadyVisited.remove(node);
if (!alreadyVisited.isEmpty()) return alreadyVisited;
if (!alreadyVisited.isEmpty())
return alreadyVisited;
return null;
}
/**
* Returns a map of the child permissions (1 node deep) as registered with Bukkit.
* Returns a map of the child permissions (1 node deep) as registered with
* Bukkit.
* null is empty
*
* @param node
@ -308,6 +317,7 @@ public class BukkitPermissions {
* @return List<String> of permissions
*/
public List<String> listPerms(Player player) {
List<String> perms = new ArrayList<String>();
/*
@ -332,6 +342,7 @@ public class BukkitPermissions {
* force Bukkit to update every OnlinePlayers permissions.
*/
public void updateAllPlayers() {
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
updatePermissions(player);
}
@ -341,6 +352,7 @@ public class BukkitPermissions {
* force Bukkit to update this Players permissions.
*/
public void updatePlayer(Player player) {
if (player != null)
this.updatePermissions(player, null);
}
@ -351,6 +363,7 @@ public class BukkitPermissions {
* @param player
*/
private void removeAttachment(Player player) {
if (attachments.containsKey(player)) {
try {
player.removeAttachment(attachments.get(player));
@ -371,7 +384,7 @@ public class BukkitPermissions {
Iterator<Player> itr = attachments.keySet().iterator();
while (itr.hasNext()){
while (itr.hasNext()) {
Player player = itr.next();
try {
player.removeAttachment(attachments.get(player));
@ -395,6 +408,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) {
setPlayer_join(true);
Player player = event.getPlayer();
@ -413,11 +427,13 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerChangeWorld(PlayerChangedWorldEvent event) { // has changed worlds
updatePermissions(event.getPlayer(), event.getPlayer().getWorld().getName());
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerKick(PlayerKickEvent event) {
Player player = event.getPlayer();
/*
@ -428,6 +444,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event) {
if (!GroupManager.isLoaded())
return;
@ -444,6 +461,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.NORMAL)
public void onPluginEnable(PluginEnableEvent event) {
if (!GroupManager.isLoaded())
return;
@ -453,6 +471,7 @@ public class BukkitPermissions {
@EventHandler(priority = EventPriority.NORMAL)
public void onPluginDisable(PluginDisableEvent event) {
collectPermissions();
// updateAllPlayers();
}

View file

@ -169,7 +169,7 @@ public abstract class PermissionsReaderInterface {
*/
public abstract double getPermissionDouble(String userName, String node);
/////////////////////////////
/////////////////////////////
/**
* Gets the appropriate prefix for the user.
* This method is a utility method for chat plugins to get the user's prefix
@ -193,36 +193,47 @@ public abstract class PermissionsReaderInterface {
public abstract String getUserSuffix(String user);
/**
* Returns the group object representing the default group of the given world.
* This method will return null if the object does not exist or the world has no default group.
* @return Group object representing default world, or null if it doesn't exist or is not defined.
* Returns the group object representing the default group of the given
* world.
* This method will return null if the object does not exist or the world
* has no default group.
*
* @return Group object representing default world, or null if it doesn't
* exist or is not defined.
*/
public abstract Group getDefaultGroup();
/**
* Gets a array of the names of all parent groups in the same world.
*
* @param name Target user's name
* @return An array containing the names of all parent groups (including ancestors) that are in the same world
* @return An array containing the names of all parent groups (including
* ancestors) that are in the same world
*/
public abstract String[] getGroups(String name);
public abstract String getInfoString(String entryName, String path, boolean isGroup);
//public abstract String getInfoString(String entryName, String path, boolean isGroup, Comparator<String> comparator);
public abstract int getInfoInteger(String entryName, String path, boolean isGroup);
//public abstract int getInfoInteger(String entryName, String path, boolean isGroup, Comparator<Integer> comparator);
/**
* Gets a double from the Info node without inheritance.
*
* @param entryName
* @param path
* @param isGroup
* @return -1 if not found
*/
public abstract double getInfoDouble(String entryName, String path, boolean isGroup);
//public abstract double getInfoDouble(String entryName, String path, boolean isGroup, Comparator<Double> comparator);
public abstract boolean getInfoBoolean(String entryName, String path, boolean isGroup);
//public abstract boolean getInfoBoolean(String entryName, String path, boolean isGroup, Comparator<Boolean> comparator);
public abstract void addUserInfo(String name, String path, Object data);
@ -232,7 +243,8 @@ public abstract class PermissionsReaderInterface {
public abstract void addGroupInfo(String name, String path, Object data);
public abstract void removeGroupInfo(String name, String path);
//////////////////////////////
//////////////////////////////
public abstract List<String> getAllPlayersPermissions(String userName);

View file

@ -16,6 +16,7 @@ public class GMLoggerHandler extends ConsoleHandler {
@Override
public void publish(LogRecord record) {
String message = "GroupManager - " + record.getLevel() + " - " + record.getMessage();
if (record.getLevel().equals(Level.SEVERE) || record.getLevel().equals(Level.WARNING)) {
System.err.println(message);

View file

@ -6,6 +6,7 @@ package org.anjocaido.groupmanager.utils;
/**
* Just a list of commands for this plugin
*
* @author gabrielcouto
*/
public enum GroupManagerPermissions {

View file

@ -14,6 +14,7 @@ public class StringPermissionComparator implements Comparator<String> {
@Override
public int compare(String permA, String permB) {
boolean ap = permA.startsWith("+");
boolean bp = permB.startsWith("+");
boolean am = permA.startsWith("-");
@ -38,9 +39,11 @@ public class StringPermissionComparator implements Comparator<String> {
}
return permA.compareToIgnoreCase(permB);
}
private static StringPermissionComparator instance;
public static StringPermissionComparator getInstance() {
if (instance == null) {
instance = new StringPermissionComparator();
}

View file

@ -22,7 +22,6 @@ import java.util.List;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.data.Group;
/**
*
* @author gabrielcouto
@ -36,6 +35,7 @@ public abstract class Tasks {
* @return stack trace as a string
*/
public static String getStackTraceAsString(Exception exception) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
@ -43,6 +43,7 @@ public abstract class Tasks {
}
public static void copy(InputStream src, File dst) throws IOException {
InputStream in = src;
OutputStream out = new FileOutputStream(dst);
@ -60,6 +61,7 @@ public abstract class Tasks {
}
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
copy(in, dst);
}
@ -87,8 +89,9 @@ public abstract class Tasks {
}
public static void removeOldFiles(GroupManager gm, File folder) {
if (folder.isDirectory()) {
long oldTime = System.currentTimeMillis() - (((long)gm.getGMConfig().getBackupDuration()*60*60)*1000);
long oldTime = System.currentTimeMillis() - (((long) gm.getGMConfig().getBackupDuration() * 60 * 60) * 1000);
for (File olds : folder.listFiles()) {
if (olds.isFile()) {
if (olds.lastModified() < oldTime) {
@ -103,6 +106,7 @@ public abstract class Tasks {
}
public static String getDateString() {
GregorianCalendar now = new GregorianCalendar();
String date = "";
date += now.get(Calendar.DAY_OF_MONTH);
@ -114,6 +118,7 @@ public abstract class Tasks {
}
public static String getStringListInString(List<String> list) {
if (list == null) {
return "";
}
@ -128,6 +133,7 @@ public abstract class Tasks {
}
public static String getStringArrayInString(String[] list) {
if (list == null) {
return "";
}
@ -142,6 +148,7 @@ public abstract class Tasks {
}
public static String getGroupListInString(List<Group> list) {
if (list == null) {
return "";
}
@ -156,6 +163,7 @@ public abstract class Tasks {
}
public static String join(String[] arr, String separator) {
if (arr.length == 0)
return "";
String out = arr[0].toString();