org.springframework.remoting.httpinvoker
Class AbstractHttpInvokerRequestExecutor

java.lang.Object
  extended by org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor
All Implemented Interfaces:
BeanClassLoaderAware, HttpInvokerRequestExecutor
Direct Known Subclasses:
CommonsHttpInvokerRequestExecutor, SimpleHttpInvokerRequestExecutor

public abstract class AbstractHttpInvokerRequestExecutor
extends Object
implements HttpInvokerRequestExecutor, BeanClassLoaderAware

Abstract base implementation of the HttpInvokerRequestExecutor interface.

Pre-implements serialization of RemoteInvocation objects and deserialization of RemoteInvocationResults objects.

Since:
1.1
Author:
Juergen Hoeller
See Also:
doExecuteRequest(org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration, java.io.ByteArrayOutputStream)

Field Summary
static String CONTENT_TYPE_SERIALIZED_OBJECT
          Default content type: "application/x-java-serialized-object"
protected static String ENCODING_GZIP
           
protected static String HTTP_HEADER_ACCEPT_ENCODING
           
protected static String HTTP_HEADER_ACCEPT_LANGUAGE
           
protected static String HTTP_HEADER_CONTENT_ENCODING
           
protected static String HTTP_HEADER_CONTENT_LENGTH
           
protected static String HTTP_HEADER_CONTENT_TYPE
           
protected static String HTTP_METHOD_POST
           
protected  Log logger
           
 
Constructor Summary
AbstractHttpInvokerRequestExecutor()
           
 
Method Summary
protected  ObjectInputStream createObjectInputStream(InputStream is, String codebaseUrl)
          Create an ObjectInputStream for the given InputStream and codebase.
protected  InputStream decorateInputStream(InputStream is)
          Return the InputStream to use for reading remote invocation results, potentially decorating the given original InputStream.
protected  OutputStream decorateOutputStream(OutputStream os)
          Return the OutputStream to use for writing remote invocations, potentially decorating the given original OutputStream.
protected abstract  RemoteInvocationResult doExecuteRequest(HttpInvokerClientConfiguration config, ByteArrayOutputStream baos)
          Execute a request to send the given serialized remote invocation.
protected  RemoteInvocationResult doReadRemoteInvocationResult(ObjectInputStream ois)
          Perform the actual reading of an invocation object from the given ObjectInputStream.
protected  void doWriteRemoteInvocation(RemoteInvocation invocation, ObjectOutputStream oos)
          Perform the actual writing of the given invocation object to the given ObjectOutputStream.
 RemoteInvocationResult executeRequest(HttpInvokerClientConfiguration config, RemoteInvocation invocation)
          Execute a request to send the given remote invocation.
protected  ClassLoader getBeanClassLoader()
          Return the bean ClassLoader that this executor is supposed to use.
protected  ByteArrayOutputStream getByteArrayOutputStream(RemoteInvocation invocation)
          Serialize the given RemoteInvocation into a ByteArrayOutputStream.
 String getContentType()
          Return the content type to use for sending HTTP invoker requests.
 boolean isAcceptGzipEncoding()
          Return whether to accept GZIP encoding, that is, whether to send the HTTP "Accept-Encoding" header with "gzip" as value.
protected  RemoteInvocationResult readRemoteInvocationResult(InputStream is, String codebaseUrl)
          Deserialize a RemoteInvocationResult object from the given InputStream.
 void setAcceptGzipEncoding(boolean acceptGzipEncoding)
          Set whether to accept GZIP encoding, that is, whether to send the HTTP "Accept-Encoding" header with "gzip" as value.
 void setBeanClassLoader(ClassLoader classLoader)
          Callback that supplies the bean class loader to a bean instance.
 void setContentType(String contentType)
          Specify the content type to use for sending HTTP invoker requests.
protected  void writeRemoteInvocation(RemoteInvocation invocation, OutputStream os)
          Serialize the given RemoteInvocation to the given OutputStream.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

CONTENT_TYPE_SERIALIZED_OBJECT

public static final String CONTENT_TYPE_SERIALIZED_OBJECT
Default content type: "application/x-java-serialized-object"

See Also:
Constant Field Values

HTTP_METHOD_POST

protected static final String HTTP_METHOD_POST
See Also:
Constant Field Values

HTTP_HEADER_ACCEPT_LANGUAGE

