Beispiel #1
0
        public void IsPositionalTest(string input, bool expected)
        {
            // Arrange
            var parameters = CreateParameters(10);

            // Act
            var messageTemplateParameters = new MessageTemplateParameters(input, parameters);

            // Assert
            Assert.Equal(expected, messageTemplateParameters.IsPositional);
        }
Beispiel #2
0
        public void ParseParameters(string input, int expected)
        {
            // Arrange
            var parameters = CreateParameters(expected);

            // Act
            var messageTemplateParameters = new MessageTemplateParameters(input, parameters);

            // Assert
            Assert.Equal(expected, messageTemplateParameters.Count);
        }
Beispiel #3
0
        [InlineData("{A} {A}", 2, true)] //overwrite
        public void IsValidTemplateTest(string input, int parameterCount, bool expected)
        {
            // Arrange
            var parameters = CreateParameters(parameterCount);

            // Act
            var messageTemplateParameters = new MessageTemplateParameters(input, parameters);

            // Assert
            Assert.Equal(expected, messageTemplateParameters.IsValidTemplate);
        }
        public void DisplaySelectForm([Comments("Configuration details for the form.")] MessageTemplateParameters setting, [ListEditorControl(ListControlType.Connectors)] ICollection <ConnectorParameters> buttons)
        {
            MessageTemplateView view = this.mapper.Map <MessageTemplateView>(setting);

            this.screenData.ScreenSettings = new ScreenSettings <MessageTemplateView>
                                             (
                view,
                mapper.Map <IEnumerable <ConnectorParameters>, IEnumerable <CommandButtonView> >(buttons),
                ViewType.Select,
                new MenuItem {
                Text = view.Message, Icon = view.Icon
            }
                                             );
        }
Beispiel #5
0
        public void IndexerTest(string input, int index, object expectedValue, string expectedName, int?expectedPositionalIndex, CaptureType expectedCaptureType)
        {
            // Arrange
            var parameters = CreateParameters(1);

            // Act
            var messageTemplateParameters = new MessageTemplateParameters(input, parameters);

            // Assert
            Assert.Equal(expectedValue, messageTemplateParameters[index].Value);
            Assert.Equal(expectedName, messageTemplateParameters[index].Name);
            Assert.Equal(expectedPositionalIndex, messageTemplateParameters[index].PositionalIndex);
            Assert.Equal(expectedCaptureType, messageTemplateParameters[index].CaptureType);
        }
Beispiel #6
0
        public void EnumeratorTest(string input, string namesRaw)
        {
            // Arrange
            var parameters = CreateParameters(1);
            var names      = namesRaw.Split(';');

            // Act
            var messageTemplateParameters = new MessageTemplateParameters(input, parameters);

            // Assert
            var resultNames = messageTemplateParameters.Select(t => t.Name).ToArray();

            Assert.Equal(names, resultNames);
        }
Beispiel #7
0
        public void ParseParameters(string input, int count)
        {
            // Arrange
            var parameters = new List <object>(count);

            for (int i = 0; i < count; i++)
            {
                parameters.Add(i.ToString());
            }

            // Act
            var MessageTemplateParameters = new MessageTemplateParameters(input, parameters.ToArray());

            // Assert
            Assert.Equal(count, MessageTemplateParameters.Count);
        }
        /// <summary>
        /// Find max index of the parameters
        /// </summary>
        /// <param name="messageTemplateParameters"></param>
        /// <returns>index, 0 or higher</returns>
        private static int FindMaxIndex(MessageTemplateParameters messageTemplateParameters)
        {
            int maxIndex = 0;

            for (int i = 0; i < messageTemplateParameters.Count; ++i)
            {
                if (messageTemplateParameters[i].Name.Length == 1)
                {
                    maxIndex = Math.Max(maxIndex, messageTemplateParameters[i].Name[0] - '0');
                }
                else
                {
                    maxIndex = Math.Max(maxIndex, int.Parse(messageTemplateParameters[i].Name, System.Globalization.CultureInfo.InvariantCulture));
                }
            }

            return(maxIndex);
        }
