1 /*
2  * Copyright (c) 1997, 2002, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 package org.omg.CORBA.portable;
26 
27 import org.omg.CORBA.Request;
28 import org.omg.CORBA.NamedValue;
29 import org.omg.CORBA.NVList;
30 import org.omg.CORBA.Context;
31 import org.omg.CORBA.ContextList;
32 import org.omg.CORBA.ExceptionList;
33 import org.omg.CORBA.TypeCode;
34 import org.omg.CORBA.SystemException;
35 
36 /**
37  * Specifies a portable API for ORB-vendor-specific
38  * implementation of the org.omg.CORBA.Object methods.
39  *
40  * Each stub (proxy) contains a delegate
41  * object, to which all org.omg.CORBA.Object methods are forwarded.
42  * This allows a stub generated by one vendor's ORB to work with the delegate
43  * from another vendor's ORB.
44  *
45  * @see org.omg.CORBA.Object
46  * @author OMG
47  */
48 
49 public abstract class Delegate {
50 
51     /**
52      * Return an InterfaceDef for the object reference provided.
53      * @param self The object reference whose InterfaceDef needs to be returned
54      * @return the InterfaceDef
55      */
get_interface_def( org.omg.CORBA.Object self)56     public abstract org.omg.CORBA.Object get_interface_def(
57         org.omg.CORBA.Object self);
58 
59     /**
60      * Returns a duplicate of the object reference provided.
61      * @param obj The object reference whose duplicate needs to be returned
62      * @return the duplicate object reference
63      */
duplicate(org.omg.CORBA.Object obj)64     public abstract org.omg.CORBA.Object duplicate(org.omg.CORBA.Object obj);
65 
66     /**
67      * Releases resources associated with the object reference provided.
68      * @param obj The object reference whose resources need to be released
69      */
release(org.omg.CORBA.Object obj)70     public abstract void release(org.omg.CORBA.Object obj);
71 
72     /**
73      * Checks if the object reference is an instance of the given interface.
74      * @param obj The object reference to be checked.
75      * @param repository_id The repository identifier of the interface
76      * to check against.
77      * @return true if the object reference supports the interface
78      */
is_a(org.omg.CORBA.Object obj, String repository_id)79     public abstract boolean is_a(org.omg.CORBA.Object obj, String repository_id);
80 
81     /**
82      * Determines whether the server object for the object reference has been
83      * destroyed.
84      * @param obj The object reference which delegated to this delegate.
85      * @return true if the ORB knows authoritatively that the server object does
86      * not exist, false otherwise
87      */
non_existent(org.omg.CORBA.Object obj)88     public abstract boolean non_existent(org.omg.CORBA.Object obj);
89 
90     /**
91      * Determines if the two object references are equivalent.
92      * @param obj The object reference which delegated to this delegate.
93      * @param other The object reference to check equivalence against.
94      * @return true if the objects are CORBA-equivalent.
95      */
is_equivalent(org.omg.CORBA.Object obj, org.omg.CORBA.Object other)96     public abstract boolean is_equivalent(org.omg.CORBA.Object obj,
97                                           org.omg.CORBA.Object other);
98 
99     /**
100      * Returns an ORB-internal identifier (hashcode) for this object reference.
101      * @param obj The object reference which delegated to this delegate.
102      * @param max specifies an upper bound on the hash value returned by
103      *            the ORB.
104      * @return ORB-internal hash identifier for object reference
105      */
hash(org.omg.CORBA.Object obj, int max)106     public abstract int hash(org.omg.CORBA.Object obj, int max);
107 
108     /**
109      * Creates a Request instance for use in the Dynamic Invocation Interface.
110      * @param obj The object reference which delegated to this delegate.
111      * @param operation The name of the operation to be invoked using the
112      *                  Request instance.
113      * @return the created Request instance
114      */
request(org.omg.CORBA.Object obj, String operation)115     public abstract Request request(org.omg.CORBA.Object obj, String operation);
116 
117     /**
118      * Creates a Request instance for use in the Dynamic Invocation Interface.
119      *
120      * @param obj The object reference which delegated to this delegate.
121      * @param ctx                      The context to be used.
122      * @param operation                The name of the operation to be
123      *                                 invoked.
124      * @param arg_list         The arguments to the operation in the
125      *                                 form of an NVList.
126      * @param result           A container for the result as a NamedValue.
127      * @return                 The created Request object.
128      *
129      */
create_request(org.omg.CORBA.Object obj, Context ctx, String operation, NVList arg_list, NamedValue result)130     public abstract Request create_request(org.omg.CORBA.Object obj,
131                                            Context ctx,
132                                            String operation,
133                                            NVList arg_list,
134                                            NamedValue result);
135 
136     /**
137      * Creates a Request instance for use in the Dynamic Invocation Interface.
138      *
139      * @param obj The object reference which delegated to this delegate.
140      * @param ctx                      The context to be used.
141      * @param operation                The name of the operation to be
142      *                                 invoked.
143      * @param arg_list         The arguments to the operation in the
144      *                                 form of an NVList.
145      * @param result           A container for the result as a NamedValue.
146      * @param exclist          A list of possible exceptions the
147      *                                 operation can throw.
148      * @param ctxlist          A list of context strings that need
149      *                                 to be resolved and sent with the
150      *                                 Request.
151      * @return                 The created Request object.
152      */
create_request(org.omg.CORBA.Object obj, Context ctx, String operation, NVList arg_list, NamedValue result, ExceptionList exclist, ContextList ctxlist)153     public abstract Request create_request(org.omg.CORBA.Object obj,
154                                            Context ctx,
155                                            String operation,
156                                            NVList arg_list,
157                                            NamedValue result,
158                                            ExceptionList exclist,
159                                            ContextList ctxlist);
160 
161     /**
162      * Provides a reference to the orb associated with its parameter.
163      *
164      * @param obj  the object reference which delegated to this delegate.
165      * @return the associated orb.
166      * @see <a href="package-summary.html#unimpl"><code>portable</code>
167      * package comments for unimplemented features</a>
168      */
orb(org.omg.CORBA.Object obj)169     public org.omg.CORBA.ORB orb(org.omg.CORBA.Object obj) {
170         throw new org.omg.CORBA.NO_IMPLEMENT();
171     }
172 
173     /**
174      * Returns the <code>Policy</code> object of the specified type
175      * which applies to this object.
176      *
177      * @param self The object reference which delegated to this delegate.
178      * @param policy_type The type of policy to be obtained.
179      * @return A <code>Policy</code> object of the type specified by
180      *         the policy_type parameter.
181      * @exception org.omg.CORBA.BAD_PARAM raised when the value of policy type
182      * is not valid either because the specified type is not supported by this
183      * ORB or because a policy object of that type is not associated with this
184      * Object.
185      * @see <a href="package-summary.html#unimpl"><code>portable</code>
186      * package comments for unimplemented features</a>
187      */
get_policy(org.omg.CORBA.Object self, int policy_type)188     public org.omg.CORBA.Policy get_policy(org.omg.CORBA.Object self,
189                                            int policy_type) {
190         throw new org.omg.CORBA.NO_IMPLEMENT();
191     }
192 
193 
194     /**
195      * Retrieves the <code>DomainManagers</code> of this object.
196      * This allows administration services (and applications) to retrieve the
197      * domain managers, and hence the security and other policies applicable
198      * to individual objects that are members of the domain.
199      *
200      * @param self The object reference which delegated to this delegate.
201      * @return The list of immediately enclosing domain managers of this object.
202      *  At least one domain manager is always returned in the list since by
203      * default each object is associated with at least one domain manager at
204      * creation.
205      * @see <a href="package-summary.html#unimpl"><code>portable</code>
206      * package comments for unimplemented features</a>
207      */
get_domain_managers( org.omg.CORBA.Object self)208     public org.omg.CORBA.DomainManager[] get_domain_managers(
209                                                              org.omg.CORBA.Object
210                                                              self) {
211         throw new org.omg.CORBA.NO_IMPLEMENT();
212     }
213 
214 
215     /**
216      * Associates the policies passed in
217      * with a newly created object reference that it returns. Only certain
218      * policies that pertain to the invocation of an operation at the client
219      * end can be overridden using this operation. Attempts to override any
220      * other policy will result in the raising of the CORBA::NO_PERMISSION
221      * exception.
222      *
223      * @param self The object reference which delegated to this delegate.
224      * @param policies A sequence of references to Policy objects.
225      * @param set_add Indicates whether these policies should be added
226      * onto any otheroverrides that already exist (ADD_OVERRIDE) in
227      * the object reference, or they should be added to a clean
228      * override free object reference (SET_OVERRIDE).
229      * @return  A new object reference with the new policies associated with it.
230      *
231      * @see <a href="package-summary.html#unimpl"><code>portable</code>
232      * package comments for unimplemented features</a>
233      */
set_policy_override(org.omg.CORBA.Object self, org.omg.CORBA.Policy[] policies, org.omg.CORBA.SetOverrideType set_add)234     public org.omg.CORBA.Object set_policy_override(org.omg.CORBA.Object self,
235                                                     org.omg.CORBA.Policy[] policies,
236                                                     org.omg.CORBA.SetOverrideType set_add) {
237         throw new org.omg.CORBA.NO_IMPLEMENT();
238     }
239 
240 
241     /**
242      * Returns true if this object is implemented by a local servant.
243      *
244      * @param self The object reference which delegated to this delegate.
245      * @return true only if the servant incarnating this object is located in
246      * this Java VM. Return false if the servant is not local or the ORB
247      * does not support local stubs for this particular servant. The default
248      * behavior of is_local() is to return false.
249      */
is_local(org.omg.CORBA.Object self)250     public boolean is_local(org.omg.CORBA.Object self) {
251         return false;
252     }
253 
254     /**
255      * Returns a Java reference to the servant which should be used for this
256      * request. servant_preinvoke() is invoked by a local stub.
257      * If a ServantObject object is returned, then its servant field
258      * has been set to an object of the expected type (Note: the object may
259      * or may not be the actual servant instance). The local stub may cast
260      * the servant field to the expected type, and then invoke the operation
261      * directly. The ServantRequest object is valid for only one invocation,
262      * and cannot be used for more than one invocation.
263      *
264      * @param self The object reference which delegated to this delegate.
265      *
266      * @param operation a string containing the operation name.
267      * The operation name corresponds to the operation name as it would be
268      * encoded in a GIOP request.
269      *
270      * @param expectedType a Class object representing the expected type of the servant.
271      * The expected type is the Class object associated with the operations
272      * class of the stub's interface (e.g. A stub for an interface Foo,
273      * would pass the Class object for the FooOperations interface).
274      *
275      * @return a ServantObject object.
276      * The method may return a null value if it does not wish to support
277      * this optimization (e.g. due to security, transactions, etc).
278      * The method must return null if the servant is not of the expected type.
279      */
servant_preinvoke(org.omg.CORBA.Object self, String operation, Class expectedType)280     public ServantObject servant_preinvoke(org.omg.CORBA.Object self,
281                                            String operation,
282                                            Class expectedType) {
283         return null;
284     }
285 
286     /**
287      * servant_postinvoke() is invoked by the local stub after the operation
288      * has been invoked on the local servant.
289      * This method must be called if servant_preinvoke() returned a non-null
290      * value, even if an exception was thrown by the servant's method.
291      * For this reason, the call to servant_postinvoke() should be placed
292      * in a Java finally clause.
293      *
294      * @param self The object reference which delegated to this delegate.
295      *
296      * @param servant the instance of the ServantObject returned from
297      *  the servant_preinvoke() method.
298      */
servant_postinvoke(org.omg.CORBA.Object self, ServantObject servant)299     public void servant_postinvoke(org.omg.CORBA.Object self,
300                                    ServantObject servant) {
301     }
302 
303     /**
304      * request is called by a stub to obtain an OutputStream for
305      * marshaling arguments. The stub must supply the operation name,
306      * and indicate if a response is expected (i.e is this a oneway
307      * call).
308      *
309      * @param self The object reference which delegated to this delegate.
310      * @param operation a string containing the operation name.
311      * The operation name corresponds to the operation name as it would be
312      * encoded in a GIOP request.
313      * @param responseExpected false if the operation is a one way operation,
314      * and true otherwise.
315      * @return OutputStream the OutputStream into which request arguments
316      * can be marshaled.
317      * @see <a href="package-summary.html#unimpl"><code>portable</code>
318      * package comments for unimplemented features</a>
319      */
request(org.omg.CORBA.Object self, String operation, boolean responseExpected)320     public OutputStream request(org.omg.CORBA.Object self,
321                                 String operation,
322                                 boolean responseExpected) {
323         throw new org.omg.CORBA.NO_IMPLEMENT();
324     }
325 
326     /**
327      * invoke is called by a stub to invoke an operation. The stub provides an
328      * OutputStream that was previously returned by a request()
329      * call. invoke returns an InputStream which contains the
330      * marshaled reply. If an exception occurs, invoke may throw an
331      * ApplicationException object which contains an InputStream from
332      * which the user exception state may be unmarshaled.
333      *
334      * @param self The object reference which delegated to this delegate.
335      * @param output the OutputStream which contains marshaled arguments
336      * @return input the InputStream from which reply parameters can be
337      * unmarshaled.
338      * @throws ApplicationException thrown when implementation throws
339      * (upon invocation) an exception defined as part of its remote method
340      * definition.
341      * @throws RemarshalException thrown when remarshalling fails.
342      * @see <a href="package-summary.html#unimpl"><code>portable</code>
343      * package comments for unimplemented features</a>
344      */
invoke(org.omg.CORBA.Object self, OutputStream output)345     public InputStream invoke(org.omg.CORBA.Object self,
346                               OutputStream output)
347         throws ApplicationException, RemarshalException {
348         throw new org.omg.CORBA.NO_IMPLEMENT();
349     }
350 
351     /**
352      * releaseReply may optionally be called by a stub to release a
353      * reply stream back to the ORB when the unmarshaling has
354      * completed. The stub passes the InputStream returned by
355      * invoke() or ApplicationException.getInputStream(). A null
356      * value may also be passed to releaseReply, in which case the
357      * method is a noop.
358      *
359      * @param self The object reference which delegated to this delegate.
360      * @param input the InputStream returned from invoke().
361      * @see <a href="package-summary.html#unimpl"><code>portable</code>
362      * package comments for unimplemented features</a>
363      */
releaseReply(org.omg.CORBA.Object self, InputStream input)364     public void releaseReply(org.omg.CORBA.Object self,
365                              InputStream input) {
366         throw new org.omg.CORBA.NO_IMPLEMENT();
367     }
368 
369     /**
370      * Provides the implementation to override the toString() method
371      * of the delegating CORBA object.
372      *
373      * @param self the object reference that delegated to this delegate
374      * @return a <code>String</code> object that represents the object
375      *         reference that delegated to this <code>Delegate</code>
376      *         object
377      */
378 
toString(org.omg.CORBA.Object self)379     public String toString(org.omg.CORBA.Object self) {
380         return self.getClass().getName() + ":" + this.toString();
381     }
382 
383     /**
384      * Provides the implementation to override the hashCode() method
385      * of the delegating CORBA object.
386      *
387      * @param self the object reference that delegated to this delegate
388      * @return an <code>int</code> that represents the hashcode for the
389      *         object reference that delegated to this <code>Delegate</code>
390      *         object
391      */
hashCode(org.omg.CORBA.Object self)392     public int hashCode(org.omg.CORBA.Object self) {
393         return System.identityHashCode(self);
394     }
395 
396     /**
397      * Provides the implementation to override the equals(java.lang.Object obj)
398      * method of the delegating CORBA object.
399      *
400      * @param self the object reference that delegated to this delegate
401      * @param obj the <code>Object</code> with which to compare
402      * @return <code>true</code> if <code>obj</code> equals <code>self</code>;
403      *         <code>false</code> otherwise
404      */
equals(org.omg.CORBA.Object self, java.lang.Object obj)405     public boolean equals(org.omg.CORBA.Object self, java.lang.Object obj) {
406         return (self == obj);
407     }
408 }
409