summaryrefslogtreecommitdiffstats
path: root/EssentialsGroupManager/src/org/anjocaido/groupmanager/data
diff options
context:
space:
mode:
Diffstat (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/data')
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java18
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java21
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java5
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java11
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java5
-rw-r--r--EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java11
6 files changed, 48 insertions, 23 deletions
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java
index bb04fa3d7..5cd07048f 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/DataUnit.java
@@ -21,7 +21,7 @@ public abstract class DataUnit {
private WorldDataHolder dataSource;
private String name;
private boolean changed, sorted = false;
- private ArrayList<String> permissions = new ArrayList<String>();
+ private List<String> permissions = Collections.unmodifiableList(Collections.<String>emptyList());
public DataUnit(WorldDataHolder dataSource, String name) {
@@ -144,7 +144,9 @@ public abstract class DataUnit {
public void addPermission(String permission) {
if (!hasSamePermissionNode(permission)) {
- permissions.add(permission);
+ List<String> clone = new ArrayList<String>(permissions);
+ clone.add(permission);
+ permissions = Collections.unmodifiableList(clone);
}
flagAsChanged();
}
@@ -152,7 +154,10 @@ public abstract class DataUnit {
public boolean removePermission(String permission) {
flagAsChanged();
- return permissions.remove(permission);
+ List<String> clone = new ArrayList<String>(permissions);
+ boolean ret = clone.remove(permission);
+ permissions = Collections.unmodifiableList(clone);
+ return ret;
}
/**
@@ -162,8 +167,7 @@ public abstract class DataUnit {
* @return a copy of the permission list
*/
public List<String> getPermissionList() {
-
- return Collections.unmodifiableList(permissions);
+ return permissions;
}
public boolean isSorted() {
@@ -174,7 +178,9 @@ public abstract class DataUnit {
public void sortPermissions() {
if (!isSorted()) {
- Collections.sort(permissions, StringPermissionComparator.getInstance());
+ List<String> clone = new ArrayList<String>(permissions);
+ Collections.sort(clone, StringPermissionComparator.getInstance());
+ permissions = Collections.unmodifiableList(clone);
sorted = true;
}
}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java
index 751dc8fd6..8da6ba85a 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Group.java
@@ -23,7 +23,7 @@ public class Group extends DataUnit implements Cloneable {
/**
* The group it inherits DIRECTLY!
*/
- private ArrayList<String> inherits = new ArrayList<String>();
+ private List<String> inherits = Collections.unmodifiableList(Collections.<String>emptyList());
/**
* This one holds the fields in INFO node.
* like prefix = 'c'
@@ -75,7 +75,9 @@ public class Group extends DataUnit implements Cloneable {
clone = new Group(this.getName());
} else {
clone = new Group(getDataSource(), this.getName());
- clone.inherits = new ArrayList<String>(this.getInherits());
+ clone.inherits = this.getInherits().isEmpty() ?
+ Collections.unmodifiableList(Collections.<String>emptyList())
+ : Collections.unmodifiableList(new ArrayList<String>(this.getInherits()));
}
for (String perm : this.getPermissionList()) {
@@ -102,7 +104,9 @@ public class Group extends DataUnit implements Cloneable {
// Don't add inheritance for GlobalGroups
if (!isGlobal()) {
- clone.inherits = new ArrayList<String>(this.getInherits());
+ clone.inherits = this.getInherits().isEmpty() ?
+ Collections.unmodifiableList(Collections.<String>emptyList())
+ : Collections.unmodifiableList(new ArrayList<String>(this.getInherits()));
}
for (String perm : this.getPermissionList()) {
clone.addPermission(perm);
@@ -120,8 +124,7 @@ public class Group extends DataUnit implements Cloneable {
* @return the inherits
*/
public List<String> getInherits() {
-
- return Collections.unmodifiableList(inherits);
+ return inherits;
}
/**
@@ -134,7 +137,9 @@ public class Group extends DataUnit implements Cloneable {
getDataSource().addGroup(inherit);
}
if (!inherits.contains(inherit.getName().toLowerCase())) {
- inherits.add(inherit.getName().toLowerCase());
+ List<String> clone = new ArrayList<String>(inherits);
+ clone.add(inherit.getName().toLowerCase());
+ inherits = Collections.unmodifiableList(clone);
}
flagAsChanged();
if (GroupManager.isLoaded()) {
@@ -148,7 +153,9 @@ public class Group extends DataUnit implements Cloneable {
if (!isGlobal()) {
if (this.inherits.contains(inherit.toLowerCase())) {
- this.inherits.remove(inherit.toLowerCase());
+ List<String> clone = new ArrayList<String>(inherits);
+ clone.remove(inherit.toLowerCase());
+ inherits = Collections.unmodifiableList(clone);
flagAsChanged();
GroupManagerEventHandler.callEvent(this, Action.GROUP_INHERITANCE_CHANGED);
return true;
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java
index e08d1db7d..588d50116 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/GroupVariables.java
@@ -26,7 +26,8 @@ public class GroupVariables extends Variables implements Cloneable {
public GroupVariables(Group owner, Map<String, Object> varList) {
super(owner);
- variables = varList;
+ variables.clear();
+ variables.putAll(varList);
if (variables.get("prefix") == null) {
variables.put("prefix", "");
owner.flagAsChanged();
@@ -54,9 +55,11 @@ public class GroupVariables extends Variables implements Cloneable {
protected GroupVariables clone(Group newOwner) {
GroupVariables clone = new GroupVariables(newOwner);
+ synchronized(variables) {
for (String key : variables.keySet()) {
clone.variables.put(key, variables.get(key));
}
+ }
newOwner.flagAsChanged();
return clone;
}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
index 6c74c2e50..a7e5cdc8b 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java
@@ -6,6 +6,8 @@ package org.anjocaido.groupmanager.data;
//import com.sun.org.apache.bcel.internal.generic.AALOAD;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.dataholder.WorldDataHolder;
@@ -26,7 +28,7 @@ public class User extends DataUnit implements Cloneable {
*
*/
private String group = null;
- private ArrayList<String> subGroups = new ArrayList<String>();
+ private final List<String> subGroups = Collections.synchronizedList(Collections.<String>emptyList());
/**
* This one holds the fields in INFO node. like prefix = 'c' or build =
* false
@@ -213,6 +215,7 @@ public class User extends DataUnit implements Cloneable {
public ArrayList<Group> subGroupListCopy() {
ArrayList<Group> val = new ArrayList<Group>();
+ synchronized(subGroups) {
for (String gstr : subGroups) {
Group g = getDataSource().getGroup(gstr);
if (g == null) {
@@ -221,12 +224,14 @@ public class User extends DataUnit implements Cloneable {
}
val.add(g);
}
+ }
return val;
}
public ArrayList<String> subGroupListStringCopy() {
-
- return new ArrayList<String>(subGroups);
+ synchronized(subGroups) {
+ return new ArrayList<String>(subGroups);
+ }
}
/**
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java
index f994595c1..05c3aecee 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/UserVariables.java
@@ -23,7 +23,8 @@ public class UserVariables extends Variables {
public UserVariables(User owner, Map<String, Object> varList) {
super(owner);
- this.variables = varList;
+ this.variables.clear();
+ this.variables.putAll(varList);
this.owner = owner;
}
@@ -35,9 +36,11 @@ public class UserVariables extends Variables {
protected UserVariables clone(User newOwner) {
UserVariables clone = new UserVariables(newOwner);
+ synchronized(variables) {
for (String key : variables.keySet()) {
clone.variables.put(key, variables.get(key));
}
+ }
newOwner.flagAsChanged();
return clone;
}
diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java
index 42ceba7e4..8e1a54b98 100644
--- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java
+++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java
@@ -4,9 +4,9 @@
*/
package org.anjocaido.groupmanager.data;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
/**
* A class that holds variables of a user/group.
@@ -21,7 +21,7 @@ import java.util.Set;
public abstract class Variables implements Cloneable {
private DataUnit owner;
- protected Map<String, Object> variables = new HashMap<String, Object>();
+ protected final Map<String, Object> variables = Collections.synchronizedMap(new HashMap<String, Object>());
public Variables(DataUnit owner) {
@@ -126,9 +126,10 @@ public abstract class Variables implements Cloneable {
*
* @return Set of all variable names.
*/
- public Set<String> getVarKeyList() {
-
- return variables.keySet();
+ public String[] getVarKeyList() {
+ synchronized(variables) {
+ return variables.keySet().toArray(new String[0]);
+ }
}
/**