home *** CD-ROM | disk | FTP | other *** search
Java Source | 1998-03-20 | 6.8 KB | 223 lines |
- /*
- * @(#)UnicastRemoteObject.java 1.17 98/03/18
- *
- * Copyright 1996-1998 by Sun Microsystems, Inc.,
- * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
- * All rights reserved.
- *
- * This software is the confidential and proprietary information
- * of Sun Microsystems, Inc. ("Confidential Information"). You
- * shall not disclose such Confidential Information and shall use
- * it only in accordance with the terms of the license agreement
- * you entered into with Sun.
- */
- package java.rmi.server;
-
- import java.rmi.*;
-
- /**
- * The UnicastRemoteObject class defines a non-replicated remote
- * object whose references are valid only while the server process is
- * alive. The UnicastRemoteObject class provides support for
- * point-to-point active object references (invocations, parameters,
- * and results) using TCP streams. <p>
- *
- * Objects that require remote behavior should extend RemoteObject,
- * typically via UnicastRemoteObject. If UnicastRemoteObject is not
- * extended, the implementation class must then assume the
- * responsibility for the correct semantics of the hashCode, equals,
- * and toString methods inherited from the Object class, so that they
- * behave appropriately for remote objects.
- */
- public class UnicastRemoteObject extends RemoteServer {
-
- /* port number on which to export object */
- private int port = 0;
-
- /* socket type to use when exporting object, if any */
- private SocketType socketType = null;
-
- /* indicate compatibility with JDK 1.1.x version of class */
- private static final long serialVersionUID = 4974527148936298033L;
-
- /**
- * Create and export a new UnicastRemoteObject object using an
- * anonymous port.
- */
- protected UnicastRemoteObject() throws RemoteException
- {
- this(0);
- }
-
- /**
- * Create and export a new UnicastRemoteObject object using the
- * particular supplied port.
- * @param port the port to export the object on
- */
- protected UnicastRemoteObject(int port) throws RemoteException
- {
- this.port = port;
- exportObject((Remote)this, port);
- }
-
- /**
- * Create and export a new UnicastRemoteObject object using the
- * particular supplied port and socket type.
- */
- protected UnicastRemoteObject(int port, SocketType socketType)
- throws RemoteException
- {
- this.port = port;
- this.socketType = socketType;
- exportObject((Remote)this, port, socketType);
- }
-
- /**
- * Re-export the remote object when it is deserialized.
- */
- private void readObject(java.io.ObjectInputStream in)
- throws java.io.IOException, java.lang.ClassNotFoundException
- {
- in.defaultReadObject();
- reexport();
- }
-
- /**
- * Returns a clone of the remote object that is distinct from
- * the original.
- *
- * @exception CloneNotSupportedException if clone failed due to
- * a RemoteException.
- * @return the new remote object
- */
- public Object clone() throws CloneNotSupportedException
- {
- try {
- UnicastRemoteObject cloned = (UnicastRemoteObject)super.clone();
- cloned.reexport();
- return cloned;
- } catch (RemoteException e) {
- throw new ServerCloneException("Clone failed", e);
- }
- }
-
- /*
- * Export this UnicastRemoteObject using its initialized fields because
- * its creation bypassed running its constructors (via deserialization
- * or cloning, for example).
- */
- private void reexport() throws RemoteException
- {
- if (socketType == null)
- exportObject((Remote)this, port);
- else
- exportObject((Remote)this, port, socketType);
- }
-
- /**
- * Export the remote object to make it available to receive incoming calls,
- * using an anonymous port.
- * @param obj the remote object to be exported
- * @exception RemoteException if export fails
- */
- public static RemoteStub exportObject(Remote obj)
- throws RemoteException
- {
- return (RemoteStub)exportObject(obj, 0);
- }
-
- /* parameter types for server ref constructor invocation used below */
- private static Class[] portClass = {
- int.class
- };
-
- /**
- * Export the remote object to make it available to receive incoming calls,
- * using the particular supplied port.
- * @param obj the remote object to be exported
- * @param port the port to export the object on
- * @exception RemoteException if export fails
- * @since JDK1.2
- */
- public static Remote exportObject(Remote obj, int port)
- throws RemoteException
- {
- // prepare arguments for server ref constructor
- Object[] args = new Object[1];
- args[0] = new Integer(port);
-
- return exportObject(obj, "UnicastServerRef", portClass, args);
- }
-
- /* parameter types for server ref constructor invocation used below */
- private static Class[] portTypeClass = {
- int.class, SocketType.class
- };
-
- /**
- * Export the remote object to make it available to receive incoming calls,
- * using a transport specified by the given socket type.
- * @param obj the remote object to be exported
- * @param port the port to export the object on
- * @param socketType the socket type to export object with
- * @exception RemoteException if export fails
- * @since JDK1.2
- */
- public static Remote exportObject(Remote obj, int port,
- SocketType socketType)
- throws RemoteException
- {
- // prepare arguments for server ref constructor
- Object[] args = new Object[2];
- args[0] = new Integer(port);
- args[1] = socketType;
-
- return exportObject(obj, "UnicastServerRef2", portTypeClass, args);
- }
-
- /*
- * Create instnace of given server ref type with constructor chosen
- * by indicated paramters and supplied with given arguements, and
- * export remote object with it.
- */
- private static Remote exportObject(Remote obj, String refType,
- Class[] params, Object[] args)
- throws RemoteException
- {
- // compose name of server ref class and find it
- String refClassName = RemoteRef.packagePrefix + "." + refType;
- Class refClass;
- try {
- refClass = Class.forName(refClassName);
- } catch (ClassNotFoundException e) {
- throw new ExportException(
- "No class found for server ref type: " + refType);
- }
-
- if (!ServerRef.class.isAssignableFrom(refClass)) {
- throw new ExportException(
- "Server ref class not instance of " +
- ServerRef.class.getName() + ": " + refClass.getName());
- }
-
- // create server ref instance using given constructor and arguments
- ServerRef serverRef;
- try {
- java.lang.reflect.Constructor cons =
- refClass.getConstructor(params);
- serverRef = (ServerRef) cons.newInstance(args);
- // if impl does extends UnicastRemoteObject, set its ref
- if (obj instanceof UnicastRemoteObject)
- ((UnicastRemoteObject)obj).ref = serverRef;
-
- } catch (Exception e) {
- throw new ExportException(
- "Exception creating instance of server ref class: " +
- refClass.getName(), e);
- }
-
- return serverRef.exportObject(obj, null);
- }
- }
-
-