| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
| <!-- package.html - describes classes in org.omg.PortableServer package |
| Copyright (C) 2005 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath 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 for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. --> |
| |
| <html> |
| <head><title>GNU Classpath - The Portable Object Adapter package</title></head> |
| <body> |
| <p> |
| The Portable Object Adapter (POA) provides more control on the request |
| processing than it is possible when connecting objects directly to the |
| ORB. The POA model defines a tree structure of POAs, the root POA being |
| connected directly to the ORB. Any branch of this tree can be temporary or |
| permanently inactivated using {@link org.omg.PortableServer.POAManager}. |
| The same manager can control several branches in the POA tree. Also, |
| any branch in this tree can have different processing options (policies). |
| </p><p> |
| The newly created POA is in holding state, just queuing requests. To start |
| processing requests, it must be turned into the active state by its |
| {@link org.omg.PortableServer.POAManagerOperations#activate}. |
| </p><p> |
| The previously monolite object implementation is now divided into object |
| (that implements {@link org.omg.CORBA.Object}) |
| and servant (that implements either {@link org.omg.CORBA.portable.InvokeHandler} |
| or {@link org.omg.PortableServer.DynamicImplementation}). |
| Frequently each object has its own servant, but it can also be a single servant |
| per multiple objects and also default servant for POA |
| (see {@link org.omg.PortableServer.POAOperations#set_servant}). Each object |
| has its own Object Id, unique in the scope of the POA, where the object is |
| connected. These Ids need not be different for objects belonging |
| to different POAs, even if these POAs are connected to the same ORB. |
| Under the USER_ID is assignment policy this Id can be a specified by user in |
| {@link org.omg.PortableServer.POAOperations#activate_object_with_id}, |
| encapsulating some meaningful information about the object. The Id of the |
| object being currently served can be identified with |
| {@link org.omg.PortableServer.Servant#_object_id}. This approach is used in cases |
| when it is possible to encapsulate all object-related data into the |
| Object Id. Such system only needs one servant, one server socket and one |
| socket port per POA that can handle thounsands of objects. |
| </p><p> |
| Instead of being connected directly to the ORB, objects are now connected |
| to one of the ORBs POAs. Since JDK 1.4 the application specific implementation |
| base is derived from the {@link org.omg.PortableServer.Servant}, having a |
| different name pattern (<code>*POA.java</code> instead of the previous |
| <code>_*ImplBase.java</code>). This <code>*POA</code> suffix does <i>not</i> |
| mean that these servants implement or are derived from POA. They are different |
| classes that can be connected to one of the POAs, by instance, using |
| {@link org.omg.PortableServer.POAOperations#servant_to_reference}. |
| The implementation base also inherits an *Operations interface, containing |
| definitions of the application specific methods. The application programmer |
| writes a descendent of the implementation base, implementing these methods |
| for the application - specific functionality. |
| </p><p> |
| The POA objects support the method invocation by name, using |
| {@link org.omg.CORBA.Request}. This alternative method works without the |
| service-specific classes that may not be available at run time. |
| </p><p> |
| The objects in POA can also be activated and inactivated independently. It |
| is possible to set a listener ({@link org.omg.PortableServer.ServantActivator}) |
| that would register the object activations ("incarnations") and deactivations |
| ("etherializations"). The servant need not be specifyed when creating an |
| object. Under the IMPLICIT_ACTIVATION |
| {@link org.omg.PortableServer.ImplicitActivationPolicy} |
| the {@link org.omg.PortableServer.ServantActivator} can provide the servant |
| in response to the first (local or remote) call of any method on the |
| previously incative object. |
| </p><p> |
| The root POA is obtained by resolving the initial reference "RootPOA" |
| for the orb. In the simpliest case the objects can be connected directly |
| to that root POA without creating the POA tree. The policies, used by |
| the root POA, are defined by OMG as following: |
| <table border="1"> |
| <tr><th>Policy type</th><th>Accepted policy</th></tr> |
| <tr><td>{@link org.omg.PortableServer.IdAssignmentPolicy} </td><td>SYSTEM_ID |
| (Ids are created by POA)</td></tr> |
| <tr><td>{@link org.omg.PortableServer.IdUniquenessPolicy}</td><td>UNIQUE_ID |
| (single object (and Id) per servant) |
| </td></tr> |
| <tr><td>{@link org.omg.PortableServer.ImplicitActivationPolicy} </td><td> |
| IMPLICIT_ACTIVATION (if inactive, activate)</td></tr> |
| <tr><td>{@link org.omg.PortableServer.LifespanPolicy} </td><td>TRANSIENT |
| (the POA objects cannot outlive POA)</td></tr> |
| <tr><td>{@link org.omg.PortableServer.RequestProcessingPolicy} </td><td> |
| USE_ACTIVE_OBJECT_MAP_ONLY (the servant is provided during activation)</td></tr> |
| <tr><td>{@link org.omg.PortableServer.ServantRetentionPolicy} </td><td> |
| RETAIN (retain servants for subsequent invocations)</td></tr> |
| <tr><td>{@link org.omg.PortableServer.ThreadPolicy} </td><td>ORB_CTRL_MODEL |
| (single thread per request and single server socket per object)</td></tr> |
| </table> |
| These values are also default for the child POAs The policies are |
| <i>never</i> inherited from the parent POA. |
| </p><p> |
| This set of policies means that each object will have a separate serving |
| thread, separate network socket port and usually a separate servant. It |
| is appropriate when the expected number of objects is not too large. |
| If the expected number of objects is larger than the supportable number |
| of threads and socket ports, the SINGLE_THREAD_MODEL |
| {@link org.omg.PortableServer.ThreadPolicy} is |
| used. Then all objects in POA with this policy are served in a single |
| thread, using the same server socket, connected to a single port. If the |
| request processing policy is additionally set to USE_DEFAULT_SERVANT, |
| all objects of this POA share the same (default) servant. |
| </p><p> |
| The operations, supported by POA are defined |
| separately in {@link org.omg.PortableServer.POAOperations}. |
| </p><p> |
| <h3>The typical POA usage scenarios</h3> |
| <h4>POA converts servant to the object reference</h4> |
| In the simpliest case, the servant implementation is connected to POA by |
| {@link org.omg.PortableServer.POAOperations#servant_to_reference}, the |
| returned object being a target of remote and local invocations. |
| It may be converted into the stringified reference, registered with |
| the naming service, used locally or, when serving or invoking local or remote |
| method, passed as a parameter or return value having the CORBA Object type. |
| The object obtains Id from POA and is activated due default implicit |
| activation policy. This scenario is supported by the default policy set |
| and is used in the most of the "hello world" examples. |
| <h4>Servant provides to the object reference</h4> |
| The servant can be connected to an ORB by |
| {@link org.omg.PortableServer.Servant#_this_object(org.omg.CORBA.ORB)}, |
| obtaining the object reference. The overridable |
| {@link org.omg.PortableServer.Servant#_default_POA()} |
| specifies POA to that the servant will be connected. The default method |
| connects to the root poa. IDL compilers frequently generate the |
| <code>_this(ORB)</code> metod for servants for getting the object reference |
| that is already narrowed to the exact object type. |
| <h4>Explicit activation with POA assigned ids</h4> |
| The objects are activated by calling the |
| {@link org.omg.PortableServer.POAOperations#activate_object} on the |
| POA with the object in question. The POA allocates, assigns, and |
| returns a unique identity value for the object. This scenario requires the |
| SYSTEM_ID {@link org.omg.PortableServer.IdAssignmentPolicy}. |
| <h4>Explicit Activation with User-assigned Ids</h4> |
| The POA supports an explicit activation operation, |
| {@link org.omg.PortableServer.POAOperations#activate_object_with_id}, |
| that associates a servant with the user-defined Object Id. |
| This scenario requires the USER_ID |
| {@link org.omg.PortableServer.IdAssignmentPolicy}. The servant manager |
| may be or may not be used. |
| <h4>References before activation</h4> |
| It may be useful to create references for objects before activating them. |
| Such reference can be created using |
| {@link org.omg.PortableServer.POAOperations#create_reference} or |
| {@link org.omg.PortableServer.POAOperations#create_reference_with_id}, both |
| methods also requiring to give the object repository id. Such object may |
| be later activated either by |
| {@link org.omg.PortableServer.POAOperations#activate_object_with_id} or |
| automatically, if the IMPLICIT_ACTIVATION policy applies. |
| <h4>Multiple Ids per servant</h4> |
| If the MULTIPLE_ID policy applies, the servant may be activated many times. |
| Under this policy, |
| {@link org.omg.PortableServer.POAOperations#servant_to_reference} |
| and {@link org.omg.PortableServer.POAOperations#servant_to_id} |
| during each call create a new object and object reference for the |
| used servant. |
| <h4>One servant for all objects</h4> |
| If the USE_DEFAULT_SERVANT policy applies, that default servant serves all |
| objects, belonging this POA. This approach is used when there is |
| very little data associated with each object, so little that the data can be |
| encoded in the Object Id. Also, it may be needed when a very large |
| number of objects is expected. If the RETAIN applies, it is possible to |
| activate an object explicitly setting the servant other than default. |
| If NO_RETAIN applies, the default servant will serve all known an |
| unknown objects for that POA. |
| <h4>Single Servant, Many Objects and Types</h4> |
| Combining USER_ID, USE_DEFAULT_SERVANT and RETAIN, it is possible to |
| create and serve objects "on the fly". The servant must determine the |
| object type (for instance, from the value of the agreed attribute, |
| shared by all supported types, or from the Object Id) and be able to |
| handle the method, named in request. If the names and parameter lists |
| of the object methods are also created "on the fly", the requests |
| to such object can still be submitted using {@link org.omg.CORBA.Request}. |
| This method is used when the created object represents some |
| entity in the complex database. |
| <h4>The ServantLocator finds a servant for each call</h4> |
| The {@link org.omg.PortableServer.ServantLocator} is used by POAs that |
| combinine NON_RETAIN and USE_SERVANT_MANAGER policies. It provides |
| a new or reused servant every time the invocation is made. The servant |
| locator must provide a servant in response of calling |
| {@link org.omg.PortableServer.ServantLocatorOperations#preinvoke}. |
| This method has access the the Id of the object being served and |
| the name of the method being called. It must return the appropriate |
| instance of the servant or throw an exception, forwarding the request |
| to another object (usually in another server). After the invocation, |
| a {@link org.omg.PortableServer.ServantLocatorOperations#postinvoke} |
| is called. It should be not assumed that the call of <code>preinvoke</code> |
| will be followed by the call of the <code>postinvoke</code>; in |
| multithreaded environment these calls are not serialized in this way. If |
| the <code>preinvoke</code> has to tell something this-call-specific to |
| the <code>postinvoke</code>, it must use the provided cookie holder. |
| The <code>preinvoke/postinoke</code> are also called to provide a servant |
| during each local invocation on the objects, belonging to the described POA. |
| </p><p> |
| All these scenarios must work with the current GNU Classpath release. |
| |
| @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org) |
| </body> |
| </html> |