Beispiel #9
0
        /// <summary>
        /// Find max index of the parameters
        /// </summary>
        /// <param name="messagetTemplateParameters"></param>
        /// <returns>index, 0 or higher</returns>
        private static int FindMaxIndex(MessageTemplateParameters messagetTemplateParameters)
        {
            int maxIndex = 0;

            for (int i = 0; i < messagetTemplateParameters.Count; ++i)
            {
                if (messagetTemplateParameters[i].Name.Length == 1)
                {
                    maxIndex = Math.Max(maxIndex, messagetTemplateParameters[i].Name[0] - '0');
                }
                else
                {
                    maxIndex = Math.Max(maxIndex, int.Parse(messagetTemplateParameters[i].Name));
                }
            }

            return(maxIndex);
        }
        private static object[] CreatePositionalLogEventInfoParameters(NLogMessageParameterList messageParameters, MessageTemplateParameters messageTemplateParameters, out List <KeyValuePair <string, object> > extraProperties)
        {
            extraProperties = null;

            var maxIndex = FindMaxIndex(messageTemplateParameters);

            object[] paramsArray           = null;
            int      messageParameterCount = messageParameters.Count;

            for (int i = 0; i < messageParameterCount; ++i)
            {
                // First positional name is the startPos
                if (char.IsDigit(messageParameters[i].Name[0]) && paramsArray == null)
                {
                    paramsArray = new object[maxIndex + 1];
                    for (int j = 0; j <= maxIndex; ++j)
                    {
                        if (i + j < messageParameterCount)
                        {
                            paramsArray[j] = messageParameters[i + j].Value;
                        }
                    }
                    i += maxIndex;
                }
                else
                {
                    extraProperties = AddExtraProperty(extraProperties, messageParameters[i]);
                }
            }

            return(paramsArray ?? new object[maxIndex + 1]);
        }
        private static object[] CreateStructuredLogEventInfoParameters(NLogMessageParameterList messageParameters, MessageTemplateParameters messageTemplateParameters, out List <KeyValuePair <string, object> > extraProperties)
        {
            extraProperties = null;

            var paramsArray           = new object[messageTemplateParameters.Count];
            int startPos              = 0;
            int messageParameterCount = messageParameters.Count;

            for (int i = 0; i < messageParameterCount; ++i)
            {
                var propertyName = messageParameters[i].Name;

                bool extraProperty = true;
                for (int j = startPos; j < messageTemplateParameters.Count; ++j)
                {
                    if (propertyName.Equals(messageTemplateParameters[j].Name, StringComparison.Ordinal))
                    {
                        extraProperty  = false;
                        paramsArray[j] = messageParameters[i].Value;
                        if (startPos == j)
                        {
                            startPos++;
                        }
                        break;
                    }
                }

                if (extraProperty)
                {
                    extraProperties = AddExtraProperty(extraProperties, messageParameters[i]);
                }
            }

            return(paramsArray);
        }
        /// <summary>
        /// Are all parameters positional and correctly mapped?
        /// </summary>
        /// <param name="messageParameters"></param>
        /// <param name="messageTemplateParameters"></param>
        /// <returns>true if correct</returns>
        private static bool AllParameterCorrectlyPositionalMapped(NLogMessageParameterList messageParameters, MessageTemplateParameters messageTemplateParameters)
        {
            if (messageTemplateParameters.Count != messageParameters.Count)
            {
                return(false);
            }

            for (int i = 0; i < messageTemplateParameters.Count; ++i)
            {
                if (!messageParameters[i].Name.Equals(messageTemplateParameters[i].Name, StringComparison.Ordinal))
                {
                    return(false);
                }
            }

            return(true);
        }
 /// <summary>
 /// Allocates object[]-array for <see cref="LogEventInfo.Parameters"/> after checking
 /// for mismatch between Microsoft Extension Logging and NLog Message Template Parser
 /// </summary>
 /// <remarks>
 /// Cannot trust the parameters received from Microsoft Extension Logging, as extra parameters can be injected
 /// </remarks>
 private static void CaptureLogEventInfoParameters(LogEventInfo logEvent, NLogMessageParameterList messageParameters, MessageTemplateParameters messageTemplateParameters)
 {
     if (messageTemplateParameters.IsPositional)
     {
         logEvent.Parameters = CreatePositionalLogEventInfoParameters(messageParameters, messageTemplateParameters, out var extraProperties);
         if (extraProperties?.Count > 0)
         {
             CaptureMessagePropertiesList(logEvent, extraProperties);
         }
     }
     else if (!AllParameterCorrectlyPositionalMapped(messageParameters, messageTemplateParameters))
     {
         // Resolves mismatch between the input from Microsoft Extension Logging TState and NLog Message Template Parser
         logEvent.Parameters = CreateStructuredLogEventInfoParameters(messageParameters, messageTemplateParameters, out var extraProperties);
         if (extraProperties?.Count > 0)
         {
             CaptureMessagePropertiesList(logEvent, extraProperties);
         }
     }
     else
     {
         // Everything is mapped correctly, inject messageParameters directly as params-array
         var paramsArray = new object[messageTemplateParameters.Count];
         for (int i = 0; i < paramsArray.Length; ++i)
         {
             paramsArray[i] = messageParameters[i].Value;
         }
         logEvent.Parameters = paramsArray;
     }
 }
