Esempio n. 1
0
        private UpdateCollectionMessage CreateUpdateCollectionMessage(DataMessage dataMessage, Sequence sequence, Identity identity, int position, int updateMode)
        {
            UpdateCollectionMessage updateCollectionMessage = new UpdateCollectionMessage();

            // The unique identifier for the collection that was updated. For a collection filled with the
            // DataService.fill() method this contains an Array of the parameters specified.
            updateCollectionMessage.collectionId  = sequence.Parameters;
            updateCollectionMessage.destination   = dataMessage.destination;
            updateCollectionMessage.replace       = false;
            updateCollectionMessage.updateMode    = updateMode;
            updateCollectionMessage.messageId     = "srv:" + Guid.NewGuid().ToString("D") + ":0";
            updateCollectionMessage.correlationId = dataMessage.correlationId;

            UpdateCollectionRange updateCollectionRange = new UpdateCollectionRange();

            // An Array of identity objects that represent which items were either deleted or inserted in the
            // associated collection starting at the position indicated by the position property
            updateCollectionRange.identities = new object[1];
            //(updateCollectionRange.identities as IList).Add( identity );
            (updateCollectionRange.identities as object[])[0] = identity;
            updateCollectionRange.updateType = UpdateCollectionRange.InsertIntoCollection;
            updateCollectionRange.position   = position;

            //ArrayList body = new ArrayList();
            //body.Add(updateCollectionRange);
            object[] body = new object[1]; body[0] = updateCollectionRange;
            updateCollectionMessage.body = body;
            return(updateCollectionMessage);
        }
Esempio n. 2
0
        private void ApplyUpdateCollectionMessage(Sequence sequence, UpdateCollectionMessage updateCollectionMessage)
        {
            IList body = updateCollectionMessage.body as IList;

            for (int i = 0; i < body.Count; i++)
            {
                UpdateCollectionRange range = body[i] as UpdateCollectionRange;
                int num2 = 0;
                for (int j = 0; j < range.identities.Length; j++)
                {
                    Identity identity = range.identities[j] as Identity;
                    if (identity == null)
                    {
                        identity = new Identity(range.identities[j] as IDictionary);
                    }
                    if (range.updateType == 0)
                    {
                        this.AddIdentityToSequence(sequence, range.position + num2, identity, null);
                        num2++;
                    }
                    if (range.updateType == 1)
                    {
                        this.RemoveIdentityFromSequence(sequence, identity, range.position, null);
                    }
                }
            }
        }
Esempio n. 3
0
        void ApplyUpdateCollectionMessage(Sequence sequence, UpdateCollectionMessage updateCollectionMessage)
        {
            IList updateCollectionRanges = updateCollectionMessage.body as IList;

            for (int k = 0; k < updateCollectionRanges.Count; k++)
            {
                UpdateCollectionRange updateCollectionRange = updateCollectionRanges[k] as UpdateCollectionRange;
                int insertCount = 0;
                for (int l = 0; l < updateCollectionRange.identities.Length; l++)
                {
                    Identity identity = updateCollectionRange.identities[l] as Identity;
                    if (identity == null)
                    {
                        identity = new Identity(updateCollectionRange.identities[l] as IDictionary);
                    }
                    if (updateCollectionRange.updateType == UpdateCollectionRange.InsertIntoCollection)
                    {
                        this.AddIdentityToSequence(sequence, updateCollectionRange.position + insertCount, identity, null);
                        insertCount++;
                    }
                    if (updateCollectionRange.updateType == UpdateCollectionRange.DeleteFromCollection)
                    {
                        this.RemoveIdentityFromSequence(sequence, identity, updateCollectionRange.position, null);
                    }
                }
            }
        }
