/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.transport.spi;
import de.rcenvironment.core.communication.channel.MessageChannelState;
import de.rcenvironment.core.communication.channel.ServerContactPoint;
import de.rcenvironment.core.communication.model.InitialNodeInformation;
import de.rcenvironment.core.communication.model.NetworkRequest;
/**
* Abstraction of a directed connection between two nodes that supports request-response calls. The realization of the actual wire
* communication depends on the underlying network transport. Implementations of this class must be reusable and thread-safe.
*
* Note that a {@link MessageChannel} may or may not correspond to a persistent, underlying network connection. As a result, a
* {@link MessageChannel} may continue to exist after the contacted node has already become unreachable. This kind of situation is usually
* detected on the next communication attempt, similar to a TCP connection.
*
* @author Robert Mischke
*/
public interface MessageChannel {
/**
* Returns a JVM-unique id for this connection. If this id is to be shared across JVMs, it should be joined with another id (for
* example, the node UUID) to make it globally unique.
*
* @return the unique id
*/
String getChannelId();
/**
* @param id a JVM-unique id for this connection
*/
void setChannelId(String id);
/**
* Signal that this channel has been initialized and is ready to use.
*/
void markAsEstablished();
/**
* @return the {@link MessageChannelState} of this connection
*/
MessageChannelState getState();
/**
* @return general information about the node at the remote end of this connection
*/
InitialNodeInformation getRemoteNodeInformation();
/**
* @param nodeInformation information about the node at the remote end of this connection
*/
void setRemoteNodeInformation(InitialNodeInformation nodeInformation);
/**
* @return true if this connection was initiated (on the network level) by the remote node, i.e. if this is a "passive" connection from
* the local node's perspective
*
* @see MessageChannelEndpointHandler#onRemoteInitiatedChannelEstablished(MessageChannel, ServerContactPoint)
*/
boolean getInitiatedByRemote();
/**
* @param value true if this connection was initiated (on the network level) by the remote node, i.e. if this is a "passive" connection
* from the local node's perspective
*/
void setInitiatedByRemote(boolean value);
/**
* Sends a {@link NetworkRequest} to the remote node via this connection. The response is returned asynchronously.
*
* @param request the request to send
* @param responseHandler the response callback handler
* @param timeoutMsec the timeout in milliseconds
*/
void sendRequest(NetworkRequest request, MessageChannelResponseHandler responseHandler, int timeoutMsec);
/**
* Closes this channel. Depending on the transport that created this connection, this may or may not result in an action on the network
* level.
*
* @return true if this call caused the channel's state to switch to "closed" from a usable state, ie if the caller should unregister
* this connection
*/
boolean close();
/**
* Indicates that a critical error has occurred while using this channel, and that it should not be used anymore.
*
* @return true if this call caused the channel's state to switch to "broken" from a usable state, ie if the caller should unregister
* this connection
*/
boolean markAsBroken();
/**
* Checks whether this channel is ready to use, which is the case when it is fully initialized, not closed, and not marked as broken.
*
* @return true if the channel is ready to send messages through
*/
boolean isReadyToUse();
/**
* Method for associating a {@link ServerContactPoint} with a connection. Usage is transport-specific.
*
* TODO review: push down to subclasses?
*
* @param networkContactPoint the {@link NetworkContactPoint} to associate
*/
@Deprecated
void setAssociatedSCP(ServerContactPoint networkContactPoint);
/**
* Gets the id of the "mirrored" channel, i.e. the one that goes into the opposite direction, if available.
*
* @return the id of the "mirroring" channel
*/
String getAssociatedMirrorChannelId();
/**
* Sets the id of the "mirrored" channel, i.e. the one that goes into the opposite direction, if available.
*
* @param mirrorChannelId the id of the "mirroring" channel
*/
void setAssociatedMirrorChannelId(String mirrorChannelId);
/**
* @return whether this channel was closed because its "mirror" channel closed before
*/
boolean isClosedBecauseMirrorChannelClosed();
/**
* Signals that this channel is about to be closed because its "mirror" channel closed.
*/
void markAsClosedBecauseMirrorChannelClosed();
}