Author: gawor
Date: Tue Jul 31 13:21:04 2007
New Revision: 561482

URL: http://svn.apache.org/viewvc?view=rev&rev=561482
Log:
added two functions to clear the ServiceDescription cache (addresses part of 
the problem described in AXIS2-3011)

Modified:
    
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java
    
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImplTests.java

Modified: 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java?view=diff&rev=561482&r1=561481&r2=561482
==============================================================================
--- 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java
 Tue Jul 31 13:21:04 2007
@@ -117,6 +117,47 @@
     }
 
     /**
+     * Clears the entire ServiceDescription cache.
+     * 
+     * <h4>Note</h4>     
+     * This function might cause unpredictable results when configuration 
contexts are being reused
+     * and/or there are outstanding requests using the cached 
ServiceDescription objects.
+     * 
+     */
+    public static void clearServiceDescriptionCache() {
+        cache.clear();
+    }
+    
+    /**
+     * Clears all the ServiceDescription objects in the cache associated with 
the specified 
+     * configuration context.
+     * 
+     * <h4>Note</h4>
+     * This function should only be used to clear the cache when the specified 
configuration context
+     * will not be used anymore and there are no outstanding requests using 
the associated 
+     * ServiceDescription objects. Otherwise, it might cause unpredictable 
results.
+     * 
+     * @param configContext The configuration context associated with the 
ServiceDescription 
+     *                      objects in the cache.
+     */
+    public static void clearServiceDescriptionCache(ConfigurationContext 
configContext) {
+        if (configContext == null) {
+            return;
+        }
+        synchronized (configContext) {
+            synchronized (cache) {
+                Iterator<DescriptionKey> iter = cache.keySet().iterator();
+                while (iter.hasNext()) {
+                    DescriptionKey key = iter.next();
+                    if (key.getConfigContext() == configContext) {
+                        iter.remove();
+                    }
+                }
+            }
+        }
+    }    
+    
+    /**
      * @see 
org.apache.axis2.jaxws.description.DescriptionFactory#createServiceDescriptionFromServiceImpl(Class,
      *      AxisService)
      * @deprecated

Modified: 
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImplTests.java
URL: 
http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImplTests.java?view=diff&rev=561482&r1=561481&r2=561482
==============================================================================
--- 
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImplTests.java
 (original)
+++ 
webservices/axis2/trunk/java/modules/metadata/test/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImplTests.java
 Tue Jul 31 13:21:04 2007
@@ -19,13 +19,17 @@
 
 package org.apache.axis2.jaxws.description.impl;
 
+import java.lang.reflect.Field;
 import java.net.URL;
 
 import javax.xml.namespace.QName;
 
 import junit.framework.TestCase;
 
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.jaxws.ClientConfigurationFactory;
 import org.apache.axis2.jaxws.description.ServiceDescription;
+import org.apache.axis2.metadata.registry.MetadataFactoryRegistry;
 
 public class DescriptionFactoryImplTests extends TestCase {
     
@@ -34,12 +38,13 @@
     private static final String localPart = "EchoService";
     private static final QName serviceQName = new QName(namespaceURI, 
localPart);
 
+    
     public void testServiceDescriptionCaching() {        
         QName uniqueQName = new QName(namespaceURI, localPart + 
"_testValidServiceSubclass");
         
         ServiceDescription desc1 = 
             DescriptionFactoryImpl.createServiceDescription(null, uniqueQName, 
ServiceSubclass.class);
-                    
+                  
         /*
         int size = 5;
         ServiceDescription desc2; 
@@ -48,13 +53,99 @@
                 DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName, ServiceSubclass.class);
             assertTrue("service description was not reused", desc1 == desc2);
         } 
-        */     
-    }   
+        */    
+    }      
 
+    public void testClearServiceDescriptionCache() throws Exception {        
+        QName uniqueQName1 = new QName(namespaceURI, localPart + 
"_testClearCache1");
+        QName uniqueQName2 = new QName(namespaceURI, localPart + 
"_testClearCache2");
+  
+        // the ClientConfigFactory instance is stored DescriptionFactoryImpl 
clientConfigFactory 
+        // field and for this test we need to clear it, so that a custom 
version of 
+        // ClientConfigurationFactory can be used.
+        resetClientConfigFactory();
+        
+        // install caching factory        
+        ClientConfigurationFactory oldFactory = 
+            
(ClientConfigurationFactory)MetadataFactoryRegistry.getFactory(ClientConfigurationFactory.class);
+        CachingClientContextFactory newFactory = new 
CachingClientContextFactory();
+        MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, 
newFactory);
+        
+        try {
+            ServiceDescription desc1 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName1, ServiceSubclass.class);
+                        
+            ServiceDescription desc2 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName1, ServiceSubclass.class);
+            
+            newFactory.reset();
+            
+            ServiceDescription desc3 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName2, ServiceSubclass.class);
+            
+            assertTrue(desc1 == desc2);
+            assertTrue(desc1 != desc3);
+                        
+            // should clear one
+            
DescriptionFactoryImpl.clearServiceDescriptionCache(desc2.getAxisConfigContext());
+            
+            ServiceDescription desc4 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName1, ServiceSubclass.class);
+                        
+            ServiceDescription desc5 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName2, ServiceSubclass.class);
+            
+            assertTrue(desc1 != desc4);
+            assertTrue(desc3 == desc5);
+                       
+            // should clear both
+            DescriptionFactoryImpl.clearServiceDescriptionCache();
+            
+            ServiceDescription desc6 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName1, ServiceSubclass.class);
+            
+            ServiceDescription desc7 = 
+                DescriptionFactoryImpl.createServiceDescription(null, 
uniqueQName2, ServiceSubclass.class);
+            
+            assertTrue(desc4 != desc6);
+            assertTrue(desc3 != desc7);
+            
+            // this should do nothing
+            DescriptionFactoryImpl.clearServiceDescriptionCache(null);
+            
+        } finally {
+            // restore old factory
+            
MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, 
oldFactory);
+        }                          
+    }
+    
+    private void resetClientConfigFactory() throws Exception {
+        Field field = 
DescriptionFactoryImpl.class.getDeclaredField("clientConfigFactory");
+        field.setAccessible(true);
+        field.set(null, null);
+    }
+    
     private static class ServiceSubclass extends javax.xml.ws.Service {
 
         protected ServiceSubclass(URL wsdlDocumentLocation, QName serviceName) 
{
             super(wsdlDocumentLocation, serviceName);
         }
+    }
+    
+    private static class CachingClientContextFactory extends 
ClientConfigurationFactory {
+        ConfigurationContext context;
+        
+        public ConfigurationContext getClientConfigurationContext() {
+            if (context == null) {
+                context = super.getClientConfigurationContext();
+            }
+            System.out.println(context);
+            return context;
+        }
+        
+        public void reset() {
+            context = null;
+        }
+        
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to