diff --git a/uni-resolver-local/example-config.json b/uni-resolver-local/example-config.json new file mode 100644 index 000000000..047b3dbe3 --- /dev/null +++ b/uni-resolver-local/example-config.json @@ -0,0 +1,23 @@ +{ + "drivers": [ + { + "pattern": "^(did:proof:z[A-Za-z0-9]{20,})$", + "driverClass": "uniresolver.driver.did.proof.DidProofDriver", + "testIdentifiers": [ + "did:proof:z6MkfrQC9BjKJzKVh6eNkJQZmUZ6a4Qz8EJGwE7VzKdKjNQ" + ], + "traits": { + "deactivatable": false, + "enumerable": false + } + }, + { + "pattern": "^(did:example:.+)$", + "url": "http://example-driver:8080/", + "propertiesEndpoint": "true", + "testIdentifiers": [ + "did:example:123456789" + ] + } + ] +} diff --git a/uni-resolver-local/src/main/java/uniresolver/local/configuration/LocalUniResolverConfigurator.java b/uni-resolver-local/src/main/java/uniresolver/local/configuration/LocalUniResolverConfigurator.java index de34fea48..563fced1a 100644 --- a/uni-resolver-local/src/main/java/uniresolver/local/configuration/LocalUniResolverConfigurator.java +++ b/uni-resolver-local/src/main/java/uniresolver/local/configuration/LocalUniResolverConfigurator.java @@ -33,6 +33,7 @@ public static void configureLocalUniResolver(String filePath, LocalUniResolver l for (Map jsonDriver : jsonDrivers) { String pattern = jsonDriver.containsKey("pattern") ? (String) jsonDriver.get("pattern") : null; + String driverClass = jsonDriver.containsKey("driverClass") ? (String) jsonDriver.get("driverClass") : null; String url = jsonDriver.containsKey("url") ? (String) jsonDriver.get("url") : null; String propertiesEndpoint = jsonDriver.containsKey("propertiesEndpoint") ? (String) jsonDriver.get("propertiesEndpoint") : null; String supportsOptions = jsonDriver.containsKey("supportsOptions") ? (String) jsonDriver.get("supportsOptions") : null; @@ -42,8 +43,15 @@ public static void configureLocalUniResolver(String filePath, LocalUniResolver l List testIdentifiers = jsonDriver.containsKey("testIdentifiers") ? (List) jsonDriver.get("testIdentifiers") : null; Map traits = jsonDriver.containsKey("traits") ? (Map) jsonDriver.get("traits") : null; - if (pattern == null) throw new IllegalArgumentException("Missing 'pattern' entry in driver configuration."); - if (url == null) throw new IllegalArgumentException("Missing 'url' entry in driver configuration."); + if (pattern == null && driverClass == null) throw new IllegalArgumentException("Missing 'pattern' entry in driver configuration."); + if (driverClass == null && url == null) throw new IllegalArgumentException("Missing 'url' entry in driver configuration."); + + if (driverClass != null) { + Driver driver = instantiateDriverClass(driverClass); + drivers.add(driver); + if (log.isInfoEnabled()) log.info("Added local driver class '" + driverClass + "'"); + continue; + } // construct HTTP driver @@ -77,4 +85,13 @@ public static void configureLocalUniResolver(String filePath, LocalUniResolver l localUniResolver.setDrivers(drivers); } + + private static Driver instantiateDriverClass(String driverClass) { + try { + Class clazz = Class.forName(driverClass).asSubclass(Driver.class); + return clazz.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException("Unable to instantiate driver class '" + driverClass + "'", e); + } + } } diff --git a/uni-resolver-web/src/main/java/uniresolver/web/config/DriverConfigs.java b/uni-resolver-web/src/main/java/uniresolver/web/config/DriverConfigs.java index 974203b3b..4c2161872 100644 --- a/uni-resolver-web/src/main/java/uniresolver/web/config/DriverConfigs.java +++ b/uni-resolver-web/src/main/java/uniresolver/web/config/DriverConfigs.java @@ -23,6 +23,7 @@ public void setDrivers(List drivers) { public static class DriverConfig { private String pattern; + private String driverClass; private String url; private String propertiesEndpoint; private String supportsOptions; @@ -40,6 +41,14 @@ public void setPattern(String value) { this.pattern = value; } + public String getDriverClass() { + return driverClass; + } + + public void setDriverClass(String driverClass) { + this.driverClass = driverClass; + } + public String getUrl() { return url; } @@ -108,6 +117,7 @@ public void setTraits(Map traits) { public String toString() { return "DriverConfig{" + "pattern='" + pattern + '\'' + + ", driverClass='" + driverClass + '\'' + ", url='" + url + '\'' + ", propertiesEndpoint='" + propertiesEndpoint + '\'' + ", supportsOptions='" + supportsOptions + '\'' + diff --git a/uni-resolver-web/src/main/java/uniresolver/web/config/WebAppConfig.java b/uni-resolver-web/src/main/java/uniresolver/web/config/WebAppConfig.java index 93c600cf7..7bf55fdf1 100644 --- a/uni-resolver-web/src/main/java/uniresolver/web/config/WebAppConfig.java +++ b/uni-resolver-web/src/main/java/uniresolver/web/config/WebAppConfig.java @@ -105,6 +105,7 @@ public void configureLocalUniresolver(DriverConfigs driverConfigs, LocalUniResol for (DriverConfigs.DriverConfig driverConfig : driverConfigs.getDrivers()) { String pattern = driverConfig.getPattern(); + String driverClass = driverConfig.getDriverClass(); String url = driverConfig.getUrl(); String propertiesEndpoint = driverConfig.getPropertiesEndpoint(); String supportsOptions = driverConfig.getSupportsOptions(); @@ -114,7 +115,16 @@ public void configureLocalUniresolver(DriverConfigs driverConfigs, LocalUniResol List testIdentifiers = driverConfig.getTestIdentifiers(); Map traits = driverConfig.getTraits(); - if (pattern == null) throw new IllegalArgumentException("Missing 'pattern' entry in driver configuration."); + if (pattern == null && driverClass == null) throw new IllegalArgumentException("Missing 'pattern' entry in driver configuration."); + + // Handle local driver class instantiation + if (driverClass != null) { + Driver driver = this.instantiateDriverClass(driverClass); + drivers.add(driver); + if (log.isInfoEnabled()) log.info("Added local driver class '" + driverClass + "'"); + continue; + } + if (url == null) throw new IllegalArgumentException("Missing 'url' entry in driver configuration."); // construct HTTP driver @@ -147,6 +157,19 @@ public void configureLocalUniresolver(DriverConfigs driverConfigs, LocalUniResol uniResolver.setDrivers(drivers); } + private Driver instantiateDriverClass(String driverClass) { + try { + Class clazz = Class.forName(driverClass); + Object instance = clazz.getDeclaredConstructor().newInstance(); + if (!(instance instanceof Driver)) { + throw new IllegalArgumentException("Driver class '" + driverClass + "' does not implement the Driver interface"); + } + return (Driver) instance; + } catch (Exception e) { + throw new IllegalArgumentException("Unable to instantiate driver class '" + driverClass + "'", e); + } + } + @PostConstruct private void initDrivers() { if (this.driverConfigs.getDrivers() != null) configureLocalUniresolver(this.driverConfigs, this.localUniResolver); diff --git a/uni-resolver-web/src/main/resources/application.yml b/uni-resolver-web/src/main/resources/application.yml index a8b62775c..39b3438ac 100644 --- a/uni-resolver-web/src/main/resources/application.yml +++ b/uni-resolver-web/src/main/resources/application.yml @@ -451,3 +451,10 @@ uniresolver: testIdentifiers: - did:webplus:ledgerdomain.github.io:did-webplus-spec:uFiANVlMledNFUBJNiZPuvfgzxvJlGGDBIpDFpM4DXW6Bow - did:webplus:ledgerdomain.github.io:did-webplus-spec:uFiDBw4xANa8sR_Fd8-pv-X9A5XIJNS3tC_bRNB3HUYiKug + - pattern: "^(did:proof:z[A-Za-z0-9]{20,})$" + driverClass: uniresolver.driver.did.proof.DidProofDriver + testIdentifiers: + - did:proof:z6MkfrQC9BjKJzKVh6eNkJQZmUZ6a4Qz8EJGwE7VzKdKjNQ + traits: + deactivatable: false + enumerable: false