protected static final String HTTP_HEADER_ACCEPT_LANGUAGE
See Also:
Constant Field Values

HTTP_HEADER_ACCEPT_ENCODING

protected static final String HTTP_HEADER_ACCEPT_ENCODING
See Also:
Constant Field Values

HTTP_HEADER_CONTENT_ENCODING

protected static final String HTTP_HEADER_CONTENT_ENCODING
See Also:
Constant Field Values

HTTP_HEADER_CONTENT_TYPE

protected static final String HTTP_HEADER_CONTENT_TYPE
See Also:
Constant Field Values

HTTP_HEADER_CONTENT_LENGTH

protected static final String HTTP_HEADER_CONTENT_LENGTH
See Also:
Constant Field Values

ENCODING_GZIP

protected static final String ENCODING_GZIP
See Also:
Constant Field Values

logger

protected final Log logger
Constructor Detail

AbstractHttpInvokerRequestExecutor

public AbstractHttpInvokerRequestExecutor()
Method Detail

setContentType

public void setContentType(String contentType)
Specify the content type to use for sending HTTP invoker requests.

Default is "application/x-java-serialized-object".


getContentType

public String getContentType()
Return the content type to use for sending HTTP invoker requests.


setAcceptGzipEncoding

public void setAcceptGzipEncoding(boolean acceptGzipEncoding)
Set whether to accept GZIP encoding, that is, whether to send the HTTP "Accept-Encoding" header with "gzip" as value.

Default is "true". Turn this flag off if you do not want GZIP response compression even if enabled on the HTTP server.


isAcceptGzipEncoding

public boolean isAcceptGzipEncoding()
Return whether to accept GZIP encoding, that is, whether to send the HTTP "Accept-Encoding" header with "gzip" as value.


setBeanClassLoader

public void setBeanClassLoader(ClassLoader classLoader)
Description copied from interface: BeanClassLoaderAware
Callback that supplies the bean class loader to a bean instance.

Invoked after the population of normal bean properties but before an initialization callback such as InitializingBean's InitializingBean.afterPropertiesSet() method or a custom init-method.

Specified by:
setBeanClassLoader in interface BeanClassLoaderAware
Parameters:
classLoader - the owning class loader; may be null in which case a default ClassLoader must be used, for example the ClassLoader obtained via ClassUtils.getDefaultClassLoader()

getBeanClassLoader

protected ClassLoader getBeanClassLoader()
Return the bean ClassLoader that this executor is supposed to use.


executeRequest

public final RemoteInvocationResult executeRequest(HttpInvokerClientConfiguration config,
                                                   RemoteInvocation invocation)
                                            throws Exception
Description copied from interface: HttpInvokerRequestExecutor
Execute a request to send the given remote invocation.

Specified by:
executeRequest in interface HttpInvokerRequestExecutor
Parameters:
config - the HTTP invoker configuration that specifies the target service
invocation - the RemoteInvocation to execute
Returns:
the RemoteInvocationResult object
Throws:
IOException - if thrown by I/O operations
ClassNotFoundException - if thrown during deserialization
Exception - in case of general errors

getByteArrayOutputStream

protected ByteArrayOutputStream getByteArrayOutputStream(RemoteInvocation invocation)
                                                  throws IOException
Serialize the given RemoteInvocation into a ByteArrayOutputStream.

Parameters:
invocation - the RemoteInvocation object
Returns:
a ByteArrayOutputStream with the serialized RemoteInvocation
Throws:
IOException - if thrown by I/O methods

writeRemoteInvocation

protected void writeRemoteInvocation(RemoteInvocation invocation,
                                     OutputStream os)
                              throws IOException
Serialize the given RemoteInvocation to the given OutputStream.

The default implementation gives decorateOutputStream a chance to decorate the stream first (for example, for custom encryption or compression). Creates an ObjectOutputStream for the final stream and calls doWriteRemoteInvocation to actually write the object.

Can be overridden for custom serialization of the invocation.

Parameters:
invocation - the RemoteInvocation object
os - the OutputStream to write to
Throws:
IOException - if thrown by I/O methods
See Also:
decorateOutputStream(java.io.OutputStream), doWriteRemoteInvocation(org.springframework.remoting.support.RemoteInvocation, java.io.ObjectOutputStream)

decorateOutputStream

