Tom,

i will spend a bit more time on this today and will let u know.

thanks,
dims

On 4/25/05, Tom Jordahl <[EMAIL PROTECTED]> wrote:
> Hi Dims,
> 
> I guess I understand the reasons why you are changing this stuff and I
> agree with them, but (in particular) my product that is shipping with
> Axis now uses the Call object to get the Message context for a request
> and response on the client side.
> 
> If you remove this, my customers will not be able to update from Axix
> 1.2 RC2 to Axix 1.2 final without me changing my code.  I would like to
> avoid that.
> 
> Is there no way that we can provide an implementation of getCall() in
> the service?  My biggest problem is that before there was *no way* to
> get the call from the stub, only the service. Now the reverse will be
> true.  Not very friendly from a compatibility standpoint.
> 
> --
> Tom Jordahl
> Macromedia Server Development
> 
> > -----Original Message-----
> > From: Davanum Srinivas [mailto:[EMAIL PROTECTED]
> > Sent: Friday, April 22, 2005 11:48 AM
> > To: Tom Jordahl
> > Cc: [email protected]
> > Subject: Re: cvs commit: ws-axis/java/src/org/apache/axis/client
> > Service.java Stub.java
> >
> > 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/
> 


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

Reply via email to