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