protected OutputStream decorateOutputStream(OutputStream os)
                                     throws IOException
Return the OutputStream to use for writing remote invocations, potentially decorating the given original OutputStream.

The default implementation returns the given stream as-is. Can be overridden, for example, for custom encryption or compression.

Parameters:
os - the original OutputStream
Returns:
the potentially decorated OutputStream
Throws:
IOException

doWriteRemoteInvocation

protected void doWriteRemoteInvocation(RemoteInvocation invocation,
                                       ObjectOutputStream oos)
                                throws IOException
Perform the actual writing of the given invocation object to the given ObjectOutputStream.

The default implementation simply calls writeObject. Can be overridden for serialization of a custom wrapper object rather than the plain invocation, for example an encryption-aware holder.

Parameters:
invocation - the RemoteInvocation object
oos - the ObjectOutputStream to write to
Throws:
IOException - if thrown by I/O methods
See Also:
ObjectOutputStream.writeObject(java.lang.Object)

doExecuteRequest

protected abstract RemoteInvocationResult doExecuteRequest(HttpInvokerClientConfiguration config,
                                                           ByteArrayOutputStream baos)
                                                    throws Exception
Execute a request to send the given serialized remote invocation.

Implementations will usually call readRemoteInvocationResult to deserialize a returned RemoteInvocationResult object.

Parameters:
config - the HTTP invoker configuration that specifies the target service
baos - the ByteArrayOutputStream that contains the serialized RemoteInvocation object
Returns:
the RemoteInvocationResult object
Throws:
IOException - if thrown by I/O operations
ClassNotFoundException - if thrown during deserialization
Exception - in case of general errors
See Also:
readRemoteInvocationResult(java.io.InputStream, String)

readRemoteInvocationResult

protected RemoteInvocationResult readRemoteInvocationResult(InputStream is,
                                                            String codebaseUrl)
                                                     throws IOException,
                                                            ClassNotFoundException
Deserialize a RemoteInvocationResult object from the given InputStream.

Gives decorateInputStream a chance to decorate the stream first (for example, for custom encryption or compression). Creates an ObjectInputStream via createObjectInputStream and calls doReadRemoteInvocationResult to actually read the object.

Can be overridden for custom serialization of the invocation.

Parameters:
is - the InputStream to read from
codebaseUrl - the codebase URL to load classes from if not found locally
Returns:
the RemoteInvocationResult object
Throws:
IOException - if thrown by I/O methods
ClassNotFoundException - if thrown during deserialization
See Also:
decorateInputStream(java.io.InputStream), createObjectInputStream(java.io.InputStream, java.lang.String), doReadRemoteInvocationResult(java.io.ObjectInputStream)

decorateInputStream

protected InputStream decorateInputStream(InputStream is)
                                   throws IOException
Return the InputStream to use for reading remote invocation results, potentially decorating the given original InputStream.

The default implementation returns the given stream as-is. Can be overridden, for example, for custom encryption or compression.

Parameters:
is - the original InputStream
Returns:
the potentially decorated InputStream
Throws:
IOException

createObjectInputStream

protected ObjectInputStream createObjectInputStream(InputStream is,
                                                    String codebaseUrl)
                                             throws IOException
Create an ObjectInputStream for the given InputStream and codebase. The default implementation creates a CodebaseAwareObjectInputStream.

Parameters:
is - the InputStream to read from
codebaseUrl - the codebase URL to load classes from if not found locally (can be null)
Returns:
the new ObjectInputStream instance to use
Throws:
IOException - if creation of the ObjectInputStream failed
See Also:
CodebaseAwareObjectInputStream

doReadRemoteInvocationResult

protected RemoteInvocationResult doReadRemoteInvocationResult(ObjectInputStream ois)
                                                       throws IOException,
                                                              ClassNotFoundException
Perform the actual reading of an invocation object from the given ObjectInputStream.

The default implementation simply calls readObject. Can be overridden for deserialization of a custom wrapper object rather than the plain invocation, for example an encryption-aware holder.

Parameters:
ois - the ObjectInputStream to read from
Returns:
the RemoteInvocationResult object
Throws:
IOException - if thrown by I/O methods
ClassNotFoundException - if the class name of a serialized object couldn't get resolved
See Also:
ObjectOutputStream.writeObject(java.lang.Object)