From d55091f81c469359bbfe01913bfd8b38c356c97f Mon Sep 17 00:00:00 2001
From: Heinrichs <Heinrichs@itc.rwth-aachen.de>
Date: Thu, 23 May 2024 13:01:55 +0200
Subject: [PATCH] New: Ignore templating values (coscine/issues#2805)

---
 src/FormGenerator.spec.ts     |  5 +++--
 src/FormGenerator.vue         |  9 +++++++++
 src/base/LinkedDataHandler.ts | 31 +++++++++++++++++++++++++++++++
 src/data/example/metadata.ts  |  2 +-
 4 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/src/FormGenerator.spec.ts b/src/FormGenerator.spec.ts
index d1a1a97..d2a128c 100644
--- a/src/FormGenerator.spec.ts
+++ b/src/FormGenerator.spec.ts
@@ -225,6 +225,7 @@ describe('FormGenerator.vue', () => {
       propsData: {
         formData: dataCiteMetadata,
         formDataMimeType: 'text/turtle',
+        ignoreTemplateValues: true,
         selectedShape:
           'https://purl.org/coscine/ap/Dataverse_Citation_Metadata/minimal/',
         shapes: dataCite,
@@ -266,8 +267,8 @@ describe('FormGenerator.vue', () => {
 
     await wrapper.vm.$nextTick();
 
-    // Wait for 1 second until everything is set up
-    await sleep(1000);
+    // Wait for 2 seconds until everything is set up
+    await sleep(2000);
 
     expect(wrapper.emitted('isValid')).toBeTruthy();
     // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
diff --git a/src/FormGenerator.vue b/src/FormGenerator.vue
index 73baa06..f528e72 100644
--- a/src/FormGenerator.vue
+++ b/src/FormGenerator.vue
@@ -24,6 +24,7 @@
             dataset,
             metadataSubject,
             validationContext,
+            ignoreTemplateValues,
           )
         "
       />
@@ -85,6 +86,10 @@ export default defineComponent({
       default: 'application/ld+json',
       type: String,
     },
+    ignoreTemplateValues: {
+      default: false,
+      type: Boolean,
+    },
     locale: {
       default: 'en',
       type: String,
@@ -272,6 +277,7 @@ export default defineComponent({
         this.dataset,
         this.metadataSubject,
         this.validationContext,
+        this.ignoreTemplateValues,
       );
     },
     locale() {
@@ -363,6 +369,7 @@ export default defineComponent({
         this.dataset,
         this.metadataSubject,
         this.validationContext,
+        this.ignoreTemplateValues,
       );
     },
     input(nodeName: string, values: Quad_Object[]) {
@@ -400,6 +407,7 @@ export default defineComponent({
             this.dataset,
             this.metadataSubject,
             this.validationContext,
+            this.ignoreTemplateValues,
           );
         }
       }
@@ -445,6 +453,7 @@ export default defineComponent({
           this.dataset,
           this.metadataSubject,
           this.validationContext,
+          this.ignoreTemplateValues,
         );
       }
     },
diff --git a/src/base/LinkedDataHandler.ts b/src/base/LinkedDataHandler.ts
index 0d87afc..ffc4ba8 100644
--- a/src/base/LinkedDataHandler.ts
+++ b/src/base/LinkedDataHandler.ts
@@ -52,6 +52,7 @@ export default defineComponent({
       dataset: Dataset,
       subjectNode: Quad_Subject,
       validationContext = '',
+      ignoreTemplateValues = false,
     ): void {
       if (this.timeOuts[validationContext]) {
         clearTimeout(this.timeOuts[validationContext]);
@@ -116,6 +117,10 @@ export default defineComponent({
           }
         }
 
+        if (ignoreTemplateValues) {
+          this.deactiveTemplateRules(clonedDataset, combinedMetadata);
+        }
+
         const validator = new SHACLValidator(clonedDataset);
         const report = validator.validate(combinedMetadata);
 
@@ -130,6 +135,32 @@ export default defineComponent({
         return report;
       }, this.validationDebounce) as unknown as number;
     },
+    deactiveTemplateRules(shape: Dataset, metadata: Dataset) {
+      for (const quad of metadata) {
+        if (!quad.object.value.match(/\{\{.*?\}\}/)) {
+          continue;
+        }
+        const pathRelations = Array.from(
+          shape.match(
+            null,
+            factory.namedNode(prefixes.sh + 'path'),
+            quad.predicate,
+          ),
+        ).map((x) => x.subject);
+        for (const pathRelation of pathRelations) {
+          shape.add(
+            factory.quad(
+              pathRelation,
+              factory.namedNode(prefixes.sh + 'deactivated'),
+              factory.literal(
+                'true',
+                factory.namedNode(prefixes.xsd + 'boolean'),
+              ),
+            ),
+          );
+        }
+      }
+    },
     async getQuads(
       data: string,
       mimeType: string,
diff --git a/src/data/example/metadata.ts b/src/data/example/metadata.ts
index b55c11f..2cfa438 100644
--- a/src/data/example/metadata.ts
+++ b/src/data/example/metadata.ts
@@ -40,7 +40,7 @@ _:b1 a <https://purl.org/coscine/ap/Dataverse_Citation_Metadata/minimal/> ;
 		rdf:type <https://purl.org/coscine/ap/Dataverse_Citation_Metadata/author/> ;
 		dcterms:creator "Cool name" ;
 		schema:affiliation "Somewhere" ;
-		<http://purl.org/spar/datacite/AgentIdentifierScheme> "GND" ;
+		<http://purl.org/spar/datacite/AgentIdentifierScheme> "{{http://purl.org/spar/datacite/AgentIdentifierScheme}}" ;
 		<http://purl.org/spar/datacite/AgentIdentifier> "1234" ;
 	] ;
 	schema:contactPoint [
-- 
GitLab