Source for org.omg.CORBA.portable.Delegate

   1: /* Delegate.java --
   2: Copyright (C) 2005, 2006 Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: 
  39: package org.omg.CORBA.portable;
  40: 
  41: import gnu.java.lang.CPStringBuilder;
  42: 
  43: import org.omg.CORBA.BAD_PARAM;
  44: import org.omg.CORBA.Context;
  45: import org.omg.CORBA.ContextList;
  46: import org.omg.CORBA.DomainManager;
  47: import org.omg.CORBA.ExceptionList;
  48: import org.omg.CORBA.NO_IMPLEMENT;
  49: import org.omg.CORBA.NVList;
  50: import org.omg.CORBA.NamedValue;
  51: import org.omg.CORBA.ORB;
  52: import org.omg.CORBA.Policy;
  53: import org.omg.CORBA.Request;
  54: import org.omg.CORBA.SetOverrideType;
  55: 
  56: /**
  57:  * Specifies a vendor specific implementation of the
  58:  * {@link org.omg.CORBA.Object} methods. The calls to these
  59:  * methods are forwarded to the object delegate that can be
  60:  * replaced, if needed. The first parameter is the actual
  61:  * CORBA object to that the operation must be applied.
  62:  *
  63:  * Some methods in this class are not abstract, but no implemented,
  64:  * thowing the {@link NO_IMPLEMENT}. This, however, does not mean that
  65:  * they are not implemented in the derived classes as well.
  66:  *
  67:  * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
  68:  */
  69: public abstract class Delegate
  70: {
  71:   /**
  72:    * Explains the reason of throwing the NO_IMPLEMENT.
  73:    */
  74:   private static final String WHY =
  75:     "Following 1.4 API, this Delegate method must not be implemented. Override.";
  76: 
  77:   /**
  78:    * Create a request to invoke the method of this object.
  79:    *
  80:    * @param target the CORBA object, to that this operation must be applied.
  81:    * @param context a list of additional properties.
  82:    * @param operation the name of method to be invoked.
  83:    * @param parameters the method parameters.
  84:    * @param returns the container for tge method returned value.
  85:    *
  86:    * @return the created reaquest.
  87:    */
  88:   public abstract Request create_request(org.omg.CORBA.Object target,
  89:                                          Context context, String operation,
  90:                                          NVList parameters, NamedValue returns
  91:                                         );
  92: 
  93:   /**
  94:    * Create a request to invoke the method of this object, specifying
  95:    * context list and the list of the expected exception.
  96:    *
  97:    * @param target the CORBA object, to that this operation must be applied.
  98:    * @param context a list of additional properties.
  99:    * @param operation the name of method to be invoked.
 100:    * @param parameters the method parameters.
 101:    * @param returns the container for tge method returned value.
 102:    * @param exceptions the list of the possible exceptions that the method
 103:    * can throw.
 104:    * @param ctx_list the list of the context strings that need to be
 105:    * resolved and send as a context instance.
 106:    *
 107:    * @return the created reaquest.
 108:    */
 109:   public abstract Request create_request(org.omg.CORBA.Object target,
 110:                                          Context context, String operation,
 111:                                          NVList parameters, NamedValue returns,
 112:                                          ExceptionList exceptions,
 113:                                          ContextList ctx_list
 114:                                         );
 115: 
 116:   /**
 117:    * Duplicate the object reference. This does not make much sense for
 118:    * java platform and is just included for the sake of compliance with
 119:    * CORBA APIs.
 120:    *
 121:    * @param target the CORBA object, to that this operation must be applied.
 122:    *
 123:    * The method may return the object reference itself.
 124:    *
 125:    * @return as a rule, <code>this</code>.
 126:    */
 127:   public abstract org.omg.CORBA.Object duplicate(org.omg.CORBA.Object target);
 128: 
 129:   /**
 130:    * Retrieve the domain managers for this object.
 131:    *
 132:    * @param target the CORBA object, to that this operation must be applied.
 133:    *
 134:    * @return the domain managers.
 135:    *
 136:    * @throws NO_IMPLEMENT, always (following the 1.4 specification).
 137:    */
 138:   public DomainManager[] get_domain_managers(org.omg.CORBA.Object target)
 139:   {
 140:     throw new NO_IMPLEMENT(WHY);
 141:   }
 142: 
 143:   /**
 144:    *
 145:    * @param target the CORBA object, to that this operation must be applied.
 146:    *
 147:    * Get the <code>InterfaceDef</code> for this Object.
 148:    */
 149:   public abstract org.omg.CORBA.Object get_interface_def(org.omg.CORBA.Object target);
 150: 
 151:   /**
 152:    * Returns the {@link Policy}, applying to this object.
 153:    *
 154:    * @param target the CORBA object, to that this operation must be applied.
 155:    * @param a_policy_type a type of policy to be obtained.
 156:    * @return a corresponding Policy object.
 157:    *
 158:    * @throws NO_IMPLEMENT, always (following the 1.4 specification).
 159:    */
 160:   public Policy get_policy(org.omg.CORBA.Object target, int a_policy_type)
 161:                     throws BAD_PARAM
 162:   {
 163:     throw new NO_IMPLEMENT(WHY);
 164:   }
 165: 
 166:   /**
 167:    * Get the hashcode this object reference. The same hashcode still
 168:    * does not means that the references are the same. From the other
 169:    * side, two different references may still refer to the same CORBA
 170:    * object. The returned value must not change during the object
 171:    * lifetime.
 172:    *
 173:    * @param target the CORBA object, to that this operation must be applied.
 174:    * @param maximum the maximal value to return.
 175:    *
 176:    * @return the hashcode.
 177:    */
 178:   public abstract int hash(org.omg.CORBA.Object target, int maximum);
 179: 
 180:   /**
 181:    * Check if this object can be referenced by the given repository id.
 182:    *
 183:    * @param target the CORBA object, to that this operation must be applied.
 184:    * @param repositoryIdentifer the repository id.
 185:    *
 186:    * @return true if the passed parameter is a repository id of this
 187:    * CORBA object.
 188:    */
 189:   public abstract boolean is_a(org.omg.CORBA.Object target,
 190:                                String repositoryIdentifer
 191:                               );
 192: 
 193:   /**
 194:    * Return true if the other object references are equivalent, so far as
 195:    * it is possible to determine this easily.
 196:    *
 197:    * @param target the CORBA object, to that this operation must be applied.
 198:    * @param other the other object reference.
 199:    *
 200:    * @return true if both references refer the same object, false
 201:    * if they probably can refer different objects.
 202:    *
 203:    */
 204:   public abstract boolean is_equivalent(org.omg.CORBA.Object target,
 205:                                         org.omg.CORBA.Object other
 206:                                        );
 207: 
 208:   /**
 209:    * Returns true if the object is local.
 210:    *
 211:    * @param self the object to check.
 212:    *
 213:    * @return false, always (following 1.4 specs). Override to get
 214:    * functionality.
 215:    */
 216:   public boolean is_local(org.omg.CORBA.Object self)
 217:   {
 218:     return false;
 219:   }
 220: 
 221:   /**
 222:    * Determines if the server object for this reference has already
 223:    * been destroyed.
 224:    *
 225:    * @param target the CORBA object, to that this operation must be applied.
 226:    *
 227:    * @return true if the object has been destroyed, false otherwise.
 228:    */
 229:   public abstract boolean non_existent(org.omg.CORBA.Object target);
 230: 
 231:   /**
 232:    * Compares two objects for equality. The default implementations
 233:    * delegated call to {@link java.lang.Object#equals(java.lang.Object)}.
 234:    *
 235:    * @param self this CORBA object.
 236:    * @param other the other CORBA object.
 237:    *
 238:    * @return true if the objects are equal.
 239:    */
 240:   public boolean equals(org.omg.CORBA.Object self, java.lang.Object other)
 241:   {
 242:     return self==other;
 243:   }
 244: 
 245:   /**
 246:    * Return the hashcode for this CORBA object. The default implementation
 247:    * delegates call to {@link #hash(org.omg.CORBA.Object, int)}, passing Integer.MAX_VALUE as an
 248:    * argument.
 249:    *
 250:    * @param target the object, for that the hash code must be computed.
 251:    *
 252:    * @return the hashcode.
 253:    */
 254:   public int hashCode(org.omg.CORBA.Object target)
 255:   {
 256:     return hash(target, Integer.MAX_VALUE);
 257:   }
 258: 
 259:   /**
 260:    * Invoke the operation.
 261:    *
 262:    * @param target the invocation target.
 263:    * @param output the stream, containing the written arguments.
 264:    *
 265:    * @return the stream, from where the input parameters could be read.
 266:    *
 267:    * @throws ApplicationException if the application throws an exception,
 268:    * defined as a part of its remote method definition.
 269:    *
 270:    * @throws RemarshalException if reading(remarshalling) fails.
 271:    *
 272:    * @throws NO_IMPLEMENT, always (following the 1.4 specification).
 273:    */
 274:   public InputStream invoke(org.omg.CORBA.Object target,
 275:                             org.omg.CORBA.portable.OutputStream output
 276:                            )
 277:                      throws ApplicationException, RemarshalException
 278:   {
 279:     throw new NO_IMPLEMENT(WHY);
 280:   }
 281: 
 282:   /**
 283:    * Provides the reference to ORB.
 284:    *
 285:    * @param target the object reference.
 286:    *
 287:    * @return the associated ORB.
 288:    *
 289:    * @throws NO_IMPLEMENT, always (following the 1.4 specification).
 290:    */
 291:   public ORB orb(org.omg.CORBA.Object target)
 292:   {
 293:     throw new NO_IMPLEMENT(WHY);
 294:   }
 295: 
 296:   /**
 297:    * Free resoureces, occupied by this reference. The object implementation
 298:    * is not notified, and the other references to the same object are not
 299:    * affected.
 300:    *
 301:    * @param target the CORBA object, to that this operation must be applied.
 302:    */
 303:   public abstract void release(org.omg.CORBA.Object target);
 304: 
 305:   /**
 306:    * Release the reply stream back to ORB after finishing reading the data
 307:    * from it.
 308:    *
 309:    * @param target the CORBA object, to that this operation must be applied.
 310:    * @param input the stream, normally returned by {@link #invoke} or
 311:    * {@link ApplicationException#getInputStream()}, can be null.
 312:    *
 313:    * The default method returns without action.
 314:    */
 315:   public void releaseReply(org.omg.CORBA.Object target,
 316:                            org.omg.CORBA.portable.InputStream input
 317:                           )
 318:   {
 319:   }
 320: 
 321:   /**
 322:    * Create a request to invoke the method of this CORBA object.
 323:    *
 324:    * @param target the CORBA object, to that this operation must be applied.
 325:    * @param operation the name of the method to invoke.
 326:    *
 327:    * @return the request.
 328:    */
 329:   public abstract Request request(org.omg.CORBA.Object target, String operation);
 330: 
 331:   /**
 332:    * Create a request to invoke the method of this CORBA object.
 333:    *
 334:    * @param target the CORBA object, to that this operation must be applied.
 335:    * @param operation the name of the method to invoke.
 336:    * @param response_expected specifies if this is one way message or the
 337:    * response to the message is expected.
 338:    *
 339:    * @return the stream where the method arguments should be written.
 340:    */
 341:   public org.omg.CORBA.portable.OutputStream request(org.omg.CORBA.Object target,
 342:                                                      String operation,
 343:                                                      boolean response_expected
 344:                                                     )
 345:   {
 346:     throw new NO_IMPLEMENT(WHY);
 347:   }
 348: 
 349:   /**
 350:    * This method is always called after invoking the operation on the
 351:    * local servant.
 352:    *
 353:    * The default method returns without action.
 354:    *
 355:    * @param self the object.
 356:    * @param servant the servant.
 357:    */
 358:   public void servant_postinvoke(org.omg.CORBA.Object self,
 359:                                  ServantObject servant
 360:                                 )
 361:   {
 362:   }
 363: 
 364:   /**
 365:    * Returns a servant that should be used for this request.
 366:    * The servant can also be casted to the expected type, calling the
 367:    * required method directly.
 368:    *
 369:    * @param self the object
 370:    * @param operation the operation
 371:    * @param expectedType the expected type of the servant.
 372:    *
 373:    * This implementation always returns null; override for different
 374:    * behavior.
 375:    *
 376:    * @return the servant or null if the servant is not an expected type
 377:    * of the method is not supported, for example, due security reasons.
 378:    */
 379:   @SuppressWarnings("rawtypes") // Needed for API compatibility
 380:   public ServantObject servant_preinvoke(org.omg.CORBA.Object self,
 381:                                          String operation, Class expectedType
 382:                                         )
 383:   {
 384:     return null;
 385:   }
 386: 
 387:   /**
 388:    * Returns a new object with the new policies either replacing or
 389:    * extending the current policies, depending on the second parameter.
 390:    *
 391:    * @param target the CORBA object, to that this operation must be applied.
 392:    * @param policies the policy additions or replacements.
 393:    * @param how either {@link SetOverrideType#SET_OVERRIDE} to override the
 394:    * current policies of {@link SetOverrideType#ADD_OVERRIDE} to replace
 395:    * them.
 396:    *
 397:    * @throws NO_IMPLEMENT, always (following the 1.4 specification).
 398:    *
 399:    * @return the new reference with the changed policies.
 400:    */
 401:   public org.omg.CORBA.Object set_policy_override(org.omg.CORBA.Object target,
 402:                                                   Policy[] policies,
 403:                                                   SetOverrideType how
 404:                                                  )
 405:   {
 406:     throw new NO_IMPLEMENT(WHY);
 407:   }
 408: 
 409:   /**
 410:    * Return a string representation of the passed object.
 411:    *
 412:    * @param self the CORBA object, to that the string representation must be
 413:    * returned. By default, the call is delegated to
 414:    * {@link java.lang.Object#toString()}.
 415:    *
 416:    * @return the string representation.
 417:    */
 418:   public String toString(org.omg.CORBA.Object self)
 419:   {
 420:     if (self instanceof ObjectImpl)
 421:       {
 422:         ObjectImpl x = (ObjectImpl) self;
 423:         CPStringBuilder b = new CPStringBuilder(x.getClass().getName());
 424:         b.append(": [");
 425:         for (int i = 0; i < x._ids().length; i++)
 426:           {
 427:             b.append(x._ids() [ i ]);
 428:             b.append(" ");
 429:           }
 430:         b.append("]");
 431:         return b.toString();
 432:       }
 433:     else
 434:       return self.getClass().getName();
 435:   }
 436: }