Пример #1
0
        private void Build(EventSourceModel eventSourceModel, EventModel model)
        {
            if (model == null)
            {
                return;
            }
            if (model.MessageFormatter != null)
            {
                return;
            }

            var messageFormatBuilder = new ListBuilder($"{model.Name.GetHumanReadable()}", " ", " ");

            var nextArgumentIndex    = 1;
            var messageArgumentIndex = -1;

            foreach (var argument in model.GetAllArgumentsExpanded())
            {
                if (!argument.IsImplicit)
                {
                    messageFormatBuilder.Append($"{{{nextArgumentIndex - 1}}}");
                }
                if (argument.Name.Equals("message", StringComparison.InvariantCultureIgnoreCase))
                {
                    messageArgumentIndex = nextArgumentIndex;
                }
                nextArgumentIndex++;
            }

            model.MessageFormatter = messageArgumentIndex >= 0 ? $"{{{messageArgumentIndex - 1}}}" : messageFormatBuilder.ToString();
        }
        private void Build(Project project, EventSourceModel eventSource, EventModel model)
        {
            if (eventSource == null)
            {
                LogError($"{nameof(eventSource)} should not be null");
                return;
            }



            foreach (var argument in model.GetAllArguments())
            {
                if (TypeExtensions.IsComplexType(argument.Type) && (argument.TypeTemplate == null))
                {
                    var template = this.GetTypeTemplate(project, eventSource.TypeTemplates, argument);
                    if (template == null && eventSource.Settings.ImplicitTypeTemplates)
                    {
                        foreach (var implicitTypeTemplateNamespace in eventSource.Settings.ImplicitTypeTemplateNamespaces ?? new string[0])
                        {
                            if (argument.Type.StartsWith(implicitTypeTemplateNamespace))
                            {
                                var typeTemplate = new TypeTemplateModel()
                                {
                                    Arguments = GetTypeArguments(project, argument.Type).ToArray(),
                                    CLRType   = argument.Type,
                                    Name      = argument.Type
                                };
                                argument.TypeTemplate = typeTemplate;
                            }
                        }
                    }
                }
            }
        }
        public string Render(Project project, EventSourceModel eventSource, ExtensionsMethodModel model)
        {
            if (!eventSource.Settings.UseReferencedHelpers)
            {
                if (model.Type == "AsJson")
                {
                    var output = EventSourceExtensionMethodTemplate.Template_EXTENSION_ASJSON_DECLARATION;
                    output = output.Replace(EventSourceExtensionMethodTemplate.Template_EXTENSION_CLRTYPE,
                                            model.CLRType);

                    return(output.ToString());
                }
                else if (model.Type == "GetReplicaOrInstanceId")
                {
                    var output = EventSourceExtensionMethodTemplate
                                 .Template_EXTENSION_GETREPLICAORINSTANCEID_DECLARATION;
                    return(output.ToString());
                }
                else if (model.Type == "GetContentDigest")
                {
                    var output = EventSourceExtensionMethodTemplate.Template_EXTENSION_GETCONTENTDIGEST_DECLARATION;
                    return(output.ToString());
                }
                else if (model.Type == "GetMD5Hash")
                {
                    var output = EventSourceExtensionMethodTemplate.Template_EXTENSION_GETMD5HASH_DECLARATION;
                    return(output.ToString());
                }
            }
            return(null);
        }
        public void should_serialize_keywords_as_string_array()
        {
            var eventSourceModel = new EventSourceModel();

            eventSourceModel.Keywords = new KeywordModel[]
            {
                new KeywordModel()
                {
                    Name = "Keyword1", Value = 1
                },
                new KeywordModel()
                {
                    Name = "Keyword2", Value = 2
                },
                new KeywordModel()
                {
                    Name = "Keyword3", Value = 3
                },
            };

            var converters = new List <JsonConverter> {
                new KeywordModelJsonConverter()
            };
            var jsonFile = Newtonsoft.Json.JsonConvert.SerializeObject(eventSourceModel, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore,
                Converters        = converters
            });

            Console.WriteLine(jsonFile);

            jsonFile.Should().Be(@"{""Keywords"":[""Keyword1"",""Keyword2"",""Keyword3""]}");
        }
        public string Render(Project project, EventSourceModel eventSource, KeywordModel model)
        {
            var output = EventSourceKeywordTemplate.Template_KEYWORD;

            output = output.Replace(EventSourceKeywordTemplate.Template_KEYWORD_NAME, model.Name);
            output = output.Replace(EventSourceKeywordTemplate.Template_KEYWORD_INDEX, model.Value.ToString());

            return(output);
        }
        public string Render(Project project, EventSourceModel eventSource, EventTaskModel model)
        {
            var output = EventSourceEventTaskTemplate.Template_EVENTTASK;

            output = output.Replace(EventSourceEventTaskTemplate.Template_EVENTTASK_NAME, model.Name);
            output = output.Replace(EventSourceEventTaskTemplate.Template_EVENTTASK_INDEX, model.Value.ToString());

            return(output);
        }
