public class BasicInvocationHandler extends Object implements InvocationHandler, TrustEquivalence, Serializable
InvocationHandler interface.
 This invocation handler implements Java(TM) Remote Method Invocation
 (Java RMI) call semantics when handling
 a remote invocation to a remote object.
 BasicInvocationHandler instances contain an
 ObjectEndpoint, optional client constraints, and
 optional server constraints.  The client and server constraints
 control the handling of remote methods, and they are represented as
 MethodConstraints objects that map remote methods to
 corresponding per-method constraints.
 
Invocation requests sent via the invoke method use
 the protocol defined in that method.  This invocation handler also
 assumes that the return value conforms to the protocol outlined in the
 BasicInvocationDispatcher.dispatch method.
BasicInvocationDispatcher, 
Serialized Form| Constructor and Description | 
|---|
BasicInvocationHandler(BasicInvocationHandler other,
                      MethodConstraints clientConstraints)
Creates a new  
BasicInvocationHandler with the
 specified client constraints and with the same
 ObjectEndpoint and server constraints as the given
 other BasicInvocationHandler. | 
BasicInvocationHandler(ObjectEndpoint oe,
                      MethodConstraints serverConstraints)
Creates a new  
BasicInvocationHandler with the
 specified ObjectEndpoint and server constraints. | 
| Modifier and Type | Method and Description | 
|---|---|
boolean | 
checkTrustEquivalence(Object obj)
Returns  
true if the specified object (which is not
 yet known to be trusted) is equivalent in trust, content, and
 function to this known trusted object, and false
 otherwise. | 
protected ObjectInputStream | 
createMarshalInputStream(Object proxy,
                        Method method,
                        OutboundRequest request,
                        boolean integrity,
                        Collection context)
Returns a new  
ObjectInputStream instance to use to read
 objects from the response input stream obtained by invoking the getResponseInputStream method
 on the given request. | 
protected ObjectOutputStream | 
createMarshalOutputStream(Object proxy,
                         Method method,
                         OutboundRequest request,
                         Collection context)
Returns a new  
ObjectOutputStream instance to use to write
 objects to the request output stream obtained by invoking the getRequestOutputStream method
 on the given request. | 
boolean | 
equals(Object obj)
Compares the specified object with this
  
BasicInvocationHandler for equality. | 
MethodConstraints | 
getClientConstraints()
Returns this  
BasicInvocationHandler's client
 constraints. | 
ObjectEndpoint | 
getObjectEndpoint()
Returns this  
BasicInvocationHandler's
 ObjectEndpoint. | 
MethodConstraints | 
getServerConstraints()
Returns this  
BasicInvocationHandler's server
 constraints. | 
int | 
hashCode()
Returns the hash code value for this invocation handler. 
 | 
Object | 
invoke(Object proxy,
      Method method,
      Object[] args)
Processes a method invocation made on the encapsulating
 proxy instance,  
proxy, and returns the result. | 
protected void | 
marshalArguments(Object proxy,
                Method method,
                Object[] args,
                ObjectOutputStream out,
                Collection context)
Marshals the arguments for the specified remote method to the outgoing
 request stream,  
out. | 
protected void | 
marshalMethod(Object proxy,
             Method method,
             ObjectOutputStream out,
             Collection context)
Marshals a representation of the given  
method to
 the outgoing request stream, out. | 
protected InvocationHandler | 
setClientConstraints(MethodConstraints constraints)
Returns a copy of this invocation handler with the specified
 constraints as its new client constraints. 
 | 
String | 
toString()
Returns a string representation of this
  
BasicInvocationHandler. | 
protected Object | 
unmarshalReturn(Object proxy,
               Method method,
               ObjectInputStream in,
               Collection context)
Unmarshals the return value for the specified remote method from the
 incoming response stream,  
in. | 
protected Throwable | 
unmarshalThrow(Object proxy,
              Method method,
              ObjectInputStream in,
              Collection context)
Unmarshals the throwable for the specified remote method from the
 incoming response stream,  
in, and returns the result. | 
public BasicInvocationHandler(ObjectEndpoint oe, MethodConstraints serverConstraints)
BasicInvocationHandler with the
 specified ObjectEndpoint and server constraints.
 The client constraints of the created
 BasicInvocationHandler will be null.
