22
22
*/
23
23
package org .xwiki .security ;
24
24
25
- import java .util .TreeSet ;
25
+ import java .lang .ref .ReferenceQueue ;
26
+ import java .lang .ref .WeakReference ;
26
27
import java .util .Collection ;
27
28
import java .util .Collections ;
28
29
import java .util .SortedSet ;
29
-
30
- import java .lang .ref .WeakReference ;
31
- import java .lang .ref .ReferenceQueue ;
30
+ import java .util .TreeSet ;
32
31
33
32
/**
34
33
* Represents access level.
50
49
*/
51
50
public class AccessLevel implements RightCacheEntry , Cloneable , Comparable <AccessLevel >
52
51
{
52
+ /** Read-only flag/mask. */
53
+ private static final int RO_MASK = 1 << 31 ;
54
+
53
55
/**
54
56
* The default access levels.
55
57
*/
56
- public static final AccessLevel DEFAULT_ACCESS_LEVEL ;
58
+ private static AccessLevel defaultAccessLevel = null ;
57
59
58
- /** Read-only flag/mask. */
59
- private static final int RO_MASK = 1 << 31 ;
60
+ /**
61
+ * The default access levels size. Check to update defaultAccessLevel if a new Right is added.
62
+ */
63
+ public static int defaultAccessLevelSize ;
60
64
61
65
/** Pool of existing instances. */
62
66
private static SortedSet <ALWeakRef > pool = new TreeSet <ALWeakRef >();
63
67
64
68
/** Reference queue for removing cleared references. */
65
69
private static ReferenceQueue <AccessLevel > refQueue = new ReferenceQueue <AccessLevel >();
66
70
67
- static {
68
- DEFAULT_ACCESS_LEVEL = new AccessLevel ()
69
- {
70
- {
71
- allow (Right .VIEW );
72
- allow (Right .EDIT );
73
- allow (Right .COMMENT );
74
- allow (Right .LOGIN );
75
- allow (Right .REGISTER );
76
- deny (Right .DELETE );
77
- deny (Right .ADMIN );
78
- deny (Right .PROGRAM );
79
- deny (Right .ILLEGAL );
80
- }
81
- } .getExistingInstance ();
82
- }
83
-
84
71
/**
85
72
* We use two consecutive bits to store an access level. The
86
73
* high order bit indicate if the state of the level is
@@ -91,6 +78,18 @@ public class AccessLevel implements RightCacheEntry, Cloneable, Comparable<Acces
91
78
* to the bits corresponding to the specific level.
92
79
*/
93
80
private int levels ;
81
+
82
+ public static AccessLevel getDefaultAccessLevel ()
83
+ {
84
+ if (defaultAccessLevel == null || Right .size () != defaultAccessLevelSize ) {
85
+ defaultAccessLevel = new AccessLevel ();
86
+ for (Right right : Right .values ()) {
87
+ defaultAccessLevel .set (right , right .getDefaultState ());
88
+ }
89
+ defaultAccessLevel = defaultAccessLevel .getExistingInstance ();
90
+ }
91
+ return defaultAccessLevel ;
92
+ }
94
93
95
94
/**
96
95
* Weak reference for storing instances in a pool.
@@ -185,7 +184,7 @@ public AccessLevel getExistingInstance()
185
184
*/
186
185
private int shift (int value , Right right )
187
186
{
188
- return value << (2 * right .getValue ());
187
+ return value << (2 * right .ordinal ());
189
188
}
190
189
191
190
/**
0 commit comments