blob: e57b8507233233f3da1aacec0aebab279ec3a91e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.cache.tier;
/**
* The following are communications "mode" bytes sent as the first byte of a client/server
* handshake. They must not be larger than 1 byte.
* <p>
* NOTE: new protobuf modes should be added as new values in this enumeration and the appropriate
* query methods must be updated.
*/
public enum CommunicationMode {
/**
* The first byte of any locator connection will be the high order byte of its gossip version,
* which will always be 0. Communication modes should not collide with this value.
*/
ReservedForGossip((byte) 0, "Locator gossip version"),
/**
* For the new client-server protocol.
*
* Protobuf handshake messages are specially constructed so that this value will match the first
* byte sent, allowing clients to start protobuf connections with a handshake instead of
* communication mode bytes.
*/
ProtobufClientServerProtocol((byte) 10, "Protobuf client"),
/**
* Byte meaning that the Socket is being used for 'client to server' communication.
*/
ClientToServer((byte) 100, "client"),
/**
* Byte meaning that the Socket is being used for 'primary server to client' communication.
*/
PrimaryServerToClient((byte) 101, "primary server to client"),
/**
* Byte meaning that the Socket is being used for 'secondary server to client' communication.
*/
SecondaryServerToClient((byte) 102, "secondary server to client"),
/**
* Byte meaning that the Socket is being used for 'gateway to gateway' communication.
*/
GatewayToGateway((byte) 103, "gateway"),
/**
* Byte meaning that the Socket is being used for 'monitor to gateway' communication.
*/
MonitorToServer((byte) 104, "monitor"),
/**
* Byte meaning that the connection between the server and client was successful. This is not
* actually a communication mode but an acknowledgement byte.
*/
SuccessfulServerToClient((byte) 105, "successful server to client"),
/**
* Byte meaning that the connection between the server and client was unsuccessful. This is not
* actually a communication mode but an error byte.
*/
UnsuccessfulServerToClient((byte) 106, "unsucessful server to client"),
/**
* Byte meaning that the Socket is being used for 'client to server' messages related to a client
* queue (register interest, create cq, etc.).
*/
ClientToServerForQueue((byte) 107, "clientToServerForQueue");
/**
* is this a client-initiated operations connection?
*/
public boolean isClientOperations() {
return this == ClientToServer || this == ProtobufClientServerProtocol;
}
/**
* is this any type of client/server connection?
*/
public boolean isClientToServerOrSubscriptionFeed() {
return this == ClientToServer || this == PrimaryServerToClient
|| this == SecondaryServerToClient || this == ClientToServerForQueue
|| this == ProtobufClientServerProtocol;
}
/**
* be the first to describe this method
*/
public boolean isSubscriptionFeed() {
return this == PrimaryServerToClient || this == SecondaryServerToClient;
}
/**
* is this connection counted in the ClientServerCnxCount statistic?
*/
public boolean isCountedAsClientServerConnection() {
return this == ClientToServer || this == MonitorToServer
|| this == ProtobufClientServerProtocol;
}
/**
* is this a WAN connection?
*/
public boolean isWAN() {
return this == GatewayToGateway;
}
/**
* non-protobuf (legacy) protocols expect a refusal message before a connection is closed. This is
* unintelligible to protobuf protocol clients.
*/
public boolean expectsConnectionRefusalMessage() {
return this != ProtobufClientServerProtocol;
}
/**
* The modeNumber is the byte written on-wire that indicates this connection mode
*/
private byte modeNumber;
private String description;
CommunicationMode(byte mode, String description) {
modeNumber = mode;
this.description = description;
}
public byte getModeNumber() {
return this.modeNumber;
}
/**
* check the given mode to see if it is assigned to one of the enumeration's instances
*/
public static boolean isValidMode(int mode) {
return (100 <= mode && mode <= 107) || mode == 10;
}
public static CommunicationMode fromModeNumber(byte modeNumber) {
switch (modeNumber) {
case 10:
return ProtobufClientServerProtocol;
case 100:
return ClientToServer;
case 101:
return PrimaryServerToClient;
case 102:
return SecondaryServerToClient;
case 103:
return GatewayToGateway;
case 104:
return MonitorToServer;
case 105:
return SuccessfulServerToClient;
case 106:
return UnsuccessfulServerToClient;
case 107:
return ClientToServerForQueue;
default:
throw new IllegalArgumentException("unknown communications mode: " + modeNumber);
}
}
public String toString() {
return this.description;
}
}