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

@ -176,4 +176,7 @@ v 2.0:
- Fix 'manuadd' to use the default or selected world (via 'manselect'), if the world is not specified in the command.
- 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.
- 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

@ -13,81 +13,89 @@ import org.anjocaido.groupmanager.utils.Tasks;
import org.bukkit.configuration.file.YamlConfiguration;
/**
*
*
* @author gabrielcouto
*/
public class GMConfiguration {
private GroupManager plugin;
private File configFile;
private YamlConfiguration GMconfig;
public GMConfiguration(GroupManager plugin) {
this.plugin = plugin;
load();
}
private GroupManager plugin;
private File configFile;
private YamlConfiguration GMconfig;
public void load() {
if (!plugin.getDataFolder().exists()) {
plugin.getDataFolder().mkdirs();
}
configFile = new File(plugin.getDataFolder(), "config.yml");
public GMConfiguration(GroupManager plugin) {
if (!configFile.exists()) {
try {
Tasks.copy(plugin.getResourceAsStream("config.yml"), configFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
this.plugin = plugin;
load();
}
GMconfig = new YamlConfiguration();
try {
GMconfig.load(configFile);
} catch (Exception ex) {
throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex);
}
// Setup defaults
adjustLoggerLevel();
plugin.setValidateOnlinePlayer(isToggleValidate());
}
public boolean isOpOverride() {
return GMconfig.getBoolean("settings.config.opOverrides", true);
}
public boolean isToggleValidate() {
return GMconfig.getBoolean("settings.config.validate_toggle", true);
}
public void load() {
public Map<String, Object> getMirrorsMap() {
// Try to fetch the old mirror path first
if (!plugin.getDataFolder().exists()) {
plugin.getDataFolder().mkdirs();
}
configFile = new File(plugin.getDataFolder(), "config.yml");
if (!configFile.exists()) {
try {
Tasks.copy(plugin.getResourceAsStream("config.yml"), configFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
GMconfig = new YamlConfiguration();
try {
GMconfig.load(configFile);
} catch (Exception ex) {
throw new IllegalArgumentException("The following file couldn't pass on Parser.\n" + configFile.getPath(), ex);
}
// Setup defaults
adjustLoggerLevel();
plugin.setValidateOnlinePlayer(isToggleValidate());
}
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;
}
public Integer getSaveInterval() {
return GMconfig.getInt("settings.data.save.minutes", 10);
}
public Integer getBackupDuration() {
return GMconfig.getInt("settings.data.save.hours", 24);
}
}
public void adjustLoggerLevel() {
try {
GroupManager.logger.setLevel(Level.parse(GMconfig.getString("settings.logging.level", "INFO")));
return;
} catch (Exception e) {
}
GroupManager.logger.setLevel(Level.INFO);
}
public Integer getSaveInterval() {
return GMconfig.getInt("settings.data.save.minutes", 10);
}
public Integer getBackupDuration() {
return GMconfig.getInt("settings.data.save.hours", 24);
}
public void adjustLoggerLevel() {
try {
GroupManager.logger.setLevel(Level.parse(GMconfig.getString("settings.logging.level", "INFO")));
return;
} catch (Exception e) {
}
GroupManager.logger.setLevel(Level.INFO);
}
}

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,20 +65,24 @@ 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;
}
/**
* @param haveGroupsChanged
* the haveGroupsChanged to set
*/
public void setGroupsChanged(boolean haveGroupsChanged) {
this.haveGroupsChanged = haveGroupsChanged;
}
@ -86,7 +90,7 @@ public class GlobalGroups {
public void load() {
GGroups = new YamlConfiguration();
GroupManager.setLoaded(false);
// READ globalGroups FILE
@ -110,44 +114,47 @@ public class GlobalGroups {
// Clear out old groups
resetGlobalGroups();
if (!GGroups.getKeys(false).isEmpty()) {
// Read all global groups
Map<String, Object> allGroups = new HashMap<String, Object>();
try {
allGroups = (Map<String, Object>) GGroups.getConfigurationSection("groups").getValues(false);
} catch (Exception ex) {
//ex.printStackTrace();
throw new IllegalArgumentException("Your " + GlobalGroupsFile.getPath() + " file is invalid. See console for details.", ex);
}
// ex.printStackTrace();
throw new IllegalArgumentException("Your " + GlobalGroupsFile.getPath() + " file is invalid. See console for details.", ex);
}
// Load each groups permissions list.
if (allGroups != null) {
Iterator<String> groupItr = allGroups.keySet().iterator();
String groupName;
Integer groupCount = 0;
/*
* loop each group entry
* and read it's data.
*/
while (groupItr.hasNext()) {
try {
groupCount++;
// Attempt to fetch the next group name.
groupName = groupItr.next();
} catch (Exception ex) {
String groupName;
Integer groupCount = 0;
/*
* loop each group entry
* and read it's data.
*/
while (groupItr.hasNext()) {
try {
groupCount++;
// Attempt to fetch the next group name.
groupName = groupItr.next();
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid group name for GlobalGroup entry (" + groupCount + ") in file: " + GlobalGroupsFile.getPath(), ex);
}
Group newGroup = new Group(groupName.toLowerCase());
/*
* Create a new group with this name.
*/
Group newGroup = new Group(groupName.toLowerCase());
Object element;
// Permission nodes
element = GGroups.get("groups." + groupName + ".permissions");
if (element != null)
if (element instanceof List) {
try {
@ -161,31 +168,31 @@ public class GlobalGroups {
newGroup.addPermission((String) element);
} else
throw new IllegalArgumentException("Unknown type of permission node for global group: " + groupName);
// Info nodes
element = GGroups.get("groups." + groupName + ".info");
if (element != null)
if (element instanceof MemorySection) {
Map<String, Object> vars = new HashMap<String, Object>();
for (String key : ((MemorySection) element).getKeys(false)) {
vars.put(key, ((MemorySection) element).get(key));
}
vars.put(key, ((MemorySection) element).get(key));
}
newGroup.setVariables(vars);
} else
throw new IllegalArgumentException("Unknown type of info node for global group: " + groupName);
// Push a new group
addGroup(newGroup);
}
}
removeGroupsChangedFlag();
}
setTimeStampGroups(GlobalGroupsFile.lastModified());
GroupManager.setLoaded(true);
//GlobalGroupsFile = null;
// GlobalGroupsFile = null;
}
/**
@ -194,33 +201,33 @@ 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()))) {
Map<String, Object> root = new HashMap<String, Object>();
Map<String, Object> groupsMap = new HashMap<String, Object>();
root.put("groups", groupsMap);
for (String groupKey : groups.keySet()) {
Group group = groups.get(groupKey);
// Group header
Map<String, Object> aGroupMap = new HashMap<String, Object>();
groupsMap.put(group.getName(), aGroupMap);
// Info nodes
Map<String, Object> infoMap = new HashMap<String, Object>();
aGroupMap.put("info", infoMap);
for (String infoKey : group.getVariables().getVarKeyList()) {
infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
}
// Permission nodes
aGroupMap.put("info", infoMap);
for (String infoKey : group.getVariables().getVarKeyList()) {
infoMap.put(infoKey, group.getVariables().getVarObject(infoKey));
}
// Permission nodes
aGroupMap.put("permissions", group.getPermissionList());
}
if (!root.isEmpty()) {
DumperOptions opt = new DumperOptions();
opt.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
@ -233,53 +240,55 @@ public class GlobalGroups {
}
setTimeStampGroups(GlobalGroupsFile.lastModified());
} else {
// Newer file found.
GroupManager.logger.log(Level.WARNING, "Newer GlobalGroups file found, but we have local changes!");
throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
}
// Newer file found.
GroupManager.logger.log(Level.WARNING, "Newer GlobalGroups file found, but we have local changes!");
throw new IllegalStateException("Unable to save unless you issue a '/mansave force'");
}
removeGroupsChangedFlag();
} else {
//Check for newer file as no local changes.
if (getTimeStampGroups() < GlobalGroupsFile.lastModified()) {
System.out.print("Newer GlobalGroups file found (Loading changes)!");
// Backup GlobalGroups file
backupFile();
load();
}
}
// Check for newer file as no local changes.
if (getTimeStampGroups() < GlobalGroupsFile.lastModified()) {
System.out.print("Newer GlobalGroups file found (Loading changes)!");
// Backup GlobalGroups file
backupFile();
load();
}
}
}
/**
* Backup the BlobalGroups file
* @param w
*/
private void backupFile() {
File backupFile = new File(plugin.getBackupFolder(), "bkp_ggroups_" + Tasks.getDateString() + ".yml");
try {
Tasks.copy(GlobalGroupsFile, backupFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
* Backup the BlobalGroups file
*
* @param w
*/
private void backupFile() {
File backupFile = new File(plugin.getBackupFolder(), "bkp_ggroups_" + Tasks.getDateString() + ".yml");
try {
Tasks.copy(GlobalGroupsFile, backupFile);
} catch (IOException ex) {
GroupManager.logger.log(Level.SEVERE, null, ex);
}
}
/**
* Adds a group, or replaces an existing one.
*
* @param groupToAdd
*/
public void addGroup(Group groupToAdd) {
// Create a new group if it already exists
if (hasGroup(groupToAdd.getName())) {
groupToAdd = groupToAdd.clone();
removeGroup(groupToAdd.getName());
}
newGroup(groupToAdd);
haveGroupsChanged = true;
if (GroupManager.isLoaded())
GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED);
haveGroupsChanged = true;
if (GroupManager.isLoaded())
GroupManagerEventHandler.callEvent(groupToAdd, GMGroupEvent.Action.GROUP_ADDED);
}
/**
@ -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,14 +409,16 @@ public class GlobalGroups {
* Resets GlobalGroups.
*/
public void resetGlobalGroups() {
this.groups = new HashMap<String, Group>();
}
/**
*
* @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,17 +441,19 @@ public class GlobalGroups {
* @return the globalGroupsFile
*/
public File getGlobalGroupsFile() {
return GlobalGroupsFile;
}
/**
*
*/
public void removeGroupsChangedFlag() {
setGroupsChanged(false);
for (Group g : groups.values()) {
g.flagAsSaved();
}
}
public void removeGroupsChangedFlag() {
setGroupsChanged(false);
for (Group g : groups.values()) {
g.flagAsSaved();
}
}
}

View file

@ -5,24 +5,25 @@ import org.anjocaido.groupmanager.GroupManager;
/*
*
* Created by ElgarL
*
*/
public class BukkitPermsUpdateTask implements Runnable {
public BukkitPermsUpdateTask() {
super();
super();
}
@Override
public void run() {
// Signal loaded and update BukkitPermissions.
GroupManager.setLoaded(true);
GroupManager.BukkitPermissions.collectPermissions();
GroupManager.BukkitPermissions.updateAllPlayers();
GroupManager.logger.info("Bukkit Permissions Updated!");
}
}

View file

@ -13,151 +13,169 @@ import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
import org.anjocaido.groupmanager.utils.StringPermissionComparator;
/**
*
*
* @author gabrielcouto
*/
public abstract class DataUnit {
private WorldDataHolder dataSource;
private String name;
private boolean changed, sorted = false;
private ArrayList<String> permissions = new ArrayList<String>();
private WorldDataHolder dataSource;
private String name;
private boolean changed, sorted = false;
private ArrayList<String> permissions = new ArrayList<String>();
public DataUnit(WorldDataHolder dataSource, String name) {
this.dataSource = dataSource;
this.name = name;
}
public DataUnit(WorldDataHolder dataSource, String name) {
public DataUnit(String name) {
this.name = 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())) {
// Global Group match.
if (this.dataSource == null && go.getDataSource() == null)
return true;
// This is a global group, the object to test isn't.
if (this.dataSource == null && go.getDataSource() != null)
return false;
// This is not a global group, but the object to test is.
if (this.dataSource != null && go.getDataSource() == null)
return false;
// Match on group name and world name.
if (this.dataSource.getName().equalsIgnoreCase(go.getDataSource().getName()))
return true;
}
}
return false;
}
* 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) {
@Override
public int hashCode() {
int hash = 5;
hash = 71 * hash + (this.name != null ? this.name.toLowerCase().hashCode() : 0);
return hash;
}
/**
* Set the data source to point to a different worldDataHolder
*
* @param source
*/
public void setDataSource(WorldDataHolder source) {
this.dataSource = source;
}
if (o instanceof DataUnit) {
DataUnit go = (DataUnit) o;
if (this.getName().equalsIgnoreCase(go.getName())) {
// Global Group match.
if (this.dataSource == null && go.getDataSource() == null)
return true;
// This is a global group, the object to test isn't.
if (this.dataSource == null && go.getDataSource() != null)
return false;
// This is not a global group, but the object to test is.
if (this.dataSource != null && go.getDataSource() == null)
return false;
// Match on group name and world name.
if (this.dataSource.getName().equalsIgnoreCase(go.getDataSource().getName()))
return true;
}
}
return false;
}
/**
* Get the current worldDataHolder this object is pointing to
*
* @return the dataSource
*/
public WorldDataHolder getDataSource() {
return dataSource;
}
@Override
public int hashCode() {
/**
* @return the name
*/
public String getName() {
return name;
}
int hash = 5;
hash = 71 * hash + (this.name != null ? this.name.toLowerCase().hashCode() : 0);
return hash;
}
public void flagAsChanged() {
WorldDataHolder testSource = getDataSource();
String source = "";
if (testSource == null)
source = "GlobalGroups";
else
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as changed!");
// for(StackTraceElement st: Thread.currentThread().getStackTrace()){
// GroupManager.logger.finest(st.toString());
// }
sorted = false;
changed = true;
}
/**
* Set the data source to point to a different worldDataHolder
*
* @param source
*/
public void setDataSource(WorldDataHolder source) {
public boolean isChanged() {
return changed;
}
this.dataSource = source;
}
public void flagAsSaved() {
WorldDataHolder testSource = getDataSource();
String source = "";
if (testSource == null)
source = "GlobalGroups";
else
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as saved!");
changed = false;
}
/**
* Get the current worldDataHolder this object is pointing to
*
* @return the dataSource
*/
public WorldDataHolder getDataSource() {
public boolean hasSamePermissionNode(String permission) {
return permissions.contains(permission);
}
return dataSource;
}
public void addPermission(String permission) {
if (!hasSamePermissionNode(permission)) {
permissions.add(permission);
}
flagAsChanged();
}
/**
* @return the name
*/
public String getName() {
public boolean removePermission(String permission) {
flagAsChanged();
return permissions.remove(permission);
}
return name;
}
/**
* 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 flagAsChanged() {
public void sortPermissions() {
if (!isSorted()) {
Collections.sort(permissions, StringPermissionComparator.getInstance());
sorted = true;
}
}
WorldDataHolder testSource = getDataSource();
String source = "";
if (testSource == null)
source = "GlobalGroups";
else
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as changed!");
// 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 = "";
if (testSource == null)
source = "GlobalGroups";
else
source = testSource.getName();
GroupManager.logger.finest("DataSource: " + source + " - DataUnit: " + getName() + " flagged as saved!");
changed = false;
}
public boolean hasSamePermissionNode(String permission) {
return permissions.contains(permission);
}
public void addPermission(String permission) {
if (!hasSamePermissionNode(permission)) {
permissions.add(permission);
}
flagAsChanged();
}
public boolean removePermission(String permission) {
flagAsChanged();
return permissions.remove(permission);
}
/**
* 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

@ -15,160 +15,173 @@ import java.util.List;
import java.util.Map;
/**
*
*
* @author gabrielcouto/ElgarL
*/
public class Group extends DataUnit implements Cloneable {
/**
* The group it inherits DIRECTLY!
*/
private ArrayList<String> inherits = new ArrayList<String>();
/**
*This one holds the fields in INFO node.
* like prefix = 'c'
* or build = false
*/
private GroupVariables variables = new GroupVariables(this);
/**
* The group it inherits DIRECTLY!
*/
private ArrayList<String> inherits = new ArrayList<String>();
/**
* This one holds the fields in INFO node.
* like prefix = 'c'
* or build = false
*/
private GroupVariables variables = new GroupVariables(this);
/**
* Constructor for individual World Groups.
*
* @param name
*/
public Group(WorldDataHolder source, String name) {
super(source, name);
}
/**
* Constructor for Global Groups.
*
* @param name
*/
public Group(String name) {
super(name);
}
/**
* Is this a GlobalGroup
*
* @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()) {
clone = new Group(this.getName());
} else {
clone = new Group(getDataSource(), this.getName());
clone.inherits = new ArrayList<String>(this.getInherits());
}
for (String perm : this.getPermissionList()) {
clone.addPermission(perm);
}
clone.variables = ((GroupVariables) variables).clone(clone);
//clone.flagAsChanged();
return clone;
}
/**
* Constructor for individual World Groups.
*
* @param name
*/
public Group(WorldDataHolder source, String name) {
/**
* 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;
}
Group clone = dataSource.createGroup(this.getName());
// Don't add inheritance for GlobalGroups
if (!isGlobal()) {
clone.inherits = new ArrayList<String>(this.getInherits());
}
for (String perm : this.getPermissionList()) {
clone.addPermission(perm);
}
clone.variables = variables.clone(clone);
clone.flagAsChanged(); //use this to make the new dataSource save the new group
return clone;
}
super(source, name);
}
/**
* 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);
}
/**
* Constructor for Global Groups.
*
* @param name
*/
public Group(String name) {
/**
* @param inherit the inherits to set
*/
public void addInherits(Group inherit) {
if (!isGlobal()) {
if (!this.getDataSource().groupExists(inherit.getName())) {
getDataSource().addGroup(inherit);
}
if (!inherits.contains(inherit.getName().toLowerCase())) {
inherits.add(inherit.getName().toLowerCase());
}
flagAsChanged();
if (GroupManager.isLoaded()) {
GroupManager.BukkitPermissions.updateAllPlayers();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED);
}
}
}
super(name);
}
public boolean removeInherits(String inherit) {
if (!isGlobal()) {
if (this.inherits.contains(inherit.toLowerCase())) {
this.inherits.remove(inherit.toLowerCase());
flagAsChanged();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED);
return true;
}
}
return false;
}
/**
* Is this a GlobalGroup
*
* @return true if this is a global group
*/
public boolean isGlobal() {
/**
* @return the variables
*/
public GroupVariables getVariables() {
return variables;
}
return (getDataSource() == null);
}
/**
*
* @param varList
*/
public void setVariables(Map<String, Object> varList) {
if (!isGlobal()) {
GroupVariables temp = new GroupVariables(this, varList);
variables.clearVars();
for (String key : temp.getVarKeyList()) {
variables.addVar(key, temp.getVarObject(key));
}
flagAsChanged();
if (GroupManager.isLoaded()) {
GroupManager.BukkitPermissions.updateAllPlayers();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INFO_CHANGED);
}
}
}
/**
* Clone this group
*
* @return a clone of this group
*/
@Override
public Group clone() {
Group clone;
if (isGlobal()) {
clone = new Group(this.getName());
} else {
clone = new Group(getDataSource(), this.getName());
clone.inherits = new ArrayList<String>(this.getInherits());
}
for (String perm : this.getPermissionList()) {
clone.addPermission(perm);
}
clone.variables = ((GroupVariables) variables).clone(clone);
//clone.flagAsChanged();
return clone;
}
/**
* 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;
}
Group clone = dataSource.createGroup(this.getName());
// Don't add inheritance for GlobalGroups
if (!isGlobal()) {
clone.inherits = new ArrayList<String>(this.getInherits());
}
for (String perm : this.getPermissionList()) {
clone.addPermission(perm);
}
clone.variables = variables.clone(clone);
clone.flagAsChanged(); //use this to make the new dataSource save the new group
return clone;
}
/**
* 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);
}
/**
* @param inherit the inherits to set
*/
public void addInherits(Group inherit) {
if (!isGlobal()) {
if (!this.getDataSource().groupExists(inherit.getName())) {
getDataSource().addGroup(inherit);
}
if (!inherits.contains(inherit.getName().toLowerCase())) {
inherits.add(inherit.getName().toLowerCase());
}
flagAsChanged();
if (GroupManager.isLoaded()) {
GroupManager.BukkitPermissions.updateAllPlayers();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED);
}
}
}
public boolean removeInherits(String inherit) {
if (!isGlobal()) {
if (this.inherits.contains(inherit.toLowerCase())) {
this.inherits.remove(inherit.toLowerCase());
flagAsChanged();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED);
return true;
}
}
return false;
}
/**
* @return the variables
*/
public GroupVariables getVariables() {
return variables;
}
/**
*
* @param varList
*/
public void setVariables(Map<String, Object> varList) {
if (!isGlobal()) {
GroupVariables temp = new GroupVariables(this, varList);
variables.clearVars();
for (String key : temp.getVarKeyList()) {
variables.addVar(key, temp.getVarObject(key));
}
flagAsChanged();
if (GroupManager.isLoaded()) {
GroupManager.BukkitPermissions.updateAllPlayers();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INFO_CHANGED);
}
}
}
}

View file

@ -7,81 +7,88 @@ package org.anjocaido.groupmanager.data;
import java.util.Map;
/**
*
*
* @author gabrielcouto
*/
public class GroupVariables extends Variables implements Cloneable {
private Group owner;
private Group owner;
public GroupVariables(Group owner) {
super(owner);
this.owner = owner;
addVar("prefix", "");
addVar("suffix", "");
addVar("build", false);
}
public GroupVariables(Group owner) {
public GroupVariables(Group owner, Map<String, Object> varList) {
super(owner);
variables = varList;
if (variables.get("prefix") == null) {
variables.put("prefix", "");
owner.flagAsChanged();
}
//thisGrp.prefix = infoNode.get("prefix").toString();
super(owner);
this.owner = owner;
addVar("prefix", "");
addVar("suffix", "");
addVar("build", false);
}
if (variables.get("suffix") == null) {
variables.put("suffix", "");
owner.flagAsChanged();
}
//thisGrp.suffix = infoNode.get("suffix").toString();
public GroupVariables(Group owner, Map<String, Object> varList) {
if (variables.get("build") == null) {
variables.put("build", false);
owner.flagAsChanged();
}
this.owner = owner;
}
super(owner);
variables = varList;
if (variables.get("prefix") == null) {
variables.put("prefix", "");
owner.flagAsChanged();
}
//thisGrp.prefix = infoNode.get("prefix").toString();
/**
* 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));
}
newOwner.flagAsChanged();
return clone;
}
if (variables.get("suffix") == null) {
variables.put("suffix", "");
owner.flagAsChanged();
}
//thisGrp.suffix = infoNode.get("suffix").toString();
/**
* Remove a var from the list
* @param name
*/
@Override
public void removeVar(String name) {
try {
this.variables.remove(name);
} catch (Exception e) {
}
if (name.equals("prefix")) {
addVar("prefix", "");
} else if (name.equals("suffix")) {
addVar("suffix", "");
} else if (name.equals("build")) {
addVar("build", false);
}
owner.flagAsChanged();
}
if (variables.get("build") == null) {
variables.put("build", false);
owner.flagAsChanged();
}
this.owner = owner;
}
/**
* @return the owner
*/
@Override
public Group getOwner() {
return owner;
}
/**
* 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));
}
newOwner.flagAsChanged();
return clone;
}
/**
* Remove a var from the list
*
* @param name
*/
@Override
public void removeVar(String name) {
try {
this.variables.remove(name);
} catch (Exception e) {
}
if (name.equals("prefix")) {
addVar("prefix", "");
} else if (name.equals("suffix")) {
addVar("suffix", "");
} else if (name.equals("build")) {
addVar("build", false);
}
owner.flagAsChanged();
}
/**
* @return the owner
*/
@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,33 +108,23 @@ 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);
}
/**
* @param group the group to set
* @param updatePerms if we are to trigger a superperms update.
*
*
*/
public void setGroup(Group group, Boolean updatePerms) {
if (!this.getDataSource().groupExists(group.getName())) {
getDataSource().addGroup(group);
}
@ -151,12 +145,13 @@ public class User extends DataUnit implements Cloneable {
if (notify)
GroupManager.notify(this.getName(), String.format(" moved to the group %s.", group.getName()));
GroupManagerEventHandler.callEvent(this, Action.USER_GROUP_CHANGED);
}
}
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;
@ -164,12 +159,12 @@ public class User extends DataUnit implements Cloneable {
// User already has this subgroup
if (containsSubGroup(subGroup))
return false;
// If the group doesn't exists add it
if (!this.getDataSource().groupExists(subGroup.getName())) {
getDataSource().addGroup(subGroup);
}
subGroups.add(subGroup.getName());
flagAsChanged();
if (GroupManager.isLoaded()) {
@ -178,25 +173,29 @@ public class User extends DataUnit implements Cloneable {
GroupManagerEventHandler.callEvent(this, Action.USER_SUBGROUP_CHANGED);
}
return true;
//subGroup = getDataSource().getGroup(subGroup.getName());
//removeSubGroup(subGroup);
//subGroups.add(subGroup.getName());
}
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

@ -7,42 +7,47 @@ package org.anjocaido.groupmanager.data;
import java.util.Map;
/**
*
*
* @author gabrielcouto
*/
public class UserVariables extends Variables {
private User owner;
private User owner;
public UserVariables(User owner) {
super(owner);
this.owner = owner;
}
public UserVariables(User owner) {
public UserVariables(User owner, Map<String, Object> varList) {
super(owner);
this.variables = varList;
this.owner = owner;
}
super(owner);
this.owner = owner;
}
/**
* 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));
}
newOwner.flagAsChanged();
return clone;
}
public UserVariables(User owner, Map<String, Object> varList) {
/**
* @return the owner
*/
@Override
public User getOwner() {
return owner;
}
super(owner);
this.variables = varList;
this.owner = owner;
}
/**
* 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));
}
newOwner.flagAsChanged();
return clone;
}
/**
* @return the owner
*/
@Override
public User getOwner() {
return owner;
}
}

