Ejemplo n.º 1
0
        public IActionResult Code(string org, string service)
        {
            List <AltinnCoreFile> altinnCoreFiles = _repository.GetImplementationFiles(org, service);
            CodeCompilationResult compResult      = _compilation.CreateServiceAssembly(org, service, false, null, false);

            // Check to see if any of the files has compiliation errors or warnings
            foreach (AltinnCoreFile coreFile in altinnCoreFiles)
            {
                if (compResult.CompilationInfo != null &&
                    compResult.CompilationInfo.Exists(c => c.FileName.ToLower().Equals(coreFile.FileName.ToLower()) && c.Severity.Equals("Error")))
                {
                    coreFile.FileStatus = ServiceLibrary.Enums.AltinnCoreFileStatusType.Error;
                }
                else if (compResult.CompilationInfo != null &&
                         compResult.CompilationInfo.Exists(c => c.FileName.ToLower().Equals(coreFile.FileName.ToLower()) && c.Severity.Equals("Warning")))
                {
                    coreFile.FileStatus = ServiceLibrary.Enums.AltinnCoreFileStatusType.Warning;
                }
                else
                {
                    coreFile.FileStatus = ServiceLibrary.Enums.AltinnCoreFileStatusType.OK;
                }
            }

            string filePath = _settings.GetModelPath(org, service, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext)) + _settings.ServiceModelFileName;

            ViewBag.HasDataModel      = System.IO.File.Exists(filePath);
            ViewBag.CompilationResult = compResult;
            return(View(altinnCoreFiles));
        }
