package Framework;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Hashtable;
import Framework.anchored.AnchoredProxy;
import Framework.anchored.MethodMapper;
import Framework.anchored.ServiceInvoker;
import Framework.anchored.ServiceProxy;
public class RemoteEventImpl extends RemoteEvent implements AnchoredProxy, RemoteProxy {
private transient ServiceProxy proxy = null;
private String objectName;
private String hostName;
private int port;
/**
* This constructor can store no reference to the original object,
* but must instead copy over it's necessary attributes.
*/
public RemoteEventImpl(RemoteEvent baseClass) {
super(new ServiceObjectContext());
ServiceInvoker serviceInvoker = getInvoker(baseClass);
if (serviceInvoker == null) {
throw new UsageException("Cannot create a proxy for an object that has not yet been exported.");
}
serviceInvoker.prepareForRemoteCall();
this.objectName = serviceInvoker.getObjectName();
// The proxy is being created on the same host as the real object
//this.hostName = System.getProperty("RMIregistry.host");
try {
this.hostName = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
throw new UsageException("Cannot BIND to RMI object ", e);
}
this.port = serviceInvoker.getPort();
}
private ServiceProxy getServiceProxy() {
if (proxy == null) {
proxy = new ServiceProxy(objectName, hostName, port, this.getClass().getSuperclass());
}
return proxy;
}
@Override
public void postEvent(String pObjectMoniker, String pEventName, Hashtable<String, Object> pParams) {
String qq_name = MethodMapper.computeName("postEvent", String.class, String.class, Hashtable.class);
getServiceProxy().intercept(qq_name, pObjectMoniker, pEventName, pParams);
}
/**
* Override the equals method so that we are equal to any other RemoteEventImpl which comes from the
* same host on the same port and the same object name
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof RemoteEventImpl) {
RemoteEventImpl rei = (RemoteEventImpl)obj;
return StringUtils.equals(hostName, rei.hostName) && StringUtils.equals(objectName, rei.objectName) && port == rei.port;
}
return false;
}
@Override
public int hashCode() {
return this.toString().hashCode();
}
@Override
public String toString() {
return "" + hostName + "\\" + port + "\\" + objectName;
}
}