package org.jgroups.protocols;
import org.jgroups.*;
import org.jgroups.util.Streamable;
import org.jgroups.util.Util;
import java.io.DataInput;
import java.io.DataOutput;
import java.util.ArrayList;
import java.util.Collection;
/**
* Encapsulates information about a cluster node, e.g. local address, coordinator's address, logical name and
* physical address(es)
* @author Bela Ban
*/
public class PingData implements Streamable {
protected Address sender=null; // the sender of this PingData
protected View view=null; // only sent with merge-triggered discovery response (if ViewIds differ)
protected ViewId view_id=null; // only sent with GMS-triggered discovery response
protected boolean is_server=false;
protected String logical_name=null;
protected Collection<PhysicalAddress> physical_addrs=null;
public PingData() {
}
public PingData(Address sender, View view, boolean is_server) {
this.sender=sender;
this.view=view;
this.is_server=is_server;
}
public PingData(Address sender, View view, boolean is_server,
String logical_name, Collection<PhysicalAddress> physical_addrs) {
this(sender, view, is_server);
this.logical_name=logical_name;
if(physical_addrs != null)
this.physical_addrs=new ArrayList<PhysicalAddress>(physical_addrs);
}
public PingData(Address sender, View view, ViewId view_id, boolean is_server,
String logical_name, Collection<PhysicalAddress> physical_addrs) {
this(sender, view, is_server, logical_name, physical_addrs);
this.view_id=view_id;
}
public boolean isCoord() {
Address coord_addr=getCoordAddress();
return is_server && sender != null && coord_addr != null && sender.equals(coord_addr);
}
public boolean hasCoord(){
Address coord_addr=getCoordAddress();
return is_server && sender != null && coord_addr != null;
}
public Address getAddress() {
return sender;
}
public Address getCoordAddress() {
if(view_id != null)
return view_id.getCreator();
return view != null? view.getVid().getCreator() : null;
}
public Collection<Address> getMembers() {
return view != null? view.getMembers() : null;
}
public View getView() {
return view;
}
public void setView(View view) {
this.view=view;
}
public ViewId getViewId() {return view_id;}
public void setViewId(ViewId view_id) {this.view_id=view_id;}
public boolean isServer() {
return is_server;
}
public String getLogicalName() {
return logical_name;
}
public Collection<PhysicalAddress> getPhysicalAddrs() {
return physical_addrs;
}
public boolean equals(Object obj) {
if(!(obj instanceof PingData))
return false;
PingData other=(PingData)obj;
return sender != null && sender.equals(other.sender);
}
public int hashCode() {
int retval=0;
if(sender != null)
retval+=sender.hashCode();
if(retval == 0)
retval=super.hashCode();
return retval;
}
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append(sender);
sb.append(", " + printViewId());
sb.append(", is_server=").append(is_server).append(", is_coord=" + isCoord());
if(logical_name != null)
sb.append(", logical_name=").append(logical_name);
if(physical_addrs != null && !physical_addrs.isEmpty())
sb.append(", physical_addrs=").append(Util.printListWithDelimiter(physical_addrs, ", "));
return sb.toString();
}
public String printViewId() {
StringBuilder sb=new StringBuilder();
sb.append("view_id=");
if(view_id != null)
sb.append(view_id);
else {
if(view != null) {
sb.append(view.getViewId()).append(" (");
if(view.size() > 10)
sb.append(view.size() + " mbrs");
else
sb.append(view);
sb.append(")");
}
}
return sb.toString();
}
public void writeTo(DataOutput outstream) throws Exception {
Util.writeAddress(sender, outstream);
Util.writeView(view, outstream);
Util.writeViewId(view_id, outstream);
outstream.writeBoolean(is_server);
Util.writeString(logical_name, outstream);
Util.writeAddresses(physical_addrs, outstream);
}
@SuppressWarnings("unchecked")
public void readFrom(DataInput instream) throws Exception {
sender=Util.readAddress(instream);
view=Util.readView(instream);
view_id=Util.readViewId(instream);
is_server=instream.readBoolean();
logical_name=Util.readString(instream);
physical_addrs=(Collection<PhysicalAddress>)Util.readAddresses(instream, ArrayList.class);
}
public int size() {
int retval=Global.BYTE_SIZE; // for is_server
retval+=Util.size(sender);
retval+=Util.size(view);
retval+=Util.size(view_id);
retval+=Global.BYTE_SIZE; // presence byte for logical_name
if(logical_name != null)
retval+=logical_name.length() +2;
retval+=Util.size(physical_addrs);
return retval;
}
}