Ejemplo n.º 2
0
        private static IEnumerable <ServiceStatusViewModel.UserMessage> CompilationUserMessages(
            CodeCompilationResult compilation)
        {
            if (compilation == null)
            {
                yield return(ServiceStatusViewModel.UserMessage.Error("Kompileringsresultat mangler"));

                yield break;
            }

            var errorFiles   = NiceSeparatedFileList(compilation.CompilationInfo, c => c.IsError());
            var warningFiles = NiceSeparatedFileList(compilation.CompilationInfo, c => c.IsWarning());

            if (!compilation.Succeeded || !string.IsNullOrWhiteSpace(errorFiles))
            {
                var failed = ServiceStatusViewModel.UserMessage.Error("Tjenesten kompilerer ikke");
                if (!string.IsNullOrWhiteSpace(errorFiles))
                {
                    failed.Details.Add("Filer", errorFiles);
                }

                yield return(failed);
            }
            else if (!string.IsNullOrWhiteSpace(warningFiles))
            {
                var warning = ServiceStatusViewModel.UserMessage.Warning("Advarsler ved kompilering");
                warning.Details.Add("Filer", warningFiles);
                yield return(warning);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Compiles the implementation files.
        /// </summary>
        /// <param name="org">The organization code for the requested service.</param>
        /// <param name="service">The service short name for the requested service.</param>
        /// <returns>A View with the result.</returns>
        public IActionResult Compile(string org, string service)
        {
            CodeCompilationResult compResult = _compilation.CreateServiceAssembly(org, service, false, null, false);

            ViewBag.CompilationResult = compResult;
            return(PartialView("CompilationResult"));
        }
Ejemplo n.º 4
0
        public IActionResult Code(string org, string service)
        {
            List <AltinnCoreFile> altinnCoreFiles = _repository.GetImplementationFiles(org, service);
            CodeCompilationResult compResult      = _compilation.CreateServiceAssembly(org, service, null, false);

            // Check to see if any of the files has compiliation errors or warnings
            foreach (AltinnCoreFile coreFile in altinnCoreFiles)
            {
                if (compResult.CompilationInfo != null &&
                    compResult.CompilationInfo.Exists(c => c.FileName.ToLower().Equals(coreFile.FileName.ToLower()) && c.Severity.Equals("Error")))
                {
                    coreFile.FileStatus = AltinnCore.ServiceLibrary.Enums.AltinnCoreFileStatusType.Error;
                }
                else if (compResult.CompilationInfo != null &&
                         compResult.CompilationInfo.Exists(c => c.FileName.ToLower().Equals(coreFile.FileName.ToLower()) && c.Severity.Equals("Warning")))
                {
                    coreFile.FileStatus = AltinnCore.ServiceLibrary.Enums.AltinnCoreFileStatusType.Warning;
                }
                else
                {
                    coreFile.FileStatus = AltinnCore.ServiceLibrary.Enums.AltinnCoreFileStatusType.OK;
                }
            }

            ViewBag.CompilationResult = compResult;
            return(View(altinnCoreFiles));
        }
        /// <summary>
        /// The invokes the Component async.
        /// </summary>
        /// <param name="org"> The org. </param>
        /// <param name="service"> The service. </param>
        /// <param name="edition"> The edition. </param>
        /// <param name="serviceMetadata"> The service Metadata. </param>
        /// <param name="viewMetadatas">The view metadata list</param>
        /// <param name="codeCompilationResult"> The code Compilation Result. </param>
        /// <returns> The <see cref="Task"/>.  </returns>
        public async Task <IViewComponentResult> InvokeAsync(
            string org,
            string service,
            string edition,
            ServiceMetadata serviceMetadata             = null,
            IList <ViewMetadata> viewMetadata           = null,
            CodeCompilationResult codeCompilationResult = null)
        {
            ServiceEditionIdentifier serviceEdition = new ServiceEditionIdentifier {
                Org = org, Service = service, Edition = edition
            };
            CodeCompilationResult compilation = null;

            if (string.IsNullOrEmpty(_generalSettings.RuntimeMode) || !_generalSettings.RuntimeMode.Equals("ServiceContainer"))
            {
                compilation = codeCompilationResult ?? await Compile(serviceEdition);


                var metadata = serviceMetadata ?? await GetServiceMetadata(serviceEdition);

                EditionStatusViewModel model = CreateModel(serviceEdition, compilation, metadata);

                return(View(model));
            }

            return(View(new EditionStatusViewModel()));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Invokes the Component async.
        /// </summary>
        /// <param name="org">Unique identifier of the organisation responsible for the app.</param>
        /// <param name="app">Application identifier which is unique within an organisation.</param>
        /// <param name="serviceMetadata">The service metadata.</param>
        /// <param name="codeCompilationResult">The code compilation result.</param>
        /// <returns>The <see cref="Task"/>.</returns>
        public async Task <IViewComponentResult> InvokeAsync(
            string org,
            string app,
            ServiceMetadata serviceMetadata             = null,
            CodeCompilationResult codeCompilationResult = null)
        {
            var serviceIdentifier = new ServiceIdentifier {
                Org = org, Service = app
            };
            var compilation = codeCompilationResult ?? await CompileHelper.CompileService(_compilation, serviceIdentifier);

            var metadata = serviceMetadata ?? await GetServiceMetadata(serviceIdentifier);

            var model = CreateModel(serviceIdentifier, compilation, metadata);

            return(View(model));
        }
Ejemplo n.º 7
0
        private static IEnumerable <CompilationInfo> FilterCompilationInfos(CodeCompilationResult codeCompilationResult)
        {
            if (codeCompilationResult?.CompilationInfo == null || codeCompilationResult.CompilationInfo.Any() == false)
            {
                return(new CompilationInfo[0]);
            }

            var relevante =
                codeCompilationResult.CompilationInfo.Where(RelevantCompilationInfo)
                .GroupBy(c => c.Severity + c.FileName + c.Info)
                .Select(c => c.First())
                .OrderBy(c => c.Severity)
                .ThenBy(c => c.FileName)
                .ThenBy(c => c.Info);

            return(relevante);
        }
Ejemplo n.º 8
0
        private ServiceStatusViewModel CreateModel(
            ServiceIdentifier serviceIdentifier,
            CodeCompilationResult compilationResult,
            ServiceMetadata serviceMetadata)
        {
            var userMessages =
                CompilationUserMessages(compilationResult)
                .Union(ServiceMetadataMessages(serviceMetadata))
                .ToList();

            userMessages.Sort();

            return(new ServiceStatusViewModel
            {
                ServiceIdentifier = serviceIdentifier,
                CodeCompilationMessages = FilterCompilationInfos(compilationResult).ToList(),
                UserMessages = userMessages,
            });
        }
Ejemplo n.º 9
0
        private EditionStatusViewModel CreateModel(
            ServiceEditionIdentifier serviceEditionIdentifier,
            CodeCompilationResult compilationResult,
            ServiceMetadata serviceMetadata,
            IEnumerable <ViewMetadata> viewMetadatas)
        {
            var userMessages =
                CompilationUserMessages(compilationResult)
                .Union(ServiceMetadataMessages(serviceMetadata, viewMetadatas))
                .ToList();

            userMessages.Sort();

            return(new EditionStatusViewModel
            {
                EditionIdentifier = serviceEditionIdentifier,
                CodeCompilationMessages = FilterCompilationInfos(compilationResult).ToList(),
                UserMessages = userMessages
            });
        }
Ejemplo n.º 10
0
        /// <summary>
        /// The invokes the Component async.
        /// </summary>
        /// <param name="org"> The org. </param>
        /// <param name="service"> The service. </param>
        /// <param name="edition"> The edition. </param>
        /// <param name="serviceMetadata"> The service Metadata. </param>
        /// <param name="viewMetadatas">The view metadata list</param>
        /// <param name="codeCompilationResult"> The code Compilation Result. </param>
        /// <returns> The <see cref="Task"/>.  </returns>
        public async Task <IViewComponentResult> InvokeAsync(
            string org,
            string service,
            string edition,
            ServiceMetadata serviceMetadata             = null,
            IList <ViewMetadata> viewMetadata           = null,
            CodeCompilationResult codeCompilationResult = null)
        {
            var serviceEdition = new ServiceEditionIdentifier {
                Org = org, Service = service, Edition = edition
            };
            var compilation = codeCompilationResult ?? await Compile(serviceEdition);

            var metadata = serviceMetadata ?? await GetServiceMetadata(serviceEdition);

            var views = viewMetadata ?? await GetViewMetadata(serviceEdition);

            var model = CreateModel(serviceEdition, compilation, metadata, views);

            return(View(model));
        }
Ejemplo n.º 11
0
        public async Task <IActionResult> Compile(string org, string app)
        {
            if (string.IsNullOrWhiteSpace(org) || string.IsNullOrWhiteSpace(app))
            {
                return(BadRequest("Org or app not supplied"));
            }

            try
            {
                ServiceIdentifier serviceIdentifier = new ServiceIdentifier {
                    Org = org, Service = app
                };
                CodeCompilationResult compileResult = await CompileHelper.CompileService(_compilation, serviceIdentifier);

                return(Ok(compileResult));
            }
            catch (Exception ex)
            {
                _logger.LogError($"Compiling services files for org: {org}, app: {app} failed with message: {ex.Message}");
                return(StatusCode(500, ex.Message));
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Creates the service assembly for a service
        /// </summary>
        /// <param name="org">The Organization code for the service owner</param>
        /// <param name="service">The service code for the current service</param>
        /// <param name="edition">The edition code for the current service</param>
        /// <param name="outputLocation">The directory where the resulting assembly should be saved</param>
        /// <param name="loadAssemblyContext">Defines if assembly should be loaded in context</param>
        /// <returns>The assembly name</returns>
        public CodeCompilationResult CreateServiceAssembly(string org, string service, string edition, string outputLocation = null, bool loadAssemblyContext = true)
        {
            CodeCompilationResult compilationResult = new CodeCompilationResult()
            {
                CompileStarted = DateTime.Now
            };
            string assemblykey = org + "_" + service + "_" + edition;

            List <AltinnCoreFile> implementationFiles = _repository.GetImplementationFiles(org, service, edition);

            DateTime lastChanged = new DateTime(2000, 01, 01);

            foreach (AltinnCoreFile file in implementationFiles)
            {
                if (file.LastChanged > lastChanged)
                {
                    lastChanged = file.LastChanged;
                }
            }

            if (_assemblyNames.ContainsKey(assemblykey) && _assemblyNames[assemblykey].CompileStarted > lastChanged && string.IsNullOrWhiteSpace(outputLocation))
            {
                compilationResult = _assemblyNames[assemblykey];
                return(compilationResult);
            }

            SyntaxTree[]             syntaxTrees = GetSyntaxTrees(org, service, edition);
            List <MetadataReference> references  = new List <MetadataReference>();
            Assembly root = Assembly.GetEntryAssembly();

            string assemblyName = Path.GetRandomFileName();

            MetadataReferenceFeature referenceFeature = new MetadataReferenceFeature();

            _partManager.PopulateFeature(referenceFeature);

            CSharpCompilation compilation = CSharpCompilation.Create(
                assemblyName,
                syntaxTrees: syntaxTrees,
                references: referenceFeature.MetadataReferences,
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            using (var pdbMs = new MemoryStream())
                using (var ms = new MemoryStream())
                {
                    EmitResult result;
                    Stopwatch  stopWatch = new Stopwatch();
                    stopWatch.Start();
                    if (!string.IsNullOrEmpty(outputLocation))
                    {
                        result = compilation.Emit(outputLocation + assemblyName + ".dll", outputLocation + assemblyName + ".pdb");
                    }
                    else
                    {
                        result = compilation.Emit(ms, pdbMs);
                    }

                    stopWatch.Stop();
                    compilationResult.TimeUsed = stopWatch.Elapsed;

                    compilationResult.CompilationInfo = new List <CompilationInfo>();
                    foreach (Diagnostic diag in result.Diagnostics)
                    {
                        // TODO: Decide how to handle this special CS1701 we get
                        if (!diag.Id.Equals("CS1701"))
                        {
                            var compInfo = new CompilationInfo
                            {
                                Info         = diag.GetMessage(),
                                FilePath     = diag.Location.SourceTree.FilePath,
                                FileName     = System.IO.Path.GetFileName(diag.Location.SourceTree.FilePath),
                                Severity     = diag.Severity.ToString(),
                                Code         = diag.Id,
                                WarningLevel = diag.WarningLevel,
                                LineNumber   = diag.Location.GetLineSpan().StartLinePosition.Line + 1
                            };

                            if (diag.Severity.Equals(DiagnosticSeverity.Warning))
                            {
                                compilationResult.Warnings++;
                            }
                            else if (diag.Severity.Equals(DiagnosticSeverity.Error))
                            {
                                compilationResult.Errors++;
                            }

                            compilationResult.CompilationInfo.Add(compInfo);
                        }
                    }

                    if (!result.Success)
                    {
                        LogEmitResult(result);
                    }
                    else
                    {
                        compilationResult.AssemblyName = compilation.AssemblyName;
                        compilationResult.Succeeded    = true;

                        if (string.IsNullOrEmpty(outputLocation) && loadAssemblyContext)
                        {
                            ms.Seek(0, SeekOrigin.Begin);
                            pdbMs.Seek(0, SeekOrigin.Begin);
                            AssemblyLoadContext.Default.LoadFromStream(ms, pdbMs);
                            ms.Seek(0, SeekOrigin.Begin);
                            MetadataReference newReference = MetadataReference.CreateFromStream(ms);
                            if (_roslynCompilation.ServiceReferences.ContainsKey(assemblykey))
                            {
                                _roslynCompilation.ServiceReferences.Remove(assemblykey);
                            }

                            _roslynCompilation.ServiceReferences.Add(assemblykey, newReference);

                            if (_assemblyNames.ContainsKey(assemblykey))
                            {
                                _assemblyNames.Remove(assemblykey);
                            }

                            _assemblyNames.Add(assemblykey, compilationResult);
                        }

                        return(compilationResult);
                    }
                }

            return(compilationResult);
        }