You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2014/11/01 07:40:34 UTC
git commit: Used reentrantReadWriteLock instead of ReentrantLocks,
to allow concurrent access to the set when we just do a
set.contains().
Repository: directory-fortress-core
Updated Branches:
refs/heads/master b6258df4c -> f6faf5485
Used reentrantReadWriteLock instead of ReentrantLocks, to allow
concurrent access to the set when we just do a set.contains().
Project: http://git-wip-us.apache.org/repos/asf/directory-fortress-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-fortress-core/commit/f6faf548
Tree: http://git-wip-us.apache.org/repos/asf/directory-fortress-core/tree/f6faf548
Diff: http://git-wip-us.apache.org/repos/asf/directory-fortress-core/diff/f6faf548
Branch: refs/heads/master
Commit: f6faf5485f063711834d624adf3c5eaecc4ff8a0
Parents: b6258df
Author: Emmanuel Lécharny <el...@symas.com>
Authored: Sat Nov 1 07:40:17 2014 +0100
Committer: Emmanuel Lécharny <el...@symas.com>
Committed: Sat Nov 1 07:40:17 2014 +0100
----------------------------------------------------------------------
.../directory/fortress/core/rbac/OrgUnitP.java | 114 ++++++++++---------
1 file changed, 58 insertions(+), 56 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/directory-fortress-core/blob/f6faf548/src/main/java/org/apache/directory/fortress/core/rbac/OrgUnitP.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/directory/fortress/core/rbac/OrgUnitP.java b/src/main/java/org/apache/directory/fortress/core/rbac/OrgUnitP.java
index 3d2aa36..4c7a85d 100755
--- a/src/main/java/org/apache/directory/fortress/core/rbac/OrgUnitP.java
+++ b/src/main/java/org/apache/directory/fortress/core/rbac/OrgUnitP.java
@@ -22,8 +22,8 @@ package org.apache.directory.fortress.core.rbac;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,8 +63,8 @@ public final class OrgUnitP
private static final Logger LOG = LoggerFactory.getLogger( CLS_NM );
// these fields are used to synchronize access to the above static pools:
- private static final Lock userPoolLock = new ReentrantLock();
- private static final Lock permPoolLock = new ReentrantLock();
+ private static final ReadWriteLock userPoolLock = new ReentrantReadWriteLock();
+ private static final ReadWriteLock permPoolLock = new ReentrantReadWriteLock();
private static Cache ouCache;
// DAO class for OU data sets must be initializer before the other statics:
@@ -93,7 +93,7 @@ public final class OrgUnitP
* @param entity
* @return
*/
- final boolean isValid( OrgUnit entity )
+ /* No Qualifier */final boolean isValid( OrgUnit entity )
{
boolean result = false;
@@ -101,7 +101,7 @@ public final class OrgUnitP
{
try
{
- userPoolLock.lock();
+ userPoolLock.readLock().lock();
Set<String> userPool = getUserSet( entity );
if ( userPool != null )
@@ -111,14 +111,14 @@ public final class OrgUnitP
}
finally
{
- userPoolLock.unlock();
+ userPoolLock.readLock().unlock();
}
}
else
{
try
{
- permPoolLock.lock();
+ permPoolLock.readLock().lock();
Set<String> permPool = getPermSet( entity );
if ( permPool != null )
@@ -128,7 +128,7 @@ public final class OrgUnitP
}
finally
{
- permPoolLock.unlock();
+ permPoolLock.readLock().unlock();
}
}
@@ -137,16 +137,17 @@ public final class OrgUnitP
/**
- * @param orgUnit
- * @return
+ * Loads the User set for an orgUnit
+ * @param orgUnit The orgUnit
+ * @return The set of associated User
*/
- private static Set<String> loadOrgSet( OrgUnit orgUnit )
+ private static Set<String> loadUserSet( OrgUnit orgUnit )
{
- Set<String> ouSet = null;
+ Set<String> ouUserSet = null;
try
{
- ouSet = oDao.getOrgs( orgUnit );
+ ouUserSet = oDao.getOrgs( orgUnit );
}
catch ( SecurityException se )
{
@@ -154,17 +155,34 @@ public final class OrgUnitP
LOG.info( warning, se );
}
- if ( orgUnit.getType() == OrgUnit.Type.USER )
+ ouCache.put( getKey( USER_OUS, orgUnit.getContextId() ), ouUserSet );
+
+ return ouUserSet;
+ }
+
+
+ /**
+ * Loads the Perm set for an orgUnit
+ * @param orgUnit The orgUnit
+ * @return The set of associated Perms
+ */
+ private static Set<String> loadPermSet( OrgUnit orgUnit )
+ {
+ Set<String> ouPermSet = null;
+
+ try
{
- // TODO: add context id to this cache
- ouCache.put( getKey( USER_OUS, orgUnit.getContextId() ), ouSet );
+ ouPermSet = oDao.getOrgs( orgUnit );
}
- else
+ catch ( SecurityException se )
{
- ouCache.put( getKey( PERM_OUS, orgUnit.getContextId() ), ouSet );
+ String warning = "loadOrgSet static initializer caught SecurityException=" + se;
+ LOG.info( warning, se );
}
+
+ ouCache.put( getKey( PERM_OUS, orgUnit.getContextId() ), ouPermSet );
- return ouSet;
+ return ouPermSet;
}
@@ -175,23 +193,15 @@ public final class OrgUnitP
*/
private static Set<String> getPermSet( OrgUnit orgUnit )
{
- try
- {
- permPoolLock.lock();
- @SuppressWarnings("unchecked")
- Set<String> permSet = ( Set<String> ) ouCache.get( getKey( PERM_OUS, orgUnit.getContextId() ) );
+ @SuppressWarnings("unchecked")
+ Set<String> permSet = ( Set<String> ) ouCache.get( getKey( PERM_OUS, orgUnit.getContextId() ) );
- if ( permSet == null )
- {
- permSet = loadOrgSet( orgUnit );
- }
-
- return permSet;
- }
- finally
+ if ( permSet == null )
{
- permPoolLock.unlock();
+ permSet = loadPermSet( orgUnit );
}
+
+ return permSet;
}
@@ -202,23 +212,15 @@ public final class OrgUnitP
*/
private static Set<String> getUserSet( OrgUnit orgUnit )
{
- try
- {
- userPoolLock.lock();
- @SuppressWarnings("unchecked")
- Set<String> userSet = ( Set<String> ) ouCache.get( getKey( USER_OUS, orgUnit.getContextId() ) );
+ @SuppressWarnings("unchecked")
+ Set<String> userSet = ( Set<String> ) ouCache.get( getKey( USER_OUS, orgUnit.getContextId() ) );
- if ( userSet == null )
- {
- userSet = loadOrgSet( orgUnit );
- }
-
- return userSet;
- }
- finally
+ if ( userSet == null )
{
- userPoolLock.unlock();
+ userSet = loadUserSet( orgUnit );
}
+
+ return userSet;
}
@@ -271,7 +273,7 @@ public final class OrgUnitP
{
try
{
- userPoolLock.lock();
+ userPoolLock.writeLock().lock();
Set<String> userPool = getUserSet( entity );
@@ -282,14 +284,14 @@ public final class OrgUnitP
}
finally
{
- userPoolLock.unlock();
+ userPoolLock.writeLock().unlock();
}
}
else
{
try
{
- permPoolLock.lock();
+ permPoolLock.writeLock().lock();
Set<String> permPool = getPermSet( entity );
@@ -300,7 +302,7 @@ public final class OrgUnitP
}
finally
{
- permPoolLock.unlock();
+ permPoolLock.writeLock().unlock();
}
}
@@ -358,7 +360,7 @@ public final class OrgUnitP
{
try
{
- userPoolLock.lock();
+ userPoolLock.writeLock().lock();
Set<String> userPool = getUserSet( entity );
if ( userPool != null )
@@ -368,14 +370,14 @@ public final class OrgUnitP
}
finally
{
- userPoolLock.unlock();
+ userPoolLock.writeLock().unlock();
}
}
else
{
try
{
- permPoolLock.lock();
+ permPoolLock.writeLock().lock();
Set<String> permPool = getPermSet( entity );
if ( permPool != null )
@@ -385,7 +387,7 @@ public final class OrgUnitP
}
finally
{
- permPoolLock.unlock();
+ permPoolLock.writeLock().unlock();
}
}