From 68c404cab39f691c58f35ac61e4a946ff9dcbf18 Mon Sep 17 00:00:00 2001
From: Andreas Romeyke <andreas.romeyke@slub-dresden.de>
Date: Mon, 20 Feb 2023 13:15:04 +0100
Subject: [PATCH] - add catalog files - refactoring, extracted
 callDefaultCatalogResolver()

---
 .../plugin/ValidationCatalogResolver.java     | 39 +++++++++++--------
 1 file changed, 22 insertions(+), 17 deletions(-)

diff --git a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
index 98be53e..b3a36cc 100644
--- a/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
+++ b/java/org/slub/rosetta/dps/repository/plugin/ValidationCatalogResolver.java
@@ -1,21 +1,25 @@
 package org.slub.rosetta.dps.repository.plugin;
 
+import org.apache.xerces.util.XMLCatalogResolver;
 import org.w3c.dom.ls.LSInput;
 import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 import javax.xml.catalog.CatalogException;
-import javax.xml.catalog.CatalogFeatures;
 import javax.xml.catalog.CatalogResolver;
 import javax.xml.transform.Source;
+import java.io.IOException;
 import java.io.InputStream;
-import java.net.URI;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 
-import static javax.xml.catalog.CatalogManager.catalogResolver;
-
 class ValidationCatalogResolver implements CatalogResolver {
+    private final String[] catalogs = {
+            "/etc/xml/catalog",
+            "/usr/share/xml/docbook/schema/dtd/catalog.xml",
+            /* TODO */
+    };
     private final HashMap<String, String> public2res = new HashMap<>() {
         // TODO: add support for catalog.xml files.
         {
@@ -29,6 +33,18 @@ class ValidationCatalogResolver implements CatalogResolver {
     };
     private final HashSet<String> allowedDtds = new HashSet<>(Arrays.asList("-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1 20151215//EN"));
 
+    private InputSource callDefaultCatalogResolver (String publicId, String systemId) {
+        InputSource result = null;
+        try {
+            XMLCatalogResolver cr = new XMLCatalogResolver();
+            cr.setPreferPublic(true);
+            cr.setCatalogList(catalogs);
+            result = cr.resolveEntity(publicId, systemId);
+        } catch (IOException | CatalogException | SAXException e) {
+            System.out.println("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
+        }
+        return result;
+    }
     @Override
     public InputSource resolveEntity(String publicId, String systemId) {
         System.out.println("======");
@@ -36,18 +52,12 @@ class ValidationCatalogResolver implements CatalogResolver {
         /* TODO: only allow catalog calls to defined ressources */
         if (allowedDtds.contains(publicId)) {
             System.out.println("fallback to CatalogResolver");
-            //CatalogFeatures f = CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "continue").build();
             var strippedSystemId = systemId;
             if (!systemId.startsWith("http://")) {
                 strippedSystemId = "file:/etc/xml/" + systemId.substring(systemId.lastIndexOf("/") + 1);
             }
             System.out.println("\tusing URI=" + strippedSystemId);
-            try {
-                CatalogResolver cr = catalogResolver(CatalogFeatures.defaults(), URI.create(strippedSystemId));
-                return cr.resolveEntity(publicId, systemId);
-            } catch (CatalogException e) {
-                System.out.println("No local mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
-            }
+            return callDefaultCatalogResolver(publicId, systemId);
         }
         if (public2res.containsKey(publicId)) {
             System.out.println("\tressource=" + public2res.get(publicId));
@@ -59,12 +69,7 @@ class ValidationCatalogResolver implements CatalogResolver {
         }
         System.out.println("\tnot implemented (no fallback, no mapping)");
         if (systemId.startsWith("http://")) {
-            try {
-                CatalogResolver cr = catalogResolver(CatalogFeatures.defaults(), URI.create(systemId));
-                return cr.resolveEntity(publicId, systemId);
-            } catch (CatalogException e) {
-                System.out.println("No mapping found for publicId=" + publicId + ", systemId=" + systemId + ", " + e.getMessage());
-            }
+            return callDefaultCatalogResolver(publicId, systemId);
         }
         return null;
     }
-- 
GitLab