Пример #7
0
        public void ExpandScopedEvents(EventSourceModel eventSource, LoggerModel model)
        {
            var scopeEvents = model.Events.Where(e => e.ReturnType == "System.IDisposable");

            var events = new List <EventModel>(model.Events);

            foreach (var eventModel in scopeEvents)
            {
                var eventBaseName = eventModel.Name;
                eventModel.Name   = $"Start{eventBaseName}";
                eventModel.OpCode = EventOpcode.Start;

                var eventTask = eventSource.GetEventTask(eventBaseName);
                if (eventTask == null)
                {
                    eventTask = eventSource.AddEventTask(eventBaseName);
                }
                eventModel.Task = eventTask;

                if (eventModel.ReturnType == "System.IDisposable")
                {
                    eventModel.IsScopedOperation = true;
                    eventModel.OperationName     = GetEventOperationName(eventModel);
                }

                var stopEvent = new EventModel()
                {
                    Arguments           = eventModel.Arguments.Select(a => (EventArgumentModel)a.Clone()).ToArray(),
                    Name                = $"Stop{eventBaseName}",
                    OpCode              = EventOpcode.Stop,
                    Task                = eventTask,
                    IsScopedOperation   = eventModel.IsScopedOperation,
                    OperationName       = eventModel.OperationName,
                    Keywords            = eventModel.Keywords,
                    HasComplexArguments = eventModel.HasComplexArguments,
                    CorrelatesTo        = eventModel,
                    ImplicitArguments   = eventModel.ImplicitArguments,
                    Level               = eventModel.Level,
                    MessageFormatter    = eventModel.MessageFormatter,
                };



                eventModel.CorrelatesTo = stopEvent;

                var index = events.IndexOf(eventModel);
                if (index == events.Count - 1)
                {
                    events.Add(stopEvent);
                }
                else
                {
                    events.Insert(events.IndexOf(eventModel) + 1, stopEvent);
                }
            }
            model.Events = events.ToArray();
        }
 private static void AddKnownExtension(EventSourceModel eventSource, string extensionName, string clrType)
 {
     if (!eventSource.Extensions.Any(ext => ext.CLRType == clrType && ext.Type == extensionName))
     {
         eventSource.Extensions.Add(new ExtensionsMethodModel()
         {
             CLRType = clrType, Type = extensionName
         });
     }
 }
 async Task IEventSourceRepository.AddEventStoreAsync(EventSourceModel eventSourceModel)
 {
     try
     {
         await
         mongoDatabase
         ?.GetCollection <EventSourceModel>("EventSource")
         ?.InsertOneAsync(eventSourceModel);
     }
     catch
     {
         throw;
     }
 }
Пример #10
0
        public IEnumerable <ProjectItem> Build(Project project, EventSourceModel model)
        {
            var outputs = new List <ProjectItem>();

            // TODO: Get all builders from project and allow all to build
            var eventSourceBuilders = new IEventSourceBuilder[]
            {
                new EventSourceKeywordBuilder(),
                new EventSourceLoggersBuilder(),
                new EventSourceEventsBuilder(),
                new EventSourceExtensionsMethodsBuilder(),
            };

            foreach (var builder in eventSourceBuilders)
            {
                builder.Build(project, model);
            }
            return(outputs);
        }