Beispiel #14
0
        private static object[] CreateStructuredLogEventInfoParameters(NLogMessageParameterList messageParameters, MessageTemplateParameters messagetTemplateParameters, out List <MessageTemplateParameter> extraProperties)
        {
            extraProperties = null;

            var paramsArray = new object[messagetTemplateParameters.Count];
            int startPos    = 0;

            for (int i = 0; i < messageParameters.Count; ++i)
            {
                bool extraProperty = true;
                for (int j = startPos; j < messagetTemplateParameters.Count; ++j)
                {
                    if (messageParameters[i].Name == messagetTemplateParameters[j].Name)
                    {
                        extraProperty  = false;
                        paramsArray[j] = messageParameters[i].Value;
                        if (startPos == j)
                        {
                            startPos++;
                        }
                        break;
                    }
                }

                if (extraProperty)
                {
                    extraProperties = AddExtraProperty(extraProperties, messageParameters[i]);
                }
            }

            return(paramsArray);
        }
Beispiel #15
0
        /// <summary>
        /// Are all parameters positional and correctly mapped?
        /// </summary>
        /// <param name="messageParameters"></param>
        /// <param name="messagetTemplateParameters"></param>
        /// <returns>true if correct</returns>
        private static bool AllParameterCorrectlyPositionalMapped(NLogMessageParameterList messageParameters, MessageTemplateParameters messagetTemplateParameters)
        {
            if (messagetTemplateParameters.Count != messageParameters.Count || messagetTemplateParameters.IsPositional)
            {
                return(false);
            }

            for (int i = 0; i < messagetTemplateParameters.Count; ++i)
            {
                if (messagetTemplateParameters[i].Name != messageParameters[i].Name)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #16
0
 /// <summary>
 /// Allocates object[]-array for <see cref="LogEventInfo.Parameters"/> after checking
 /// for mismatch between Microsoft Extension Logging and NLog Message Template Parser
 /// </summary>
 /// <remarks>
 /// Cannot trust the parameters received from Microsoft Extension Logging, as extra parameters can be injected
 /// </remarks>
 private static object[] CreateLogEventInfoParameters(NLogMessageParameterList messageParameters, MessageTemplateParameters messagetTemplateParameters, out List <MessageTemplateParameter> extraProperties)
 {
     if (AllParameterCorrectlyPositionalMapped(messageParameters, messagetTemplateParameters))
     {
         // Everything is mapped correctly, inject messageParameters directly as params-array
         extraProperties = null;
         var paramsArray = new object[messagetTemplateParameters.Count];
         for (int i = 0; i < paramsArray.Length; ++i)
         {
             paramsArray[i] = messageParameters[i].Value;
         }
         return(paramsArray);
     }
     else
     {
         // Resolves mismatch between the input from Microsoft Extension Logging TState and NLog Message Template Parser
         if (messagetTemplateParameters.IsPositional)
         {
             return(CreatePositionalLogEventInfoParameters(messageParameters, messagetTemplateParameters, out extraProperties));
         }
         else
         {
             return(CreateStructuredLogEventInfoParameters(messageParameters, messagetTemplateParameters, out extraProperties));
         }
     }
 }