PortableRemoteObject.java 8.71 KB
Newer Older
1 2
/* PortableRemoteObject.java --
   Copyright (C) 2004, 2004, 2005 Free Software Foundation, Inc.
Tom Tromey committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

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. */


package javax.rmi;

import gnu.javax.rmi.CORBA.DelegateFactory;
42 43 44 45 46 47

import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.ORB;
import org.omg.CORBA.portable.ObjectImpl;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.Servant;
Tom Tromey committed
48 49 50 51 52 53

import java.rmi.NoSuchObjectException;
import java.rmi.Remote;
import java.rmi.RemoteException;

import javax.rmi.CORBA.PortableRemoteObjectDelegate;
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
import javax.rmi.CORBA.Stub;
import javax.rmi.CORBA.Tie;
import javax.rmi.CORBA.Util;

/**
 * <p>
 * An utility class for RMI/IDL server side object implementations. Server side
 * implementation objects may inherit from this class, but this is not
 * mandatory, as the needed methds are static. Server side implementations may
 * choose to inherit from {@link ObjectImpl} or {@link Servant} instead.
 * </p>
 * <p>
 * The functionality of methods in this class is forwarded to the enclosed
 * PortableRemoteObjectDelegate. This delegate can be altered by setting the
 * system property "javax.rmi.CORBA.PortableRemoteObjectClass" to the name of
 * the alternative class that must implement
 * {@link PortableRemoteObjectDelegate}.
 * </p>
72
 *
73 74
 * @author Audrius Meskauskas (AudriusA@Bioinformatics.org)
 */
Tom Tromey committed
75 76
public class PortableRemoteObject
{
77 78 79 80 81 82 83
  /**
   * A delegate where the functionality is forwarded.
   */
  static PortableRemoteObjectDelegate delegate = (PortableRemoteObjectDelegate) DelegateFactory.getInstance(DelegateFactory.PORTABLE_REMOTE_OBJECT);

  /**
   * The protected constructor calls {@link exportObject} (this).
84
   *
85 86
   * @throws RemoteException if the exportObject(this) throws one.
   */
Tom Tromey committed
87 88 89
  protected PortableRemoteObject()
    throws RemoteException
  {
90
    exportObject((Remote) this);
Tom Tromey committed
91 92
  }

93 94 95 96 97 98
  /**
   * <p>
   * Makes the remote object <code>a_target</code> ready for remote
   * communication using the same communications runtime as for the passed
   * <code>a_source</code> parameter. The a_target is connected to the same
   * ORB (and, if applicable, to the same {@link POA}) as the a_source.
99
   *
100
   * @param target the target to connect to ORB, must be an instance of either
101
   * {@link ObjectImpl} (Stubs and old-style ties) or {@link Tie}.
102
   *
103
   * @param source the object, providing the connection information, must be
104 105
   * an instance of either {@link ObjectImpl} (Stubs and old-style ties) or
   * {@link Servant} (the next-generation Ties supporting {@link POA}).
106
   *
107 108
   * @throws RemoteException if the target is already connected to another ORB.
   */
Tom Tromey committed
109 110 111
  public static void connect(Remote target, Remote source)
    throws RemoteException
  {
112
    delegate.connect(target, source);
Tom Tromey committed
113
  }
114 115 116 117 118 119 120 121 122 123 124

