SCOUT-95
Add first stage of caching authtokens.    Still need to use the singletons
and add BusinessQueryManager support for caching.


git-svn-id: https://svn.apache.org/repos/asf/webservices/scout/trunk@934962 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/ws/scout/registry/AuthTokenSingleton.java b/src/main/java/org/apache/ws/scout/registry/AuthTokenSingleton.java
new file mode 100644
index 0000000..fe71814
--- /dev/null
+++ b/src/main/java/org/apache/ws/scout/registry/AuthTokenSingleton.java
@@ -0,0 +1,42 @@
+package org.apache.ws.scout.registry;
+
+import java.util.Hashtable;
+import org.apache.ws.scout.model.uddi.v2.AuthToken;
+
+public class AuthTokenSingleton {
+	private static AuthTokenSingleton instance = new AuthTokenSingleton();
+	private static Hashtable cachedAuthTokenHash = new Hashtable();
+	
+	private AuthTokenSingleton() {
+		cachedAuthTokenHash = new Hashtable();
+	}
+
+	public static AuthToken getToken(String username) {
+		if (instance == null) {
+			instance = new AuthTokenSingleton();
+		}
+
+		if (cachedAuthTokenHash.containsKey(username)) 
+			return (AuthToken) cachedAuthTokenHash.get(username);
+	
+		return null;
+	} 	
+	
+	public synchronized static void addAuthToken(String username, 
+			AuthToken token) {
+		if (instance == null) {
+			instance = new AuthTokenSingleton();
+		}
+		cachedAuthTokenHash.put(username, token);
+	}
+	
+	public synchronized static void deleteAuthToken(String username) {
+		if (instance == null) {
+			instance = new AuthTokenSingleton();
+		} else {
+			if (cachedAuthTokenHash.containsKey(username)) {
+				cachedAuthTokenHash.remove(username);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/ws/scout/registry/AuthTokenV3Singleton.java b/src/main/java/org/apache/ws/scout/registry/AuthTokenV3Singleton.java
new file mode 100644
index 0000000..0a2c4df
--- /dev/null
+++ b/src/main/java/org/apache/ws/scout/registry/AuthTokenV3Singleton.java
@@ -0,0 +1,41 @@
+package org.apache.ws.scout.registry;
+
+import java.util.Hashtable;
+import org.uddi.api_v3.AuthToken;
+
+public class AuthTokenV3Singleton {
+	private static AuthTokenV3Singleton instance = new AuthTokenV3Singleton();
+	private static Hashtable cachedAuthTokenHash = new Hashtable();
+	
+	private AuthTokenV3Singleton() {
+		cachedAuthTokenHash = new Hashtable();
+	}
+
+	public static AuthToken getInstance(String username) {
+		if (instance == null) {
+			instance = new AuthTokenV3Singleton();
+		}
+		if (cachedAuthTokenHash.containsKey(username)) 
+			return (AuthToken)cachedAuthTokenHash.get(username);
+	
+		return null;
+	} 	
+	
+	public synchronized static void addAuthToken(String username, 
+			AuthToken token) {
+		if (instance == null) {
+			instance = new AuthTokenV3Singleton();
+		}
+		cachedAuthTokenHash.put(username, token);
+	}
+	
+	public synchronized static void deleteAuthToken(String username) {
+		if (instance == null) {
+			instance = new AuthTokenV3Singleton();
+		} else {
+			if (cachedAuthTokenHash.containsKey(username)) {
+				cachedAuthTokenHash.remove(username);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
index ebbaa4f..c9d7ca4 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -93,12 +94,18 @@
 
 	private Log log = LogFactory.getLog(this.getClass());
     
+    private static Hashtable cachedAuthTokenHash = null;
+	
     private transient ObjectFactory objectFactory = new ObjectFactory();
 	
     public BusinessLifeCycleManagerImpl(RegistryService registry) {
-        super(registry);
+    	super(registry);
+        
         if(objectFactory == null)
         	objectFactory = new ObjectFactory();
+        
+        if (cachedAuthTokenHash == null) 
+        	cachedAuthTokenHash = new Hashtable();
     }
 
     /**
@@ -570,32 +577,117 @@
         Object regobj;
         if(op.equalsIgnoreCase("SAVE_ASSOCIATION"))
         {
-            regobj = ireg.setPublisherAssertions(token.getAuthInfo(), (PublisherAssertion[]) dataarray);
-        } else
-        if (op.equalsIgnoreCase("SAVE_SERVICE")) {
-            regobj = ireg.saveService(token.getAuthInfo(), (BusinessService[])dataarray);
+        	try {
+        		regobj = ireg.setPublisherAssertions(token.getAuthInfo(), (PublisherAssertion[]) dataarray);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.setPublisherAssertions(token.getAuthInfo(), (PublisherAssertion[]) dataarray);
+        	}
+        } 
+        else if (op.equalsIgnoreCase("SAVE_SERVICE")) {
+        	try {
+        		regobj = ireg.saveService(token.getAuthInfo(), (BusinessService[])dataarray);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveService(token.getAuthInfo(), (BusinessService[])dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("SAVE_SERVICE_BINDING")) {
-            regobj = ireg.saveBinding(token.getAuthInfo(), (BindingTemplate[]) dataarray);
+        	try {
+        		regobj = ireg.saveBinding(token.getAuthInfo(), (BindingTemplate[]) dataarray);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveBinding(token.getAuthInfo(), (BindingTemplate[]) dataarray);        		
+        	}
         }
         else if (op.equalsIgnoreCase("SAVE_ORG")) {
-            regobj = ireg.saveBusiness(token.getAuthInfo(), (BusinessEntity[]) dataarray);
+        	try {
+        		regobj = ireg.saveBusiness(token.getAuthInfo(), (BusinessEntity[]) dataarray);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveBusiness(token.getAuthInfo(), (BusinessEntity[]) dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("SAVE_TMODEL")) {
-            regobj = ireg.saveTModel(token.getAuthInfo(), (TModel[]) dataarray);
+        	try {
+        		regobj = ireg.saveTModel(token.getAuthInfo(), (TModel[]) dataarray);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveTModel(token.getAuthInfo(), (TModel[]) dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("DELETE_ORG")) {
-            clearPublisherAssertions(token.getAuthInfo(), ireg);
-            regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
+            try {
+                clearPublisherAssertions(token.getAuthInfo(), ireg);
+            	regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+                clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("DELETE_SERVICE")) {
-            regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
+        	try {
+        		regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryException rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_SERVICEBINDING")) {
-            regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
+        	try	{
+        		regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryException rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_CONCEPT")) {
-            regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+            try {
+            	regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryException rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+            	regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_ASSOCIATION")) {
            int len = ((String[]) dataarray).length;
@@ -605,7 +697,17 @@
                String keystr = ((String[])dataarray)[i];
                paarr[i] = ScoutJaxrUddiHelper.getPubAssertionFromJAXRAssociationKey(keystr);
             }
-            regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
+            try {
+                regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
+            } catch (RegistryException rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_CLASSIFICATIONSCHEME")) {
             regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
@@ -724,7 +826,19 @@
         return bulk;
     }
 
-
+    private String getUsernameFromCredentials(Set credentials) {
+        String username = "", pwd = "";
+                
+        if (credentials != null) {
+        	Iterator it = credentials.iterator();
+        	while (it.hasNext()) {
+        		PasswordAuthentication pass = (PasswordAuthentication) it.next();
+        		username = pass.getUserName();
+        	}
+        }
+        return username;
+    }
+    
     /**
      * Get the Auth Token from the registry
      *
@@ -734,18 +848,22 @@
      * @throws JAXRException
      */
     private AuthToken getAuthToken(ConnectionImpl connection, IRegistry ireg)
-            throws JAXRException {
+            throws JAXRException {    	
         Set creds = connection.getCredentials();
         String username = "", pwd = "";
         if (creds != null) {
         	Iterator it = creds.iterator();
         	while (it.hasNext()) {
         		PasswordAuthentication pass = (PasswordAuthentication) it.next();
-        		username = pass.getUserName();
+        		username = pass.getUserName	();
         		pwd = new String(pass.getPassword());
         	}
         }
 
+        if ((cachedAuthTokenHash != null) && (cachedAuthTokenHash.containsKey(username))) {
+        	return (AuthToken) cachedAuthTokenHash.get(username);
+        }
+        
         AuthToken token = null;
         try {
             token = ireg.getAuthToken(username, pwd);
@@ -754,6 +872,7 @@
         { 
             throw new JAXRException(e);
         }
+        cachedAuthTokenHash.put(username, token);
         return token;
     }
 
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
index 7d6384e..229599f 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -95,10 +96,14 @@
     
     private transient ObjectFactory objectFactory = new ObjectFactory();
 	
+    private static Hashtable cachedAuthTokenHash = null;
+    
     public BusinessLifeCycleManagerV3Impl(RegistryService registry) {
         super(registry);
         if(objectFactory == null)
         	objectFactory = new ObjectFactory();
+        if (cachedAuthTokenHash == null) 
+        	cachedAuthTokenHash = new Hashtable();
     }
 
     /**
@@ -569,46 +574,150 @@
 
         Object regobj;
         if(op.equalsIgnoreCase("SAVE_ASSOCIATION"))
-        {
-            regobj = ireg.setPublisherAssertions(token.getAuthInfo(), (PublisherAssertion[]) dataarray);
-        } else
-        if (op.equalsIgnoreCase("SAVE_SERVICE")) {
-            regobj = ireg.saveService(token.getAuthInfo(), (BusinessService[])dataarray);
+        { 	
+        	try {
+        		regobj = ireg.setPublisherAssertions(token.getAuthInfo(), (PublisherAssertion[]) dataarray);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.setPublisherAssertions(token.getAuthInfo(), (PublisherAssertion[]) dataarray);
+        	}
+        } else if (op.equalsIgnoreCase("SAVE_SERVICE")) {
+        	try {
+        		regobj = ireg.saveService(token.getAuthInfo(), (BusinessService[])dataarray);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveService(token.getAuthInfo(), (BusinessService[])dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("SAVE_SERVICE_BINDING")) {
-            regobj = ireg.saveBinding(token.getAuthInfo(), (BindingTemplate[]) dataarray);
+        	try {
+        		regobj = ireg.saveBinding(token.getAuthInfo(), (BindingTemplate[]) dataarray);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveBinding(token.getAuthInfo(), (BindingTemplate[]) dataarray);        		
+        	}
         }
         else if (op.equalsIgnoreCase("SAVE_ORG")) {
-            regobj = ireg.saveBusiness(token.getAuthInfo(), (BusinessEntity[]) dataarray);
+        	try {
+        		regobj = ireg.saveBusiness(token.getAuthInfo(), (BusinessEntity[]) dataarray);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveBusiness(token.getAuthInfo(), (BusinessEntity[]) dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("SAVE_TMODEL")) {
-            regobj = ireg.saveTModel(token.getAuthInfo(), (TModel[]) dataarray);
+        	try {
+        		regobj = ireg.saveTModel(token.getAuthInfo(), (TModel[]) dataarray);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+        		regobj = ireg.saveTModel(token.getAuthInfo(), (TModel[]) dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("DELETE_ORG")) {
-            clearPublisherAssertions(token.getAuthInfo(), ireg);
-            regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
+            try {
+                clearPublisherAssertions(token.getAuthInfo(), ireg);
+            	regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (cachedAuthTokenHash.containsKey(username)) {
+        			cachedAuthTokenHash.remove(username);
+        		}
+        		token = getAuthToken(connection, ireg);
+                clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
+        	}
         }
         else if (op.equalsIgnoreCase("DELETE_SERVICE")) {
-            regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
+        	try {
+        		regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryV3Exception rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_SERVICEBINDING")) {
-            regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
+        	try	{
+        		regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryV3Exception rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_CONCEPT")) {
-            regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+            try {
+            	regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryV3Exception rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+            	regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_ASSOCIATION")) {
-           int len = ((String[]) dataarray).length;
+        	int len = ((String[]) dataarray).length;
             PublisherAssertion[] paarr = new PublisherAssertion[len];
             for(int i=0;i<len;i++)
             {
                String keystr = ((String[])dataarray)[i];
                paarr[i] = ScoutJaxrUddiV3Helper.getPubAssertionFromJAXRAssociationKey(keystr);
             }
-            regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
+            try {
+            	regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
+            } catch (RegistryV3Exception rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+            	regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
+	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_CLASSIFICATIONSCHEME")) {
-            regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+        	try {
+        		regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryV3Exception rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+	    		if (cachedAuthTokenHash.containsKey(username)) {
+	    			cachedAuthTokenHash.remove(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+        		regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	}	        		
         }
         else {
             throw new JAXRException("Unsupported operation:" + op);
@@ -763,6 +872,18 @@
         return bulk;
     }
 
+    private String getUsernameFromCredentials(Set credentials) {
+        String username = "", pwd = "";
+                
+        if (credentials != null) {
+        	Iterator it = credentials.iterator();
+        	while (it.hasNext()) {
+        		PasswordAuthentication pass = (PasswordAuthentication) it.next();
+        		username = pass.getUserName();
+        	}
+        }
+        return username;
+    }
 
     /**
      * Get the Auth Token from the registry
@@ -774,8 +895,10 @@
      */
     private AuthToken getAuthToken(ConnectionImpl connection, IRegistryV3 ireg)
             throws JAXRException {
-        Set creds = connection.getCredentials();
+    	
+    	Set creds = connection.getCredentials();
         String username = "", pwd = "";
+                
         if (creds != null) {
         	Iterator it = creds.iterator();
         	while (it.hasNext()) {
@@ -785,6 +908,11 @@
         	}
         }
 
+        if ((cachedAuthTokenHash != null) && (cachedAuthTokenHash.containsKey(username))) {
+        	return (AuthToken) cachedAuthTokenHash.get(username);
+        }
+        
+        
         AuthToken token = null;
         try {
             token = ireg.getAuthToken(username, pwd);
@@ -793,7 +921,8 @@
         { 
             throw new JAXRException(e);
         }
-        return token;
+        cachedAuthTokenHash.put(username, token);
+        return token;	
     }
 
     private PublisherAssertion getPublisherAssertion(AssertionStatusItem asi)