oe - the ObjectEndpoint for this invocation handlerserverConstraints - the server constraints, or nullNullPointerException - if oe is nullpublic BasicInvocationHandler(BasicInvocationHandler other, MethodConstraints clientConstraints)
BasicInvocationHandler with the
 specified client constraints and with the same
 ObjectEndpoint and server constraints as the given
 other BasicInvocationHandler.
 This constructor is intended for use by the
 BasicInvocationHandler implementation of the
 setClientConstraints(net.jini.core.constraint.MethodConstraints) method.  To create a copy of a
 given BasicInvocationHandler with new client
 constraints, use the RemoteMethodControl.setConstraints method on the containing
 proxy.
other - the BasicInvocationHandler to obtain the
                ObjectEndpoint and server constraints fromclientConstraints - the client constraints, or
                nullNullPointerException - if other is
                nullpublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable
proxy, and returns the result.
 This method is invoked when a method is invoked on a proxy
 instance that this handler is associated with.
 BasicInvocationHandler implements this method
 as follows:
 
If method is one of the following methods, it
 is processed as described below:
 
Object.hashCode: Returns the hash
 code value for the proxy.
 Object.equals: Returns
 true if the argument (args[0]) is an
 instance of a dynamic proxy class that implements the same
 ordered set of interfaces as proxy and this
 invocation handler is equal to the invocation handler of that
 argument, and returns false otherwise.
 Object.toString: Returns a string
 representation of the proxy.
 RemoteMethodControl.setConstraints: Returns a new proxy
 instance of the same class as proxy containing a
 new invocation handler with the specified new client
 constraints.  The new invocation handler is created by invoking
 the setClientConstraints method
 of this object with the specified client constraints
 (args[0]).  An exception is thrown if
 proxy is not an instance of a dynamic proxy class
 containing this invocation handler.
 RemoteMethodControl.getConstraints: Returns this
 BasicInvocationHandler's client constraints.
 TrustEquivalence.checkTrustEquivalence: Returns
 true if the argument (args[0]) is an
 instance of a dynamic proxy class that implements the same
 ordered set of interfaces as proxy and invoking
 the checkTrustEquivalence method
 of this object with the invocation handler of that argument
 returns true, and returns false
 otherwise.
 Otherwise, a remote call is made as follows:
The object endpoint's newCall
 method is invoked to obtain an OutboundRequestIterator,
 passing constraints obtained by combining the client and server
 constraints for the specified remote method and making them
 absolute.  If the returned iterator's hasNext method returns
 false, then this method throws a ConnectIOException.  Otherwise, the iterator is used to make
 one or more attempts to communicate the remote call.  Each
 attempt proceeds as follows:
 
The iterator'snextmethod is invoked to obtain anOutboundRequestfor the current attempt. Ifnextreturns normally, the request'sgetUnfulfilledConstraintsmethod is invoked, and if the returned requirements or preferences includeIntegrity.YES, object integrity is enforced for the current remote call attempt. If the returned requirements include any constraint other than anIntegrityconstraint, anUnsupportedConstraintExceptionis generated and, as described below, wrapped and handled like any otherExceptionthrown from a remote call attempt. Otherwise, the marshalling of the remote call proceeds with the following steps in order:
- A byte of value
 0x00is written to the request output stream of theOutboundRequestto indicate the version of the marshalling protocol being used.- A byte is written to specify object integrity enforcement:
 0x01if object integrity is being enforced for this remote call attempt, and0x00otherwise.- A client context collection is created containing an
 IntegrityEnforcementelement that reflects whether or not object integrity is being enforced for this remote call attempt.- The
 createMarshalOutputStreammethod is invoked, passingproxy,method, theOutboundRequest, and the client context, to create the marshal output stream for marshalling the remote call.- The
 marshalMethodmethod of this invocation handler is invoked withproxy,method, the marshal output stream, and the client context.- The
 marshalArgumentsmethod of this invocation handler is invoked withproxy,method,args, the marshal output stream, and the client context.- The marshal output stream is closed.
 Then the object endpoint's