View file

@ -9,178 +9,200 @@ 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
* suffix
* build
*
*
* @author gabrielcouto
*/
public abstract class Variables implements Cloneable {
private DataUnit owner;
protected Map<String, Object> variables = new HashMap<String, Object>();
private DataUnit owner;
protected Map<String, Object> variables = new HashMap<String, Object>();
public Variables(DataUnit owner) {
this.owner = owner;
}
public Variables(DataUnit owner) {
/**
* Add var to the the INFO node.
* 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;
}
if (variables.containsKey(name)) {
variables.remove(name);
}
variables.put(name, o);
owner.flagAsChanged();
}
this.owner = owner;
}
/**
* 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);
}
/**
* Add var to the the INFO node.
* 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) {
/**
* 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();
} catch (Exception e) {
return "";
}
}
if (o == null) {
return;
}
if (variables.containsKey(name)) {
variables.remove(name);
}
variables.put(name, o);
owner.flagAsChanged();
}
/**
*
* @param name
* @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());
} catch (Exception e) {
return false;
}
}
/**
* Returns the object inside the var
*
* @param name
* @return a Object if exists. null if doesn't exists
*/
public Object getVarObject(String name) {
/**
*
* @param name
* @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());
} catch (Exception e) {
return -1;
}
}
return variables.get(name);
}
/**
*
* @param name
* @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());
} catch (Exception e) {
return -1.0D;
}
}
/**
* 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) {
/**
* All variable keys this is holding
* @return Set of all variable names.
*/
public Set<String> getVarKeyList() {
return variables.keySet();
}
Object o = variables.get(name);
try {
return o == null ? "" : o.toString();
} catch (Exception e) {
return "";
}
}
/**
* 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);
}
/**
*
* @param name
* @return false if null. or a Boolean.parseBoolean of the string
*/
public Boolean getVarBoolean(String name) {
/**
* Returns the quantity of vars this is holding
* @return the number of vars
*/
public int getSize() {
return variables.size();
}
Object o = variables.get(name);
try {
return o == null ? false : Boolean.parseBoolean(o.toString());
} catch (Exception e) {
return false;
}
}
/**
* Remove a var from the list
* @param name
*/
public void removeVar(String name) {
try {
variables.remove(name);
} catch (Exception e) {
}
owner.flagAsChanged();
}
/**
*
* @param name
* @return -1 if null. or a parseInt of the string
*/
public Integer getVarInteger(String name) {
public static Object parseVariableValue(String value) {
try {
Integer i = Integer.parseInt(value);
return i;
} catch (NumberFormatException e) {
}
try {
Double d = Double.parseDouble(value);
return d;
} catch (NumberFormatException e) {
}
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("on")) {
return true;
} else if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no") || value.equalsIgnoreCase("off")) {
return false;
}
return value;
Object o = variables.get(name);
try {
return o == null ? -1 : Integer.parseInt(o.toString());
} catch (Exception e) {
return -1;
}
}
}
/**
*
* @param name
* @return -1 if null. or a parseDouble of the string
*/
public Double getVarDouble(String name) {
public void clearVars() {
variables.clear();
owner.flagAsChanged();
}
Object o = variables.get(name);
try {
return o == null ? -1.0D : Double.parseDouble(o.toString());
} catch (Exception e) {
return -1.0D;
}
}
/**
* @return the owner
*/
public DataUnit getOwner() {
return owner;
}
/**
* All variable keys this is holding
*
* @return Set of all variable names.
*/
public Set<String> getVarKeyList() {
public boolean isEmpty() {
return variables.isEmpty();
}
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) {
}
owner.flagAsChanged();
}
public static Object parseVariableValue(String value) {
try {
Integer i = Integer.parseInt(value);
return i;
} catch (NumberFormatException e) {
}
try {
Double d = Double.parseDouble(value);
return d;
} catch (NumberFormatException e) {
}
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("on")) {
return true;
} else if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no") || value.equalsIgnoreCase("off")) {
return false;
}
return value;
}
public void clearVars() {
variables.clear();
owner.flagAsChanged();
}
/**
* @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,20 +60,23 @@ public class GroupsDataHolder {
* @return the groups
*/
public Map<String, Group> getGroups() {
return groups;
}
/**
* @param groups the groups to set
*/
public void setGroups(Map<String, Group> groups) {
this.groups = groups;
}
/**
* @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

@ -11,195 +11,204 @@ import java.util.Map;
import org.anjocaido.groupmanager.data.User;
/**
*
*
* @author gabrielcouto
*/
public class OverloadedWorldHolder extends WorldDataHolder {
/**
/**
*
*/
protected Map<String, User> overloadedUsers = new HashMap<String, User>();
protected Map<String, User> overloadedUsers = new HashMap<String, User>();
/**
*
* @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;
}
/**
*
* @param ph
*/
public OverloadedWorldHolder(WorldDataHolder ph) {
/**
*
* @param userName
* @return user object or a new user if none exists.
*/
@Override
public User getUser(String userName) {
//OVERLOADED CODE
String userNameLowered = userName.toLowerCase();
if (overloadedUsers.containsKey(userNameLowered)) {
return overloadedUsers.get(userNameLowered);
}
//END CODE
if (getUsers().containsKey(userNameLowered)) {
return getUsers().get(userNameLowered);
}
User newUser = createUser(userName);
setUsersChanged(true);
return newUser;
}
super(ph.getName());
this.setGroupsFile(ph.getGroupsFile());
this.setUsersFile(ph.getUsersFile());
this.groups = ph.groups;
this.users = ph.users;
}
/**
*
* @param theUser
*/
@Override
public void addUser(User theUser) {
if (theUser.getDataSource() != this) {
theUser = theUser.clone(this);
}
if (theUser == null) {
return;
}
if ((theUser.getGroup() == null) || (!getGroups().containsKey(theUser.getGroupName().toLowerCase()))) {
theUser.setGroup(getDefaultGroup());
}
//OVERLOADED CODE
if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) {
overloadedUsers.remove(theUser.getName().toLowerCase());
overloadedUsers.put(theUser.getName().toLowerCase(), theUser);
return;
}
//END CODE
removeUser(theUser.getName());
getUsers().put(theUser.getName().toLowerCase(), theUser);
setUsersChanged(true);
}
/**
*
* @param userName
* @return user object or a new user if none exists.
*/
@Override
public User getUser(String userName) {
/**
*
* @param userName
* @return true if removed/false if not found.
*/
@Override
public boolean removeUser(String userName) {
//OVERLOADED CODE
if (overloadedUsers.containsKey(userName.toLowerCase())) {
overloadedUsers.remove(userName.toLowerCase());
return true;
}
//END CODE
if (getUsers().containsKey(userName.toLowerCase())) {
getUsers().remove(userName.toLowerCase());
setUsersChanged(true);
return true;
}
return false;
}
//OVERLOADED CODE
String userNameLowered = userName.toLowerCase();
if (overloadedUsers.containsKey(userNameLowered)) {
return overloadedUsers.get(userNameLowered);
}
//END CODE
if (getUsers().containsKey(userNameLowered)) {
return getUsers().get(userNameLowered);
}
User newUser = createUser(userName);
setUsersChanged(true);
return newUser;
}
@Override
public boolean removeGroup(String groupName) {
if (groupName.equals(getDefaultGroup())) {
return false;
}
for (String key : getGroups().keySet()) {
if (groupName.equalsIgnoreCase(key)) {
getGroups().remove(key);
for (String userKey : getUsers().keySet()) {
User user = getUsers().get(userKey);
if (user.getGroupName().equalsIgnoreCase(key)) {
user.setGroup(getDefaultGroup());
}
/**
*
* @param theUser
*/
@Override
public void addUser(User theUser) {
}
//OVERLOADED CODE
for (String userKey : overloadedUsers.keySet()) {
User user = overloadedUsers.get(userKey);
if (user.getGroupName().equalsIgnoreCase(key)) {
user.setGroup(getDefaultGroup());
}
if (theUser.getDataSource() != this) {
theUser = theUser.clone(this);
}
if (theUser == null) {
return;
}
if ((theUser.getGroup() == null) || (!getGroups().containsKey(theUser.getGroupName().toLowerCase()))) {
theUser.setGroup(getDefaultGroup());
}
//OVERLOADED CODE
if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) {
overloadedUsers.remove(theUser.getName().toLowerCase());
overloadedUsers.put(theUser.getName().toLowerCase(), theUser);
return;
}
//END CODE
removeUser(theUser.getName());
getUsers().put(theUser.getName().toLowerCase(), theUser);
setUsersChanged(true);
}
}
//END OVERLOAD
setGroupsChanged(true);
return true;
}
}
return false;
}
/**
*
* @param userName
* @return true if removed/false if not found.
*/
@Override
public boolean removeUser(String userName) {
/**
*
* @return Collection of all users
*/
@Override
public Collection<User> getUserList() {
Collection<User> overloadedList = new ArrayList<User>();
Collection<User> normalList = getUsers().values();
for (User u : normalList) {
if (overloadedUsers.containsKey(u.getName().toLowerCase())) {
overloadedList.add(overloadedUsers.get(u.getName().toLowerCase()));
} else {
overloadedList.add(u);
}
}
return overloadedList;
}
//OVERLOADED CODE
if (overloadedUsers.containsKey(userName.toLowerCase())) {
overloadedUsers.remove(userName.toLowerCase());
return true;
}
//END CODE
if (getUsers().containsKey(userName.toLowerCase())) {
getUsers().remove(userName.toLowerCase());
setUsersChanged(true);
return true;
}
return false;
}
/**
*
* @param userName
* @return true if user is overloaded.
*/
public boolean isOverloaded(String userName) {
return overloadedUsers.containsKey(userName.toLowerCase());
}
@Override
public boolean removeGroup(String groupName) {
/**
*
* @param userName
*/
public void overloadUser(String userName) {
if (!isOverloaded(userName)) {
User theUser = getUser(userName);
theUser = theUser.clone();
if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) {
overloadedUsers.remove(theUser.getName().toLowerCase());
}
overloadedUsers.put(theUser.getName().toLowerCase(), theUser);
}
}
if (groupName.equals(getDefaultGroup())) {
return false;
}
for (String key : getGroups().keySet()) {
if (groupName.equalsIgnoreCase(key)) {
getGroups().remove(key);
for (String userKey : getUsers().keySet()) {
User user = getUsers().get(userKey);
if (user.getGroupName().equalsIgnoreCase(key)) {
user.setGroup(getDefaultGroup());
}
/**
*
* @param userName
*/
public void removeOverload(String userName) {
overloadedUsers.remove(userName.toLowerCase());
}
}
//OVERLOADED CODE
for (String userKey : overloadedUsers.keySet()) {
User user = overloadedUsers.get(userKey);
if (user.getGroupName().equalsIgnoreCase(key)) {
user.setGroup(getDefaultGroup());
}
/**
* Gets the user in normal state. Surpassing the overload state.
* It doesn't affect permissions. But it enables plugins change the
* actual user permissions even in overload mode.
*
* @param userName
* @return user object
*/
public User surpassOverload(String userName) {
if (!isOverloaded(userName)) {
return getUser(userName);
}
if (getUsers().containsKey(userName.toLowerCase())) {
return getUsers().get(userName.toLowerCase());
}
User newUser = createUser(userName);
return newUser;
}
}
//END OVERLOAD
setGroupsChanged(true);
return true;
}
}
return false;
}
/**
*
* @return Collection of all users
*/
@Override
public Collection<User> getUserList() {
Collection<User> overloadedList = new ArrayList<User>();
Collection<User> normalList = getUsers().values();
for (User u : normalList) {
if (overloadedUsers.containsKey(u.getName().toLowerCase())) {
overloadedList.add(overloadedUsers.get(u.getName().toLowerCase()));
} else {
overloadedList.add(u);
}
}
return overloadedList;
}
/**
*
* @param userName
* @return true if user is overloaded.
*/
public boolean isOverloaded(String userName) {
return overloadedUsers.containsKey(userName.toLowerCase());
}
/**
*
* @param userName
*/
public void overloadUser(String userName) {
if (!isOverloaded(userName)) {
User theUser = getUser(userName);
theUser = theUser.clone();
if (overloadedUsers.containsKey(theUser.getName().toLowerCase())) {
overloadedUsers.remove(theUser.getName().toLowerCase());
}
overloadedUsers.put(theUser.getName().toLowerCase(), theUser);
}
}
/**
*
* @param userName
*/
public void removeOverload(String userName) {
overloadedUsers.remove(userName.toLowerCase());
}
/**
* Gets the user in normal state. Surpassing the overload state.
* It doesn't affect permissions. But it enables plugins change the
* actual user permissions even in overload mode.
*
* @param userName
* @return user object
*/
public User surpassOverload(String userName) {
if (!isOverloaded(userName)) {
return getUser(userName);
}
if (getUsers().containsKey(userName.toLowerCase())) {
return getUsers().get(userName.toLowerCase());
}
User newUser = createUser(userName);
return newUser;
}
}

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,27 +28,31 @@ 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())
user.setDataSource(this.dataSource);
}
/**
* @return the users
*/
public Map<String, User> getUsers() {
return users;
}
/**
* @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

@ -6,79 +6,82 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
/**
* @author ElgarL
*
*
*/
public class GMGroupEvent extends Event {
/**
/**
*
*/
private static final HandlerList handlers = new HandlerList();
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
//////////////////////////////
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
//////////////////////////////
protected Group group;
protected String groupName;
protected Action action;
public GMGroupEvent(Group group, Action action) {
super();
protected Action action;
this.group = group;
this.action = action;
this.groupName = group.getName();
}
public GMGroupEvent(String groupName, Action action) {
super();
public GMGroupEvent(Group group, Action action) {
this.groupName = groupName;
this.action = action;
}
public Action getAction(){
return this.action;
}
super();
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,
}
public void schedule(final GMGroupEvent event) {
this.group = group;
this.action = action;
this.groupName = group.getName();
}
public GMGroupEvent(String groupName, Action action) {
super();
this.groupName = groupName;
this.action = action;
}
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,
}
public void schedule(final GMGroupEvent event) {
if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
@Override
public void run() {
Bukkit.getServer().getPluginManager().callEvent(event);
}
}, 1) == -1)
GroupManager.logger.warning("Could not schedule GM Event.");
}
}
}