Esempio n. 4
0
        public void ManageMessageBatch(MessageBatch messageBatch, DataServiceTransaction dataServiceTransaction)
        {
            DataMessage dataMessage = messageBatch.IncomingMessage;

            //Manage existing sequences
            for (int j = 0; j < messageBatch.Messages.Count; j++)
            {
                IMessage message = messageBatch.Messages[j] as IMessage;
                if (message is UpdateCollectionMessage)
                {
                    UpdateCollectionMessage updateCollectionMessage = message as UpdateCollectionMessage;
                    //update collections, fix sequences
                    IList    fillParameters = updateCollectionMessage.collectionId as IList;
                    Sequence sequence       = _dataDestination.SequenceManager.GetSequence(fillParameters);
                    if (sequence != null)
                    {
                        ApplyUpdateCollectionMessage(sequence, updateCollectionMessage);
                    }
                }
            }
            for (int j = 0; j < messageBatch.Messages.Count; j++)
            {
                DataMessage dataMessageTmp = messageBatch.Messages[j] as DataMessage;
                if (dataMessageTmp != null)
                {
                    switch (dataMessageTmp.operation)
                    {
                    case DataMessage.CreateAndSequenceOperation:
                    {
                        //dataMessage.identity contains identity
                        //dataMessage.body contains the object
                        IList result = new ArrayList();
                        result.Add(dataMessageTmp.body);
                        //Will generate an UpdateCollectionMessage too (server adding item to collection)
                        Sequence         sequence         = this.CreateSequence(dataMessageTmp.clientId as string, result, null, dataServiceTransaction);
                        SequencedMessage sequencedMessage = this.GetSequencedMessage(dataMessageTmp, sequence);
                        messageBatch.Messages[j] = sequencedMessage;
                    }
                    break;
                    }
                }
            }
            for (int j = 0; j < messageBatch.Messages.Count; j++)
            {
                if (messageBatch.Messages[j] is DataMessage)
                {
                    DataMessage dataMessageTmp = messageBatch.Messages[j] as DataMessage;
                    SyncSequenceChanges(dataMessageTmp, dataServiceTransaction);
                }
                if (messageBatch.Messages[j] is SequencedMessage)
                {
                    SequencedMessage sequencedMessage = messageBatch.Messages[j] as SequencedMessage;
                    DataMessage      dataMessageTmp   = sequencedMessage.dataMessage;
                    SyncSequenceChanges(dataMessageTmp, dataServiceTransaction);
                }
            }
        }
Esempio n. 5
0
        private IMessage UpdateCollection(UpdateCollectionMessage updateCollectionMessage, IList messages)
        {
            IList updateCollectionRanges = updateCollectionMessage.body as IList;

            for (int i = 0; i < updateCollectionRanges.Count; i++)
            {
                UpdateCollectionRange updateCollectionRange = updateCollectionRanges[i] as UpdateCollectionRange;
                for (int j = 0; j < updateCollectionRange.identities.Length; j++)
                {
                    string   messageId = updateCollectionRange.identities[j] as string;
                    Identity identity  = null;
                    if (messageId != null)
                    {
                        //Search for previous Create or CreateAndSequence
                        //This was a "pending update collection" sent from the client and it must be replaced by the actual Identity
                        IMessage    refMessage  = GetMessage(messages, messageId);
                        DataMessage dataMessage = refMessage as DataMessage;
                        if (dataMessage != null)
                        {
                            DataDestination dataDestination = this.Destination as DataDestination;
                            identity = Identity.GetIdentity(dataMessage.body, dataDestination);
                        }
                        //replace with the actual identity
                        updateCollectionRange.identities[j] = identity;
                    }
                    else
                    {
                        IDictionary identityMap = updateCollectionRange.identities[j] as IDictionary;
                        if (identityMap != null)
                        {
                            identity = new Identity(identityMap);
                        }
                    }

                    IList fillParameters = updateCollectionMessage.collectionId as IList;

                    IAssembler assembler = GetAssembler();
                    if (assembler != null)
                    {
                        if (updateCollectionRange.updateType == UpdateCollectionRange.InsertIntoCollection)
                        {
                            assembler.AddItemToFill(fillParameters, updateCollectionRange.position + j, identity);
                        }
                        if (updateCollectionRange.updateType == UpdateCollectionRange.DeleteFromCollection)
                        {
                            assembler.RemoveItemFromFill(fillParameters, updateCollectionRange.position, identity);
                        }
                    }
                }
            }
            return(updateCollectionMessage);
        }
Esempio n. 6
0
        internal void GenerateUpdateCollectionMessage(int updateType, DataDestination dataDestination, Sequence sequence, int position, Identity identity)
        {
            UpdateCollectionMessage message = this.CreateUpdateCollectionMessage(dataDestination, sequence);

            message.AddItemIdentityChange(updateType, position, identity);
            if (message.collectionId != null)
            {
                this._updateCollectionMessages[message.collectionId] = message;
            }
            else
            {
                this._updateCollectionMessages[new object[0]] = message;
            }
        }
Esempio n. 7
0
        private UpdateCollectionMessage CreateUpdateCollectionMessage(DataDestination dataDestination, Sequence sequence)
        {
            UpdateCollectionMessage message = new UpdateCollectionMessage {
                clientId      = this.ClientId,
                updateMode    = 1,
                collectionId  = sequence.Parameters,
                destination   = dataDestination.Id,
                correlationId = this.CorrelationId,
                messageId     = "srv:" + Guid.NewGuid().ToString("D") + ":" + _idCounter.ToString()
            };

            Interlocked.Increment(ref _idCounter);
            return(message);
        }
