/*
* Copyright (c) 1997, 2003, 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.PortableServer;
import org.omg.CORBA.ORB;
import org.omg.PortableServer.portable.Delegate;
Defines the native Servant
type. In Java, the
Servant
type is mapped to the Java
org.omg.PortableServer.Servant
class.
It serves as the base class for all POA servant
implementations and provides a number of methods that may
be invoked by the application programmer, as well as methods
which are invoked by the POA itself and may be overridden by
the user to control aspects of servant behavior.
Based on IDL to Java spec. (CORBA V2.3.1) ptc/00-01-08.pdf.
/**
* Defines the native <code>Servant</code> type. In Java, the
* <code>Servant</code> type is mapped to the Java
* <code>org.omg.PortableServer.Servant</code> class.
* It serves as the base class for all POA servant
* implementations and provides a number of methods that may
* be invoked by the application programmer, as well as methods
* which are invoked by the POA itself and may be overridden by
* the user to control aspects of servant behavior.
* Based on IDL to Java spec. (CORBA V2.3.1) ptc/00-01-08.pdf.
*/
abstract public class Servant {
private transient Delegate _delegate = null;
Gets the ORB vendor-specific implementation of
PortableServer::Servant
.
Returns: _delegate
the ORB vendor-specific
implementation of PortableServer::Servant
.
/**
* Gets the ORB vendor-specific implementation of
* <code>PortableServer::Servant</code>.
* @return <code>_delegate</code> the ORB vendor-specific
* implementation of <code>PortableServer::Servant</code>.
*/
final public Delegate _get_delegate() {
if (_delegate == null) {
throw
new
org.omg.CORBA.BAD_INV_ORDER
("The Servant has not been associated with an ORB instance");
}
return _delegate;
}
Supports the Java ORB portability
interfaces by providing a method for classes that support
ORB portability through delegation to set their delegate.
Params: - delegate – ORB vendor-specific implementation of
the
PortableServer::Servant
.
/**
* Supports the Java ORB portability
* interfaces by providing a method for classes that support
* ORB portability through delegation to set their delegate.
* @param delegate ORB vendor-specific implementation of
* the <code>PortableServer::Servant</code>.
*/
final public void _set_delegate(Delegate delegate) {
_delegate = delegate;
}
Allows the servant to obtain the object reference for
the target CORBA object it is incarnating for that request.
Returns: this_object
Object
reference
associated with the request.
/**
* Allows the servant to obtain the object reference for
* the target CORBA object it is incarnating for that request.
* @return <code>this_object</code> <code>Object</code> reference
* associated with the request.
*/
final public org.omg.CORBA.Object _this_object() {
return _get_delegate().this_object(this);
}
Allows the servant to obtain the object reference for
the target CORBA Object it is incarnating for that request.
Params: - orb – ORB with which the servant is associated.
Returns: _this_object
reference associated with the request.
/**
* Allows the servant to obtain the object reference for
* the target CORBA Object it is incarnating for that request.
* @param orb ORB with which the servant is associated.
* @return <code>_this_object</code> reference associated with the request.
*/
final public org.omg.CORBA.Object _this_object(ORB orb) {
try {
((org.omg.CORBA_2_3.ORB)orb).set_delegate(this);
}
catch(ClassCastException e) {
throw
new
org.omg.CORBA.BAD_PARAM
("POA Servant requires an instance of org.omg.CORBA_2_3.ORB");
}
return _this_object();
}
Returns the instance of the ORB
currently associated with the Servant
(convenience method).
Returns: orb
the instance of the ORB currently
associated with the Servant
.
/**
* Returns the instance of the ORB
* currently associated with the <code>Servant</code> (convenience method).
* @return <code>orb</code> the instance of the ORB currently
* associated with the <code>Servant</code>.
*/
final public ORB _orb() {
return _get_delegate().orb(this);
}
Allows easy execution of common methods, equivalent to
PortableServer::Current:get_POA
.
Returns: poa
POA associated with the servant.
/**
* Allows easy execution of common methods, equivalent to
* <code>PortableServer::Current:get_POA</code>.
* @return <code>poa</code> POA associated with the servant.
*/
final public POA _poa() {
return _get_delegate().poa(this);
}
Allows easy execution of
common methods, equivalent
to calling PortableServer::Current::get_object_id
.
Returns: object_id
the Object
ID associated
with this servant.
/**
* Allows easy execution of
* common methods, equivalent
* to calling <code>PortableServer::Current::get_object_id</code>.
* @return <code>object_id</code> the <code>Object</code> ID associated
* with this servant.
*/
final public byte[] _object_id() {
return _get_delegate().object_id(this);
}
Returns the
root POA from the ORB instance associated with the servant.
Subclasses may override this method to return a different POA.
Returns: default_POA
the POA associated with the
Servant
.
/**
* Returns the
* root POA from the ORB instance associated with the servant.
* Subclasses may override this method to return a different POA.
* @return <code>default_POA</code> the POA associated with the
* <code>Servant</code>.
*/
public POA _default_POA() {
return _get_delegate().default_POA(this);
}
Checks to see if the specified repository_id
is present
on the list returned by _all_interfaces()
or is the
repository_id
for the generic CORBA Object.
Params: - repository_id – the
repository_id
to be checked in the repository list or against the id
of generic CORBA objects.
Returns: is_a
boolean indicating whether the specified
repository_id
is
in the repository list or is same as a generic CORBA
object.
/**
* Checks to see if the specified <code>repository_id</code> is present
* on the list returned by <code>_all_interfaces()</code> or is the
* <code>repository_id</code> for the generic CORBA Object.
* @param repository_id the <code>repository_id</code>
* to be checked in the repository list or against the id
* of generic CORBA objects.
* @return <code>is_a</code> boolean indicating whether the specified
* <code>repository_id</code> is
* in the repository list or is same as a generic CORBA
* object.
*/
public boolean _is_a(String repository_id) {
return _get_delegate().is_a(this, repository_id);
}
Checks for the existence of an
Object
.
The Servant
provides a default implementation of
_non_existent()
that can be overridden by derived servants.
Returns: non_existent
true
if that object does
not exist, false
otherwise.
/**
* Checks for the existence of an
* <code>Object</code>.
* The <code>Servant</code> provides a default implementation of
* <code>_non_existent()</code> that can be overridden by derived servants.
* @return <code>non_existent</code> <code>true</code> if that object does
* not exist, <code>false</code> otherwise.
*/
public boolean _non_existent() {
return _get_delegate().non_existent(this);
}
// Ken and Simon will ask about editorial changes
// needed in IDL to Java mapping to the following
// signature.
/**
* Returns an object in the Interface Repository
* which provides type information that may be useful to a program.
* <code>Servant</code> provides a default implementation of
* <code>_get_interface()</code>
* that can be overridden by derived servants if the default
* behavior is not adequate.
* @return <code>get_interface</code> type information that corresponds to this servant.
*/
/*
public org.omg.CORBA.Object _get_interface() {
return _get_delegate().get_interface(this);
}
*/
// _get_interface_def() replaces the _get_interface() method
Returns an InterfaceDef
object as a
CORBA::Object
that defines the runtime type of the
CORBA::Object
implemented by the Servant
.
The invoker of _get_interface_def
must narrow the result to an InterfaceDef
in order
to use it.
This default implementation of _get_interface_def()
can be overridden
by derived servants if the default behavior is not adequate.
As defined in the CORBA 2.3.1 specification, section 11.3.1, the
default behavior of _get_interface_def()
is to use
the most derived
interface of a static servant or the most derived interface retrieved
from a dynamic servant to obtain the InterfaceDef
.
This behavior must
be supported by the Delegate
that implements the
Servant
.
Returns: get_interface_def
an InterfaceDef
object as a
CORBA::Object
that defines the runtime type of the
CORBA::Object
implemented by the Servant
.
/**
* Returns an <code>InterfaceDef</code> object as a
* <code>CORBA::Object</code> that defines the runtime type of the
* <code>CORBA::Object</code> implemented by the <code>Servant</code>.
* The invoker of <code>_get_interface_def</code>
* must narrow the result to an <code>InterfaceDef</code> in order
* to use it.
* <P>This default implementation of <code>_get_interface_def()</code>
* can be overridden
* by derived servants if the default behavior is not adequate.
* As defined in the CORBA 2.3.1 specification, section 11.3.1, the
* default behavior of <code>_get_interface_def()</code> is to use
* the most derived
* interface of a static servant or the most derived interface retrieved
* from a dynamic servant to obtain the <code>InterfaceDef</code>.
* This behavior must
* be supported by the <code>Delegate</code> that implements the
* <code>Servant</code>.
* @return <code>get_interface_def</code> an <code>InterfaceDef</code>
* object as a
* <code>CORBA::Object</code> that defines the runtime type of the
* <code>CORBA::Object</code> implemented by the <code>Servant</code>.
*/
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 ORBs
// whose delegates implement this method).
// Else call the delegate implementation class's
// "InterfaceDef get_interface(..)" method using reflection
// (will work for ORBs that were built using an older version
// of the Delegate interface with a get_interface method
// but not a get_interface_def method).
org.omg.PortableServer.portable.Delegate delegate = _get_delegate();
try {
// If the ORB's delegate class does not implement
// "Object get_interface_def(..)", this will throw
// an AbstractMethodError.
return delegate.get_interface_def(this);
} catch( AbstractMethodError aex ) {
// Call "InterfaceDef get_interface(..)" method using reflection.
try {
Class[] argc = { org.omg.PortableServer.Servant.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();
}
}
}
// methods for which the user must provide an
// implementation
Used by the ORB to obtain complete type
information from the servant.
Params: - poa – POA with which the servant is associated.
- objectId – is the id corresponding to the object
associated with this servant.
Returns: list of type information for the object.
/**
* Used by the ORB to obtain complete type
* information from the servant.
* @param poa POA with which the servant is associated.
* @param objectId is the id corresponding to the object
* associated with this servant.
* @return list of type information for the object.
*/
abstract public String[] _all_interfaces( POA poa, byte[] objectId);
}