You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by du...@apache.org on 2002/03/26 13:44:47 UTC

cvs commit: xml-axis/java/src/org/apache/axis/client Service.java

dug         02/03/26 04:44:47

  Modified:    java/src/org/apache/axis/client Service.java
  Log:
  Add some basic caching of WSDL.  WSDL will not change very often
  so cache what we see - the improvement in speed in cases where
  we reuse the same WSDL(but not the same Service object) is quite dramatic.
  Some thing nice to add in the future would be some basic algorithm that
  would limit the size of the cache and drop the least-used (or last used)
  one.
  
  Revision  Changes    Path
  1.45      +56 -7     xml-axis/java/src/org/apache/axis/client/Service.java
  
  Index: Service.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/Service.java,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- Service.java	20 Mar 2002 21:52:23 -0000	1.44
  +++ Service.java	26 Mar 2002 12:44:46 -0000	1.45
  @@ -55,6 +55,7 @@
   
   package org.apache.axis.client ;
   
  +import javax.wsdl.extensions.soap.SOAPAddress;
   import org.apache.axis.AxisEngine;
   import org.apache.axis.EngineConfiguration;
   import org.apache.axis.configuration.DefaultEngineConfigurationFactory;
  @@ -65,11 +66,11 @@
   import javax.naming.Reference;
   import javax.naming.Referenceable;
   import javax.naming.StringRefAddr;
  +
   import javax.wsdl.Binding;
   import javax.wsdl.Definition;
   import javax.wsdl.Port;
   import javax.wsdl.PortType;
  -import javax.wsdl.extensions.soap.SOAPAddress;
   import javax.wsdl.factory.WSDLFactory;
   import javax.wsdl.xml.WSDLReader;
   import javax.xml.rpc.ServiceException;
  @@ -79,14 +80,15 @@
   import java.io.FileNotFoundException;
   import java.io.InputStream;
   import java.io.Serializable;
  -import java.lang.reflect.Proxy;
   import java.net.MalformedURLException;
   import java.net.URL;
   import java.util.HashSet;
  +import java.util.HashMap;
   import java.util.Iterator;
   import java.util.List;
   import java.util.Map;
   import java.util.Set;
  +import java.lang.reflect.Proxy;
   
   /**
    * Axis' JAXRPC Dynamic Invoation Interface implementation of the Service
  @@ -114,6 +116,9 @@
        * Thread local storage used for storing the last call object
        */
       private static ThreadLocal previousCall = new ThreadLocal();
  +    static private HashMap      cachedWSDL  = new HashMap();
  +    static private boolean      cachingWSDL = true ;
  +
   
       Definition getWSDLDefinition() {
           return( wsdlDefinition );
  @@ -158,8 +163,16 @@
       public Service(URL wsdlDoc, QName serviceName) throws ServiceException {
           engine = getAxisClient();
           this.wsdlLocation = wsdlDoc;
  -        Document doc = XMLUtils.newDocument(wsdlDoc.toString());
  -        initService(doc, serviceName);
  +        Definition def = null ;
  +
  +        if ( cachingWSDL &&
  +             (def = (Definition) cachedWSDL.get(this.wsdlLocation.toString())) != null ){
  +          initService( def, serviceName );
  +        }
  +        else {
  +          Document doc = XMLUtils.newDocument(wsdlDoc.toString());
  +          initService(doc, serviceName);
  +        }
       }
   
       /**
  @@ -183,9 +196,16 @@
           }
           try {
               // Start by reading in the WSDL using WSDL4J
  -            FileInputStream      fis = new FileInputStream(wsdlLocation);
  -            Document doc = XMLUtils.newDocument(fis);
  -            initService(doc, serviceName);
  +            Definition def = null ;
  +            if ( cachingWSDL && 
  +                 (def = (Definition) cachedWSDL.get(this.wsdlLocation.toString())) != null ) {
  +              initService( def, serviceName );
  +            }
  +            else {
  +              FileInputStream  fis = new FileInputStream(wsdlLocation);
  +              Document         doc = XMLUtils.newDocument(fis);
  +              initService(doc, serviceName);
  +            }
           }
           catch( FileNotFoundException exp ) {
               throw new ServiceException(
  @@ -226,6 +246,20 @@
               reader.setFeature("javax.wsdl.verbose", false);
               Definition           def    = reader.readWSDL( null, doc );
   
  +            if ( cachingWSDL && this.wsdlLocation != null )
  +              cachedWSDL.put( this.wsdlLocation.toString(), def );
  +
  +            initService( def, serviceName );
  +        }
  +        catch( Exception exp ) {
  +            throw new ServiceException(
  +                    JavaUtils.getMessage("wsdlError00", "" + "", "\n" + exp) );
  +        }
  +    }
  +
  +    private void initService(Definition def, QName serviceName)
  +            throws ServiceException {
  +        try {
               this.wsdlDefinition = def ;
   
               // grrr!  Too many flavors of QName
  @@ -576,5 +610,20 @@
       public Call getCall() throws ServiceException {
           Call call = (Call) previousCall.get();
           return call;
  +    }
  +
  +    /**
  +     * Tells whether or not we're caching WSDL
  +     */
  +    public boolean getCacheWSDL() {
  +      return cachingWSDL ;
  +    }
  +
  +    /**
  +     * Allows users to turn caching of WSDL documents on or off.
  +     * Default is 'true' (on).
  +     */
  +    public void setCacheWSDL(boolean flag) {
  +      cachingWSDL = flag ;
       }
   }