executeCallmethod is invoked with theOutboundRequest. IfexecuteCallreturns aRemoteException, then this method throws that exception (and thus the remote call attempt iteration terminates). IfexecuteCallreturnsnull, then the unmarshalling of the call response proceeds as follows:A byte is read from the response input stream of the
OutboundRequest:
- If the byte is
 0x00, indicating a marshalling protocol version mismatch, aProtocolExceptionis generated and, as described below, wrapped and handled like any otherExceptionthrown from a remote call attempt.- If the byte is
 0x01, indicating a normal return, thecreateMarshalInputStreammethod is invoked, passingproxy,method, theOutboundRequest, abooleanindicating whether or not object integrity is being enforced, and the client context, to create the marshal input stream for unmarshalling the response, and theunmarshalReturnmethod of this invocation handler is invoked withproxy,method, the marshal input stream, and the client context. This method returns the value returned byunmarshalReturn(and thus the remote call attempt iteration terminates).- If the byte is
 0x02, indicating an exceptional return, a marshal input stream is created by calling thecreateMarshalInputStreammethod as described for the previous case, and theunmarshalThrowmethod of this invocation handler is invoked withproxy,method, the marshal input stream, and the client context. This method throws the exception returned byunmarshalThrow(and thus the remote call attempt iteration terminates).- If the byte is any other value, a
 ProtocolExceptionis generated and, as described below, wrapped and handled like any otherExceptionthrown from a remote call attempt.If an
IOExceptionis thrown during the attempt to communicate the remote call, then it is wrapped in aRemoteExceptionas follows:
- If
 marshalMethodwas not invoked for this attempt, or if an invocation ofgetDeliveryStatuson theOutboundRequestreturnsfalse, or if a marshalling protocol version mismatch was detected, then
- if the
 IOExceptionis ajava.net.UnknownHostException, it is wrapped in ajava.rmi.UnknownHostException;- if it is a
 java.net.ConnectException, it is wrapped in ajava.rmi.ConnectException;- if it is any other
 IOException, it is wrapped in aConnectIOException.- Otherwise, if
 executeCallwas not invoked for this attempt, theIOExceptionis wrapped in aMarshalException, and ifexecuteCallwas invoked, it is wrapped in anUnmarshalException.If a
ClassNotFoundExceptionis thrown during the unmarshalling, then it is wrapped in anUnmarshalException.In all cases, either the request output stream and the response input stream will be closed or the
OutboundRequestwill be aborted before this attempt completes.
If an attempt to communicate the remote call throws an
 Exception (other than an exception returned by
 executeCall or unmarshalThrow, which
 terminates the remote call attempt iteration), then if
 marshalMethod was not invoked for the attempt or
 if an invocation of getDeliveryStatus on the
 OutboundRequest returns false, then
 if the iterator's hasNext method returns
 true, then another attempt is made.  Otherwise,
 this method throws the Exception thrown by the
 last attempt (possibly wrapped as described above).
 
Note that invoking a remote method on a remote object via this invoke method preserves "at-most-once" call semantics. At-most-once call semantics guarantees that the remote call will either a) not execute, b) partially execute, or c) execute exactly once at the remote site. With Java RMI's at-most-once call semantics, arguments may be marshalled more than once for a given remote call.
A subclass can override this method to handle the methods of any additional non-remote interfaces implemented by the proxy or to otherwise control invocation handling behavior.
The semantics of this method are unspecified if the
 arguments could not have been produced by an instance of some
 valid dynamic proxy class containing this invocation handler.
 This method throws IllegalArgumentException if
 proxy is an instance of
 InvocationHandler or, if a remote call is to be
 made, any of the superinterfaces of proxy's class
 have a method with the same name and parameter types as
 method but that does not declare
 RemoteException or a superclass of
 RemoteException in its throws clause
 (even if such a method is not a member of any of the direct
 superinterfaces of proxy's class because of
 overriding).
invoke in interface InvocationHandlerThrowableUndeclaredThrowableExceptionprotected InvocationHandler setClientConstraints(MethodConstraints constraints)
BasicInvocationHandler implements this method
 as follows:
 
This method looks for a public constructor declared by the
 class of this object with two parameters, the first parameter
 type being the class of this object and the second parameter
 type being MethodConstraints.  If found, the
 constructor is invoked with this instance and the specified
 constraints, and the resulting object is returned.  If the
 constructor could not be found or was not accessible, or if the
 constructor invocation throws an exception, an
 UndeclaredThrowableException is thrown.
 
