blob: 3cd515d7b3363761d0de2660fe785840a49b2c83 [file] [log] [blame]
/*
* Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.omg.CORBA.portable;
import org.omg.CORBA.Request;
import org.omg.CORBA.NamedValue;
import org.omg.CORBA.NVList;
import org.omg.CORBA.ExceptionList;
import org.omg.CORBA.ContextList;
import org.omg.CORBA.Context;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.BAD_OPERATION;
import org.omg.CORBA.SystemException;
/**
* The common base class for all stub classes; provides default implementations
* of the <code>org.omg.CORBA.Object</code> methods. All method implementations are
* forwarded to a <code>Delegate</code> object stored in the <code>ObjectImpl</code>
* instance. <code>ObjectImpl</code> allows for portable stubs because the
* <code>Delegate</code> can be implemented by a different vendor-specific ORB.
*/
abstract public class ObjectImpl implements org.omg.CORBA.Object
{
/**
* The field that stores the <code>Delegate</code> instance for
* this <code>ObjectImpl</code> object. This <code>Delegate</code>
* instance can be implemented by a vendor-specific ORB. Stub classes,
* which are derived from this <code>ObjectImpl</code> class, can be
* portable because they delegate all of the methods called on them to this
* <code>Delegate</code> object.
*/
private transient Delegate __delegate;
/**
* Retrieves the reference to the vendor-specific <code>Delegate</code>
* object to which this <code>ObjectImpl</code> object delegates all
* methods invoked on it.
*
* @return the Delegate contained in this ObjectImpl instance
* @throws BAD_OPERATION if the delegate has not been set
* @see #_set_delegate
*/
public Delegate _get_delegate() {
if (__delegate == null)
throw new BAD_OPERATION("The delegate has not been set!");
return __delegate;
}
/**
* Sets the Delegate for this <code>ObjectImpl</code> instance to the given
* <code>Delegate</code> object. All method invocations on this
* <code>ObjectImpl</code> object will be forwarded to this delegate.
*
* @param delegate the <code>Delegate</code> instance to which
* all method calls on this <code>ObjectImpl</code> object
* will be delegated; may be implemented by a third-party ORB
* @see #_get_delegate
*/
public void _set_delegate(Delegate delegate) {
__delegate = delegate;
}
/**
* Retrieves a string array containing the repository identifiers
* supported by this <code>ObjectImpl</code> object. For example,
* for a stub, this method returns information about all the
* interfaces supported by the stub.
*
* @return the array of all repository identifiers supported by this
* <code>ObjectImpl</code> instance
*/
public abstract String[] _ids();
/**
* Returns a duplicate of this <code>ObjectImpl</code> object.
*
* @return an <code>orb.omg.CORBA.Object</code> object that is
* a duplicate of this object
*/
public org.omg.CORBA.Object _duplicate() {
return _get_delegate().duplicate(this);
}
/**
* Releases the resources associated with this <code>ObjectImpl</code> object.
*/
public void _release() {
_get_delegate().release(this);
}
/**
* Checks whether the object identified by the given repository
* identifier is an <code>ObjectImpl</code> object.
*
* @param repository_id a <code>String</code> object with the repository
* identifier to check
* @return <code>true</code> if the object identified by the given
* repository id is an instance of <code>ObjectImpl</code>;
* <code>false</code> otherwise
*/
public boolean _is_a(String repository_id) {
return _get_delegate().is_a(this, repository_id);
}
/**
* Checks whether the the given <code>ObjectImpl</code> object is
* equivalent to this <code>ObjectImpl</code> object.
*
* @param that an instance of <code>ObjectImpl</code> to compare with
* this <code>ObjectImpl</code> object
* @return <code>true</code> if the given object is equivalent
* to this <code>ObjectImpl</code> object;
* <code>false</code> otherwise
*/
public boolean _is_equivalent(org.omg.CORBA.Object that) {
return _get_delegate().is_equivalent(this, that);
}
/**
* Checks whether the server object for this <code>ObjectImpl</code>
* object has been destroyed.
*
* @return <code>true</code> if the ORB knows authoritatively that the
* server object does not exist; <code>false</code> otherwise
*/
public boolean _non_existent() {
return _get_delegate().non_existent(this);
}
/**
* Retrieves the hash code that serves as an ORB-internal identifier for
* this <code>ObjectImpl</code> object.
*
* @param maximum an <code>int</code> indicating the upper bound on the hash
* value returned by the ORB
* @return an <code>int</code> representing the hash code for this
* <code>ObjectImpl</code> object
*/
public int _hash(int maximum) {
return _get_delegate().hash(this, maximum);
}
/**
* Creates a <code>Request</code> object containing the given method
* that can be used with the Dynamic Invocation Interface.
*
* @param operation the method to be invoked by the new <code>Request</code>
* object
* @return a new <code>Request</code> object initialized with the
* given method
*/
public Request _request(String operation) {
return _get_delegate().request(this, operation);
}
/**
* Creates a <code>Request</code> object that contains the given context,
* method, argument list, and container for the result.
*
* @param ctx the Context for the request
* @param operation the method that the new <code>Request</code>
* object will invoke
* @param arg_list the arguments for the method; an <code>NVList</code>
* in which each argument is a <code>NamedValue</code> object
* @param result a <code>NamedValue</code> object to be used for
* returning the result of executing the request's method
* @return a new <code>Request</code> object initialized with the
* given context, method, argument list, and container for the
* return value
*/
public Request _create_request(Context ctx,
String operation,
NVList arg_list,
NamedValue result) {
return _get_delegate().create_request(this,
ctx,
operation,
arg_list,
result);
}
/**
* Creates a <code>Request</code> object that contains the given context,
* method, argument list, container for the result, exceptions, and
* list of property names to be used in resolving the context strings.
* This <code>Request</code> object is for use in the Dynamic
* Invocation Interface.
*
* @param ctx the <code>Context</code> object that contains the
* context strings that must be resolved before they are
* sent along with the request
* @param operation the method that the new <code>Request</code>
* object will invoke
* @param arg_list the arguments for the method; an <code>NVList</code>
* in which each argument is a <code>NamedValue</code> object
* @param result a <code>NamedValue</code> object to be used for
* returning the result of executing the request's method
* @param exceptions a list of the exceptions that the given method
* throws
* @param contexts a list of the properties that are needed to
* resolve the contexts in <i>ctx</i>; the strings in
* <i>contexts</i> are used as arguments to the method
* <code>Context.get_values</code>,
* which returns the value associated with the given property
* @return a new <code>Request</code> object initialized with the
* given context strings to resolve, method, argument list,
* container for the result, exceptions, and list of property
* names to be used in resolving the context strings
*/
public Request _create_request(Context ctx,
String operation,
NVList arg_list,
NamedValue result,
ExceptionList exceptions,
ContextList contexts) {
return _get_delegate().create_request(this,
ctx,
operation,
arg_list,
result,
exceptions,
contexts);
}
/**
* Retrieves the interface definition for this <code>ObjectImpl</code>
* object.
*
* @return the <code>org.omg.CORBA.Object</code> instance that is the
* interface definition for this <code>ObjectImpl</code> object
*/
public org.omg.CORBA.Object _get_interface_def()
{
// First try to call the delegate implementation class's
// "Object get_interface_def(..)" method (will work for JDK1.2 ORBs).
// Else call the delegate implementation class's
// "InterfaceDef get_interface(..)" method using reflection
// (will work for pre-JDK1.2 ORBs).
org.omg.CORBA.portable.Delegate delegate = _get_delegate();
try {
// If the ORB's delegate class does not implement
// "Object get_interface_def(..)", this will call
// get_interface_def(..) on portable.Delegate.
return delegate.get_interface_def(this);
}
catch( org.omg.CORBA.NO_IMPLEMENT ex ) {
// Call "InterfaceDef get_interface(..)" method using reflection.
try {
Class[] argc = { org.omg.CORBA.Object.class };
java.lang.reflect.Method meth =
delegate.getClass().getMethod("get_interface", argc);
Object[] argx = { this };
return (org.omg.CORBA.Object)meth.invoke(delegate, argx);
}
catch( java.lang.reflect.InvocationTargetException exs ) {
Throwable t = exs.getTargetException();
if (t instanceof Error) {
throw (Error) t;
}
else if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
else {
throw new org.omg.CORBA.NO_IMPLEMENT();
}
} catch( RuntimeException rex ) {
throw rex;
} catch( Exception exr ) {
throw new org.omg.CORBA.NO_IMPLEMENT();
}
}
}
/**
* Returns a reference to the ORB associated with this object and
* its delegate. This is the <code>ORB</code> object that created
* the delegate.
*
* @return the <code>ORB</code> instance that created the
* <code>Delegate</code> object contained in this
* <code>ObjectImpl</code> object
*/
public org.omg.CORBA.ORB _orb() {
return _get_delegate().orb(this);
}
/**
* Retrieves the <code>Policy</code> object for this
* <code>ObjectImpl</code> object that has the given
* policy type.
*
* @param policy_type an int indicating the policy type
* @return the <code>Policy</code> object that is the specified policy type
* and that applies to this <code>ObjectImpl</code> object
* @see org.omg.CORBA.PolicyOperations#policy_type
*/
public org.omg.CORBA.Policy _get_policy(int policy_type) {
return _get_delegate().get_policy(this, policy_type);
}
/**
* Retrieves a list of the domain managers for this
* <code>ObjectImpl</code> object.
*
* @return an array containing the <code>DomainManager</code>
* objects for this instance of <code>ObjectImpl</code>
*/
public org.omg.CORBA.DomainManager[] _get_domain_managers() {
return _get_delegate().get_domain_managers(this);
}
/**
* Sets this <code>ObjectImpl</code> object's override type for
* the given policies to the given instance of
* <code>SetOverrideType</code>.
*
* @param policies an array of <code>Policy</code> objects with the
* policies that will replace the current policies or be
* added to the current policies
* @param set_add either <code>SetOverrideType.SET_OVERRIDE</code>,
* indicating that the given policies will replace any existing
* ones, or <code>SetOverrideType.ADD_OVERRIDE</code>, indicating
* that the given policies should be added to any existing ones
* @return an <code>Object</code> with the given policies replacing or
* added to its previous policies
*/
public org.omg.CORBA.Object
_set_policy_override(org.omg.CORBA.Policy[] policies,
org.omg.CORBA.SetOverrideType set_add) {
return _get_delegate().set_policy_override(this, policies,
set_add);
}
/**
* Checks whether this <code>ObjectImpl</code> object is implemented
* by a local servant. If so, local invocation API's may be used.
*
* @return <code>true</code> if this object is implemented by a local
* servant; <code>false</code> otherwise
*/
public boolean _is_local() {
return _get_delegate().is_local(this);
}
/**
* Returns a Java reference to the local servant that should be used for sending
* a request for the method specified. If this <code>ObjectImpl</code>
* object is a local stub, it will invoke the <code>_servant_preinvoke</code>
* method before sending a request in order to obtain the
* <code>ServantObject</code> instance to use.
* <P>
* If a <code>ServantObject</code> object is returned, its <code>servant</code>
* field has been set to an object of the expected type (Note: the object may
* or may not be the actual servant instance). The local stub may cast
* the servant field to the expected type, and then invoke the operation
* directly. The <code>ServantRequest</code> object is valid for only one
* invocation and cannot be used for more than one invocation.
*
* @param operation a <code>String</code> containing the name of the method
* to be invoked. This name should correspond to the method name as
* it would be encoded in a GIOP request.
*
* @param expectedType a <code>Class</code> object representing the
* expected type of the servant that is returned. This expected
* type is the <code>Class</code> object associated with the
* operations class for the stub's interface. For example, a
* stub for an interface <code>Foo</code> would pass the
* <code>Class</code> object for the <code>FooOperations</code>
* interface.
*
* @return (1) a <code>ServantObject</code> object, which may or may
* not be the actual servant instance, or (2) <code>null</code> if
* (a) the servant is not local or (b) the servant has ceased to
* be local due to a ForwardRequest from a POA ServantManager
* @throws org.omg.CORBA.BAD_PARAM if the servant is not the expected type
*/
public ServantObject _servant_preinvoke(String operation,
Class expectedType) {
return _get_delegate().servant_preinvoke(this, operation,
expectedType);
}
/**
* Is called by the local stub after it has invoked an operation
* on the local servant that was previously retrieved from a
* call to the method <code>_servant_preinvoke</code>.
* The <code>_servant_postinvoke</code> method must be called
* if the <code>_servant_preinvoke</code>
* method returned a non-null value, even if an exception was thrown
* by the method invoked by the servant. For this reason, the call
* to the method <code>_servant_postinvoke</code> should be placed
* in a Java <code>finally</code> clause.
*
* @param servant the instance of the <code>ServantObject</code>
* returned by the <code>_servant_preinvoke</code> method
*/
public void _servant_postinvoke(ServantObject servant) {
_get_delegate().servant_postinvoke(this, servant);
}
/*
* The following methods were added by orbos/98-04-03: Java to IDL
* Mapping. These are used by RMI over IIOP.
*/
/**
* Returns an <code>OutputStream</code> object to use for marshalling
* the arguments of the given method. This method is called by a stub,
* which must indicate if a response is expected, that is, whether or not
* the call is oneway.
*
* @param operation a String giving the name of the method.
* @param responseExpected a boolean -- <code>true</code> if the
* request is not one way, that is, a response is expected
* @return an <code>OutputStream</code> object for dispatching the request
*/
public OutputStream _request(String operation,
boolean responseExpected) {
return _get_delegate().request(this, operation, responseExpected);
}
/**
* Invokes an operation and returns an <code>InputStream</code>
* object for reading the response. The stub provides the
* <code>OutputStream</code> object that was previously returned by a
* call to the <code>_request</code> method. The method specified
* as an argument to <code>_request</code> when it was
* called previously is the method that this method invokes.
* <P>
* If an exception occurs, the <code>_invoke</code> method may throw an
* <code>ApplicationException</code> object that contains an InputStream from
* which the user exception state may be unmarshalled.
*
* @param output an OutputStream object for dispatching the request
* @return an <code>InputStream</code> object containing the marshalled
* response to the method invoked
* @throws ApplicationException if the invocation
* meets application-defined exception
* @throws RemarshalException if the invocation leads
* to a remarshalling error
* @see #_request
*/
public InputStream _invoke(OutputStream output)
throws ApplicationException, RemarshalException {
return _get_delegate().invoke(this, output);
}
/**
* Releases the given
* reply stream back to the ORB when unmarshalling has
* completed after a call to the method <code>_invoke</code>.
* Calling this method is optional for the stub.
*
* @param input the <code>InputStream</code> object that was returned
* by the <code>_invoke</code> method or the
* <code>ApplicationException.getInputStream</code> method;
* may be <code>null</code>, in which case this method does
* nothing
* @see #_invoke
*/
public void _releaseReply(InputStream input) {
_get_delegate().releaseReply(this, input);
}
/**
* Returns a <code>String</code> object that represents this
* <code>ObjectImpl</code> object.
*
* @return the <code>String</code> representation of this object
*/
public String toString() {
if ( __delegate != null )
return __delegate.toString(this);
else
return getClass().getName() + ": no delegate set";
}
/**
* Returns the hash code for this <code>ObjectImpl</code> object.
*
* @return the hash code for this object
*/
public int hashCode() {
if ( __delegate != null )
return __delegate.hashCode(this);
else
return super.hashCode();
}
/**
* Compares this <code>ObjectImpl</code> object with the given one
* for equality.
*
*@param obj the object with which to compare this object
*@return <code>true</code> if the two objects are equal;
* <code>false</code> otherwise
*/
public boolean equals(java.lang.Object obj) {
if ( __delegate != null )
return __delegate.equals(this, obj);
else
return (this==obj);
}
}