Esempio n. 8
0
        public void ManageMessageBatch(MessageBatch messageBatch, DataServiceTransaction dataServiceTransaction)
        {
            int              num;
            Sequence         sequence;
            DataMessage      dataMessage;
            SequencedMessage sequencedMessage;
            DataMessage      incomingMessage = messageBatch.IncomingMessage;

            for (num = 0; num < messageBatch.Messages.Count; num++)
            {
                IMessage message2 = messageBatch.Messages[num] as IMessage;
                if (message2 is UpdateCollectionMessage)
                {
                    UpdateCollectionMessage updateCollectionMessage = message2 as UpdateCollectionMessage;
                    IList collectionId = updateCollectionMessage.collectionId;
                    sequence = this._dataDestination.SequenceManager.GetSequence(collectionId);
                    if (sequence != null)
                    {
                        this.ApplyUpdateCollectionMessage(sequence, updateCollectionMessage);
                    }
                }
            }
            for (num = 0; num < messageBatch.Messages.Count; num++)
            {
                dataMessage = messageBatch.Messages[num] as DataMessage;
                if ((dataMessage != null) && (dataMessage.operation == 11))
                {
                    IList result = new ArrayList();
                    result.Add(dataMessage.body);
                    sequence                   = this.CreateSequence(dataMessage.clientId as string, result, null, dataServiceTransaction);
                    sequencedMessage           = this.GetSequencedMessage(dataMessage, sequence);
                    messageBatch.Messages[num] = sequencedMessage;
                }
            }
            for (num = 0; num < messageBatch.Messages.Count; num++)
            {
                if (messageBatch.Messages[num] is DataMessage)
                {
                    dataMessage = messageBatch.Messages[num] as DataMessage;
                    this.SyncSequenceChanges(dataMessage, dataServiceTransaction);
                }
                if (messageBatch.Messages[num] is SequencedMessage)
                {
                    sequencedMessage = messageBatch.Messages[num] as SequencedMessage;
                    dataMessage      = sequencedMessage.dataMessage;
                    this.SyncSequenceChanges(dataMessage, dataServiceTransaction);
                }
            }
        }
Esempio n. 9
0
        internal void GenerateUpdateCollectionMessage(int updateType, DataDestination dataDestination, Sequence sequence, int position, Identity identity)
        {
            UpdateCollectionMessage updateCollectionMessage = CreateUpdateCollectionMessage(dataDestination, sequence);

            updateCollectionMessage.AddItemIdentityChange(updateType, position, identity);
            if (updateCollectionMessage.collectionId != null)
            {
                _updateCollectionMessages[updateCollectionMessage.collectionId] = updateCollectionMessage;
            }
            else
            {
                //without fill parameters
                _updateCollectionMessages[new object[0]] = updateCollectionMessage;
            }
        }
Esempio n. 10
0
        private UpdateCollectionMessage CreateUpdateCollectionMessage(DataDestination dataDestination, Sequence sequence)
        {
            UpdateCollectionMessage updateCollectionMessage = new UpdateCollectionMessage();

            updateCollectionMessage.clientId   = this.ClientId;
            updateCollectionMessage.updateMode = UpdateCollectionMessage.ServerUpdate;
            // The unique identifier for the collection that was updated. For a collection filled with the
            // DataService.fill() method this contains an Array of the parameters specified.
            updateCollectionMessage.collectionId  = sequence.Parameters;
            updateCollectionMessage.destination   = dataDestination.Id;
            updateCollectionMessage.correlationId = this.CorrelationId;
            updateCollectionMessage.messageId     = "srv:" + Guid.NewGuid().ToString("D") + ":" + _idCounter.ToString();
            System.Threading.Interlocked.Increment(ref _idCounter);

            return(updateCollectionMessage);
        }
