You are viewing a plain text version of this content. The canonical link for it is here.
Posted to rampart-dev@ws.apache.org by na...@apache.org on 2008/05/18 21:36:17 UTC

svn commit: r657611 - /webservices/rampart/branches/java/1_4/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java

Author: nandana
Date: Sun May 18 12:36:16 2008
New Revision: 657611

URL: http://svn.apache.org/viewvc?rev=657611&view=rev
Log:
RAMPART-161 fixing the issue

Modified:
    webservices/rampart/branches/java/1_4/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java

Modified: webservices/rampart/branches/java/1_4/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java
URL: http://svn.apache.org/viewvc/webservices/rampart/branches/java/1_4/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java?rev=657611&r1=657610&r2=657611&view=diff
==============================================================================
--- webservices/rampart/branches/java/1_4/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java (original)
+++ webservices/rampart/branches/java/1_4/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java Sun May 18 12:36:16 2008
@@ -28,42 +28,77 @@
 import java.util.Hashtable;
 import java.util.Iterator;
 
+import edu.emory.mathcs.backport.java.util.concurrent.locks.Lock;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.ReadWriteLock;
+import edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantReadWriteLock;
+
 /**
  * In-memory implementation of the token storage
  */
 public class SimpleTokenStore implements TokenStorage {
 
     protected Map tokens = new Hashtable();
+    
+    /**
+     * We use a read write lock to improve concurrency while avoiding concurrent modification 
+     * exceptions.  We allow concurrent reads and avoid concurrent reads and modifications
+     * ReentrantReadWriteLock supports a maximum of 65535 recursive write locks and 65535 read locks
+     */
+     protected final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+     
+     protected final Lock readLock = readWriteLock.readLock(); 
+     
+     protected final Lock writeLock = readWriteLock.writeLock();
 
     public void add(Token token) throws TrustException {
-        if (token != null && !"".equals(token.getId()) &&
-            token.getId() != null) {
-            if (this.tokens.keySet().size() == 0
-                || (this.tokens.keySet().size() > 0 && !this.tokens
-                    .keySet().contains(token.getId()))) {
-                tokens.put(token.getId(), token);
-            } else {
-                throw new TrustException("tokenAlreadyExists",
-                                         new String[]{token.getId()});
+               
+        if (token != null && !"".equals(token.getId()) && token.getId() != null) {
+            
+            writeLock.lock();
+            
+            try {
+                if (this.tokens.keySet().size() == 0
+                    || (this.tokens.keySet().size() > 0 && !this.tokens
+                        .keySet().contains(token.getId()))) {
+                    tokens.put(token.getId(), token);
+                } else {
+                    throw new TrustException("tokenAlreadyExists",
+                                            new String[]{token.getId()});
+                }
+            } finally {
+                writeLock.unlock();
             }
-
-        }
+        }           
     }
 
     public void update(Token token) throws TrustException {
+             
         if (token != null && token.getId() != null && token.getId().trim().length() != 0) {
-
-            if (!this.tokens.keySet().contains(token.getId())) {
-                throw new TrustException("noTokenToUpdate", new String[]{token.getId()});
+    
+            writeLock.lock();    
+            
+            try {
+                if (!this.tokens.keySet().contains(token.getId())) {
+                    throw new TrustException("noTokenToUpdate", new String[]{token.getId()});
+                }
+                this.tokens.put(token.getId(), token);
+            } finally {
+                writeLock.unlock();
             }
-            this.tokens.put(token.getId(), token);
-        }
+        } 
+        
     }
 
-    public String[] getTokenIdentifiers() throws TrustException {
+    public String[] getTokenIdentifiers() throws TrustException {       
         List identifiers = new ArrayList();
-        for (Iterator iterator = tokens.keySet().iterator(); iterator.hasNext();) {
-            identifiers.add(iterator.next());
+        
+        readLock.lock();
+        try {
+            for (Iterator iterator = tokens.keySet().iterator(); iterator.hasNext();) {
+                identifiers.add(iterator.next());
+            }
+        } finally {
+            readLock.unlock();
         }
         return (String[]) identifiers.toArray(new String[identifiers.size()]);
     }
@@ -88,14 +123,21 @@
     private Token[] getTokens(int[] states) throws TrustException {
         processTokenExpiry();
         List tokens = new ArrayList();
-        for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
-            Token token = (Token) iterator.next();
-            for (int i = 0; i < states.length; i++) {
-                if (token.getState() == states[i]) {
-                    tokens.add(token);
-                    break;
+        
+        readLock.lock();
+        
+        try {
+            for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
+                Token token = (Token) iterator.next();
+                for (int i = 0; i < states.length; i++) {
+                    if (token.getState() == states[i]) {
+                        tokens.add(token);
+                        break;
+                    }
                 }
             }
+        } finally {
+            readLock.unlock();
         }
         return (Token[]) tokens.toArray(new Token[tokens.size()]);
     }
@@ -103,52 +145,76 @@
     private Token[] getTokens(int state) throws TrustException {
         processTokenExpiry();
         List tokens = new ArrayList();
-        for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
-            Token token = (Token) iterator.next();
-            if (token.getState() == state) {
-                tokens.add(token);
+        
+        readLock.lock();
+        
+        try {
+            for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
+                Token token = (Token) iterator.next();
+                if (token.getState() == state) {
+                    tokens.add(token);
+                }
             }
+        } finally {
+            readLock.unlock();
         }
         return (Token[]) tokens.toArray(new Token[tokens.size()]);
     }
 
     public Token getToken(String id) throws TrustException {
         processTokenExpiry();
-        Token token = (Token) this.tokens.get(id);
         
-        if(token == null) {
-            //Try the unattached refs
-            for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
-                Token tempToken = (Token) iterator.next();
-                OMElement elem = tempToken.getAttachedReference();
-                if(elem != null && id.equals(this.getIdFromSTR(elem))) {
-                    token = tempToken;
-                }
-                elem = tempToken.getUnattachedReference();
-                if(elem != null && id.equals(this.getIdFromSTR(elem))) {
-                    token = tempToken;
+        readLock.lock();
+        
+        Token token;
+        
+        try {
+            
+            token = (Token) this.tokens.get(id);
+            
+            if(token == null) {
+                //Try the unattached refs
+                for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
+                    Token tempToken = (Token) iterator.next();
+                    OMElement elem = tempToken.getAttachedReference();
+                    if(elem != null && id.equals(this.getIdFromSTR(elem))) {
+                        token = tempToken;
+                    }
+                    elem = tempToken.getUnattachedReference();
+                    if(elem != null && id.equals(this.getIdFromSTR(elem))) {
+                        token = tempToken;
+                    }
+                    
                 }
                 
             }
-            
+        
+        } finally {
+            readLock.unlock();
         }
       
         return token;
     }
 
     protected void processTokenExpiry() throws TrustException {
-        for (Iterator iterator = tokens.values().iterator(); iterator.hasNext();) {
-            Token token = (Token) iterator.next();
-            if (token.getExpires() != null &&
-                token.getExpires().getTime() < System.currentTimeMillis()) {
-                token.setState(Token.EXPIRED);
-                update(token);
+        
+        readLock.lock();
+        
+        try {
+            for (Iterator iterator = tokens.values().iterator(); iterator.hasNext();) {
+                Token token = (Token) iterator.next();
+                if (token.getExpires() != null &&
+                    token.getExpires().getTime() < System.currentTimeMillis()) {
+                    token.setState(Token.EXPIRED);
+                }
             }
+        } finally {
+            readLock.unlock();
         }
     }
     
     public static String getIdFromSTR(OMElement str) {
-//      ASSUMPTION:SecurityTokenReference/KeyIdentifier
+        //ASSUMPTION:SecurityTokenReference/KeyIdentifier
         OMElement child = str.getFirstElement();
         if(child == null) {
             return null;
@@ -162,4 +228,7 @@
             return null;
         }
     }
+    
+    
+    
 }