/* * 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.activemq.artemis.core.protocol.core.impl; import java.io.Serializable; import org.apache.activemq.artemis.api.core.ActiveMQBuffer; import org.apache.activemq.artemis.core.client.ActiveMQClientMessageBundle; import org.apache.activemq.artemis.core.protocol.core.Packet; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ActiveMQExceptionMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CheckFailoverMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CheckFailoverReplyMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ClusterTopologyChangeMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ClusterTopologyChangeMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ClusterTopologyChangeMessage_V3; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateAddressMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSessionMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSessionResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSharedQueueMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSharedQueueMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.DisconnectConsumerMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.DisconnectConsumerWithKillMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.DisconnectMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.DisconnectMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.NullResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.PacketsConfirmedMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.Ping; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ReattachSessionMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ReattachSessionResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.RollbackMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAcknowledgeMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAddMetaDataMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAddMetaDataMessageV2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V3; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V4; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCloseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCommitMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionConsumerCloseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionConsumerFlowCreditMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionDeleteQueueMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionExpireMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionForceConsumerDelivery; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionIndividualAcknowledgeMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionProducerCreditsFailMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionProducerCreditsMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage_V3; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionReceiveContinuationMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionRequestProducerCreditsMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendContinuationMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionUniqueAddMetaDataMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAAfterFailedMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXACommitMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAEndMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAForgetMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAGetInDoubtXidsResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAGetTimeoutResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAJoinMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAPrepareMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAResumeMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXARollbackMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXASetTimeoutMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXASetTimeoutResponseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAStartMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SubscribeClusterTopologyUpdatesMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SubscribeClusterTopologyUpdatesMessageV2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CHECK_FOR_FAILOVER; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CLUSTER_TOPOLOGY; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CLUSTER_TOPOLOGY_V2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CLUSTER_TOPOLOGY_V3; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATESESSION; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATESESSION_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATE_ADDRESS; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATE_QUEUE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATE_QUEUE_V2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATE_SHARED_QUEUE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.CREATE_SHARED_QUEUE_V2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.DELETE_QUEUE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.DISCONNECT; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.DISCONNECT_CONSUMER; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.DISCONNECT_V2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.EXCEPTION; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.NULL_RESPONSE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.PACKETS_CONFIRMED; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.PING; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.REATTACH_SESSION; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.REATTACH_SESSION_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_ACKNOWLEDGE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_ADD_METADATA; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_ADD_METADATA2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_BINDINGQUERY; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_BINDINGQUERY_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_BINDINGQUERY_RESP_V2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_BINDINGQUERY_RESP_V3; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_BINDINGQUERY_RESP_V4; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_CLOSE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_COMMIT; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_CONSUMER_CLOSE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_CREATECONSUMER; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_EXPIRED; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_FLOWTOKEN; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_FORCE_CONSUMER_DELIVERY; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_INDIVIDUAL_ACKNOWLEDGE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_PRODUCER_CREDITS; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_PRODUCER_FAIL_CREDITS; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_PRODUCER_REQUEST_CREDITS; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_QUEUEQUERY; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_QUEUEQUERY_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_QUEUEQUERY_RESP_V2; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_QUEUEQUERY_RESP_V3; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_RECEIVE_CONTINUATION; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_ROLLBACK; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_SEND_CONTINUATION; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_START; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_STOP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_UNIQUE_ADD_METADATA; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_COMMIT; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_END; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_FAILED; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_FORGET; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_GET_TIMEOUT; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_GET_TIMEOUT_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_INDOUBT_XIDS; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_INDOUBT_XIDS_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_JOIN; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_PREPARE; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_RESUME; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_ROLLBACK; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_SET_TIMEOUT; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_SET_TIMEOUT_RESP; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_START; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SESS_XA_SUSPEND; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SUBSCRIBE_TOPOLOGY; import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.SUBSCRIBE_TOPOLOGY_V2; public abstract class PacketDecoder implements Serializable { public abstract Packet decode(final ActiveMQBuffer in); public Packet decode(byte packetType) { Packet packet; switch (packetType) { case PING: { packet = new Ping(); break; } case DISCONNECT: { packet = new DisconnectMessage(); break; } case DISCONNECT_V2: { packet = new DisconnectMessage_V2(); break; } case DISCONNECT_CONSUMER: { packet = new DisconnectConsumerMessage(); break; } case EXCEPTION: { packet = new ActiveMQExceptionMessage(); break; } case PACKETS_CONFIRMED: { packet = new PacketsConfirmedMessage(); break; } case CREATESESSION: { packet = new CreateSessionMessage(); break; } case CHECK_FOR_FAILOVER: { packet = new CheckFailoverMessage(); break; } case CREATESESSION_RESP: { packet = new CreateSessionResponseMessage(); break; } case REATTACH_SESSION: { packet = new ReattachSessionMessage(); break; } case REATTACH_SESSION_RESP: { packet = new ReattachSessionResponseMessage(); break; } case SESS_CLOSE: { packet = new SessionCloseMessage(); break; } case SESS_CREATECONSUMER: { packet = new SessionCreateConsumerMessage(); break; } case SESS_ACKNOWLEDGE: { packet = new SessionAcknowledgeMessage(); break; } case SESS_EXPIRED: { packet = new SessionExpireMessage(); break; } case SESS_COMMIT: { packet = new SessionCommitMessage(); break; } case SESS_ROLLBACK: { packet = new RollbackMessage(); break; } case SESS_QUEUEQUERY: { packet = new SessionQueueQueryMessage(); break; } case SESS_QUEUEQUERY_RESP: { packet = new SessionQueueQueryResponseMessage(); break; } case SESS_QUEUEQUERY_RESP_V2: { packet = new SessionQueueQueryResponseMessage_V2(); break; } case SESS_QUEUEQUERY_RESP_V3: { packet = new SessionQueueQueryResponseMessage_V3(); break; } case CREATE_ADDRESS: { packet = new CreateAddressMessage(); break; } case CREATE_QUEUE: { packet = new CreateQueueMessage(); break; } case CREATE_QUEUE_V2: { packet = new CreateQueueMessage_V2(); break; } case CREATE_SHARED_QUEUE: { packet = new CreateSharedQueueMessage(); break; } case CREATE_SHARED_QUEUE_V2: { packet = new CreateSharedQueueMessage_V2(); break; } case DELETE_QUEUE: { packet = new SessionDeleteQueueMessage(); break; } case SESS_BINDINGQUERY: { packet = new SessionBindingQueryMessage(); break; } case SESS_BINDINGQUERY_RESP: { packet = new SessionBindingQueryResponseMessage(); break; } case SESS_BINDINGQUERY_RESP_V2: { packet = new SessionBindingQueryResponseMessage_V2(); break; } case SESS_BINDINGQUERY_RESP_V3: { packet = new SessionBindingQueryResponseMessage_V3(); break; } case SESS_BINDINGQUERY_RESP_V4: { packet = new SessionBindingQueryResponseMessage_V4(); break; } case SESS_XA_START: { packet = new SessionXAStartMessage(); break; } case SESS_XA_FAILED: { packet = new SessionXAAfterFailedMessage(); break; } case SESS_XA_END: { packet = new SessionXAEndMessage(); break; } case SESS_XA_COMMIT: { packet = new SessionXACommitMessage(); break; } case SESS_XA_PREPARE: { packet = new SessionXAPrepareMessage(); break; } case SESS_XA_RESP: { packet = new SessionXAResponseMessage(); break; } case SESS_XA_ROLLBACK: { packet = new SessionXARollbackMessage(); break; } case SESS_XA_JOIN: { packet = new SessionXAJoinMessage(); break; } case SESS_XA_SUSPEND: { packet = new PacketImpl(PacketImpl.SESS_XA_SUSPEND); break; } case SESS_XA_RESUME: { packet = new SessionXAResumeMessage(); break; } case SESS_XA_FORGET: { packet = new SessionXAForgetMessage(); break; } case SESS_XA_INDOUBT_XIDS: { packet = new PacketImpl(PacketImpl.SESS_XA_INDOUBT_XIDS); break; } case SESS_XA_INDOUBT_XIDS_RESP: { packet = new SessionXAGetInDoubtXidsResponseMessage(); break; } case SESS_XA_SET_TIMEOUT: { packet = new SessionXASetTimeoutMessage(); break; } case SESS_XA_SET_TIMEOUT_RESP: { packet = new SessionXASetTimeoutResponseMessage(); break; } case SESS_XA_GET_TIMEOUT: { packet = new PacketImpl(PacketImpl.SESS_XA_GET_TIMEOUT); break; } case SESS_XA_GET_TIMEOUT_RESP: { packet = new SessionXAGetTimeoutResponseMessage(); break; } case SESS_START: { packet = new PacketImpl(PacketImpl.SESS_START); break; } case SESS_STOP: { packet = new PacketImpl(PacketImpl.SESS_STOP); break; } case SESS_FLOWTOKEN: { packet = new SessionConsumerFlowCreditMessage(); break; } case SESS_CONSUMER_CLOSE: { packet = new SessionConsumerCloseMessage(); break; } case SESS_INDIVIDUAL_ACKNOWLEDGE: { packet = new SessionIndividualAcknowledgeMessage(); break; } case NULL_RESPONSE: { packet = new NullResponseMessage(); break; } case SESS_RECEIVE_CONTINUATION: { packet = new SessionReceiveContinuationMessage(); break; } case SESS_SEND_CONTINUATION: { packet = new SessionSendContinuationMessage(); break; } case SESS_PRODUCER_REQUEST_CREDITS: { packet = new SessionRequestProducerCreditsMessage(); break; } case SESS_PRODUCER_CREDITS: { packet = new SessionProducerCreditsMessage(); break; } case SESS_PRODUCER_FAIL_CREDITS: { packet = new SessionProducerCreditsFailMessage(); break; } case SESS_FORCE_CONSUMER_DELIVERY: { packet = new SessionForceConsumerDelivery(); break; } case CLUSTER_TOPOLOGY: { packet = new ClusterTopologyChangeMessage(); break; } case CLUSTER_TOPOLOGY_V2: { packet = new ClusterTopologyChangeMessage_V2(); break; } case CLUSTER_TOPOLOGY_V3: { packet = new ClusterTopologyChangeMessage_V3(); break; } case SUBSCRIBE_TOPOLOGY: { packet = new SubscribeClusterTopologyUpdatesMessage(); break; } case SUBSCRIBE_TOPOLOGY_V2: { packet = new SubscribeClusterTopologyUpdatesMessageV2(); break; } case SESS_ADD_METADATA: { packet = new SessionAddMetaDataMessage(); break; } case SESS_ADD_METADATA2: { packet = new SessionAddMetaDataMessageV2(); break; } case SESS_UNIQUE_ADD_METADATA: { packet = new SessionUniqueAddMetaDataMessage(); break; } case PacketImpl.CHECK_FOR_FAILOVER_REPLY: { packet = new CheckFailoverReplyMessage(); break; } case PacketImpl.DISCONNECT_CONSUMER_KILL: { packet = new DisconnectConsumerWithKillMessage(); break; } default: { throw ActiveMQClientMessageBundle.BUNDLE.invalidType(packetType); } } return packet; } }