package freenet.node.probe; public enum Error { /** * The node being waited on to provide a response disconnected. */ DISCONNECTED((byte) 0), /** * A node cannot accept the request because its probe DoS protection has tripped. */ OVERLOAD((byte) 1), /** * Timed out while waiting for a response. */ TIMEOUT((byte) 2), /** * An error occurred, but a node did not recognize the error used. * If this occurs locally, it will be specified along with the unrecognized code. */ UNKNOWN((byte) 3), /** * A remote node did not recognize the requested probe type. For locally started probes it will not be * a ProbeError but a ProtocolError. */ UNRECOGNIZED_TYPE((byte) 4), /** * A node received and understood the request, but failed to forward it to another node. * @see freenet.node.probe.Probe#MAX_SEND_ATTEMPTS */ CANNOT_FORWARD((byte) 5); /** * Stable numerical value to represent the enum value. Used to send over the network instead of .name(). * Ordinals are not acceptable because they rely on the number and ordering of enums. */ public final byte code; private static final int MAX_CODE = Error.values().length; Error(byte code) { this.code = code; } /** * Checks whether valueOf() will throw for the given code. Intended to make things more concise and * faster than try-catch blocks. * * @param code to be converted to an enum value. * @return true if the code can be converted to an enum value; false if not. */ static boolean isValid(byte code) { //Assumes codes are consecutive, start at zero, and all are valid. return code >= 0 && code < MAX_CODE; } /** * Determines the enum value with the given code. * * @param code enum value code. * @return enum value with selected code. * @throws IllegalArgumentException There is no enum value with the requested code. */ static Error valueOf(byte code) throws IllegalArgumentException { switch (code) { case 0: return DISCONNECTED; case 1: return OVERLOAD; case 2: return TIMEOUT; case 3: return UNKNOWN; case 4: return UNRECOGNIZED_TYPE; case 5: return CANNOT_FORWARD; default: throw new IllegalArgumentException("There is no ProbeError with code " + code + "."); } } }