Пример #11
0
        private void Build(Project project, EventSourceModel eventSource, EventModel model)
        {
            if (eventSource == null)
            {
                LogError($"{nameof(eventSource)} should not be null");
                return;
            }

            foreach (var argument in model.GetAllArguments())
            {
                if (TypeExtensions.IsComplexType(argument.Type) && (argument.TypeTemplate == null))
                {
                    var template = this.GetTypeTemplate(project, eventSource.TypeTemplates, argument);
                    if (template != null)
                    {
                        argument.TypeTemplate = template;
                    }
                }
            }
        }
        private static void AddKnownExtensions(EventSourceModel eventSource, EventArgumentModel argument)
        {
            if (argument.TypeTemplate != null)
            {
                foreach (var templateArgument in argument.GetTypeTemplateArguments())
                {
                    AddKnownExtensions(eventSource, templateArgument);
                }
            }

            if (argument.Assignment == null)
            {
                return;
            }
            var templateCLRType = argument.AssignedCLRType ?? argument.TemplatedParentArgument?.CLRType ?? argument?.TemplatedParentArgument?.Type ?? argument.Type;

            if (argument.Assignment.Contains("$this.AsJson()"))
            {
                AddKnownExtension(eventSource, "AsJson", templateCLRType);
                return;
            }

            if (argument.Assignment.Contains("$this.GetReplicaOrInstanceId()"))
            {
                AddKnownExtension(eventSource, "GetReplicaOrInstanceId", templateCLRType);
                return;
            }

            if (argument.Assignment.Contains("$this.GetContentDigest("))
            {
                AddKnownExtension(eventSource, "GetContentDigest", templateCLRType);
                AddKnownExtension(eventSource, "GetMD5Hash", templateCLRType);
                return;
            }
            if (argument.Assignment.Contains("$this.GetMD5Hash("))
            {
                AddKnownExtension(eventSource, "GetMD5Hash", templateCLRType);
                return;
            }
        }
Пример #13
0
        private void AddDefaultEventSource(Project project)
        {
            var defaultEventSourceProjectItem = project.ProjectItems.GetDefaultEventSourceProjectItem();

            if (defaultEventSourceProjectItem != null)
            {
                var defaultEventSource = new EventSourceModel()
                {
                    Namespace     = defaultEventSourceProjectItem.RootNamespace,
                    Name          = "DefaultEventSource",
                    ProviderName  = $"{defaultEventSourceProjectItem.RootNamespace.Replace('.', '-')}-Default",
                    ClassName     = "DefaultEventSource",
                    TypeTemplates = new TypeTemplateModel[]
                    {
                        new TypeTemplateModel()
                        {
                            Name      = "Exception",
                            CLRType   = "System.Exception",
                            Arguments = new EventArgumentModel[]
                            {
                                new EventArgumentModel("message", "string", "$this.Message"),
                                new EventArgumentModel("source", "string", "$this.Source"),
                                new EventArgumentModel("exceptionTypeName", "string", "$this.GetType().FullName"),
                                new EventArgumentModel("exception", "string", "$this.AsJson()"),
                            }
                        }
                    }
                };
                var eventSourceLoggers = new List <LoggerModel>();
                var startId            = 1000;
                foreach (var logger in project.Loggers)
                {
                    eventSourceLoggers.Add(new LoggerModel()
                    {
                        Name              = logger.Name,
                        StartId           = startId,
                        ImplicitArguments = new EventArgumentModel[]
                        {
                            new EventArgumentModel()
                            {
                                Name = "autogenerated", Type = "bool"
                            },
                            new EventArgumentModel()
                            {
                                Name = "machineName", Type = "string", Assignment = "Environment.MachineName"
                            },
                        }
                    });
                    startId += 1000;
                }
                defaultEventSource.Loggers = eventSourceLoggers.ToArray();

                // TODO: Move this to a renderer
                var sourceFileName         = System.IO.Path.GetFileName(defaultEventSourceProjectItem.Name);
                var implementationFileName = $"{System.IO.Path.GetFileNameWithoutExtension(defaultEventSourceProjectItem.Name)}.cs";
                var fileRelativePath       = defaultEventSourceProjectItem.Name.RemoveFromStart(project.ProjectBasePath + System.IO.Path.DirectorySeparatorChar).Replace(sourceFileName, implementationFileName);

                defaultEventSource.Include        = fileRelativePath;
                defaultEventSource.SourceFilePath = defaultEventSourceProjectItem.Include;

                defaultEventSourceProjectItem.Content = defaultEventSource;
                //var newProjectItem = new ProjectItem(
                //    type: ProjectItemType.DefaultGeneratedEventSourceDefinition,
                //    name: defaultEventSourceProjectItem.Name,
                //    content: jsonFile,
                //    include: defaultEventSourceProjectItem.Include)
                //{
                //    RootNamespace = defaultEventSourceProjectItem.RootNamespace
                //};

                //project.AddProjectItem(newProjectItem);
            }
        }