A subclass can override this method to control how the invocation handler is copied.
constraints - the new client constraints, or
                nullprotected ObjectOutputStream createMarshalOutputStream(Object proxy, Method method, OutboundRequest request, Collection context) throws IOException
ObjectOutputStream instance to use to write
 objects to the request output stream obtained by invoking the getRequestOutputStream method
 on the given request.
 BasicInvocationHandler implements this method
 to return a new MarshalOutputStream instance
 constructed with the output stream obtained from
 request as specified above and an unmodifiable
 view of the supplied context collection.
 
A subclass can override this method to control how the marshal input stream is created or implemented.
proxy - the proxy instancemethod - the remote method invokedrequest - the outbound requestcontext - the client contextObjectOutputStream instance for marshalling
                a call requestIOException - if an I/O exception occursNullPointerException - if any argument is nullprotected ObjectInputStream createMarshalInputStream(Object proxy, Method method, OutboundRequest request, boolean integrity, Collection context) throws IOException
ObjectInputStream instance to use to read
 objects from the response input stream obtained by invoking the getResponseInputStream method
 on the given request.
 BasicInvocationHandler implements this method
 to return a new MarshalInputStream instance constructed
 with the input stream obtained from request as
 specified above for the input stream in, the class
 loader of proxy's class for
 defaultLoader and verifierLoader,
 this method's integrity argument for
 verifyCodebaseIntegrity, and an unmodifiable view
 of context for the context
 collection.  The useCodebaseAnnotations method is invoked on the created stream
 before it is returned.
 
An exception is thrown if proxy is not an instance
 of a dynamic proxy class containing this invocation handler.
 
A subclass can override this method to control how the marshal input stream is created or implemented.
proxy - the proxy instancemethod - the remote method invokedrequest - the outbound requestintegrity - whether or not to verify codebase integritycontext - the client contextObjectInputStream instance for unmarshalling
                a call responseIOException - if an I/O exception occursNullPointerException - if any argument is nullprotected void marshalMethod(Object proxy, Method method, ObjectOutputStream out, Collection context) throws IOException
method to
 the outgoing request stream, out.  For each remote
 call, the invoke method calls this method to
 marshal a representation of the method.
 BasicInvocationHandler implements this method
 to write the JRMP method hash (defined in section 8.3 of the
 Java RMI specification) for the given method to the output stream
 using the writeLong
 method.
 
A subclass can override this method to control how the remote method is marshalled.
proxy - the proxy instance that the method was invoked onmethod - the Method instance corresponding
          to the interface method invoked on the proxy
          instance.  The declaring class of the
          Method object will be the interface that
          the method was declared in, which may be a
          superinterface of the proxy interface that the proxy
          class inherits the method through.out - outgoing request stream for the remote callcontext - the client contextIOException - if an I/O exception occursNullPointerException - if any argument is nullprotected void marshalArguments(Object proxy, Method method, Object[] args, ObjectOutputStream out, Collection context) throws IOException
out.  For each remote call, the
 invoke method calls this method to marshal arguments.
 BasicInvocationHandler implements this method
 marshal each argument as follows:
 
If the corresponding declared parameter type is primitive, then the 
 the primitive value is written to the stream (for example, if the type
 is int.class, then the primitive int value
 is written to the stream using the writeInt method).
 Otherwise, the argument is written to the stream using the
 writeObject method.
 
A subclass can override this method to marshal the arguments in an alternative context, perform pre- or post-processing on the arguments, marshal additional implicit data, or otherwise control how the arguments are marshalled.
proxy - the proxy instance that the method was invoked onmethod - the Method instance corresponding
          to the interface method invoked on the proxy
          instance.  The declaring class of the
          Method object will be the interface that
          the method was declared in, which may be a
          superinterface of the proxy interface that the proxy
          class inherits the method through.args - an array of objects containing the values of the
          arguments passed in the method invocation on the
          proxy instance.  If an argument's corresponding declared
          parameter type is primitive, then its value is
          represented with an instance of the corresponding primitive
          wrapper class, such as java.lang.Integer or 
          java.lang.Boolean.out - outgoing request stream for the remote callcontext - the client contextIOException - if an I/O exception occursNullPointerException - if any argument is nullprotected Object unmarshalReturn(Object proxy, Method method, ObjectInputStream in, Collection context) throws IOException, ClassNotFoundException
