/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.channel;
import de.rcenvironment.core.communication.common.CommunicationException;
import de.rcenvironment.core.communication.configuration.ConnectionFilter;
import de.rcenvironment.core.communication.model.NetworkContactPoint;
import de.rcenvironment.core.communication.transport.spi.MessageChannelEndpointHandler;
import de.rcenvironment.core.communication.transport.spi.NetworkTransportProvider;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Extension of a {@link NetworkContactPoint} to represent transport-specific implementations that accept incoming connections. For example,
* a TCP-based {@link ServerContactPoint} may listen on a TCP port and accept inbound connections.
*
* @author Robert Mischke
*/
public class ServerContactPoint {
private final NetworkContactPoint networkContactPoint;
private final MessageChannelEndpointHandler endpointHandler;
private final String expectedProtocolVersion;
private final NetworkTransportProvider transportProvider;
private final ConnectionFilter connectionFilter;
private volatile boolean acceptingMessages = false;
private volatile boolean simulatingBreakdown;
public ServerContactPoint(NetworkTransportProvider transportProvider, NetworkContactPoint ncp,
String expectedProtocolVersion, MessageChannelEndpointHandler endpointHandler, ConnectionFilter connectionFilter) {
this.transportProvider = transportProvider;
this.networkContactPoint = ncp;
this.endpointHandler = endpointHandler;
this.expectedProtocolVersion = expectedProtocolVersion;
this.connectionFilter = connectionFilter;
}
public NetworkContactPoint getNetworkContactPoint() {
return networkContactPoint;
}
public MessageChannelEndpointHandler getEndpointHandler() {
return endpointHandler;
}
public String getExpectedProtocolVersion() {
return expectedProtocolVersion;
}
public ConnectionFilter getConnectionFilter() {
return connectionFilter;
}
// TODO review: currently, only used by integration test
public synchronized boolean isAcceptingMessages() {
return acceptingMessages;
}
@Override
public String toString() {
// note: acceptingMessages is left volatile as I don't want to synchronize on "this" in toString() - misc_ro
return StringUtils.format("SCP (NCP='%s', acc=%s, simbr=%s)", networkContactPoint, acceptingMessages, simulatingBreakdown);
}
public String getTransportId() {
return getNetworkContactPoint().getTransportId();
}
/**
* Starts accepting connections at the configured {@link NetworkContactPoint}.
*
* Note that this method could be refactored away, but is kept for API symmetry with shutDown().
*
* @throws CommunicationException on startup failure
*/
public synchronized void start() throws CommunicationException {
transportProvider.startServer(this);
acceptingMessages = true;
}
/**
* Stops accepting connections at the configured {@link NetworkContactPoint}. Whether inbound connections are actively closed is
* transport-specific.
*/
public synchronized void shutDown() {
acceptingMessages = false;
transportProvider.stopServer(this);
}
public boolean isSimulatingBreakdown() {
return simulatingBreakdown;
}
public void setSimulatingBreakdown(boolean simulatingBreakdown) {
this.simulatingBreakdown = simulatingBreakdown;
}
}