Fri, 10 Jul 2015 08:43:05 -0700
Merge
1 /*
2 * Copyright (c) 1997, 2006, 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;
27 import org.omg.CORBA.Request;
28 import org.omg.CORBA.NamedValue;
29 import org.omg.CORBA.NVList;
30 import org.omg.CORBA.ExceptionList;
31 import org.omg.CORBA.ContextList;
32 import org.omg.CORBA.Context;
33 import org.omg.CORBA.TypeCode;
34 import org.omg.CORBA.BAD_OPERATION;
35 import org.omg.CORBA.SystemException;
38 /**
39 * The common base class for all stub classes; provides default implementations
40 * of the <code>org.omg.CORBA.Object</code> methods. All method implementations are
41 * forwarded to a <code>Delegate</code> object stored in the <code>ObjectImpl</code>
42 * instance. <code>ObjectImpl</code> allows for portable stubs because the
43 * <code>Delegate</code> can be implemented by a different vendor-specific ORB.
44 */
46 abstract public class ObjectImpl implements org.omg.CORBA.Object
47 {
49 /**
50 * The field that stores the <code>Delegate</code> instance for
51 * this <code>ObjectImpl</code> object. This <code>Delegate</code>
52 * instance can be implemented by a vendor-specific ORB. Stub classes,
53 * which are derived from this <code>ObjectImpl</code> class, can be
54 * portable because they delegate all of the methods called on them to this
55 * <code>Delegate</code> object.
56 */
57 private transient Delegate __delegate;
60 /**
61 * Retrieves the reference to the vendor-specific <code>Delegate</code>
62 * object to which this <code>ObjectImpl</code> object delegates all
63 * methods invoked on it.
64 *
65 * @return the Delegate contained in this ObjectImpl instance
66 * @throws BAD_OPERATION if the delegate has not been set
67 * @see #_set_delegate
68 */
69 public Delegate _get_delegate() {
70 if (__delegate == null)
71 throw new BAD_OPERATION("The delegate has not been set!");
72 return __delegate;
73 }
76 /**
77 * Sets the Delegate for this <code>ObjectImpl</code> instance to the given
78 * <code>Delegate</code> object. All method invocations on this
79 * <code>ObjectImpl</code> object will be forwarded to this delegate.
80 *
81 * @param delegate the <code>Delegate</code> instance to which
82 * all method calls on this <code>ObjectImpl</code> object
83 * will be delegated; may be implemented by a third-party ORB
84 * @see #_get_delegate
85 */
86 public void _set_delegate(Delegate delegate) {
87 __delegate = delegate;
88 }
90 /**
91 * Retrieves a string array containing the repository identifiers
92 * supported by this <code>ObjectImpl</code> object. For example,
93 * for a stub, this method returns information about all the
94 * interfaces supported by the stub.
95 *
96 * @return the array of all repository identifiers supported by this
97 * <code>ObjectImpl</code> instance
98 */
99 public abstract String[] _ids();
102 /**
103 * Returns a duplicate of this <code>ObjectImpl</code> object.
104 *
105 * @return an <code>orb.omg.CORBA.Object</code> object that is
106 * a duplicate of this object
107 */
108 public org.omg.CORBA.Object _duplicate() {
109 return _get_delegate().duplicate(this);
110 }
112 /**
113 * Releases the resources associated with this <code>ObjectImpl</code> object.
114 */
115 public void _release() {
116 _get_delegate().release(this);
117 }
119 /**
120 * Checks whether the object identified by the given repository
121 * identifier is an <code>ObjectImpl</code> object.
122 *
123 * @param repository_id a <code>String</code> object with the repository
124 * identifier to check
125 * @return <code>true</code> if the object identified by the given
126 * repository id is an instance of <code>ObjectImpl</code>;
127 * <code>false</code> otherwise
128 */
129 public boolean _is_a(String repository_id) {
130 return _get_delegate().is_a(this, repository_id);
131 }
133 /**
134 * Checks whether the the given <code>ObjectImpl</code> object is
135 * equivalent to this <code>ObjectImpl</code> object.
136 *
137 * @param that an instance of <code>ObjectImpl</code> to compare with
138 * this <code>ObjectImpl</code> object
139 * @return <code>true</code> if the given object is equivalent
140 * to this <code>ObjectImpl</code> object;
141 * <code>false</code> otherwise
142 */
143 public boolean _is_equivalent(org.omg.CORBA.Object that) {
144 return _get_delegate().is_equivalent(this, that);
145 }
147 /**
148 * Checks whether the server object for this <code>ObjectImpl</code>
149 * object has been destroyed.
150 *
151 * @return <code>true</code> if the ORB knows authoritatively that the
152 * server object does not exist; <code>false</code> otherwise
153 */
154 public boolean _non_existent() {
155 return _get_delegate().non_existent(this);
156 }
158 /**
159 * Retrieves the hash code that serves as an ORB-internal identifier for
160 * this <code>ObjectImpl</code> object.
161 *
162 * @param maximum an <code>int</code> indicating the upper bound on the hash
163 * value returned by the ORB
164 * @return an <code>int</code> representing the hash code for this
165 * <code>ObjectImpl</code> object
166 */
167 public int _hash(int maximum) {
168 return _get_delegate().hash(this, maximum);
169 }
171 /**
172 * Creates a <code>Request</code> object containing the given method
173 * that can be used with the Dynamic Invocation Interface.
174 *
175 * @param operation the method to be invoked by the new <code>Request</code>
176 * object
177 * @return a new <code>Request</code> object initialized with the
178 * given method
179 */
180 public Request _request(String operation) {
181 return _get_delegate().request(this, operation);
182 }
184 /**
185 * Creates a <code>Request</code> object that contains the given context,
186 * method, argument list, and container for the result.
187 *
188 * @param ctx the Context for the request
189 * @param operation the method that the new <code>Request</code>
190 * object will invoke
191 * @param arg_list the arguments for the method; an <code>NVList</code>
192 * in which each argument is a <code>NamedValue</code> object
193 * @param result a <code>NamedValue</code> object to be used for
194 * returning the result of executing the request's method
195 * @return a new <code>Request</code> object initialized with the
196 * given context, method, argument list, and container for the
197 * return value
198 */
199 public Request _create_request(Context ctx,
200 String operation,
201 NVList arg_list,
202 NamedValue result) {
203 return _get_delegate().create_request(this,
204 ctx,
205 operation,
206 arg_list,
207 result);
208 }
210 /**
211 * Creates a <code>Request</code> object that contains the given context,
212 * method, argument list, container for the result, exceptions, and
213 * list of property names to be used in resolving the context strings.
214 * This <code>Request</code> object is for use in the Dynamic
215 * Invocation Interface.
216 *
217 * @param ctx the <code>Context</code> object that contains the
218 * context strings that must be resolved before they are
219 * sent along with the request
220 * @param operation the method that the new <code>Request</code>
221 * object will invoke
222 * @param arg_list the arguments for the method; an <code>NVList</code>
223 * in which each argument is a <code>NamedValue</code> object
224 * @param result a <code>NamedValue</code> object to be used for
225 * returning the result of executing the request's method
226 * @param exceptions a list of the exceptions that the given method
227 * throws
228 * @param contexts a list of the properties that are needed to
229 * resolve the contexts in <i>ctx</i>; the strings in
230 * <i>contexts</i> are used as arguments to the method
231 * <code>Context.get_values</code>,
232 * which returns the value associated with the given property
233 * @return a new <code>Request</code> object initialized with the
234 * given context strings to resolve, method, argument list,
235 * container for the result, exceptions, and list of property
236 * names to be used in resolving the context strings
237 */
238 public Request _create_request(Context ctx,
239 String operation,
240 NVList arg_list,
241 NamedValue result,
242 ExceptionList exceptions,
243 ContextList contexts) {
244 return _get_delegate().create_request(this,
245 ctx,
246 operation,
247 arg_list,
248 result,
249 exceptions,
250 contexts);
251 }
253 /**
254 * Retrieves the interface definition for this <code>ObjectImpl</code>
255 * object.
256 *
257 * @return the <code>org.omg.CORBA.Object</code> instance that is the
258 * interface definition for this <code>ObjectImpl</code> object
259 */
260 public org.omg.CORBA.Object _get_interface_def()
261 {
262 // First try to call the delegate implementation class's
263 // "Object get_interface_def(..)" method (will work for JDK1.2 ORBs).
264 // Else call the delegate implementation class's
265 // "InterfaceDef get_interface(..)" method using reflection
266 // (will work for pre-JDK1.2 ORBs).
268 org.omg.CORBA.portable.Delegate delegate = _get_delegate();
269 try {
270 // If the ORB's delegate class does not implement
271 // "Object get_interface_def(..)", this will call
272 // get_interface_def(..) on portable.Delegate.
273 return delegate.get_interface_def(this);
274 }
275 catch( org.omg.CORBA.NO_IMPLEMENT ex ) {
276 // Call "InterfaceDef get_interface(..)" method using reflection.
277 try {
278 Class[] argc = { org.omg.CORBA.Object.class };
279 java.lang.reflect.Method meth =
280 delegate.getClass().getMethod("get_interface", argc);
281 Object[] argx = { this };
282 return (org.omg.CORBA.Object)meth.invoke(delegate, argx);
283 }
284 catch( java.lang.reflect.InvocationTargetException exs ) {
285 Throwable t = exs.getTargetException();
286 if (t instanceof Error) {
287 throw (Error) t;
288 }
289 else if (t instanceof RuntimeException) {
290 throw (RuntimeException) t;
291 }
292 else {
293 throw new org.omg.CORBA.NO_IMPLEMENT();
294 }
295 } catch( RuntimeException rex ) {
296 throw rex;
297 } catch( Exception exr ) {
298 throw new org.omg.CORBA.NO_IMPLEMENT();
299 }
300 }
301 }
303 /**
304 * Returns a reference to the ORB associated with this object and
305 * its delegate. This is the <code>ORB</code> object that created
306 * the delegate.
307 *
308 * @return the <code>ORB</code> instance that created the
309 * <code>Delegate</code> object contained in this
310 * <code>ObjectImpl</code> object
311 */
312 public org.omg.CORBA.ORB _orb() {
313 return _get_delegate().orb(this);
314 }
317 /**
318 * Retrieves the <code>Policy</code> object for this
319 * <code>ObjectImpl</code> object that has the given
320 * policy type.
321 *
322 * @param policy_type an int indicating the policy type
323 * @return the <code>Policy</code> object that is the specified policy type
324 * and that applies to this <code>ObjectImpl</code> object
325 * @see org.omg.CORBA.PolicyOperations#policy_type
326 */
327 public org.omg.CORBA.Policy _get_policy(int policy_type) {
328 return _get_delegate().get_policy(this, policy_type);
329 }
331 /**
332 * Retrieves a list of the domain managers for this
333 * <code>ObjectImpl</code> object.
334 *
335 * @return an array containing the <code>DomainManager</code>
336 * objects for this instance of <code>ObjectImpl</code>
337 */
338 public org.omg.CORBA.DomainManager[] _get_domain_managers() {
339 return _get_delegate().get_domain_managers(this);
340 }
342 /**
343 * Sets this <code>ObjectImpl</code> object's override type for
344 * the given policies to the given instance of
345 * <code>SetOverrideType</code>.
346 *
347 * @param policies an array of <code>Policy</code> objects with the
348 * policies that will replace the current policies or be
349 * added to the current policies
350 * @param set_add either <code>SetOverrideType.SET_OVERRIDE</code>,
351 * indicating that the given policies will replace any existing
352 * ones, or <code>SetOverrideType.ADD_OVERRIDE</code>, indicating
353 * that the given policies should be added to any existing ones
354 * @return an <code>Object</code> with the given policies replacing or
355 * added to its previous policies
356 */
357 public org.omg.CORBA.Object
358 _set_policy_override(org.omg.CORBA.Policy[] policies,
359 org.omg.CORBA.SetOverrideType set_add) {
360 return _get_delegate().set_policy_override(this, policies,
361 set_add);
362 }
364 /**
365 * Checks whether this <code>ObjectImpl</code> object is implemented
366 * by a local servant. If so, local invocation API's may be used.
367 *
368 * @return <code>true</code> if this object is implemented by a local
369 * servant; <code>false</code> otherwise
370 */
371 public boolean _is_local() {
372 return _get_delegate().is_local(this);
373 }
375 /**
376 * Returns a Java reference to the local servant that should be used for sending
377 * a request for the method specified. If this <code>ObjectImpl</code>
378 * object is a local stub, it will invoke the <code>_servant_preinvoke</code>
379 * method before sending a request in order to obtain the
380 * <code>ServantObject</code> instance to use.
381 * <P>
382 * If a <code>ServantObject</code> object is returned, its <code>servant</code>
383 * field has been set to an object of the expected type (Note: the object may
384 * or may not be the actual servant instance). The local stub may cast
385 * the servant field to the expected type, and then invoke the operation
386 * directly. The <code>ServantRequest</code> object is valid for only one
387 * invocation and cannot be used for more than one invocation.
388 *
389 * @param operation a <code>String</code> containing the name of the method
390 * to be invoked. This name should correspond to the method name as
391 * it would be encoded in a GIOP request.
392 *
393 * @param expectedType a <code>Class</code> object representing the
394 * expected type of the servant that is returned. This expected
395 * type is the <code>Class</code> object associated with the
396 * operations class for the stub's interface. For example, a
397 * stub for an interface <code>Foo</code> would pass the
398 * <code>Class</code> object for the <code>FooOperations</code>
399 * interface.
400 *
401 * @return (1) a <code>ServantObject</code> object, which may or may
402 * not be the actual servant instance, or (2) <code>null</code> if
403 * (a) the servant is not local or (b) the servant has ceased to
404 * be local due to a ForwardRequest from a POA ServantManager
405 * @throws org.omg.CORBA.BAD_PARAM if the servant is not the expected type
406 */
407 public ServantObject _servant_preinvoke(String operation,
408 Class expectedType) {
409 return _get_delegate().servant_preinvoke(this, operation,
410 expectedType);
411 }
413 /**
414 * Is called by the local stub after it has invoked an operation
415 * on the local servant that was previously retrieved from a
416 * call to the method <code>_servant_preinvoke</code>.
417 * The <code>_servant_postinvoke</code> method must be called
418 * if the <code>_servant_preinvoke</code>
419 * method returned a non-null value, even if an exception was thrown
420 * by the method invoked by the servant. For this reason, the call
421 * to the method <code>_servant_postinvoke</code> should be placed
422 * in a Java <code>finally</code> clause.
423 *
424 * @param servant the instance of the <code>ServantObject</code>
425 * returned by the <code>_servant_preinvoke</code> method
426 */
427 public void _servant_postinvoke(ServantObject servant) {
428 _get_delegate().servant_postinvoke(this, servant);
429 }
431 /*
432 * The following methods were added by orbos/98-04-03: Java to IDL
433 * Mapping. These are used by RMI over IIOP.
434 */
436 /**
437 * Returns an <code>OutputStream</code> object to use for marshalling
438 * the arguments of the given method. This method is called by a stub,
439 * which must indicate if a response is expected, that is, whether or not
440 * the call is oneway.
441 *
442 * @param operation a String giving the name of the method.
443 * @param responseExpected a boolean -- <code>true</code> if the
444 * request is not one way, that is, a response is expected
445 * @return an <code>OutputStream</code> object for dispatching the request
446 */
447 public OutputStream _request(String operation,
448 boolean responseExpected) {
449 return _get_delegate().request(this, operation, responseExpected);
450 }
452 /**
453 * Invokes an operation and returns an <code>InputStream</code>
454 * object for reading the response. The stub provides the
455 * <code>OutputStream</code> object that was previously returned by a
456 * call to the <code>_request</code> method. The method specified
457 * as an argument to <code>_request</code> when it was
458 * called previously is the method that this method invokes.
459 * <P>
460 * If an exception occurs, the <code>_invoke</code> method may throw an
461 * <code>ApplicationException</code> object that contains an InputStream from
462 * which the user exception state may be unmarshalled.
463 *
464 * @param output an OutputStream object for dispatching the request
465 * @return an <code>InputStream</code> object containing the marshalled
466 * response to the method invoked
467 * @throws ApplicationException if the invocation
468 * meets application-defined exception
469 * @throws RemarshalException if the invocation leads
470 * to a remarshalling error
471 * @see #_request
472 */
473 public InputStream _invoke(OutputStream output)
474 throws ApplicationException, RemarshalException {
475 return _get_delegate().invoke(this, output);
476 }
478 /**
479 * Releases the given
480 * reply stream back to the ORB when unmarshalling has
481 * completed after a call to the method <code>_invoke</code>.
482 * Calling this method is optional for the stub.
483 *
484 * @param input the <code>InputStream</code> object that was returned
485 * by the <code>_invoke</code> method or the
486 * <code>ApplicationException.getInputStream</code> method;
487 * may be <code>null</code>, in which case this method does
488 * nothing
489 * @see #_invoke
490 */
491 public void _releaseReply(InputStream input) {
492 _get_delegate().releaseReply(this, input);
493 }
495 /**
496 * Returns a <code>String</code> object that represents this
497 * <code>ObjectImpl</code> object.
498 *
499 * @return the <code>String</code> representation of this object
500 */
501 public String toString() {
502 if ( __delegate != null )
503 return __delegate.toString(this);
504 else
505 return getClass().getName() + ": no delegate set";
506 }
508 /**
509 * Returns the hash code for this <code>ObjectImpl</code> object.
510 *
511 * @return the hash code for this object
512 */
513 public int hashCode() {
514 if ( __delegate != null )
515 return __delegate.hashCode(this);
516 else
517 return super.hashCode();
518 }
520 /**
521 * Compares this <code>ObjectImpl</code> object with the given one
522 * for equality.
523 *
524 *@param obj the object with which to compare this object
525 *@return <code>true</code> if the two objects are equal;
526 * <code>false</code> otherwise
527 */
528 public boolean equals(java.lang.Object obj) {
529 if ( __delegate != null )
530 return __delegate.equals(this, obj);
531 else
532 return (this==obj);
533 }
534 }