RAMPART-423: Improve the efficiency of SimpleTokenStore. Based on a patch provided by Boris Dushanov.
diff --git a/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java b/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java
index af18d82..74e0e56 100644
--- a/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java
+++ b/modules/rampart-trust/src/main/java/org/apache/rahas/SimpleTokenStore.java
@@ -28,6 +28,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -90,17 +91,13 @@
     }
 
     public String[] getTokenIdentifiers() throws TrustException {       
-        List identifiers = new ArrayList();
-        
         readLock.lock();
         try {
-            for (Iterator iterator = tokens.keySet().iterator(); iterator.hasNext();) {
-                identifiers.add(iterator.next());
-            }
+            Set identifiers = tokens.keySet();
+            return (String[]) identifiers.toArray(new String[identifiers.size()]);
         } finally {
             readLock.unlock();
         }
-        return (String[]) identifiers.toArray(new String[identifiers.size()]);
     }
 
     public Token[] getValidTokens() throws TrustException {
@@ -120,8 +117,7 @@
         return getTokens(Token.EXPIRED);
     }
 
-    private Token[] getTokens(int[] states) throws TrustException {
-        processTokenExpiry();
+    private Token[] getTokens(int... states) throws TrustException {
         List tokens = new ArrayList();
         
         readLock.lock();
@@ -129,6 +125,7 @@
         try {
             for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
                 Token token = (Token) iterator.next();
+                processTokenExpiry(token);
                 for (int i = 0; i < states.length; i++) {
                     if (token.getState() == states[i]) {
                         tokens.add(token);
@@ -142,28 +139,7 @@
         return (Token[]) tokens.toArray(new Token[tokens.size()]);
     }
 
-    private Token[] getTokens(int state) throws TrustException {
-        processTokenExpiry();
-        List tokens = new ArrayList();
-        
-        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();
-        
         readLock.lock();
         
         Token token;
@@ -176,6 +152,7 @@
                 //Try to find the token using attached refs & unattached refs
                 for (Iterator iterator = this.tokens.values().iterator(); iterator.hasNext();) {
                     Token tempToken = (Token) iterator.next();
+                    processTokenExpiry(tempToken);
                     OMElement elem = tempToken.getAttachedReference();
                     if(elem != null && id.equals(this.getIdFromSTR(elem))) {
                         token = tempToken;
@@ -186,7 +163,8 @@
                     }
                     
                 }
-                
+            } else {
+                processTokenExpiry(token);
             }
         
         } finally {
@@ -206,20 +184,10 @@
         }        
     }
     
-    protected void processTokenExpiry() throws TrustException {
-        
-        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();
+    protected void processTokenExpiry(Token token) throws TrustException {
+        if (token.getExpires() != null &&
+            token.getExpires().getTime() < System.currentTimeMillis()) {
+            token.setState(Token.EXPIRED);
         }
     }