Can i use a switch to keep old behavior? can you please look at the
following as well.

- http://issues.apache.org/jira/browse/AXIS-1754 
- http://marc.theaimsgroup.com/?l=axis-dev&m=111404132128455&w=2

this check-in was to fix part of that problem (breaks Service's
thread-safety) that i forgot about in that last check-in .

thanks,
-- dims

On 4/22/05, Tom Jordahl <[EMAIL PROTECTED]> wrote:
> Ack!  -1!
> 
>        /**
>   -     * Returns last Call object associated with
>   +     * Returns last Call object associated with
>         * this service.
>   +     * @deprecated please use Stub._getCall
>         */
>        public Call getCall() throws ServiceException {
>   -        return previousCall;
>   +        throw new
> ServiceException(Messages.getMessage("useStubsGetCallMethod"));
>        }
> 
> This is a huge compatibility change.  Up until recently (1.1?) you
> couldn't get the Call from anywhere but the Service, so there is
> probably lots of code out there that does this (including some of mine).
> 
> Please either revert this or make sure you can get the call from the
> service.
> 
> Tom Jordahl
> Macromedia Server Development
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: Friday, April 22, 2005 7:00 AM
> To: [EMAIL PROTECTED]
> Subject: cvs commit: ws-axis/java/src/org/apache/axis/client
> Service.java Stub.java
> 
> dims        2005/04/22 06:59:29
> 
>   Modified:    java/src/org/apache/axis/i18n resource.properties
>                java/src/org/apache/axis/client Service.java Stub.java
>   Log:
>   Fix for AXIS-935 - Using ThreadLocal Call objects in a servlet memory
> leak both on client and server side
> 
>   After reading tom's comment...moved the _getCall to stub, which
> ensures that Service is threadsafe. Added a deprecated flag and an
> exception in Service's getCall to point people in the right direction.
> 
>   Revision  Changes    Path
>   1.117     +1 -0
> ws-axis/java/src/org/apache/axis/i18n/resource.properties
> 
>   Index: resource.properties
>   ===================================================================
>   RCS file:
> /home/cvs/ws-axis/java/src/org/apache/axis/i18n/resource.properties,v
>   retrieving revision 1.116
>   retrieving revision 1.117
>   diff -u -r1.116 -r1.117
>   --- resource.properties       13 Apr 2005 16:22:52 -0000      1.116
>   +++ resource.properties       22 Apr 2005 13:59:29 -0000      1.117
>   @@ -1072,6 +1072,7 @@
>    cannotFindObjectForClass00=No object was found for class type {0}
>    NullDelegate=Null delegate passed to TypeMappingDelegate constructor
>    optionWrapArrays=Prefers building beans to straight arrays for
> wrapped XML array types (defaults to off).
>   +useStubsGetCallMethod=Please use Stub's _getCall method
> 
>    #
> #
>    # In-use keys
> #
> 
>   1.108     +14 -18
> ws-axis/java/src/org/apache/axis/client/Service.java
> 
>   Index: Service.java
>   ===================================================================
>   RCS file:
> /home/cvs/ws-axis/java/src/org/apache/axis/client/Service.java,v
>   retrieving revision 1.107
>   retrieving revision 1.108
>   diff -u -r1.107 -r1.108
>   --- Service.java      20 Apr 2005 23:55:18 -0000      1.107
>   +++ Service.java      22 Apr 2005 13:59:29 -0000      1.108
>   @@ -79,10 +79,6 @@
>        private HandlerRegistryImpl registry = new HandlerRegistryImpl();
>        private Parser wsdlParser = null;
> 
>   -    /**
>   -     * Thread local storage used for storing the last call object
>   -     */
>   -    private static Call previousCall = null;
>        private static HashMap cachedWSDL = new HashMap();
>        private static boolean cachingWSDL = true;
> 
>   @@ -160,7 +156,7 @@
>         *
>         * @param parser          Parser for this service
>         * @param serviceName      Qualified name of the desired service
>   -     * @throws ServiceException If there's an error
>   +     * @throws ServiceException If there's an error
>         */
>        public Service(Parser parser, QName serviceName) throws
> ServiceException {
>            this.serviceName = serviceName;
>   @@ -266,7 +262,7 @@
> 
>        /**
>         *  Code for building up the Service from a Parser
>   -     *
>   +     *
>         * @param parser            Parser for this service
>         * @param serviceName       Qualified name of the desired service
>         * @throws ServiceException If there's an error finding or
> parsing the WSDL
>   @@ -376,7 +372,7 @@
>                // If not found, just pick the first port.
>                port = (Port) ports.values().iterator().next();
>            }
>   -
>   +
>            // First, try to find a generated stub.  If that
>            // returns null, then find a dynamic stub.
>            Remote stub = getGeneratedStub(new QName(port.getName()),
> proxyInterface);
>   @@ -416,16 +412,16 @@
>                Port port = wsdlService.getPort(portName.getLocalPart());
>                if (port == null)
>                    throw new
> ServiceException(Messages.getMessage("noPort00", "" +
> proxyInterface.getName()));
>   -
>   +
>                Binding binding = port.getBinding();
>                SymbolTable symbolTable = wsdlParser.getSymbolTable();
>                BindingEntry bEntry =
> symbolTable.getBindingEntry(binding.getQName());
>                if(bEntry.getParameters().size() !=
> proxyInterface.getMethods().length) {
>                    throw new
> ServiceException(Messages.getMessage("incompatibleSEI00", "" +
> proxyInterface.getName()));
>   -            }
>   +            }
>                // TODO: Check the methods and the parameters as well.
>            }
>   -
>   +
>            try {
>                Call call = null;
>                if (portName == null) {
>   @@ -546,7 +542,6 @@
>         */
>        public javax.xml.rpc.Call createCall() throws ServiceException {
>            Call call = new org.apache.axis.client.Call(this);
>   -        previousCall = call;
>            return call;
>        }
> 
>   @@ -586,7 +581,7 @@
>                javax.xml.rpc.Call call =
> createCall(QName.valueOf(port.getName()),
> 
> QName.valueOf(operation.getName()));
>                calls.add(call);
>   -        }
>   +        }
>            javax.xml.rpc.Call[] array = new
> javax.xml.rpc.Call[calls.size()];
>            calls.toArray(array);
>            return array;
>   @@ -766,10 +761,10 @@
>         * lazy engine instantiation work, and not have to duplicate
> every single
>         * Service constructor with a EngineConfiguration argument.
>         * <p>
>   -     * If you need to use a non-default
> <code>EngineConfiguration</code>, do
>   +     * If you need to use a non-default
> <code>EngineConfiguration</code>, do
>         * the following before calling the Service constructor:<p><code>
>   -     *
>   -     *
> AxisProperties.setProperty(EngineConfigurationFactory.SYSTEM_PROPERTY_NA
> ME,
>   +     *
>   +     *
> AxisProperties.setProperty(EngineConfigurationFactory.SYSTEM_PROPERTY_NA
> ME,
>         *
> "classname.of.new.EngineConfigurationFactory");
>         * </code><p>
>         * Where the second parameter is the name of your new class that
> implements
>   @@ -786,7 +781,7 @@
>         * the getClientEngineConfig() of your own
> EngineConfigurationFactory will be
>         * called, and your configuration will be used in the constructed
> Service object.<p>
>         *
>   -     * Another way is to use the "discovery" method of
>   +     * Another way is to use the "discovery" method of
>         * <code>EngineConfigurationFactoryFinder</code>.
>         *
>         * @param config the EngineConfiguration we want to use.
>   @@ -828,11 +823,12 @@
>        }
> 
>        /**
>   -     * Returns last Call object associated with
>   +     * Returns last Call object associated with
>         * this service.
>   +     * @deprecated please use Stub._getCall
>         */
>        public Call getCall() throws ServiceException {
>   -        return previousCall;
>   +        throw new
> ServiceException(Messages.getMessage("useStubsGetCallMethod"));
>        }
> 
>        /**
> 
>   1.41      +23 -9     ws-axis/java/src/org/apache/axis/client/Stub.java
> 
>   Index: Stub.java
>   ===================================================================
>   RCS file:
> /home/cvs/ws-axis/java/src/org/apache/axis/client/Stub.java,v
>   retrieving revision 1.40
>   retrieving revision 1.41
>   diff -u -r1.40 -r1.41
>   --- Stub.java 8 Oct 2004 18:11:42 -0000       1.40
>   +++ Stub.java 22 Apr 2005 13:59:29 -0000      1.41
>   @@ -64,6 +64,9 @@
>        // a synchronized block in the generated stub code.
>        private boolean firstCall = true;
> 
>   +    // The last call object
>   +    private Call _call = null;
>   +
>        /**
>         * Is this the first time the type mappings are being registered?
>         */
>   @@ -325,10 +328,9 @@
>        public SOAPHeaderElement getResponseHeader(String namespace,
> String partName) {
>            try
>            {
>   -            Call lastCall =
> ((org.apache.axis.client.Service)service).getCall();
>   -            if (lastCall == null)
>   +            if (_call == null)
>                    return null;
>   -            return
> lastCall.getResponseMessage().getSOAPEnvelope().getHeaderByName(namespac
> e, partName);
>   +            return
> _call.getResponseMessage().getSOAPEnvelope().getHeaderByName(namespace,
> partName);
>            }
>            catch (Exception e)
>            {
>   @@ -352,10 +354,9 @@
>            SOAPHeaderElement[] array = new SOAPHeaderElement[0];
>            try
>            {
>   -            Call lastCall =
> ((org.apache.axis.client.Service)service).getCall();
>   -            if (lastCall == null)
>   +            if (_call == null)
>                    return array;
>   -            Vector h =
> lastCall.getResponseMessage().getSOAPEnvelope().getHeaders();
>   +            Vector h =
> _call.getResponseMessage().getSOAPEnvelope().getHeaders();
>                array = new SOAPHeaderElement[h.size()];
>                h.copyInto(array);
>                return array;
>   @@ -394,6 +395,10 @@
>        }
> 
>        protected void setRequestHeaders(org.apache.axis.client.Call
> call) throws AxisFault {
>   +        // HACK: store the _call object.
>   +        _call = call;
>   +
>   +        // Set the call headers.
>            SOAPHeaderElement[] headers = getHeaders();
>            for(int i=0;i<headers.length;i++){
>                call.addHeader(headers[i]);
>   @@ -407,6 +412,7 @@
>         * @throws AxisFault
>         */
>        protected void setAttachments(org.apache.axis.client.Call call)
> throws AxisFault {
>   +        // Set the attachments.
>            Object[] attachments = getAttachments();
>            for(int i=0;i<attachments.length;i++){
>                call.addAttachmentPart(attachments[i]);
>   @@ -415,14 +421,22 @@
>        }
> 
>        /**
>   -     * Provide access to the service object, through which you can
> get the Call
>   -     * that is used to process the operations.
>   -     * Not part of JAX-RPC
>   +     * Provide access to the service object. Not part of JAX-RPC
>   +     *
>         * @return the service object for this stub
>         */
>        public Service _getService() {
>            return service;
>        }
>   +
>   +    /**
>   +     * Returns last Call object associated with
>   +     * this stub.
>   +     */
>   +    public Call _getCall() {
>   +        return _call;
>   +    }
>   +
>        /**
>         * Helper method for updating headers from the response.
>         *
> 
> 


-- 
Davanum Srinivas - http://webservices.apache.org/~dims/

Reply via email to