package java.rmi.server;
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.NoSuchObjectException;
import java.rmi.UnmarshalException;
import java.rmi.server.RemoteRef;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.lang.ClassNotFoundException;
import java.lang.InstantiationException;
import java.lang.IllegalAccessException;
import java.lang.reflect.Constructor;
public abstract class RemoteObject
implements Remote, Serializable {
public static final long serialVersionUID = -3215090123894869218l;
protected transient RemoteRef ref;
protected RemoteObject() {
this(null);
}
protected RemoteObject(RemoteRef newref) {
ref = newref;
}
public RemoteRef getRef() {
return (ref);
}
public static Remote toStub(Remote obj) throws NoSuchObjectException
{
Class cls = obj.getClass();
String classname = cls.getName();
ClassLoader cl = cls.getClassLoader();
try
{
Class scls = cl.loadClass(classname + "_Stub");
Class[] stubprototype = new Class[] { RemoteRef.class };
Constructor con = scls.getConstructor(stubprototype);
return (Remote)(con.newInstance(new Object[]{obj}));
}
catch (Exception e) {}
throw new NoSuchObjectException(obj.getClass().getName());
}
public int hashCode() {
if (ref == null) {
return (0);
}
else {
return (ref.hashCode());
}
}
public boolean equals(Object obj) {
return (this == obj);
}
public String toString()
{
if (ref == null)
return getClass ().toString ();
return (ref.toString ());
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
String cname = in.readUTF();
if (!cname.equals(""))
{
if (cname.equals ("UnicastRef2"))
{
cname = "UnicastRef";
in.read (); }
cname = RemoteRef.packagePrefix + '.' + cname;
try
{
Class cls = Class.forName(cname);
ref = (RemoteRef)cls.newInstance();
}
catch (InstantiationException e1)
{
throw new UnmarshalException("failed to create ref", e1);
}
catch (IllegalAccessException e2)
{
throw new UnmarshalException("failed to create ref", e2);
}
ref.readExternal(in);
}
else
{
ref = (RemoteRef)in.readObject();
}
}
private void writeObject(ObjectOutputStream out) throws IOException, ClassNotFoundException {
if (ref == null) {
throw new UnmarshalException("no ref to serialize");
}
String cname = ref.getRefClass(out);
if (cname != null && cname.length() > 0) {
out.writeUTF(cname);
ref.writeExternal(out);
}
else {
out.writeUTF("");
out.writeObject(ref);
}
}
}