/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.protocol;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.core.communication.model.NetworkResponse;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* Constants related to the higher-level network protocol, for example metadata values. This also includes version information for network
* compatibility checks.
*
* @author Robert Mischke
*/
public final class ProtocolConstants {
/**
* An arbitrary protocol version or compatibility string used to determine if two nodes can establish a compatible connection.
*
* Note that there are no "higher/lower version" semantics for the content of this string. On a connection attempt, the strings provided
* by both nodes are only checked for equality, and possibly displayed as part of the error message if they do not match.
*/
public static final String PROTOCOL_COMPATIBILITY_VERSION = "8.0.0-final";
/**
* Represents possible return codes contained in {@link NetworkResponse}s.
*
* @author Robert Mischke
*/
public enum ResultCode {
/**
* Value for marking an undefined result code.
*/
UNDEFINED(0, null),
/**
* Request successful.
*/
SUCCESS(1, null),
/**
* An exception occurred while handling the request at its final destination node.
*/
EXCEPTION_AT_DESTINATION(102, "An internal error occured on the destination node while processing this request; "
+ "more information may be available in the destination node's log files"),
/**
* An exception occurred while forwarding/routing the request towards its final destination node.
*/
EXCEPTION_DURING_DELIVERY(103, "There was an error while delivering the request to the destination node"),
/**
* The was no valid forwarding route on a node between sender and final recipient.
*/
NO_ROUTE_TO_DESTINATION_WHILE_FORWARDING(104, "An instance between sender and destination was unable to forward the request; "
+ DESTINATION_MAY_HAVE_BECOME_UNREACHABLE_TEXT),
/**
* There was a forwarding route to the final recipient, but when the request was to be sent to the next hop, the message channel was
* already marked as broken.
*/
CHANNEL_CLOSED_OR_BROKEN_BEFORE_SENDING_REQUEST(105,
"A network connection between sender and destination has been closed (by user action or an error) "
+ "while sending/forwarding the request; " + DESTINATION_MAY_HAVE_BECOME_UNREACHABLE_TEXT),
/**
* While waiting for the response to a sent request, the non-blocking response listener was shut down.
*/
CHANNEL_OR_RESPONSE_LISTENER_SHUT_DOWN_WHILE_WAITING_FOR_RESPONSE(106,
"A network connection between sender and destination has been closed (by user action or an error) "
+ "while awaiting the response; " + DESTINATION_MAY_HAVE_BECOME_UNREACHABLE_TEXT),
/**
* The was no valid route to the destination at the initial sender.
*/
NO_ROUTE_TO_DESTINATION_AT_SENDER(107, "The destination instance for this request is unreachable; it was probably "
+ "contacted because it was reachable at an earlier time"),
/**
* A timeout occurred while waiting for a response after sending the request into a channel.
*/
TIMEOUT_WAITING_FOR_RESPONSE(108,
"The destination instance for this request did not answer in time, or the response got lost because of a network error"),
/**
* A placeholder result code if an invalid code was passed in for conversion via {@link #fromCode(int)}.
*/
INVALID_RESULT_CODE(999, null);
private final int code;
private final String stringForm;
// note: userMessage may be null for results that are not typically presented to the user
ResultCode(int code, String userMessage) {
this.code = code;
// prepare and store toString() message
if (userMessage != null) {
stringForm = StringUtils.format("%s (error code %d)", userMessage, code);
} else {
stringForm = StringUtils.format("%s (error code %d)", name(), code);
}
}
public int getCode() {
return code;
}
/**
* @param code a numeric code
* @return the associated {@link ResultCode} object; if none exists, an {@link IllegalArgumentException} is thrown
*/
public static ResultCode fromCode(int code) {
for (ResultCode rc : values()) {
if (rc.code == code) {
return rc;
}
}
LogFactory.getLog(ProtocolConstants.class).error("Received an invalid result code: " + code);
return INVALID_RESULT_CODE;
}
@Override
public String toString() {
return stringForm;
}
}
/**
* Top-level type for remote service call (RPC) messages.
*/
public static final String VALUE_MESSAGE_TYPE_RPC = "rpc";
/**
* Top-level type for connection health check ("ping") messages.
*/
public static final String VALUE_MESSAGE_TYPE_HEALTH_CHECK = "healthCheck";
/**
* Top-level type for routing meta-information (LSA) messages.
*/
@Deprecated
public static final String VALUE_MESSAGE_TYPE_LSA = "lsa";
/**
* Top-level type for distributed node property update messages.
*/
public static final String VALUE_MESSAGE_TYPE_NODE_PROPERTIES_UPDATE = "np";
/**
* Top-level type for dummy integration test messages.
*/
public static final String VALUE_MESSAGE_TYPE_TEST = "test";
/**
* The TTL (in msec) set for outgoing messages by transports that support this concept.
*/
public static final long JMS_MESSAGES_TTL_MSEC = 60 * 1000;
// common text
private static final String DESTINATION_MAY_HAVE_BECOME_UNREACHABLE_TEXT = "the destination instance may have become unreachable";
private ProtocolConstants() {}
}