private static void ProcessError(ValidationBehavior validationBehavior, string errorMessage, ValidationResults log) { ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;; switch (validationBehavior) { case ValidationBehavior.Enforce: // throw an exception log.AddResult(new ValidationResult(true, errorMessage)); throw new InvalidPackageException(errorMessage); case ValidationBehavior.LogError: // log an error log.AddResult(new ValidationResult(true, errorMessage)); break; case ValidationBehavior.LogWarning: // log a warning log.AddResult(new ValidationResult(false, errorMessage)); break; case ValidationBehavior.None: // do nothing break; } }
private static void CheckPackageFiles(ReadOnlyCollection <string> packageFilePaths, Dictionary <string, bool> manifestFilePaths, ValidationResults log, PackageValidatorSettings packageValidatorSettings) { ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;; // Check all of the files in the package to make sure they are referenced in the manifest. foreach (string filePath in packageFilePaths) { string fileExtension = Path.GetExtension(filePath); if (filePath != "imsmanifest.xml" && string.Compare(fileExtension, ".xsd", StringComparison.OrdinalIgnoreCase) != 0 && string.Compare(fileExtension, ".dtd", StringComparison.OrdinalIgnoreCase) != 0 && !manifestFilePaths.ContainsKey(filePath)) { ProcessError(packageValidatorSettings.ScormRecommendationValidation, string.Format(CultureInfo.CurrentCulture, ValidatorResources.OrphanedFile, filePath), log); } } }
private static void CheckManifestFiles(ReadOnlyCollection <string> packageFilePaths, Dictionary <string, bool> manifestFilePaths, ValidationResults log, PackageValidatorSettings packageValidatorSettings) { ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;; // Check all of the files in the manifest to make sure they are referenced in the package. Dictionary <string, bool> packageFileDictionary = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase); foreach (string filePath in packageFilePaths) { packageFileDictionary.Add(filePath, true); } foreach (string filePath in manifestFilePaths.Keys) { if (!packageFileDictionary.ContainsKey(filePath)) { ProcessError(packageValidatorSettings.ScormRequirementValidation, string.Format(CultureInfo.CurrentCulture, ValidatorResources.FileMissing, filePath), log); } } }
internal static void Validate(PackageValidatorSettings packageValidatorSettings, PackageReader packageReader, bool logReplacement, ValidationResults log, ManifestReaderSettings manifestSettings, bool fixLrmViolations, out ManifestReader manifestReader) { ValidatorResources.Culture = Thread.CurrentThread.CurrentCulture;; if (packageReader == null) { throw new ArgumentNullException("packageReader"); } ValidationResults manifestLog; XPathNavigator manifest; packageReader.CreateManifestNavigator(packageValidatorSettings.LrmRequirementValidation, fixLrmViolations, out manifestLog, out manifest); if (manifestLog != null) { foreach (ValidationResult result in manifestLog.Results) { log.AddResult(result); } } manifestReader = new ManifestReader(packageReader, manifestSettings, packageValidatorSettings, logReplacement, log, manifest); if (packageValidatorSettings.MlcRequirementValidation != ValidationBehavior.None) { int activityCount = 0; if (manifestReader.Organizations.Count > 0) { foreach (OrganizationNodeReader nodeReader in manifestReader.Organizations) { activityCount += nodeReader.Activities.Count; } if (activityCount == 0) { ProcessError(packageValidatorSettings.MlcRequirementValidation, ValidatorResources.MlcViolationActivityMissing, log); } } else { ProcessError(packageValidatorSettings.MlcRequirementValidation, ValidatorResources.MlcViolationOrganizationMissing, log); } } ManifestValidator.Validate(manifestReader); // Add all files in the manifest to a Dictionary Dictionary <string, bool> manifestFilePaths = new Dictionary <string, bool>(StringComparer.OrdinalIgnoreCase); foreach (ResourceNodeReader r in manifestReader.Resources.Values) { foreach (FileNodeReader fileNode in r.Files) { if (!fileNode.Location.IsAbsoluteUri) { // get the path component of the Location property, and URL decode the string // so it is a proper file path. string path = System.Web.HttpUtility.UrlDecode(RemoveQueryAndAnchor(fileNode.Location.OriginalString)); if (!manifestFilePaths.ContainsKey(path)) { manifestFilePaths.Add(path, true); } } } } ReadOnlyCollection <string> packageFilePaths = packageReader.GetFilePaths(); CheckManifestFiles(packageFilePaths, manifestFilePaths, log, packageValidatorSettings); CheckPackageFiles(packageFilePaths, manifestFilePaths, log, packageValidatorSettings); }