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/

Reply via email to