View file

@ -5,57 +5,58 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
/**
* @author ElgarL
*
*
*/
public class GMSystemEvent extends Event {
/**
/**
*
*/
private static final HandlerList handlers = new HandlerList();
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
//////////////////////////////
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
//////////////////////////////
protected Action action;
public GMSystemEvent(Action action) {
super();
this.action = action;
}
public Action getAction(){
return this.action;
}
public enum Action {
RELOADED,
SAVED,
DEFAULT_GROUP_CHANGED,
VALIDATE_TOGGLE,
}
public void schedule(final GMSystemEvent event) {
public GMSystemEvent(Action action) {
super();
this.action = action;
}
public Action getAction() {
return this.action;
}
public enum Action {
RELOADED, SAVED, DEFAULT_GROUP_CHANGED, VALIDATE_TOGGLE,
}
public void schedule(final GMSystemEvent event) {
if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
@Override
public void run() {
Bukkit.getServer().getPluginManager().callEvent(event);
}
}, 1) == -1)
GroupManager.logger.warning("Could not schedule GM Event.");
}
}
}

View file

@ -6,81 +6,82 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
/**
* @author ElgarL
*
*
*/
public class GMUserEvent extends Event {
/**
/**
*
*/
private static final HandlerList handlers = new HandlerList();
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
//////////////////////////////
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
//////////////////////////////
protected User user;
protected String userName;
protected Action action;
public GMUserEvent(User user, Action action) {
super();
protected Action action;
this.user = user;
this.action = action;
this.userName = user.getName();
}
public GMUserEvent(String userName, Action action) {
super();
public GMUserEvent(User user, Action action) {
this.userName = userName;
this.action = action;
}
public Action getAction(){
return this.action;
}
super();
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,
}
public void schedule(final GMUserEvent event) {
this.user = user;
this.action = action;
this.userName = user.getName();
}
public GMUserEvent(String userName, Action action) {
super();
this.userName = userName;
this.action = action;
}
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,
}
public void schedule(final GMUserEvent event) {
if (Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("GroupManager"), new Runnable() {
@Override
public void run() {
Bukkit.getServer().getPluginManager().callEvent(event);
}
}, 1) == -1)
GroupManager.logger.warning("Could not schedule GM Event.");
}
}
}