Esempio n. 11
0
        private IMessage UpdateCollection(UpdateCollectionMessage updateCollectionMessage, IList messages)
        {
            IList body = updateCollectionMessage.body as IList;

            for (int i = 0; i < body.Count; i++)
            {
                UpdateCollectionRange range = body[i] as UpdateCollectionRange;
                for (int j = 0; j < range.identities.Length; j++)
                {
                    string   messageId = range.identities[j] as string;
                    Identity identity  = null;
                    if (messageId != null)
                    {
                        DataMessage message = this.GetMessage(messages, messageId) as DataMessage;
                        if (message != null)
                        {
                            DataDestination destination = base.Destination as DataDestination;
                            identity = Identity.GetIdentity(message.body, destination);
                        }
                        range.identities[j] = identity;
                    }
                    else
                    {
                        IDictionary map = range.identities[j] as IDictionary;
                        if (map != null)
                        {
                            identity = new Identity(map);
                        }
                    }
                    IList      collectionId = updateCollectionMessage.collectionId;
                    IAssembler assembler    = this.GetAssembler();
                    if (assembler != null)
                    {
                        if (range.updateType == 0)
                        {
                            assembler.AddItemToFill(collectionId, range.position + j, identity);
                        }
                        if (range.updateType == 1)
                        {
                            assembler.RemoveItemFromFill(collectionId, range.position, identity);
                        }
                    }
                }
            }
            return(updateCollectionMessage);
        }
Esempio n. 12
0
        private UpdateCollectionMessage CreateUpdateCollectionMessage(DataMessage dataMessage, Sequence sequence, Identity identity, int position, int updateMode)
        {
            UpdateCollectionMessage message = new UpdateCollectionMessage {
                collectionId  = sequence.Parameters,
                destination   = dataMessage.destination,
                replace       = false,
                updateMode    = updateMode,
                messageId     = "srv:" + Guid.NewGuid().ToString("D") + ":0",
                correlationId = dataMessage.correlationId
            };
            UpdateCollectionRange range = new UpdateCollectionRange {
                identities = new object[] { identity },
                updateType = 0,
                position   = position
            };

            object[] objArray = new object[] { range };
            message.body = objArray;
            return(message);
        }
Esempio n. 13
0
 internal void AddClientUpdateCollection(UpdateCollectionMessage updateCollectionMessage)
 {
     _clientUpdateCollectionMessages[updateCollectionMessage.collectionId] = updateCollectionMessage;
 }
Esempio n. 14
0
        /// <summary>
        /// Clients can call this method to commit the transaction. You should only use this method if
        /// you used the begin method to create the DataServiceTransaction.
        /// Otherwise, the gateway will commit or rollback the transaction as necessary.
        /// </summary>
        public void Commit()
        {
            if (_rollbackOnly)
            {
                Rollback();
                return;
            }

            try {
                ProcessRefreshFills();

                _pushMessages = new ArrayList();
                for (int i = 0; i < _processedMessageBatches.Count; i++)
                {
                    MessageBatch messageBatch = _processedMessageBatches[i] as MessageBatch;
                    if (messageBatch.Messages != null && messageBatch.Messages.Count > 0)
                    {
                        DataDestination dataDestination = _dataService.GetDestination(messageBatch.IncomingMessage) as DataDestination;
                        try {
                            dataDestination.SequenceManager.ManageMessageBatch(messageBatch, this);
                        } catch (Exception ex) {
                            MessageException messageException = new MessageException(ex);
                            ErrorMessage     errorMessage     = messageException.GetErrorMessage();
                            errorMessage.correlationId = messageBatch.IncomingMessage.messageId;
                            errorMessage.destination   = messageBatch.IncomingMessage.destination;
                            messageBatch.Messages.Clear();
                            messageBatch.Messages.Add(errorMessage);
                        }
                        for (int j = 0; j < messageBatch.Messages.Count; j++)
                        {
                            IMessage message = messageBatch.Messages[j] as IMessage;

                            if (!(message is ErrorMessage))
                            {
                                _pushMessages.Add(message);
                            }
                        }
                    }
                    _outgoingMessages.AddRange(messageBatch.Messages);
                }

                for (int i = 0; i < _pushMessages.Count; i++)
                {
                    IMessage    message     = _pushMessages[i] as IMessage;
                    DataMessage dataMessage = message as DataMessage;
                    if (dataMessage != null)
                    {
                        PushMessage(GetSubscribers(message), message);
                    }
                }
                foreach (DictionaryEntry entry in _clientUpdateCollectionMessages)
                {
                    UpdateCollectionMessage updateCollectionMessage = entry.Value as UpdateCollectionMessage;
                    _outgoingMessages.Add(updateCollectionMessage);
                    PushMessage(GetSubscribers(updateCollectionMessage), updateCollectionMessage);
                }
                foreach (DictionaryEntry entry in _updateCollectionMessages)
                {
                    UpdateCollectionMessage updateCollectionMessage = entry.Value as UpdateCollectionMessage;
                    _outgoingMessages.Add(updateCollectionMessage);
                    PushMessage(GetSubscribers(updateCollectionMessage), updateCollectionMessage);
                }
            } finally {
                _transactionState = TransactionState.Committed;
            }
        }