diff --git a/src/main.ts b/src/main.ts index d939cd45..9748ed60 100644 --- a/src/main.ts +++ b/src/main.ts @@ -92,12 +92,11 @@ const argv = args.argv; async function readOptionsFile( optionsFile: string ): Promise { - const validationOptions: ValidationOptions = await readJsonUnchecked( - optionsFile - ); - if (!validationOptions) { + const validationOptionsObject = await readJsonUnchecked(optionsFile); + if (!validationOptionsObject) { return new ValidationOptions(); } + const validationOptions = ValidationOptions.fromJson(validationOptionsObject); return validationOptions; } diff --git a/src/validation/ContentDataValidator.ts b/src/validation/ContentDataValidator.ts index eadfa128..73ecf9fe 100644 --- a/src/validation/ContentDataValidator.ts +++ b/src/validation/ContentDataValidator.ts @@ -15,6 +15,8 @@ import { Content } from "3d-tiles-tools"; import { IoValidationIssues } from "../issues/IoValidationIssue"; import { ContentValidationIssues } from "../issues/ContentValidationIssues"; import { ValidationOptionChecks } from "./ValidationOptionChecks"; +import { ValidationIssueFilters } from "./ValidationIssueFilters"; +import { ValidationIssueSeverity } from "./ValidationIssueSeverity"; /** * A class for validation of the data that is pointed to by a `content.uri`. @@ -183,9 +185,29 @@ export class ContentDataValidator { context.addIssue(issue); } } else { + const includedSeverities: ValidationIssueSeverity[] = []; + if ( + options.contentValidationIssueSeverity == ValidationIssueSeverity.ERROR + ) { + includedSeverities.push(ValidationIssueSeverity.ERROR); + } else if ( + options.contentValidationIssueSeverity == + ValidationIssueSeverity.WARNING + ) { + includedSeverities.push(ValidationIssueSeverity.WARNING); + includedSeverities.push(ValidationIssueSeverity.ERROR); + } else { + includedSeverities.push(ValidationIssueSeverity.INFO); + includedSeverities.push(ValidationIssueSeverity.WARNING); + includedSeverities.push(ValidationIssueSeverity.ERROR); + } + const filter = ValidationIssueFilters.byIncludedSeverities( + ...includedSeverities + ); + const filteredDerivedResult = derivedResult.filter(filter); const issue = ContentValidationIssues.createForContent( contentUri, - derivedResult + filteredDerivedResult ); if (issue) { context.addIssue(issue); diff --git a/src/validation/ValidationOptions.ts b/src/validation/ValidationOptions.ts index d257c6a0..a182992a 100644 --- a/src/validation/ValidationOptions.ts +++ b/src/validation/ValidationOptions.ts @@ -1,3 +1,5 @@ +import { ValidationIssueSeverity } from "./ValidationIssueSeverity"; + /** * A class describing the options for a validator within * a `ValidationContext` @@ -14,6 +16,12 @@ export class ValidationOptions { */ private _validateContentData: boolean; + /** + * The severity of content validation issues that should be + * included in the results. + */ + private _contentValidationIssueSeverity: ValidationIssueSeverity; + /** * The content types that are included in the validation. */ @@ -37,6 +45,7 @@ export class ValidationOptions { */ constructor() { this._validateContentData = true; + this._contentValidationIssueSeverity = ValidationIssueSeverity.INFO; this._includeContentTypes = undefined; this._excludeContentTypes = undefined; } @@ -54,6 +63,23 @@ export class ValidationOptions { this._validateContentData = value; } + /** + * The severity of content validation issues that should + * be included in the result. + * + * By default, this will be `INFO`, meaning that all content + * validation issues will be included. It can be set to + * `WARNING`, to include all `ERROR` and `WARNING` issues, + * or to `ERROR` to only include `ERROR` issues. + */ + get contentValidationIssueSeverity(): ValidationIssueSeverity { + return this._contentValidationIssueSeverity; + } + + set contentValidationIssueSeverity(value: ValidationIssueSeverity) { + this._contentValidationIssueSeverity = value; + } + /** * The content types that should be included. * diff --git a/src/validation/Validators.ts b/src/validation/Validators.ts index d8a17f11..4c1de991 100644 --- a/src/validation/Validators.ts +++ b/src/validation/Validators.ts @@ -458,6 +458,33 @@ export class Validators { ); } + // Register an empty validator for NGA_gpm + { + const emptyValidator = Validators.createEmptyValidator(); + const override = false; + ExtendedObjectsValidators.register("NGA_gpm", emptyValidator, override); + } + // Register an empty validator for MAXAR_extent + { + const emptyValidator = Validators.createEmptyValidator(); + const override = false; + ExtendedObjectsValidators.register( + "MAXAR_extent", + emptyValidator, + override + ); + } + // Register an empty validator for MAXAR_grid + { + const emptyValidator = Validators.createEmptyValidator(); + const override = false; + ExtendedObjectsValidators.register( + "MAXAR_grid", + emptyValidator, + override + ); + } + Validators._registeredExtensionValidators = true; } } diff --git a/src/validation/gltfExtensions/GltfDataReader.ts b/src/validation/gltfExtensions/GltfDataReader.ts index 4ffc1112..30257628 100644 --- a/src/validation/gltfExtensions/GltfDataReader.ts +++ b/src/validation/gltfExtensions/GltfDataReader.ts @@ -1,5 +1,7 @@ -import { JSONDocument } from "@gltf-transform/core"; import { Document } from "@gltf-transform/core"; +import { JSONDocument } from "@gltf-transform/core"; +import { Logger } from "@gltf-transform/core"; +import { Verbosity } from "@gltf-transform/core"; import { BinaryBufferData } from "3d-tiles-tools"; import { BinaryBufferDataResolver } from "3d-tiles-tools"; @@ -155,6 +157,8 @@ export class GltfDataReader { ): Promise { try { const io = await GltfTransform.getIO(); + // Avoid warning "Missing optional extension" + io.setLogger(new Logger(Verbosity.ERROR)); const gltfDocument = await io.readBinary(input); return gltfDocument; } catch (error) { @@ -236,6 +240,8 @@ export class GltfDataReader { const resources = {}; try { const io = await GltfTransform.getIO(); + // Avoid warning "Missing optional extension" + io.setLogger(new Logger(Verbosity.ERROR)); const json = JSON.parse(input.toString()); const jsonDoc = { json, resources } as JSONDocument; const gltfDocument = await io.readJSON(jsonDoc);