View file

@ -6,31 +6,33 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.world.WorldInitEvent;
/**
* @author ElgarL
*
* Handle new world creation from other plugins
*
* Handle new world creation from other plugins
*
*/
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);
}
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)) {
String worldName = event.getWorld().getName();
if (GroupManager.isLoaded() && !plugin.getWorldsHolder().isInList(worldName)) {
GroupManager.logger.info("New world detected...");
GroupManager.logger.info("Creating data for: " + worldName);
plugin.getWorldsHolder().setupWorldFolder(worldName);

View file

@ -3,40 +3,51 @@ package org.anjocaido.groupmanager.events;
import org.anjocaido.groupmanager.data.Group;
import org.anjocaido.groupmanager.data.User;
/**
* @author ElgarL
*
* Handles all Event generation.
*
* Handles all Event generation.
*
*/
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,10 +101,11 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
*/
@Override
public List<String> getAllPlayersPermissions(String userName) {
List<String> perms = new ArrayList<String>();
perms.addAll(getAllPlayersPermissions(userName, true));
return perms;
}
@ -118,33 +123,32 @@ public class AnjoPermissionsHandler extends PermissionsReaderInterface {
// Add the players own permissions.
playerPermArray.addAll(populatePerms(ph.getUser(userName).getPermissionList(), includeChildren));
ArrayList<String> alreadyProcessed = new ArrayList<String>();
// fetch all group permissions
for (String group : getGroups(userName)) {
// Don't process a group more than once.
if (!alreadyProcessed.contains(group)) {
alreadyProcessed.add(group);
Set<String> groupPermArray = new HashSet<String>();
if (group.startsWith("g:") && GroupManager.getGlobalGroups().hasGroup(group)) {
// GlobalGroups
groupPermArray = populatePerms(GroupManager.getGlobalGroups().getGroupsPermissions(group), includeChildren);
} else {
// World Groups
groupPermArray = populatePerms(ph.getGroup(group).getPermissionList(), includeChildren);
}
// Add all group permissions, unless negated by earlier permissions.
for (String perm : groupPermArray) {
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);
}
}
@ -154,68 +158,69 @@ 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);
Set<String> permArray = new HashSet<String>();
Boolean allPerms = false;
// Allow * node to populate ALL permissions to Bukkit.
if (perms.contains("*")) {
permArray.addAll(GroupManager.BukkitPermissions.getAllRegisteredPermissions(includeChildren));
allPerms = true;
perms.remove("*");
}
for (String perm : perms) {
/**
* all permission sets are passed here pre-sorted, alphabetically.
* This means negated nodes will be processed before all permissions
* other than *.
*/
boolean negated = perm.startsWith("-");
if (!permArray.contains(perm)) {
permArray.add(perm);
if ((negated) && (permArray.contains(perm.substring(1))))
permArray.remove(perm.substring(1));
/**
* all permission sets are passed here pre-sorted, alphabetically.
* This means negated nodes will be processed before all permissions
* other than *.
* Process child nodes if required,
* 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.
*/
boolean negated = perm.startsWith("-");
if (!permArray.contains(perm)) {
permArray.add(perm);
if ((negated) && (permArray.contains(perm.substring(1))))
permArray.remove(perm.substring(1));
/**
* Process child nodes if required,
* 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)) {
Map<String, Boolean> children = GroupManager.BukkitPermissions.getAllChildren((negated ? perm.substring(1) : perm), new HashSet<String>());
if (children != null) {
if (negated)
if (allPerms) {
// Remove children of negated nodes
for (String child : children.keySet())
if (children.get(child))
if (permArray.contains(child))
permArray.remove(child);
if ((includeChildren) || (negated && allPerms)) {
Map<String, Boolean> children = GroupManager.BukkitPermissions.getAllChildren((negated ? perm.substring(1) : perm), new HashSet<String>());
if (children != null) {
if (negated)
if (allPerms) {
// Remove children of negated nodes
for (String child : children.keySet())
if (children.get(child))
if (permArray.contains(child))
permArray.remove(child);
} else {
// Add child nodes
for (String child : children.keySet())
if (children.get(child))
if ((!permArray.contains(child)) && (!permArray.contains("-" + child)))
permArray.add(child);
}
}
}
}
}
}
return permArray;
}
@ -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
@ -62,11 +62,12 @@ public class BukkitPermissions {
protected boolean dumpAllPermissions = true;
protected boolean dumpMatchedPermissions = true;
private boolean player_join = false;
/**
* @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,35 +104,38 @@ 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()) {
registeredPermissions.put(perm.getName().toLowerCase(), perm);
registeredPermissions.put(perm.getName().toLowerCase(), perm);
}
}
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;
}
@ -155,17 +161,18 @@ public class BukkitPermissions {
// Sort the perm list by parent/child, so it will push to superperms correctly.
playerPermArray = sort(playerPermArray);
Boolean value = false;
for (String permission : playerPermArray) {
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
* https://github.com/Bukkit/Bukkit/pull/466
*/
* 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
@SuppressWarnings("unchecked")
Map<String, Boolean> orig = (Map<String, Boolean>) permissions.get(attachment);
@ -182,7 +189,7 @@ public class BukkitPermissions {
e.printStackTrace();
}
}
/**
* Sort a permission node list by parent/child
*
@ -190,20 +197,20 @@ public class BukkitPermissions {
* @return List sorted for priority
*/
private List<String> sort(List<String> permList) {
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)) {
itr.set(key);
@ -215,11 +222,10 @@ public class BukkitPermissions {
if (!result.contains(key))
result.add(key);
}
return result;
}
/**
* Fetch all permissions which are registered with superperms.
* {can include child nodes)
@ -228,13 +234,13 @@ public class BukkitPermissions {
* @return List of all permission nodes
*/
public List<String> getAllRegisteredPermissions(boolean includeChildren) {
List<String> perms = new ArrayList<String>();
for (String key : registeredPermissions.keySet()) {
if (!perms.contains(key)) {
perms.add(key);
if (includeChildren) {
Map<String, Boolean> children = getAllChildren(key, new HashSet<String>());
if (children != null) {
@ -244,32 +250,33 @@ public class BukkitPermissions {
}
}
}
}
return perms;
}
/**
* Returns a map of ALL child permissions registered with bukkit
* 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) {
LinkedList<String> stack = new LinkedList<String>();
Map<String, Boolean> alreadyVisited = new HashMap<String, Boolean>();
stack.push(node);
alreadyVisited.put(node, true);
while (!stack.isEmpty()) {
String now = stack.pop();
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,24 +286,26 @@ 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
* @return Map of child permissions
*/
public Map<String, Boolean> getChildren(String node) {
Permission perm = registeredPermissions.get(node.toLowerCase());
if (perm == null)
return null;
return perm.getChildren();
}
@ -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,25 +342,28 @@ public class BukkitPermissions {
* force Bukkit to update every OnlinePlayers permissions.
*/
public void updateAllPlayers() {
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
updatePermissions(player);
}
}
/**
* force Bukkit to update this Players permissions.
*/
public void updatePlayer(Player player) {
if (player != null)
this.updatePermissions(player, null);
}
/**
* Force remove any attachments
*
* @param player
*/
private void removeAttachment(Player player) {
if (attachments.containsKey(player)) {
try {
player.removeAttachment(attachments.get(player));
@ -363,15 +376,15 @@ public class BukkitPermissions {
attachments.remove(player);
}
}
/**
* Remove all attachments in case of a restart or reload.
*/
public void removeAllAttachments() {
Iterator<Player> itr = attachments.keySet().iterator();
while (itr.hasNext()){
while (itr.hasNext()) {
Player player = itr.next();
try {
player.removeAttachment(attachments.get(player));
@ -389,20 +402,21 @@ public class BukkitPermissions {
* Player events tracked to cause Superperms updates
*
* @author ElgarL
*
*
*/
protected class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) {
setPlayer_join(true);
Player player = event.getPlayer();
/*
* Tidy up any lose ends
*/
removeAttachment(player);
// force GM to create the player if they are not already listed.
if (plugin.getWorldsHolder().getWorldData(player.getWorld().getName()).getUser(player.getName()) != null) {
setPlayer_join(false);
@ -410,29 +424,32 @@ public class BukkitPermissions {
}
setPlayer_join(false);
}
@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();
/*
* force remove any attachments as bukkit may not
*/
removeAttachment(player);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event) {
if (!GroupManager.isLoaded())
return;
Player player = event.getPlayer();
/*
* force remove any attachments as bukkit may not
*/
@ -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

@ -12,227 +12,239 @@ import org.bukkit.entity.Player;
/**
* Made by Nijikokun. Changed by Gabriel Couto
*
*
* This class is intended to *read* permissions from a single world.
*
*
* @author Nijikokun
* @author Gabriel Couto
* @author ElgarL
*/
public abstract class PermissionsReaderInterface {
/**
*
* @param player
* @param string
* @return true if has permission
*/
public abstract boolean has(Player player, String string);
/**
*
* @param player
* @param string
* @return true if has permission
*/
public abstract boolean has(Player player, String string);
/**
*
* @param player
* @param string
* @return true if has permission
*/
public abstract boolean permission(Player player, String string);
/**
*
* @param player
* @param string
* @return true if has permission
*/
public abstract boolean permission(Player player, String string);
/**
*
* @param userName
* @return group name for this player.
*/
public abstract String getGroup(String userName);
/**
*
* @param userName
* @return group name for this player.
*/
public abstract String getGroup(String userName);
/**
*
* @param userName
* @param groupName
* @return true if in group
*/
public abstract boolean inGroup(String userName, String groupName);
/**
*
* @param userName
* @param groupName
* @return true if in group
*/
public abstract boolean inGroup(String userName, String groupName);
/**
*
* @param groupName
* @return String of prefix
*/
public abstract String getGroupPrefix(String groupName);
/**
*
* @param groupName
* @return String of prefix
*/
public abstract String getGroupPrefix(String groupName);
/**
*
* @param groupName
* @return String of suffix
*/
public abstract String getGroupSuffix(String groupName);
/**
*
* @param groupName
* @return String of suffix
*/
public abstract String getGroupSuffix(String groupName);
/**
*
* @param groupName
* @return true if can build
*/
public abstract boolean canGroupBuild(String groupName);
/**
*
* @param groupName
* @return true if can build
*/
public abstract boolean canGroupBuild(String groupName);
/**
*
* @param groupName
* @param node
* @return String value
*/
public abstract String getGroupPermissionString(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return String value
*/
public abstract String getGroupPermissionString(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return integer value
*/
public abstract int getGroupPermissionInteger(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return integer value
*/
public abstract int getGroupPermissionInteger(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return boolean value
*/
public abstract boolean getGroupPermissionBoolean(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return boolean value
*/
public abstract boolean getGroupPermissionBoolean(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return double value
*/
public abstract double getGroupPermissionDouble(String groupName, String node);
/**
*
* @param groupName
* @param node
* @return double value
*/
public abstract double getGroupPermissionDouble(String groupName, String node);
/**
*
* @param userName
* @param node
* @return String value
*/
public abstract String getUserPermissionString(String userName, String node);
/**
*
* @param userName
* @param node
* @return String value
*/
public abstract String getUserPermissionString(String userName, String node);
/**
*
* @param userName
* @param node
* @return integer value
*/
public abstract int getUserPermissionInteger(String userName, String node);
/**
*
* @param userName
* @param node
* @return integer value
*/
public abstract int getUserPermissionInteger(String userName, String node);
/**
*
* @param userName
* @param node
* @return boolean value
*/
public abstract boolean getUserPermissionBoolean(String userName, String node);
/**
*
* @param userName
* @param node
* @return boolean value
*/
public abstract boolean getUserPermissionBoolean(String userName, String node);
/**
*
* @param userName
* @param node
* @return double value
*/
public abstract double getUserPermissionDouble(String userName, String node);
/**
*
* @param userName
* @param node
* @return double value
*/
public abstract double getUserPermissionDouble(String userName, String node);
/**
*
* @param userName
* @param node
* @return String value
*/
public abstract String getPermissionString(String userName, String node);
/**
*
* @param userName
* @param node
* @return String value
*/
public abstract String getPermissionString(String userName, String node);
/**
*
* @param userName
* @param node
* @return integer value
*/
public abstract int getPermissionInteger(String userName, String node);
/**
*
* @param userName
* @param node
* @return integer value
*/
public abstract int getPermissionInteger(String userName, String node);
/**
*
* @param userName
* @param node
* @return boolean value
*/
public abstract boolean getPermissionBoolean(String userName, String node);
/**
*
* @param userName
* @param node
* @return boolean value
*/
public abstract boolean getPermissionBoolean(String userName, String node);
/**
*
* @param userName
* @param node
* @return double value
*/
public abstract double getPermissionDouble(String userName, String node);
/**
*
* @param userName
* @param node
* @return double value
*/
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
* without having to look at every one of the user's ancestors.
* Returns an empty string if user has no parent groups.
*
* @param user Player's name
* @return Player's prefix
*/
public abstract String getUserPrefix(String user);
/////////////////////////////
/**
* Gets the appropriate prefix for the user.
* This method is a utility method for chat plugins to get the user's prefix
* without having to look at every one of the user's ancestors.
* Returns an empty string if user has no parent groups.
*
* @param user Player's name
* @return Player's prefix
*/
public abstract String getUserPrefix(String user);
/**
* Gets the appropriate suffix for the user.
* This method is a utility method for chat plugins to get the user's suffix
* without having to look at every one of the user's ancestors.
* Returns an empty string if user has no parent groups.
*
* @param user Player's name
* @return Player's suffix
*/
public abstract String getUserSuffix(String user);
/**
* Gets the appropriate suffix for the user.
* This method is a utility method for chat plugins to get the user's suffix
* without having to look at every one of the user's ancestors.
* Returns an empty string if user has no parent groups.
*
* @param user Player's name
* @return Player's suffix
*/
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.
*/
public abstract Group getDefaultGroup();
/**
* 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
*/
public abstract String[] getGroups(String name);
/**
* 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
*/
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 String getInfoString(String entryName, String path, boolean isGroup);
public abstract int getInfoInteger(String entryName, String path, boolean isGroup);
//public abstract int getInfoInteger(String entryName, String path, boolean isGroup, Comparator<Integer> comparator);
//public abstract String getInfoString(String entryName, String path, boolean isGroup, Comparator<String> 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 int getInfoInteger(String entryName, String path, boolean isGroup);
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 int getInfoInteger(String entryName, String path, boolean isGroup, Comparator<Integer> comparator);
public abstract void addUserInfo(String name, String path, Object data);
/**
* 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 void removeUserInfo(String name, String path);
//public abstract double getInfoDouble(String entryName, String path, boolean isGroup, Comparator<Double> comparator);
public abstract void addGroupInfo(String name, String path, Object data);
public abstract boolean getInfoBoolean(String entryName, String path, boolean isGroup);
public abstract void removeGroupInfo(String name, String path);
//////////////////////////////
//public abstract boolean getInfoBoolean(String entryName, String path, boolean isGroup, Comparator<Boolean> comparator);
public abstract void addUserInfo(String name, String path, Object data);
public abstract void removeUserInfo(String name, String path);
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

@ -9,18 +9,19 @@ import java.util.logging.Level;
import java.util.logging.LogRecord;
/**
*
*
* @author gabrielcouto
*/
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);
} else {
System.out.println(message);
}
}
@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);
} else {
System.out.println(message);
}
}
}

View file

@ -6,47 +6,48 @@ package org.anjocaido.groupmanager.utils;
/**
* Just a list of commands for this plugin
*
* @author gabrielcouto
*/
public enum GroupManagerPermissions {
manuadd,
manudel,
manuaddsub,
manudelsub,
mangadd,
mangdel,
manuaddp,
manudelp,
manulistp,
manucheckp,
mangaddp,
mangdelp,
manglistp,
mangcheckp,
mangaddi,
mangdeli,
manuaddv,
manudelv,
manulistv,
manucheckv,
mangaddv,
mangdelv,
manglistv,
mangcheckv,
manwhois,
tempadd,
tempdel,
templist,
tempdelall,
mansave,
manload,
listgroups,
manpromote,
mandemote,
mantogglevalidate,
mantogglesave,
manworld,
manselect,
manclear
manuadd,
manudel,
manuaddsub,
manudelsub,
mangadd,
mangdel,
manuaddp,
manudelp,
manulistp,
manucheckp,
mangaddp,
mangdelp,
manglistp,
mangcheckp,
mangaddi,
mangdeli,
manuaddv,
manudelv,
manulistv,
manucheckv,
mangaddv,
mangdelv,
manglistv,
mangcheckv,
manwhois,
tempadd,
tempdel,
templist,
tempdelall,
mansave,
manload,
listgroups,
manpromote,
mandemote,
mantogglevalidate,
mantogglesave,
manworld,
manselect,
manclear
}

View file

@ -7,61 +7,61 @@ package org.anjocaido.groupmanager.utils;
import org.anjocaido.groupmanager.data.DataUnit;
/**
*
*
* @author gabrielcouto
*/
public class PermissionCheckResult {
/**
* It should be the owner of the access level found.
*
* Use instanceof to find the owner type
*/
public DataUnit owner;
/**
* The permission node found in the DataUnit.
*/
public String accessLevel;
/**
* The full name of the permission you are looking for
*/
public String askedPermission;
/**
* The result conclusion of the search.
* It determines if the owner can do, or not.
*
* It even determines if it has an owner.
*/
public Type resultType = Type.NOTFOUND;
/**
* It should be the owner of the access level found.
*
* Use instanceof to find the owner type
*/
public DataUnit owner;
/**
* The permission node found in the DataUnit.
*/
public String accessLevel;
/**
* The full name of the permission you are looking for
*/
public String askedPermission;
/**
* The result conclusion of the search.
* It determines if the owner can do, or not.
*
* It even determines if it has an owner.
*/
public Type resultType = Type.NOTFOUND;
/**
* The type of result the search can give.
*/
public enum Type {
/**
* The type of result the search can give.
*/
public enum Type {
/**
* If found a matching node starting with '+'.
* It means the user CAN do the permission.
*/
EXCEPTION,
/**
* If found a matching node starting with '-'.
* It means the user CANNOT do the permission.
*/
NEGATION,
/**
* If just found a common matching node.
* IT means the user CAN do the permission.
*/
FOUND,
/**
* If no matchin node was found.
* It means the user CANNOT do the permission.
*
* owner field and accessLevel field should not be considered,
* when type is
* NOTFOUND
*/
NOTFOUND
}
/**
* If found a matching node starting with '+'.
* It means the user CAN do the permission.
*/
EXCEPTION,
/**
* If found a matching node starting with '-'.
* It means the user CANNOT do the permission.
*/
NEGATION,
/**
* If just found a common matching node.
* IT means the user CAN do the permission.
*/
FOUND,
/**
* If no matchin node was found.
* It means the user CANNOT do the permission.
*
* owner field and accessLevel field should not be considered,
* when type is
* NOTFOUND
*/
NOTFOUND
}
}

View file

@ -7,43 +7,46 @@ package org.anjocaido.groupmanager.utils;
import java.util.Comparator;
/**
*
*
* @author gabrielcouto
*/
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("-");
boolean bm = permB.startsWith("-");
if (ap && bp) {
return 0;
}
if (ap && !bp) {
return -1;
}
if (!ap && bp) {
return 1;
}
if (am && bm) {
return 0;
}
if (am && !bm) {
return -1;
}
if (!am && bm) {
return 1;
}
return permA.compareToIgnoreCase(permB);
}
private static StringPermissionComparator instance;
@Override
public int compare(String permA, String permB) {
public static StringPermissionComparator getInstance() {
if (instance == null) {
instance = new StringPermissionComparator();
}
return instance;
}
boolean ap = permA.startsWith("+");
boolean bp = permB.startsWith("+");
boolean am = permA.startsWith("-");
boolean bm = permB.startsWith("-");
if (ap && bp) {
return 0;
}
if (ap && !bp) {
return -1;
}
if (!ap && bp) {
return 1;
}
if (am && bm) {
return 0;
}
if (am && !bm) {
return -1;
}
if (!am && bm) {
return 1;
}
return permA.compareToIgnoreCase(permB);
}
private static StringPermissionComparator instance;
public static StringPermissionComparator getInstance() {
if (instance == null) {
instance = new StringPermissionComparator();
}
return instance;
}
}

View file

@ -22,13 +22,12 @@ import java.util.List;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.data.Group;
/**
*
*
* @author gabrielcouto
*/
public abstract class Tasks {
/**
* Gets the exception stack trace as a string.
*
@ -36,35 +35,38 @@ 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);
return sw.toString();
}
public static void copy(InputStream src, File dst) throws IOException {
InputStream in = src;
OutputStream out = new FileOutputStream(dst);
public static void copy(InputStream src, File dst) throws IOException {
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
try {
in.close();
} catch (Exception e) {
}
}
InputStream in = src;
OutputStream out = new FileOutputStream(dst);
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
copy(in, dst);
}
/**
// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
try {
in.close();
} catch (Exception e) {
}
}
public static void copy(File src, File dst) throws IOException {
InputStream in = new FileInputStream(src);
copy(in, dst);
}
/**
* Appends a string to a file
*
* @param data
@ -82,86 +84,92 @@ public abstract class Tasks {
out.append(System.getProperty("line.separator"));
out.append(data);
out.append(System.getProperty("line.separator"));
out.close();
}
public static void removeOldFiles(GroupManager gm, File folder) {
if (folder.isDirectory()) {
long oldTime = System.currentTimeMillis() - (((long)gm.getGMConfig().getBackupDuration()*60*60)*1000);
for (File olds : folder.listFiles()) {
if (olds.isFile()) {
if (olds.lastModified() < oldTime) {
try {
olds.delete();
} catch (Exception e) {
}
}
}
}
}
}
public static void removeOldFiles(GroupManager gm, File folder) {
public static String getDateString() {
GregorianCalendar now = new GregorianCalendar();
String date = "";
date += now.get(Calendar.DAY_OF_MONTH);
date += "-";
date += now.get(Calendar.HOUR);
date += "-";
date += now.get(Calendar.MINUTE);
return date;
}
if (folder.isDirectory()) {
long oldTime = System.currentTimeMillis() - (((long) gm.getGMConfig().getBackupDuration() * 60 * 60) * 1000);
for (File olds : folder.listFiles()) {
if (olds.isFile()) {
if (olds.lastModified() < oldTime) {
try {
olds.delete();
} catch (Exception e) {
}
}
}
}
}
}
public static String getStringListInString(List<String> list) {
if (list == null) {
return "";
}
String result = "";
for (int i = 0; i < list.size(); i++) {
result += list.get(i);
if (i < list.size() - 1) {
result += ", ";
}
}
return result;
}
public static String getDateString() {
public static String getStringArrayInString(String[] list) {
if (list == null) {
return "";
}
String result = "";
for (int i = 0; i < list.length; i++) {
result += list[i];
if (i < ((list.length) - 1)) {
result += ", ";
}
}
return result;
}
GregorianCalendar now = new GregorianCalendar();
String date = "";
date += now.get(Calendar.DAY_OF_MONTH);
date += "-";
date += now.get(Calendar.HOUR);
date += "-";
date += now.get(Calendar.MINUTE);
return date;
}
public static String getGroupListInString(List<Group> list) {
if (list == null) {
return "";
}
String result = "";
for (int i = 0; i < list.size(); i++) {
result += list.get(i).getName();
if (i < list.size() - 1) {
result += ", ";
}
}
return result;
}
public static String join(String[] arr, String separator) {
if (arr.length == 0)
return "";
String out = arr[0].toString();
for (int i = 1; i < arr.length; i++)
out += separator + arr[i];
return out;
}
public static String getStringListInString(List<String> list) {
if (list == null) {
return "";
}
String result = "";
for (int i = 0; i < list.size(); i++) {
result += list.get(i);
if (i < list.size() - 1) {
result += ", ";
}
}
return result;
}
public static String getStringArrayInString(String[] list) {
if (list == null) {
return "";
}
String result = "";
for (int i = 0; i < list.length; i++) {
result += list[i];
if (i < ((list.length) - 1)) {
result += ", ";
}
}
return result;
}
public static String getGroupListInString(List<Group> list) {
if (list == null) {
return "";
}
String result = "";
for (int i = 0; i < list.size(); i++) {
result += list.get(i).getName();
if (i < list.size() - 1) {
result += ", ";
}
}
return result;
}
public static String join(String[] arr, String separator) {
if (arr.length == 0)
return "";
String out = arr[0].toString();
for (int i = 1; i < arr.length; i++)
out += separator + arr[i];
return out;
}
}