/* * 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; /** * Represents a RCE instance in the network. More abstract a {@link TopologyNode} is a node in a graph that is encapsulated in * {@link TopologyMap}. * * @author Phillip Kroll * @author Robert Mischke (changed sequenceNumber to timestamp) */ public final class TopologyNode implements Comparable<TopologyNode>, Cloneable, Serializable { private static final int INITIAL_SEQUENCE_NUMBER = -1; private static final long serialVersionUID = -2179209415622826744L; private final Date createdTime = new Date(); private final InstanceNodeSessionId nodeId; private long lastSequenceNumber = INITIAL_SEQUENCE_NUMBER; private int lastGraphHashCode = 0; private boolean routing; private String displayName; private boolean isWorkflowHost; /** * The constructor. * * @param nodeId */ public TopologyNode(InstanceNodeSessionId nodeId) { this.nodeId = nodeId; this.routing = true; } public TopologyNode(InstanceNodeSessionId nodeId, boolean routing) { this.nodeId = nodeId; this.routing = routing; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } @Deprecated public boolean getIsWorkflowHost() { return isWorkflowHost; } @Deprecated public void setIsWorkflowHost(boolean isWorkflowHost) { this.isWorkflowHost = isWorkflowHost; } @Override public TopologyNode clone() { return new TopologyNode(getNodeIdentifier()); } /** * @return Returns the added. */ public Date getCreatedTime() { return createdTime; } /** * @return Returns the lastSequenceNumber. */ public synchronized long getSequenceNumber() { return lastSequenceNumber; } /** * @return Returns the node identifier. */ public InstanceNodeSessionId getNodeIdentifier() { return nodeId; } /** * @param lastSequenceNumber The lastSequenceNumber to set. */ public synchronized void setLastSequenceNumber(long lastSequenceNumber) { this.lastSequenceNumber = lastSequenceNumber; } /** * @return The incremented sequence number. */ public synchronized long invalidateSequenceNumber() { // note that this timestamp-based approach relies on the local clock not jumping back to an // earlier time for correct distributed behavior long newValue = System.currentTimeMillis(); if (newValue <= lastSequenceNumber) { // ensure an increase even if the timestamp did not change since the last update newValue = lastSequenceNumber + 1; } lastSequenceNumber = newValue; return lastSequenceNumber; } /** * {@inheritDoc} * * @see java.lang.Object#toString() */ @Override public String toString() { return getNodeIdentifier().toString() + "(" + getSequenceNumber() + ")"; } /** * {@inheritDoc} * * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(TopologyNode networkNode) { return ((Integer) hashCode()).compareTo(networkNode.hashCode()); } /** * {@inheritDoc} * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return getNodeIdentifier().hashCode(); } /** * {@inheritDoc} * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj instanceof TopologyNode) { return obj.hashCode() == hashCode(); } else { return false; } } /** * @return Returns the lastGraphChecksum. */ public int getLastGraphHashCode() { return lastGraphHashCode; } /** * @param lastGraphHashCode The lastGraphHashCode to set. */ public void setLastGraphHashCode(int lastGraphHashCode) { this.lastGraphHashCode = lastGraphHashCode; } /** * Is a node that performs routing. * * @return Returns the routing. */ public boolean isRouting() { return routing; } /** * Set isRouting. * * @param routing The routing to set. */ public void setRouting(boolean routing) { this.routing = routing; } }