/*
* 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 org.omg.CORBA.Object
methods. All method implementations are
forwarded to a Delegate
object stored in the ObjectImpl
instance. ObjectImpl
allows for portable stubs because the
Delegate
can be implemented by a different vendor-specific ORB.
/**
* 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 Delegate
instance for
this ObjectImpl
object. This Delegate
instance can be implemented by a vendor-specific ORB. Stub classes,
which are derived from this ObjectImpl
class, can be
portable because they delegate all of the methods called on them to this
Delegate
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 Delegate
object to which this ObjectImpl
object delegates all
methods invoked on it.
Throws: - BAD_OPERATION – if the delegate has not been set
See Also: Returns: the Delegate contained in this ObjectImpl instance
/**
* 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 ObjectImpl
instance to the given
Delegate
object. All method invocations on this
ObjectImpl
object will be forwarded to this delegate.
Params: - delegate – the
Delegate
instance to which
all method calls on this ObjectImpl
object
will be delegated; may be implemented by a third-party ORB
See Also:
/**
* 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 ObjectImpl
object. For example,
for a stub, this method returns information about all the
interfaces supported by the stub.
Returns: the array of all repository identifiers supported by this
ObjectImpl
instance
/**
* 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 ObjectImpl
object.
Returns: an orb.omg.CORBA.Object
object that is
a duplicate of this object
/**
* 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 ObjectImpl
object.
/**
* 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 ObjectImpl
object.
Params: - repository_id – a
String
object with the repository
identifier to check
Returns: true
if the object identified by the given
repository id is an instance of ObjectImpl
;
false
otherwise
/**
* 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 ObjectImpl
object is
equivalent to this ObjectImpl
object.
Params: - that – an instance of
ObjectImpl
to compare with
this ObjectImpl
object
Returns: true
if the given object is equivalent
to this ObjectImpl
object;
false
otherwise
/**
* 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 ObjectImpl
object has been destroyed.
Returns: true
if the ORB knows authoritatively that the
server object does not exist; false
otherwise
/**
* 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 ObjectImpl
object.
Params: - maximum – an
int
indicating the upper bound on the hash
value returned by the ORB
Returns: an int
representing the hash code for this
ObjectImpl
object
/**
* 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 Request
object containing the given method
that can be used with the Dynamic Invocation Interface.
Params: - operation – the method to be invoked by the new
Request
object
Returns: a new Request
object initialized with the
given method
/**
* 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 Request
object that contains the given context,
method, argument list, and container for the result.
Params: - ctx – the Context for the request
- operation – the method that the new
Request
object will invoke - arg_list – the arguments for the method; an
NVList
in which each argument is a NamedValue
object - result – a
NamedValue
object to be used for
returning the result of executing the request's method
Returns: a new Request
object initialized with the
given context, method, argument list, and container for the
return value
/**
* 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 Request
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 Request
object is for use in the Dynamic
Invocation Interface.
Params: - ctx – the
Context
object that contains the
context strings that must be resolved before they are
sent along with the request - operation – the method that the new
Request
object will invoke - arg_list – the arguments for the method; an
NVList
in which each argument is a NamedValue
object - result – a
NamedValue
object to be used for
returning the result of executing the request's method - exceptions – a list of the exceptions that the given method
throws
- contexts – a list of the properties that are needed to
resolve the contexts in ctx; the strings in
contexts are used as arguments to the method
Context.get_values
,
which returns the value associated with the given property
Returns: a new Request
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
/**
* 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 ObjectImpl
object.
Returns: the org.omg.CORBA.Object
instance that is the
interface definition for this ObjectImpl
object
/**
* 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 ORB
object that created
the delegate.
Returns: the ORB
instance that created the
Delegate
object contained in this
ObjectImpl
object
/**
* 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 Policy
object for this
ObjectImpl
object that has the given
policy type.
Params: - policy_type – an int indicating the policy type
See Also: Returns: the Policy
object that is the specified policy type
and that applies to this ObjectImpl
object
/**
* 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
ObjectImpl
object.
Returns: an array containing the DomainManager
objects for this instance of ObjectImpl
/**
* 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 ObjectImpl
object's override type for
the given policies to the given instance of
SetOverrideType
.
Params: - policies – an array of
Policy
objects with the
policies that will replace the current policies or be
added to the current policies - set_add – either
SetOverrideType.SET_OVERRIDE
,
indicating that the given policies will replace any existing
ones, or SetOverrideType.ADD_OVERRIDE
, indicating
that the given policies should be added to any existing ones
Returns: an Object
with the given policies replacing or
added to its previous policies
/**
* 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 ObjectImpl
object is implemented
by a local servant. If so, local invocation API's may be used.
Returns: true
if this object is implemented by a local
servant; false
otherwise
/**
* 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 ObjectImpl
object is a local stub, it will invoke the _servant_preinvoke
method before sending a request in order to obtain the
ServantObject
instance to use.
If a ServantObject
object is returned, its servant
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 ServantRequest
object is valid for only one
invocation and cannot be used for more than one invocation.
Params: - operation – a
String
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. - expectedType – a
Class
object representing the
expected type of the servant that is returned. This expected
type is the Class
object associated with the
operations class for the stub's interface. For example, a
stub for an interface Foo
would pass the
Class
object for the FooOperations
interface.
Throws: - BAD_PARAM – if the servant is not the expected type
Returns: (1) a ServantObject
object, which may or may
not be the actual servant instance, or (2) null
if
(a) the servant is not local or (b) the servant has ceased to
be local due to a ForwardRequest from a POA ServantManager
/**
* 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 _servant_preinvoke
.
The _servant_postinvoke
method must be called
if the _servant_preinvoke
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 _servant_postinvoke
should be placed
in a Java finally
clause.
Params: - servant – the instance of the
ServantObject
returned by the _servant_preinvoke
method
/**
* 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 OutputStream
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.
Params: - operation – a String giving the name of the method.
- responseExpected – a boolean --
true
if the
request is not one way, that is, a response is expected
Returns: an OutputStream
object for dispatching the request
/**
* 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 InputStream
object for reading the response. The stub provides the
OutputStream
object that was previously returned by a
call to the _request
method. The method specified
as an argument to _request
when it was
called previously is the method that this method invokes.
If an exception occurs, the _invoke
method may throw an
ApplicationException
object that contains an InputStream from
which the user exception state may be unmarshalled.
Params: - output – an OutputStream object for dispatching the request
Throws: - ApplicationException – if the invocation
meets application-defined exception
- RemarshalException – if the invocation leads
to a remarshalling error
See Also: Returns: an InputStream
object containing the marshalled
response to the method invoked
/**
* 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 _invoke
.
Calling this method is optional for the stub.
Params: - input – the
InputStream
object that was returned
by the _invoke
method or the
ApplicationException.getInputStream
method;
may be null
, in which case this method does
nothing
See Also:
/**
* 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 String
object that represents this
ObjectImpl
object.
Returns: the String
representation of this object
/**
* 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 ObjectImpl
object.
Returns: the hash code for this object
/**
* 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 ObjectImpl
object with the given one
for equality.
Params: - obj – the object with which to compare this object
Returns: true
if the two objects are equal;
false
otherwise
/**
* 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);
}
}