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);
}
}