in.  In the case that a value is
 returned from the invocation on the remote object, this method is
 called to unmarshal that return value.
 BasicInvocationHandler implements this method
 as follows:
 
If the return type of the method is void, then no return value is
 read from the stream and null is returned.  If the return
 type is a primitive type, then the primitive value is read from the
 stream (for example, if the type is int.class, then the
 primitive int value is read from the stream using the
 readInt method).  Otherwise, the return value is read from
 the stream using the readObject method.
 
A subclass can override this method to unmarshal the return value in an alternative context, perform post-processing on the return value, unmarshal additional implicit data, or otherwise control how the return value is unmarshalled.
proxy - the proxy instance that the method was invoked onmethod - the Method instance corresponding
          to the interface method invoked on the proxy
          instance.  The declaring class of the
          Method object will be the interface that
          the method was declared in, which may be a
          superinterface of the proxy interface that the proxy
          class inherits the method through.in - the incoming result stream for the remote callcontext - the client contextinvoke will be an
          instance of the corresponding primitive wrapper
          class; otherwise, it will be a type assignable to
                the declared return type.IOException - if an I/O exception occursClassNotFoundException - if a class could not be found during
          unmarshallingNullPointerException - if any argument is nullprotected Throwable unmarshalThrow(Object proxy, Method method, ObjectInputStream in, Collection context) throws IOException, ClassNotFoundException
in, and returns the result.  In
 the case that an exception was thrown as a result of the
 invocation on the remote object, this method is called to unmarshal
 that throwable.
 BasicInvocationHandler implements this method
 to return the throwable unmarshalled from the stream using the
 readObject method.  If the unmarshalled throwable
 is a checked exception that is not assignable to any exception
 in the throws clause of the method implemented by the
 proxy's class, then: if there is no public member
 method of proxy's class with the same name and
 parameter types as method an IllegalArgumentException is thrown, otherwise that exception
 is wrapped in an UnexpectedException and the wrapped
 exception is returned.
 
A subclass can override this method to unmarshal the return value in an alternative context, perform post-processing on the return value, unmarshal additional implicit data, or otherwise control how the return value is unmarshalled.
proxy - the proxy instance that the method was invoked onmethod - the Method instance corresponding
          to the interface method invoked on the proxy
          instance.  The declaring class of the
          Method object will be the interface that
          the method was declared in, which may be a
          superinterface of the proxy interface that the proxy
          class inherits the method through.context - the client contextin - the incoming result stream for the remote callthrows clause of the interface
                method or to the unchecked exception types
                java.lang.RuntimeException or
                java.lang.Error.IOException - if an I/O exception occursClassNotFoundException - if a class could not be found during
          unmarshallingNullPointerException - if any argument is nullpublic final ObjectEndpoint getObjectEndpoint()
BasicInvocationHandler's
 ObjectEndpoint.ObjectEndpointpublic final MethodConstraints getClientConstraints()
BasicInvocationHandler's client
 constraints.public final MethodConstraints getServerConstraints()
BasicInvocationHandler's server
 constraints.public int hashCode()
public boolean equals(Object obj)
BasicInvocationHandler for equality.
 BasicInvocationHandler implements this method
 to return true if and only if
 
ObjectEndpoint in the specified object has the
 same class and is equal to the object endpoint in this object, and
 A subclass should override this method if adds instance state that affects equality.
public boolean checkTrustEquivalence(Object obj)
true if the specified object (which is not
 yet known to be trusted) is equivalent in trust, content, and
 function to this known trusted object, and false
 otherwise.
 BasicInvocationHandler implements this method
 to return true if and only if
 
ObjectEndpoint is an instance of
 TrustEquivalence and invoking its
 checkTrustEquivalence method with the specified
 object's ObjectEndpoint returns true,
 and
 A subclass should override this method to perform any additional checks that are necessary.
checkTrustEquivalence in interface TrustEquivalenceobj - object to check that is not yet known to be trustedtrue if the specified object (that is not yet
 known to be trusted) is equivalent in trust, content, and function to
 this known trusted object, and returns false otherwise