  /**
   * <p>
   * Makes a server object ready for remote calls. The subclasses of
   * PortableRemoteObject do not need to call this method, as it is called by
   * the constructor.
   * </p>
   * <p>
   * This method only creates a tie object and caches it for future usage. The
   * created tie does not have a delegate or an ORB associated.
   * </p>
125
   *
126
   * @param object the object to export.
127
   *
128 129 130
   * @throws RemoteException if export fails due any reason.
   */
  public static void exportObject(Remote object)
Tom Tromey committed
131 132
    throws RemoteException
  {
133
    delegate.exportObject(object);
Tom Tromey committed
134 135
  }

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
  /**
   * Narrows the passed object to conform to the given interface or IDL type. In
   * RMI-IIOP, this method replaces the narrow(org.omg.CORBA.Object) method that
   * was present in the CORBA Helpers. This method frequently returns different
   * instance and cannot be replaced by the direct cast. The typical narrowing
   * cases (all supported by GNU Classpath) are:
   * <ul>
   * <li>A CORBA object (for instance, returned by the
   * {@link ORB#string_to_object} or from the naming service) can be narrowed
   * into interface, derived from Remote. The method will try to locate an
   * appropriate {@link Stub} by the name pattern (_*_Stub). If the object being
   * narrowed is connected to an ORB, the returned instance will inherit that
   * connection, representing the same remote (or local) object, but now with
   * the possibility to invoke remote methods. </li>
   * <li>A CORBA object may be directly narrowed into the appropriate
   * {@link Stub} class, if it is and passed as a second parameter. This allows
   * to use non-standard stubs without parameterless constructors.</li>
   * <li>Any two classes, derived from the {@link ObjectImpl} (may be Stub's)
   * can be narrowed one into another (a delegate is transferred). </li>
   * <li>An implementation of Remote can be narrowed into {@link Tie} that can
   * later connected to an ORB, making the methods accessible remotely. The
   * Remote being narrowed normally provides a local implementation, but you can
   * also narrow remote Stub, creating "forwarding Tie".</li>
   * <li>null is narrowed into null regardless of the second parameter.</li>
   * <li>A {@link Tie} can be narrowed into Remote, representing the
   * implementation for this Tie (if one is set).</li>
   * </ul>
163
   *
164 165
   * @param object the object like CORBA Object, Stub or Remote that must be
   * narrowed to the given interface.
166
   *
167 168
   * @param narrowToInstaceOf the class of the interface to that the object must
   * be narrowed.
169
   *
170 171
   * @return On success, an object of type narrowTo or null, if narrowFrom =
   * null.
172
   *
173 174 175
   * @throws ClassCastException if no narrowing is possible.
   */
  public static Object narrow(Object object, Class narrowToInstaceOf)
Tom Tromey committed
176 177
    throws ClassCastException
  {
178
    return delegate.narrow(object, narrowToInstaceOf);
Tom Tromey committed
179 180
  }

181 182 183 184 185
  /**
   * <p>
   * Takes a server implementation object (name pattern *imp) and returns a stub
   * object that can be used to access that server object (target), name
   * (pattern _*_Stub).
186
   *
187 188 189 190 191 192 193
   * The returned stub is not connected to any ORB and must be explicitly
   * connected using {@link #connect}.
   * </p>
   * <p>
   * The method signature prevents it from returning stubs that does not
   * implement Remote (ClassCastException will be thrown).
   * </p>
194
   *
195 196
   * @param target a server side object implementation.
   * @return a stub object that can be used to access that server object.
197
   *
198 199
   * @throws NoSuchObjectException if a stub class cannot be located by supposed
   * name pattern, or an instance of stub fails to be instantiated.
200
   *
201 202
   * @throws ClassCastException if the stub class can be located, but it does
   * not inherit from Remote.
203
   *
204 205 206 207
   * @throws BAD_PARAM if the name of the passed class does not match the
   * implementation name pattern (does not end by 'Impl').
   */
  public static Remote toStub(Remote targetImpl)
Tom Tromey committed
208 209
    throws NoSuchObjectException
  {
210
    return delegate.toStub(targetImpl);
Tom Tromey committed
211 212
  }

213 214 215 216
  /**
   * Deregister a currently exported server object from the ORB runtimes. The
   * object to becomes available for garbage collection. This is usually
   * impemented via {@link Util#unexportObject}
217
   *
218
   * @param object the object to unexport.
219
   *
220 221 222 223
   * @throws NoSuchObjectException if the passed object is not currently
   * exported.
   */
  public static void unexportObject(Remote object)
Tom Tromey committed
224 225
    throws NoSuchObjectException
  {
226
    delegate.unexportObject(object);
Tom Tromey committed
227
  }
228
}