package org.jgroups.protocols.relay;
import org.jgroups.Address;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.logging.Log;
import org.jgroups.util.Util;
/**
* Class which maintains the destination address for sending messages to a given site, and the bridge channel to do so.
* @author Bela Ban
* @since 3.x
*/
public class Route implements Comparable<Route> {
/** SiteUUID: address of the site master */
protected final Address site_master;
protected final JChannel bridge;
protected final RELAY2 relay;
protected final Log log;
protected boolean stats=true;
public Route(Address site_master, JChannel bridge, RELAY2 relay, Log log) {
this.site_master=site_master;
this.bridge=bridge;
this.relay=relay;
this.log=log;
}
public JChannel bridge() {return bridge;}
public Address siteMaster() {return site_master;}
public boolean stats() {return stats;}
public Route stats(boolean f) {stats=f; return this;}
public void send(Address final_destination, Address original_sender, final Message msg) {
if(log.isTraceEnabled())
log.trace("routing message to " + final_destination + " via " + site_master);
long start=stats? System.nanoTime() : 0;
try {
Message copy=createMessage(site_master, final_destination, original_sender, msg);
bridge.send(copy);
if(stats) {
relay.addToRelayedTime(System.nanoTime() - start);
relay.incrementRelayed();
}
}
catch(Exception e) {
log.error(Util.getMessage("FailureRelayingMessage"), e);
}
}
public int compareTo(Route o) {
return site_master.compareTo(o.siteMaster());
}
public boolean equals(Object obj) {
return compareTo((Route)obj) == 0;
}
public int hashCode() {
return site_master.hashCode();
}
public String toString() {
return (site_master != null? site_master.toString() : "");
}
protected Message createMessage(Address target, Address final_destination, Address original_sender, final Message msg) {
Message copy=relay.copy(msg).dest(target).src(null);
RELAY2.Relay2Header hdr=new RELAY2.Relay2Header(RELAY2.Relay2Header.DATA, final_destination, original_sender);
copy.putHeader(relay.getId(), hdr);
return copy;
}
}