/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.routing.internal;
import java.io.Serializable;
import java.util.Date;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.transport.spi.MessageChannel;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Represents a logical link between two communicating RCE instances in a network. It is similar to a {@link MessageChannel}, but can
* connect arbitrary nodes (while a {@link MessageChannel} always starts at the local node). It is used as a directed edge in the graph
* representing the known network topology (see {@link TopologyMap}).
*
* @author Phillip Kroll
* @author Robert Mischke
*/
public final class TopologyLink implements Comparable<TopologyLink>, Cloneable, Serializable {
private static final long serialVersionUID = -5377050931490338202L;
private final Date creationTime = new Date();
private final InstanceNodeSessionId source;
private final InstanceNodeSessionId destination;
private int weight;
private int reliability;
private String connectionId;
private final String linkIdentity;
public TopologyLink(InstanceNodeSessionId source, InstanceNodeSessionId destination, String connectionId) {
this.source = source;
this.destination = destination;
// generate a link id that should be globally unique
this.linkIdentity = source.getInstanceNodeSessionIdString() + destination.getInstanceNodeSessionIdString() + connectionId;
this.connectionId = connectionId;
this.reliability = 0;
this.weight = 1;
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return StringUtils.format("%s --[ConId=%3$s]--> %s, (Hash=%s)", getSource(), getDestination(), getConnectionId(), hashCode());
}
@Override
public TopologyLink clone() {
// TODO check - is this actually needed anymore? couldn't the class just be made immutable? - misc_ro
return new TopologyLink(getSource(), getDestination(), connectionId);
}
/**
* @return Returns the creationTime.
*/
public Date getCreationTime() {
return creationTime;
}
public String getConnectionId() {
return connectionId;
}
/**
* @return Returns the source.
*/
public InstanceNodeSessionId getSource() {
return source;
}
/**
* @return Returns the destination.
*/
public InstanceNodeSessionId getDestination() {
return destination;
}
/**
* @return Returns the weight.
*/
public int getWeight() {
return weight;
}
/**
* @param weight The weight to set.
*/
public void setWeight(int weight) {
this.weight = weight;
}
/**
* @return Returns the reliability.
*/
public int getReliability() {
return reliability;
}
/**
* Increase reliability.
*
*/
public void incReliability() {
reliability = reliability + 1;
}
/**
* {@inheritDoc}
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(TopologyLink otherLink) {
return linkIdentity.compareTo(otherLink.linkIdentity);
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return linkIdentity.hashCode();
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj instanceof TopologyLink) {
return ((TopologyLink) obj).linkIdentity.equals(linkIdentity);
} else {
return false;
}
}
}