private ABIExitCode InternalCompile(MetadataFile metadataFile, List<MetadataFile> commonMetadataFiles) { _logger.Info(""); _logger.Info("Compiling metadata file '{0}'", metadataFile.RelativePath); metadataFile.Result.Code = CompileMetadata(metadataFile, commonMetadataFiles); if (metadataFile.Result.Code != ABIExitCode.CompileCompleted && metadataFile.Result.Code != ABIExitCode.CompileCompletedWithWarnings) return metadataFile.Result.Code; return CompileTemplates(metadataFile); }
private ABIExitCode CompileTemplates(MetadataFile metadataFile) { _logger.Info("Templates process starting"); #region Template path string templatePath = Path.Combine(_options.TemplatePath, metadataFile.Phase, metadataFile.Source); if (!Directory.Exists(templatePath)) return ABIExitCode.ErrorTemplatePathSourceDirectoryNotExisting; string templatePathVersionSpecific = Path.Combine(templatePath, metadataFile.TargetSQLPlatformVersion); if (Directory.Exists(templatePathVersionSpecific)) { templatePath = templatePathVersionSpecific; } else { _logger.Debug("Template path for TargetSQLPlatformVersion '{0}' not found. Falling back to catch-all folder.", templatePathVersionSpecific); } _logger.Info("Using template path '{0}'", templatePath); #endregion #region Template search pattern string templateSearchPattern = metadataFile.Pattern; if (!string.IsNullOrEmpty(metadataFile.Source)) templateSearchPattern += "-" + metadataFile.Source; if (!string.IsNullOrEmpty(metadataFile.Implementation)) templateSearchPattern += "-" + metadataFile.Implementation; // BASE -> phase\pattern-source-implementation.version.* // EXTENDED -> phase\pattern-source-implementation[-extensions].version.* string baseTemplateSearchPattern = templateSearchPattern + "." + metadataFile.Version + ".*"; string extendedTemplateSearchPattern = templateSearchPattern + "-*." + metadataFile.Version + ".*"; _logger.Info("Template search patterns '{0}' '{1}'", baseTemplateSearchPattern, extendedTemplateSearchPattern); #endregion var templateFiles = Directory.EnumerateFiles(templatePath, baseTemplateSearchPattern) .Union(Directory.EnumerateFiles(templatePath, extendedTemplateSearchPattern)) .OrderBy((path) => path) .ToList(); _logger.Info("Template files found '{0}'", templateFiles.Count); _logger.Debug("Listing template files found"); foreach (string templateFile in templateFiles) _logger.Debug("\t'{0}'", templateFile.Replace(templatePath, string.Empty)); foreach (string templateFile in templateFiles) { #region Process template _logger.Info("Processing template file '{0}'", Path.GetFileName(templateFile)); _logger.Debug("Template file full path '{0}'", templateFile); _logger.Info("Creating context"); var renderMetadata = (Dictionary<string, object>)JsonHelper.Deserialize(metadataFile.Json.ToString()); _logger.Info("Parsing template file"); var template = Template.Parse(File.ReadAllText(templateFile)); _logger.Info("Rendering"); string outputFileContent = string.Empty; try { outputFileContent = template.Render(parameters: new RenderParameters { LocalVariables = Hash.FromDictionary(renderMetadata), RethrowErrors = true }); metadataFile.Result.Warnings += template.Errors.Count(); foreach (var error in template.Errors) _logger.Warn(error.Message); } catch (DotLiquid.Exceptions.LiquidException le) { _logger.Error(le, "Exception occurred during template rendering"); return ABIExitCode.ErrorTemplatePatternMissingInMetadata; } string outputPath = Path.Combine(_options.OutputPath, metadataFile.Phase); if (metadataFile.Phase.ToLower() == "load") outputPath = Path.Combine(outputPath, metadataFile.Pattern); outputPath = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(metadataFile.FullName)); _logger.Info("Using output path '{0}'", outputPath); string outputFile = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(metadataFile.FullName) + GetTemplateFileExtension(templateFile)); _logger.Info("Writing output file '{0}'", outputFile.Replace(_options.OutputPath, string.Empty)); _logger.Debug("Output file full path '{0}'", outputFile); Directory.CreateDirectory(outputPath); File.WriteAllText(outputFile, outputFileContent); metadataFile.Result.Artifacts += 1; #endregion } _logger.Info("Templates process completed"); if (metadataFile.Result.Warnings > 0) return ABIExitCode.CompileCompletedWithWarnings; return ABIExitCode.CompileCompleted; }
private ABIExitCode CompileTemplates(MetadataFile metadataFile) { _logger.Info("Templates process starting"); #region Template path string templatePath = Path.Combine(_options.TemplatePath, metadataFile.Phase, metadataFile.Source); if (!Directory.Exists(templatePath)) { return(ABIExitCode.ErrorTemplatePathSourceDirectoryNotExisting); } string templatePathVersionSpecific = Path.Combine(templatePath, metadataFile.TargetSQLPlatformVersion); if (Directory.Exists(templatePathVersionSpecific)) { templatePath = templatePathVersionSpecific; } else { _logger.Debug("Template path for TargetSQLPlatformVersion '{0}' not found. Falling back to catch-all folder.", templatePathVersionSpecific); } _logger.Info("Using template path '{0}'", templatePath); #endregion #region Template search pattern string templateSearchPattern = metadataFile.Pattern; if (!string.IsNullOrEmpty(metadataFile.Source)) { templateSearchPattern += "-" + metadataFile.Source; } if (!string.IsNullOrEmpty(metadataFile.Implementation)) { templateSearchPattern += "-" + metadataFile.Implementation; } // BASE -> phase\pattern-source-implementation.version.* // EXTENDED -> phase\pattern-source-implementation[-extensions].version.* string baseTemplateSearchPattern = templateSearchPattern + "." + metadataFile.Version + ".*"; string extendedTemplateSearchPattern = templateSearchPattern + "-*." + metadataFile.Version + ".*"; _logger.Info("Template search patterns '{0}' '{1}'", baseTemplateSearchPattern, extendedTemplateSearchPattern); #endregion var templateFiles = Directory.EnumerateFiles(templatePath, baseTemplateSearchPattern) .Union(Directory.EnumerateFiles(templatePath, extendedTemplateSearchPattern)) .OrderBy((path) => path) .ToList(); _logger.Info("Template files found '{0}'", templateFiles.Count); _logger.Debug("Listing template files found"); foreach (string templateFile in templateFiles) { _logger.Debug("\t'{0}'", templateFile.Replace(templatePath, string.Empty)); } foreach (string templateFile in templateFiles) { #region Process template _logger.Info("Processing template file '{0}'", Path.GetFileName(templateFile)); _logger.Debug("Template file full path '{0}'", templateFile); _logger.Info("Creating context"); var renderMetadata = (Dictionary <string, object>)JsonHelper.Deserialize(metadataFile.Json.ToString()); _logger.Info("Parsing template file"); var template = Template.Parse(File.ReadAllText(templateFile)); _logger.Info("Rendering"); string outputFileContent = string.Empty; try { outputFileContent = template.Render(parameters: new RenderParameters { LocalVariables = Hash.FromDictionary(renderMetadata), RethrowErrors = true }); metadataFile.Result.Warnings += template.Errors.Count(); foreach (var error in template.Errors) { _logger.Warn(error.Message); } } catch (DotLiquid.Exceptions.LiquidException le) { _logger.Error(le, "Exception occurred during template rendering"); return(ABIExitCode.ErrorTemplatePatternMissingInMetadata); } string outputPath = Path.Combine(_options.OutputPath, metadataFile.Phase); if (metadataFile.Phase.ToLower() == "load") { outputPath = Path.Combine(outputPath, metadataFile.Pattern); } outputPath = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(metadataFile.FullName)); _logger.Info("Using output path '{0}'", outputPath); string outputFile = Path.Combine(outputPath, Path.GetFileNameWithoutExtension(metadataFile.FullName) + Path.GetExtension(Path.GetFileNameWithoutExtension(templateFile))); _logger.Info("Writing output file '{0}'", outputFile.Replace(_options.OutputPath, string.Empty)); _logger.Debug("Output file full path '{0}'", outputFile); Directory.CreateDirectory(outputPath); File.WriteAllText(outputFile, outputFileContent); metadataFile.Result.Artifacts += 1; #endregion } _logger.Info("Templates process completed"); if (metadataFile.Result.Warnings > 0) { return(ABIExitCode.CompileCompletedWithWarnings); } return(ABIExitCode.CompileCompleted); }
private ABIExitCode CompileMetadata(MetadataFile metadataFile, List<MetadataFile> commonMetadataFiles) { _logger.Info("Metadata file process starting"); #region Metadata _logger.Info("Parsing metadata file"); metadataFile.ParseJson(); #endregion #region Common metadata foreach (var commonMetadata in commonMetadataFiles) { _logger.Info("Parsing common metadata file '{0}'", commonMetadata.RelativePath); commonMetadata.ParseJson(); _logger.Info("Merging common metadata file '{0}'", commonMetadata.RelativePath); metadataFile.Json.Merge(commonMetadata.Json, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); } #endregion #region Extended metadata _logger.Info("Looking for extended metadata"); _logger.Debug("Extended metadata file '{0}'", metadataFile.ExtendedRelativePath); if (!File.Exists(metadataFile.ExtendedFullName)) { _logger.Info("Extended metadata file not found"); } else { _logger.Info("Parsing extended metadata file '{0}'", metadataFile.ExtendedRelativePath); metadataFile.ParseExtendedJson(); _logger.Info("Merging extended metadata file '{0}'", metadataFile.ExtendedRelativePath); metadataFile.Json.Merge(metadataFile.ExtendedJson, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); } #endregion #region Analyze metadata _logger.Info("Analyzing metadata"); if (metadataFile.Json["ABI3"] == null) return ABIExitCode.ErrorABISectionMissingInMetadata; _logger.Info("Reading project directives"); _logger.Info("\tTargetSQLPlatformVersion: '{0}'", metadataFile.TargetSQLPlatformVersion); _logger.Info("Reading template directives"); if (metadataFile.Template == null) return ABIExitCode.ErrorTemplateSectionMissingInMetadata; _logger.Info("\tPhase: '{0}'", metadataFile.Phase); _logger.Info("\tPattern: '{0}'", metadataFile.Pattern); _logger.Info("\tSource: '{0}'", metadataFile.Source); _logger.Info("\tImplementation: '{0}'", metadataFile.Implementation); _logger.Info("\tVersion: '{0}'", metadataFile.Version); if (string.IsNullOrEmpty(metadataFile.Pattern)) return ABIExitCode.ErrorTemplatePatternMissingInMetadata; _logger.Debug(metadataFile.Json); _logger.Info("Resolving json references"); metadataFile.ResolveJsonReferences(); _logger.Info("Resolving plugin expressions"); metadataFile.ResolvePluginExpressions(); #endregion #region Compile metadata _logger.Info("Generating compiler metadata"); var compilerInfo = new { ABI3 = new { Compiler = new { CompilationDateTime = DateTime.Now.ToString("yyyyMMdd HH:mm:ss") } } }; JObject compilerMetadata = JObject.Parse(JsonConvert.SerializeObject(compilerInfo)); _logger.Info("Merging compiler metadata"); metadataFile.Json.Merge(compilerMetadata, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); #endregion #region Schema validation _logger.Info("Looking for $schema"); string fileSchema = (string)metadataFile.Json["$schema"]; if (string.IsNullOrEmpty(fileSchema)) { _logger.Info("$schema element not found, skipping validation"); } else { _logger.Info("$schema element found, attempting validation"); if (fileSchema.StartsWith("/")) fileSchema = "." + fileSchema; fileSchema = Path.GetFullPath(Path.Combine(_options.RootPath, fileSchema.Replace("/", "\\"))); _logger.Debug("$schema file path is '{0}'", fileSchema); if (!File.Exists(fileSchema)) { _logger.Warn("$schema file not found, cannot validate json metadata"); } else { var jsonSchema = JSchema.Parse(File.ReadAllText(fileSchema)); IList<ValidationError> errors; if (!metadataFile.Json.IsValid(jsonSchema, out errors)) { metadataFile.Result.Warnings += ProcessSchemaValidationErrors(errors); } else { _logger.Info("$schema is valid"); } } } #endregion _logger.Info("Metadata file process completed"); if (metadataFile.Result.Warnings > 0) return ABIExitCode.CompileCompletedWithWarnings; return ABIExitCode.CompileCompleted; }
private ABIExitCode CompileMetadata(MetadataFile metadataFile, List <MetadataFile> commonMetadataFiles) { _logger.Info("Metadata file process starting"); #region Metadata _logger.Info("Parsing metadata file"); metadataFile.ParseJson(); #endregion #region Common metadata foreach (var commonMetadata in commonMetadataFiles) { _logger.Info("Parsing common metadata file '{0}'", commonMetadata.RelativePath); commonMetadata.ParseJson(); _logger.Info("Merging common metadata file '{0}'", commonMetadata.RelativePath); metadataFile.Json.Merge(commonMetadata.Json, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); } #endregion #region Extended metadata _logger.Info("Looking for extended metadata"); _logger.Debug("Extended metadata file '{0}'", metadataFile.ExtendedRelativePath); if (!File.Exists(metadataFile.ExtendedFullName)) { _logger.Info("Extended metadata file not found"); } else { _logger.Info("Parsing extended metadata file '{0}'", metadataFile.ExtendedRelativePath); metadataFile.ParseExtendedJson(); _logger.Info("Merging extended metadata file '{0}'", metadataFile.ExtendedRelativePath); metadataFile.Json.Merge(metadataFile.ExtendedJson, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); } #endregion #region Analyze metadata _logger.Info("Analyzing metadata"); if (metadataFile.Json["ABI3"] == null) { return(ABIExitCode.ErrorABISectionMissingInMetadata); } _logger.Info("Reading project directives"); _logger.Info("\tTargetSQLPlatformVersion: '{0}'", metadataFile.TargetSQLPlatformVersion); _logger.Info("Reading template directives"); if (metadataFile.Template == null) { return(ABIExitCode.ErrorTemplateSectionMissingInMetadata); } _logger.Info("\tPhase: '{0}'", metadataFile.Phase); _logger.Info("\tPattern: '{0}'", metadataFile.Pattern); _logger.Info("\tSource: '{0}'", metadataFile.Source); _logger.Info("\tImplementation: '{0}'", metadataFile.Implementation); _logger.Info("\tVersion: '{0}'", metadataFile.Version); if (string.IsNullOrEmpty(metadataFile.Pattern)) { return(ABIExitCode.ErrorTemplatePatternMissingInMetadata); } _logger.Debug(metadataFile.Json); _logger.Info("Resolving json references"); metadataFile.ResolveJsonReferences(); _logger.Info("Resolving plugin expressions"); metadataFile.ResolvePluginExpressions(); #endregion #region Compiler metadata _logger.Info("Generating compiler metadata"); var compilerInfo = new { ABI3 = new { Compiler = new { CompilationDateTime = DateTime.Now.ToString("yyyyMMdd HH:mm:ss") } } }; JObject compilerMetadata = JObject.Parse(JsonConvert.SerializeObject(compilerInfo)); _logger.Info("Merging compiler metadata"); metadataFile.Json.Merge(compilerMetadata, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); #endregion #region Schema validation _logger.Info("Looking for $schema"); string fileSchema = (string)metadataFile.Json["$schema"]; if (string.IsNullOrEmpty(fileSchema)) { _logger.Info("$schema element not found, skipping validation"); } else { _logger.Info("$schema element found, attempting validation"); if (fileSchema.StartsWith("/")) { fileSchema = "." + fileSchema; } fileSchema = Path.GetFullPath(Path.Combine(_options.RootPath, fileSchema.Replace("/", "\\"))); _logger.Debug("$schema file path is '{0}'", fileSchema); if (!File.Exists(fileSchema)) { _logger.Warn("$schema file not found, cannot validate json metadata"); } else { var jsonSchema = JSchema.Parse(File.ReadAllText(fileSchema)); IList <ValidationError> errors; if (!metadataFile.Json.IsValid(jsonSchema, out errors)) { metadataFile.Result.Warnings += ProcessSchemaValidationErrors(errors); } else { _logger.Info("$schema is valid"); } } } #endregion _logger.Info("Metadata file process completed"); if (metadataFile.Result.Warnings > 0) { return(ABIExitCode.CompileCompletedWithWarnings); } return(ABIExitCode.CompileCompleted); }