private StitchDataMessage AddressInstanceMessage(StitchDataMessage message)
        {
            var fullToId = new StitchFullId(message.ToNodeId, message.ToStitchInstanceId);

            IEnumerable <StitchSummary> query = _stitches;
            var toNodeId = message.ToNodeId;

            if (string.IsNullOrEmpty(toNodeId) && !fullToId.IsLocalOnly)
            {
                toNodeId = fullToId.NodeId;
            }
            if (!string.IsNullOrEmpty(toNodeId))
            {
                query = query.Where(s => s.NodeId == toNodeId);
            }

            var stitch = query.FirstOrDefault(si => si.Id == fullToId.StitchInstanceId);

            if (stitch == null)
            {
                return(null);
            }

            message.ToNodeId    = stitch.NodeId;
            message.ToNetworkId = stitch.NetworkNodeId;
            return(message);
        }
        private IEnumerable <StitchDataMessage> AddressApplicationMessage(StitchDataMessage message)
        {
            var messages  = new List <StitchDataMessage>();
            var groupName = new StitchGroupName(message.ToStitchGroup);
            var stitches  = _stitches
                            .Where(si => groupName.Contains(si.GroupName))
                            .Where(si => si.Id != message.FromStitchInstanceId)
                            .ToList();

            foreach (var stitch in stitches)
            {
                messages.Add(new StitchDataMessage
                {
                    // Leave the ToNodeID and NetworkID empty, so it gets routed locally
                    Data = message.Data,
                    ToStitchInstanceId   = stitch.Id,
                    FromNetworkId        = message.FromNetworkId,
                    FromNodeId           = message.FromNodeId,
                    FromStitchInstanceId = message.FromStitchInstanceId,
                    ToNetworkId          = stitch.NetworkNodeId,
                    ToNodeId             = stitch.NodeId
                });
            }

            return(messages);
        }
        public IEnumerable <StitchDataMessage> AddressMessage(StitchDataMessage message)
        {
            // TODO: Some kind of validation that we have all the necessary fields.
            var fullFromId = message.GetSenderId();

            return(AddressMessageInternal(message)
                   .Where(s => new StitchFullId(s.ToNodeId, s.ToStitchInstanceId).FullId != fullFromId.FullId));
        }
Пример #4
0
        public InstanceActionResult SendDataMessage(StitchFullId fullStitchId, StitchDataMessage message)
        {
            var adaptor = _adaptors.Get(fullStitchId.StitchInstanceId);

            if (adaptor == null)
            {
                return(InstanceActionResult.NotFound(fullStitchId.StitchInstanceId));
            }

            adaptor.SendMessage(message.Id, message.DataChannelName, message.Data, message.FromNodeId, message.FromStitchInstanceId);
            return(InstanceActionResult.Result(fullStitchId.StitchInstanceId, true));
        }
 private IEnumerable <StitchDataMessage> AddressMessageInternal(StitchDataMessage message)
 {
     if (!string.IsNullOrEmpty(message.ToStitchInstanceId))
     {
         message = AddressInstanceMessage(message);
         return(message == null?Enumerable.Empty <StitchDataMessage>() : new[] { message });
     }
     if (!string.IsNullOrEmpty(message.ToStitchGroup))
     {
         return(AddressApplicationMessage(message));
     }
     return(Enumerable.Empty <StitchDataMessage>());
 }
        public void AddressMessage_NoAddressee()
        {
            var target  = CreateTarget();
            var message = new StitchDataMessage
            {
                Data                 = "ABC",
                FromNodeId           = "FromNode1",
                FromStitchInstanceId = "FromStitch1"
            };
            var result = target.AddressMessage(message).OrderBy(si => si.Id).ToList();

            result.Count.Should().Be(0);
        }
        public void AddressMessage_Instance_NotFound()
        {
            var target  = CreateTarget();
            var message = new StitchDataMessage
            {
                ToStitchInstanceId = "XXX",
                Data                 = "ABC",
                FromNodeId           = "FromNode1",
                FromStitchInstanceId = "FromStitch1"
            };
            var result = target.AddressMessage(message).ToList();

            result.Count.Should().Be(0);
        }
Пример #8
0
 public void SendStitchData(StitchDataMessage message, bool remote)
 {
     if (remote)
     {
         var envelope = new ClusterMessageBuilder()
                        .ToNode(message.ToNetworkId)
                        .FromNode()
                        .WithObjectPayload(message)
                        .Build();
         _messageBus.Publish(ClusterMessage.SendEventName, envelope);
     }
     else
     {
         _messageBus.Publish(StitchDataMessage.ChannelSendLocal, message);
     }
 }
        public void AddressMessage_Instance_FullToId()
        {
            var target  = CreateTarget();
            var message = new StitchDataMessage
            {
                ToStitchInstanceId = "1:1",
                Data                 = "ABC",
                FromNodeId           = "FromNode1",
                FromStitchInstanceId = "FromStitch1"
            };
            var result = target.AddressMessage(message).ToList();

            result.Count.Should().Be(1);
            result[0].ToNodeId.Should().Be("1");
            result[0].ToNetworkId.Should().Be("1N");
            result[0].Data.Should().Be("ABC");
        }
Пример #10
0
        public void EnrichStitchDataMessageWithAddress(StitchDataMessage message)
        {
            message.FromNodeId    = _core.NodeId;
            message.FromNetworkId = _networkNodeId;

            var stitches = _data.GetAllStitchSummaries();
            var messages = new DataMessageAddresser(stitches).AddressMessage(message);

            foreach (var outMessage in messages)
            {
                bool isRemote = !string.IsNullOrEmpty(outMessage.ToNodeId) && outMessage.ToNodeId != _core.NodeId;
                _stitches.SendStitchData(outMessage, isRemote);
                if (isRemote)
                {
                    _log.LogDebug("Routing StitchDataMessage to node Id={0}, StitchId={1}", outMessage.ToNodeId, outMessage.ToStitchInstanceId);
                }
            }
        }
Пример #11
0
        public void SendDataMessageToStitch(StitchDataMessage message)
        {
            var fullStitchId = message.GetRecipientId();

            if (!fullStitchId.IsLocalOnly && fullStitchId.NodeId != _core.NodeId)
            {
                _log.LogWarning("Received message for stitch on the wrong node NodeId={0}", fullStitchId.NodeId);
            }
            var result = _stitchInstanceManager.SendDataMessage(fullStitchId, message);

            if (result.Success)
            {
                _log.LogDebug("Sent message Id={0} to StitchInstanceId={1}", message.Id, fullStitchId.StitchInstanceId);
            }
            else
            {
                _log.LogWarning("Could not deliver message Id={0} to StitchInstanceId={1}", message.Id, fullStitchId.StitchInstanceId);
            }
        }
        public void AddressMessage_Group()
        {
            var target  = CreateTarget();
            var message = new StitchDataMessage
            {
                ToStitchGroup        = "A.B.1",
                Data                 = "ABC",
                FromNodeId           = "FromNode1",
                FromStitchInstanceId = "FromStitch1"
            };
            var result = target.AddressMessage(message).OrderBy(si => si.Id).ToList();

            result.Count.Should().Be(2);
            result[0].ToStitchInstanceId.Should().Be("1");
            result[0].ToNodeId.Should().Be("1");
            result[0].ToNetworkId.Should().Be("1N");
            result[1].ToStitchInstanceId.Should().Be("3");
            result[1].ToNodeId.Should().Be("2");
            result[1].ToNetworkId.Should().Be("2N");
        }