/*
* 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.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Encapsulates information about a network node and its direct neighborhood. This is called a link state advertisement and is supposed to
* be passed across the network.
*
* @see http://de.wikipedia.org/wiki/Link_State_Advertisement
* @author Phillip Kroll
*/
public final class LinkStateAdvertisement implements Serializable, Cloneable {
/**
* Startup LSA string.
*/
public static final String REASON_STARTUP = "startup";
/**
* Shutdown LSA string.
*/
public static final String REASON_SHUTDOWN = "shutdown";
/**
* Update LSA string.
*/
public static final String REASON_UPDATE = "update";
private static final long serialVersionUID = -6872824009925812913L;
private final Collection<TopologyLink> links;
private final InstanceNodeSessionId owner;
// TODO temporarily transported on top of the LSA infrastructure
private String displayName;
// TODO temporarily transported on top of the LSA infrastructure
private boolean isWorkflowHost;
private final long sequenceNumber;
private final int graphHashCode;
private final boolean routing;
private final String reason;
/**
* The constructor.
*/
public LinkStateAdvertisement(InstanceNodeSessionId theOwner, String displayName, boolean isWorkflowHost, long sequenceNumber,
int graphChecksum,
boolean routing, String reason, Collection<TopologyLink> links) {
this.owner = theOwner;
this.displayName = displayName;
this.isWorkflowHost = isWorkflowHost;
this.sequenceNumber = sequenceNumber;
this.links = new HashSet<TopologyLink>(links);
this.graphHashCode = graphChecksum;
this.routing = routing;
this.reason = reason;
}
/**
* Create an update LSA.
*
* @param theOwner The owner
* @param sequenceNumber The sequence number
* @param graphChecksum The graph checksum
* @param routing The routing
* @param links The links
* @param displayName The display name
* @param isWorkflowHost Is workflow host
* @return The update LSA.
*/
public static LinkStateAdvertisement createUpdateLsa(InstanceNodeSessionId theOwner, String displayName, boolean isWorkflowHost,
long sequenceNumber,
int graphChecksum, boolean routing, Collection<TopologyLink> links) {
return new LinkStateAdvertisement(theOwner, displayName, isWorkflowHost, sequenceNumber, graphChecksum, routing, REASON_UPDATE,
links);
}
/**
* Create startup LSA.
*
* @param theOwner The owner
* @param routing The routing
* @param links The links
* @param displayName The display name
* @param isWorkflowHost Is workflow host
* @param sequenceNumber The sequence number
* @return The startup LSA
*/
public static LinkStateAdvertisement createStartUpLsa(InstanceNodeSessionId theOwner, String displayName, boolean isWorkflowHost,
long sequenceNumber, boolean routing,
Collection<TopologyLink> links) {
return new LinkStateAdvertisement(theOwner, displayName, isWorkflowHost, 1, 0, routing, REASON_STARTUP, links);
}
/**
* Create shut down LSA.
*
* @param theOwner The owner
* @param sequenceNumber The sequnce number
* @param displayName The display name.
* @param isWorkflowHost Is worfklow host.
* @return The shut down LSA.
*/
public static LinkStateAdvertisement createShutDownLsa(InstanceNodeSessionId theOwner, String displayName, boolean isWorkflowHost,
long sequenceNumber) {
return new LinkStateAdvertisement(theOwner, displayName, isWorkflowHost, sequenceNumber, 0, false, REASON_SHUTDOWN,
new ArrayList<TopologyLink>());
}
/**
*
* {@inheritDoc}
*
* @see java.lang.Object#clone()
*/
@Override
public LinkStateAdvertisement clone() {
List<TopologyLink> copiedLinks = new ArrayList<TopologyLink>();
for (TopologyLink link : this.links) {
copiedLinks.add(link.clone());
}
LinkStateAdvertisement clone = new LinkStateAdvertisement(
owner, displayName, isWorkflowHost, sequenceNumber, graphHashCode, routing, reason, copiedLinks);
return clone;
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
String result = StringUtils.format("LinkStateAdvertisement(%s): %s [", getSequenceNumber(), getOwner());
for (TopologyLink link : links) {
result = StringUtils.format("%s, %s", result, link);
}
return StringUtils.format("%s]", result);
}
/**
* @return Returns the networkNodes.
*/
public Collection<TopologyLink> getLinks() {
return links;
}
/**
* @return Returns the owner.
*/
public InstanceNodeSessionId getOwner() {
return owner;
}
/**
* @return Returns the displayName.
*/
public String getDisplayName() {
return displayName;
}
public boolean getIsWorkflowHost() {
return isWorkflowHost;
}
/**
* @return Returns the sequenceNumber.
*/
public long getSequenceNumber() {
return sequenceNumber;
}
/**
* @return Returns the graphHashCode.
*/
public int getGraphHashCode() {
return graphHashCode;
}
/**
* @return Returns the routing.
*/
public boolean isRouting() {
return routing;
}
/**
* @return Returns the reason.
*/
public String getReason() {
return reason;
}
}