/* * 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.ignite.internal.managers.communication; import java.util.Map; import org.apache.ignite.IgniteException; import org.apache.ignite.internal.GridJobCancelRequest; import org.apache.ignite.internal.GridJobExecuteRequest; import org.apache.ignite.internal.GridJobExecuteResponse; import org.apache.ignite.internal.GridJobSiblingsRequest; import org.apache.ignite.internal.GridJobSiblingsResponse; import org.apache.ignite.internal.GridTaskCancelRequest; import org.apache.ignite.internal.GridTaskSessionRequest; import org.apache.ignite.internal.binary.BinaryEnumObjectImpl; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.managers.checkpoint.GridCheckpointRequest; import org.apache.ignite.internal.managers.deployment.GridDeploymentInfoBean; import org.apache.ignite.internal.managers.deployment.GridDeploymentRequest; import org.apache.ignite.internal.managers.deployment.GridDeploymentResponse; import org.apache.ignite.internal.managers.eventstorage.GridEventStorageMessage; import org.apache.ignite.internal.pagemem.snapshot.SnapshotFinishedMessage; import org.apache.ignite.internal.pagemem.snapshot.SnapshotProgressMessage; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection; import org.apache.ignite.internal.processors.cache.CacheEntryPredicateContainsValue; import org.apache.ignite.internal.processors.cache.CacheEntrySerializablePredicate; import org.apache.ignite.internal.processors.cache.CacheEvictionEntry; import org.apache.ignite.internal.processors.cache.CacheInvokeDirectResult; import org.apache.ignite.internal.processors.cache.CacheObjectByteArrayImpl; import org.apache.ignite.internal.processors.cache.CacheObjectImpl; import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo; import org.apache.ignite.internal.processors.cache.GridCacheReturn; import org.apache.ignite.internal.processors.cache.GridChangeGlobalStateMessageResponse; import org.apache.ignite.internal.processors.cache.KeyCacheObjectImpl; import org.apache.ignite.internal.processors.cache.binary.MetadataRequestMessage; import org.apache.ignite.internal.processors.cache.binary.MetadataResponseMessage; import org.apache.ignite.internal.processors.cache.distributed.GridCacheTtlUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.GridCacheTxRecoveryRequest; import org.apache.ignite.internal.processors.cache.distributed.GridCacheTxRecoveryResponse; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedLockRequest; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedLockResponse; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxFinishRequest; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxFinishResponse; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxPrepareRequest; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxPrepareResponse; import org.apache.ignite.internal.processors.cache.distributed.GridDistributedUnlockRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLockResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxFinishResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxOnePhaseCommitAckRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicDeferredUpdateResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicNearResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicSingleUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicUpdateResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicCheckUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicFullUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateFilterRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateInvokeRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicSingleUpdateRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.NearCacheUpdates; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.UpdateErrors; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysResponse; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemandMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionExchangeId; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessage; import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleRequest; import org.apache.ignite.internal.processors.cache.distributed.near.CacheVersionedValue; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetResponse; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockRequest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockResponse; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetRequest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetResponse; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRequest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishResponse; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareRequest; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareResponse; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearUnlockRequest; import org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest; import org.apache.ignite.internal.processors.cache.query.GridCacheQueryResponse; import org.apache.ignite.internal.processors.cache.query.GridCacheSqlQuery; import org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryBatchAck; import org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryEntry; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry; import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey; import org.apache.ignite.internal.processors.cache.transactions.TxEntryValueHolder; import org.apache.ignite.internal.processors.cache.transactions.TxLock; import org.apache.ignite.internal.processors.cache.transactions.TxLockList; import org.apache.ignite.internal.processors.cache.transactions.TxLocksRequest; import org.apache.ignite.internal.processors.cache.transactions.TxLocksResponse; import org.apache.ignite.internal.processors.cache.version.GridCacheRawVersionedEntry; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.cache.version.GridCacheVersionEx; import org.apache.ignite.internal.processors.continuous.GridContinuousMessage; import org.apache.ignite.internal.processors.datastreamer.DataStreamerEntry; import org.apache.ignite.internal.processors.datastreamer.DataStreamerRequest; import org.apache.ignite.internal.processors.datastreamer.DataStreamerResponse; import org.apache.ignite.internal.processors.hadoop.HadoopJobId; import org.apache.ignite.internal.processors.hadoop.shuffle.HadoopDirectShuffleMessage; import org.apache.ignite.internal.processors.hadoop.shuffle.HadoopShuffleAck; import org.apache.ignite.internal.processors.hadoop.shuffle.HadoopShuffleFinishRequest; import org.apache.ignite.internal.processors.hadoop.shuffle.HadoopShuffleFinishResponse; import org.apache.ignite.internal.processors.hadoop.shuffle.HadoopShuffleMessage; import org.apache.ignite.internal.processors.igfs.IgfsAckMessage; import org.apache.ignite.internal.processors.igfs.IgfsBlockKey; import org.apache.ignite.internal.processors.igfs.IgfsBlocksMessage; import org.apache.ignite.internal.processors.igfs.IgfsDeleteMessage; import org.apache.ignite.internal.processors.igfs.IgfsFileAffinityRange; import org.apache.ignite.internal.processors.igfs.IgfsFragmentizerRequest; import org.apache.ignite.internal.processors.igfs.IgfsFragmentizerResponse; import org.apache.ignite.internal.processors.igfs.IgfsSyncMessage; import org.apache.ignite.internal.processors.marshaller.MissingMappingRequestMessage; import org.apache.ignite.internal.processors.marshaller.MissingMappingResponseMessage; import org.apache.ignite.internal.processors.query.schema.message.SchemaOperationStatusMessage; import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryCancelRequest; import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryFailResponse; import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageRequest; import org.apache.ignite.internal.processors.query.h2.twostep.messages.GridQueryNextPageResponse; import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultRequest; import org.apache.ignite.internal.processors.rest.handlers.task.GridTaskResultResponse; import org.apache.ignite.internal.util.GridByteArrayList; import org.apache.ignite.internal.util.GridIntList; import org.apache.ignite.internal.util.GridLongList; import org.apache.ignite.internal.util.GridMessageCollection; import org.apache.ignite.internal.util.UUIDCollectionMessage; import org.apache.ignite.lang.IgniteOutClosure; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.plugin.extensions.communication.MessageFactory; import org.apache.ignite.spi.collision.jobstealing.JobStealingRequest; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; import org.jsr166.ConcurrentHashMap8; /** * Message factory implementation. */ public class GridIoMessageFactory implements MessageFactory { /** Custom messages registry. Used for test purposes. */ private static final Map<Short, IgniteOutClosure<Message>> CUSTOM = new ConcurrentHashMap8<>(); /** Extensions. */ private final MessageFactory[] ext; /** * @param ext Extensions. */ public GridIoMessageFactory(MessageFactory[] ext) { this.ext = ext; } /** {@inheritDoc} */ @Override public Message create(short type) { Message msg = null; switch (type) { case -53: msg = new SchemaOperationStatusMessage(); break; case -52: msg = new GridIntList(); break; case -51: msg = new NearCacheUpdates(); break; case -50: msg = new GridNearAtomicCheckUpdateRequest(); break; case -49: msg = new UpdateErrors(); break; case -48: msg = new GridDhtAtomicNearResponse(); break; case -47: msg = new SnapshotProgressMessage(); break; case -46: msg = new GridChangeGlobalStateMessageResponse(); break; case -45: msg = new SnapshotFinishedMessage(); break; case -44: msg = new TcpCommunicationSpi.HandshakeMessage2(); break; case -43: msg = new IgniteIoTestMessage(); break; case -42: msg = new HadoopDirectShuffleMessage(); break; case -41: msg = new HadoopShuffleFinishResponse(); break; case -40: msg = new HadoopShuffleFinishRequest(); break; case -39: msg = new HadoopJobId(); break; case -38: msg = new HadoopShuffleAck(); break; case -37: msg = new HadoopShuffleMessage(); break; case -36: msg = new GridDhtAtomicSingleUpdateRequest(); break; case -27: msg = new GridDhtTxOnePhaseCommitAckRequest(); break; case -26: msg = new TxLockList(); break; case -25: msg = new TxLock(); break; case -24: msg = new TxLocksRequest(); break; case -23: msg = new TxLocksResponse(); break; case TcpCommunicationSpi.NODE_ID_MSG_TYPE: msg = new TcpCommunicationSpi.NodeIdMessage(); break; case TcpCommunicationSpi.RECOVERY_LAST_ID_MSG_TYPE: msg = new TcpCommunicationSpi.RecoveryLastReceivedMessage(); break; case TcpCommunicationSpi.HANDSHAKE_MSG_TYPE: msg = new TcpCommunicationSpi.HandshakeMessage(); break; case 0: msg = new GridJobCancelRequest(); break; case 1: msg = new GridJobExecuteRequest(); break; case 2: msg = new GridJobExecuteResponse(); break; case 3: msg = new GridJobSiblingsRequest(); break; case 4: msg = new GridJobSiblingsResponse(); break; case 5: msg = new GridTaskCancelRequest(); break; case 6: msg = new GridTaskSessionRequest(); break; case 7: msg = new GridCheckpointRequest(); break; case 8: msg = new GridIoMessage(); break; case 9: msg = new GridIoUserMessage(); break; case 10: msg = new GridDeploymentInfoBean(); break; case 11: msg = new GridDeploymentRequest(); break; case 12: msg = new GridDeploymentResponse(); break; case 13: msg = new GridEventStorageMessage(); break; case 16: msg = new GridCacheTxRecoveryRequest(); break; case 17: msg = new GridCacheTxRecoveryResponse(); break; case 20: msg = new GridCacheTtlUpdateRequest(); break; case 21: msg = new GridDistributedLockRequest(); break; case 22: msg = new GridDistributedLockResponse(); break; case 23: msg = new GridDistributedTxFinishRequest(); break; case 24: msg = new GridDistributedTxFinishResponse(); break; case 25: msg = new GridDistributedTxPrepareRequest(); break; case 26: msg = new GridDistributedTxPrepareResponse(); break; case 27: msg = new GridDistributedUnlockRequest(); break; case 28: msg = new GridDhtAffinityAssignmentRequest(); break; case 29: msg = new GridDhtAffinityAssignmentResponse(); break; case 30: msg = new GridDhtLockRequest(); break; case 31: msg = new GridDhtLockResponse(); break; case 32: msg = new GridDhtTxFinishRequest(); break; case 33: msg = new GridDhtTxFinishResponse(); break; case 34: msg = new GridDhtTxPrepareRequest(); break; case 35: msg = new GridDhtTxPrepareResponse(); break; case 36: msg = new GridDhtUnlockRequest(); break; case 37: msg = new GridDhtAtomicDeferredUpdateResponse(); break; case 38: msg = new GridDhtAtomicUpdateRequest(); break; case 39: msg = new GridDhtAtomicUpdateResponse(); break; case 40: msg = new GridNearAtomicFullUpdateRequest(); break; case 41: msg = new GridNearAtomicUpdateResponse(); break; case 42: msg = new GridDhtForceKeysRequest(); break; case 43: msg = new GridDhtForceKeysResponse(); break; case 44: msg = new GridDhtPartitionDemandMessage(); break; case 46: msg = new GridDhtPartitionsFullMessage(); break; case 47: msg = new GridDhtPartitionsSingleMessage(); break; case 48: msg = new GridDhtPartitionsSingleRequest(); break; case 49: msg = new GridNearGetRequest(); break; case 50: msg = new GridNearGetResponse(); break; case 51: msg = new GridNearLockRequest(); break; case 52: msg = new GridNearLockResponse(); break; case 53: msg = new GridNearTxFinishRequest(); break; case 54: msg = new GridNearTxFinishResponse(); break; case 55: msg = new GridNearTxPrepareRequest(); break; case 56: msg = new GridNearTxPrepareResponse(); break; case 57: msg = new GridNearUnlockRequest(); break; case 58: msg = new GridCacheQueryRequest(); break; case 59: msg = new GridCacheQueryResponse(); break; case 61: msg = new GridContinuousMessage(); break; case 62: msg = new DataStreamerRequest(); break; case 63: msg = new DataStreamerResponse(); break; case 64: msg = new IgfsAckMessage(); break; case 65: msg = new IgfsBlockKey(); break; case 66: msg = new IgfsBlocksMessage(); break; case 67: msg = new IgfsDeleteMessage(); break; case 68: msg = new IgfsFileAffinityRange(); break; case 69: msg = new IgfsFragmentizerRequest(); break; case 70: msg = new IgfsFragmentizerResponse(); break; case 71: msg = new IgfsSyncMessage(); break; case 76: msg = new GridTaskResultRequest(); break; case 77: msg = new GridTaskResultResponse(); break; case 78: msg = new MissingMappingRequestMessage(); break; case 79: msg = new MissingMappingResponseMessage(); break; case 80: msg = new MetadataRequestMessage(); break; case 81: msg = new MetadataResponseMessage(); break; case 82: msg = new JobStealingRequest(); break; case 84: msg = new GridByteArrayList(); break; case 85: msg = new GridLongList(); break; case 86: msg = new GridCacheVersion(); break; case 87: msg = new GridDhtPartitionExchangeId(); break; case 88: msg = new GridCacheReturn(); break; case 89: msg = new CacheObjectImpl(); break; case 90: msg = new KeyCacheObjectImpl(); break; case 91: msg = new GridCacheEntryInfo(); break; case 92: msg = new CacheEntryInfoCollection(); break; case 93: msg = new CacheInvokeDirectResult(); break; case 94: msg = new IgniteTxKey(); break; case 95: msg = new DataStreamerEntry(); break; case 96: msg = new CacheContinuousQueryEntry(); break; case 97: msg = new CacheEvictionEntry(); break; case 98: msg = new CacheEntryPredicateContainsValue(); break; case 99: msg = new CacheEntrySerializablePredicate(); break; case 100: msg = new IgniteTxEntry(); break; case 101: msg = new TxEntryValueHolder(); break; case 102: msg = new CacheVersionedValue(); break; case 103: msg = new GridCacheRawVersionedEntry<>(); break; case 104: msg = new GridCacheVersionEx(); break; case 105: msg = new CacheObjectByteArrayImpl(); break; case 106: msg = new GridQueryCancelRequest(); break; case 107: msg = new GridQueryFailResponse(); break; case 108: msg = new GridQueryNextPageRequest(); break; case 109: msg = new GridQueryNextPageResponse(); break; case 110: // EMPTY type // GridQueryRequest was removed break; case 111: msg = new AffinityTopologyVersion(); break; case 112: msg = new GridCacheSqlQuery(); break; case 113: msg = new BinaryObjectImpl(); break; case 114: msg = new GridDhtPartitionSupplyMessage(); break; case 115: msg = new UUIDCollectionMessage(); break; case 116: msg = new GridNearSingleGetRequest(); break; case 117: msg = new GridNearSingleGetResponse(); break; case 118: msg = new CacheContinuousQueryBatchAck(); break; case 119: msg = new BinaryEnumObjectImpl(); break; case 124: msg = new GridMessageCollection<>(); break; case 125: msg = new GridNearAtomicSingleUpdateRequest(); break; case 126: msg = new GridNearAtomicSingleUpdateInvokeRequest(); break; case 127: msg = new GridNearAtomicSingleUpdateFilterRequest(); break; // [-3..119] [124..127] [-23..-27] [-36..-47]- this // [120..123] - DR // [-4..-22, -30..-35] - SQL default: if (ext != null) { for (MessageFactory factory : ext) { msg = factory.create(type); if (msg != null) break; } } if (msg == null) { IgniteOutClosure<Message> c = CUSTOM.get(type); if (c != null) msg = c.apply(); } } if (msg == null) throw new IgniteException("Invalid message type: " + type); return msg; } /** * Registers factory for custom message. Used for test purposes. * * @param type Message type. * @param c Message producer. */ public static void registerCustom(short type, IgniteOutClosure<Message> c) { assert c != null; CUSTOM.put(type, c); } }