Пример #14
0
        private string RenderMethod(Project project, ProjectItem <LoggerModel> loggerProjectItem, EventSourceModel eventSourceModel, EventModel model)
        {
            var eventName = model.Name;

            var output = LoggerImplementationEventMethodTemplate.Template_LOGGER_METHOD;

            output = output.Replace(LoggerImplementationEventMethodTemplate.Variable_LOGGER_METHOD_NAME, eventName);
            output = output.Replace(LoggerImplementationEventMethodTemplate.Variable_EVENTSOURCE_CLASS_NAME, eventSourceModel.ClassName);
            output = output.Replace(LoggerImplementationEventMethodTemplate.Variable_LOGGER_METHOD_RETURNTYPE, model.ReturnType ?? "void");

            var methodArguments = new EventArgumentsListBuilder(
                RenderMethodArgument, LoggerImplementationEventMethodTemplate.Template_LOGGER_IMPLICIT_ARGUMENTS_METHOD_DECLARATION_DELIMITER);

            foreach (var argument in model.GetAllNonImplicitArguments())
            {
                methodArguments.Append(argument);
            }
            output = output.Replace(LoggerImplementationEventMethodTemplate.Variable_LOGGER_METHOD_ARGUMENTS, methodArguments.ToString());

            var methodImplementation = new StringBuilder();
            var renderers            = new ILoggerImplementationMethodRenderer[]
            {
                new LoggerImplementationMethodCallEventSourceEventRenderer(),
            }.Union(project.GetExtensions <ILoggerImplementationMethodRenderer>(eventSourceModel.Settings?.Modules ?? new string[0])).ToArray();

            foreach (var renderer in renderers)
            {
                PassAlongLoggers(renderer as IWithLogging);
                methodImplementation.Append(renderer.Render(project, loggerProjectItem, model));
            }
            output = output.Replace(LoggerImplementationEventMethodTemplate.Variable_LOGGER_METHOD_IMPLEMENTATION, methodImplementation.ToString());

            return(output);
        }
Пример #15
0
 public async Task AddAsync(EventModel eventModel)
 {
     var eventSourceModel = new EventSourceModel(eventModel, _httpContextAccessor.HttpContext.User.Identity.Name ?? "");
     await _eventSourceRepository.AddAsync(eventSourceModel);
 }
Пример #16
0
        public async Task AddAsync(EventSourceModel eventSourceModel)
        {
            await _models.AddAsync(eventSourceModel);

            _db.SaveChanges();
        }
Пример #17
0
 public string Render(Project project, EventSourceModel eventSource, EventModel model)
 {
     return(Render(model));
 }
Пример #18
0
 private string RenderStartOperation(Project project, ProjectItem <LoggerModel> loggerProjectItem, EventSourceModel eventSourceModel, EventModel model)
 {
     return(RenderMethod(project, loggerProjectItem, eventSourceModel, model));
 }