From 1cf0ebbd7f120c0b8d421cc459f2d5a1386d82dc Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 10 Sep 2012 20:49:07 +0200 Subject: Thread safety for GM --- .../org/anjocaido/groupmanager/data/DataUnit.java | 18 ++++++++++++------ .../src/org/anjocaido/groupmanager/data/Group.java | 21 ++++++++++++++------- .../anjocaido/groupmanager/data/GroupVariables.java | 5 ++++- .../src/org/anjocaido/groupmanager/data/User.java | 11 ++++++++--- .../anjocaido/groupmanager/data/UserVariables.java | 5 ++++- .../org/anjocaido/groupmanager/data/Variables.java | 10 ++++++---- 6 files changed, 48 insertions(+), 22 deletions(-) (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/data') 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 permissions = new ArrayList(); + private List permissions = Collections.unmodifiableList(Collections.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 clone = new ArrayList(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 clone = new ArrayList(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 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 clone = new ArrayList(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 inherits = new ArrayList(); + private List inherits = Collections.unmodifiableList(Collections.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(this.getInherits()); + clone.inherits = this.getInherits().isEmpty() ? + Collections.unmodifiableList(Collections.emptyList()) + : Collections.unmodifiableList(new ArrayList(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(this.getInherits()); + clone.inherits = this.getInherits().isEmpty() ? + Collections.unmodifiableList(Collections.emptyList()) + : Collections.unmodifiableList(new ArrayList(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 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 clone = new ArrayList(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 clone = new ArrayList(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 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..b1b2c6985 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 subGroups = new ArrayList(); + private List subGroups = Collections.synchronizedList(Collections.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 subGroupListCopy() { ArrayList val = new ArrayList(); + 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 subGroupListStringCopy() { - - return new ArrayList(subGroups); + synchronized(subGroups) { + return new ArrayList(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 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..10d8be469 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java @@ -4,6 +4,7 @@ */ package org.anjocaido.groupmanager.data; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -21,7 +22,7 @@ import java.util.Set; public abstract class Variables implements Cloneable { private DataUnit owner; - protected Map variables = new HashMap(); + protected final Map variables = Collections.synchronizedMap(new HashMap()); public Variables(DataUnit owner) { @@ -126,9 +127,10 @@ public abstract class Variables implements Cloneable { * * @return Set of all variable names. */ - public Set getVarKeyList() { - - return variables.keySet(); + public String[] getVarKeyList() { + synchronized(variables) { + return variables.keySet().toArray(new String[0]); + } } /** -- cgit v1.2.3 From 60142d872fc2193525ffc3e45fdd35c5517247d7 Mon Sep 17 00:00:00 2001 From: snowleo Date: Mon, 10 Sep 2012 20:53:25 +0200 Subject: Missing final --- EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/data') diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java index b1b2c6985..a7e5cdc8b 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/User.java @@ -28,7 +28,7 @@ public class User extends DataUnit implements Cloneable { * */ private String group = null; - private List subGroups = Collections.synchronizedList(Collections.emptyList()); + private final List subGroups = Collections.synchronizedList(Collections.emptyList()); /** * This one holds the fields in INFO node. like prefix = 'c' or build = * false -- cgit v1.2.3 From 75f7b06a23e8bed40d30068542b97959663c75e8 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Tue, 11 Sep 2012 11:12:19 +0100 Subject: Remove unused imports. --- .../src/org/anjocaido/groupmanager/data/Variables.java | 1 - 1 file changed, 1 deletion(-) (limited to 'EssentialsGroupManager/src/org/anjocaido/groupmanager/data') diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java index 10d8be469..8e1a54b98 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/data/Variables.java @@ -7,7 +7,6 @@ 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. -- cgit v1.2.3