This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 2af047d572b201ff03c95b40d9d3c25658d9eda6 Author: Andy Seaborne <[email protected]> AuthorDate: Mon Jan 12 14:25:38 2026 +0000 Make FunctionRegistry more robust --- .../jena/sparql/function/FunctionRegistry.java | 33 +++++++++++++--------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionRegistry.java b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionRegistry.java index 68b381b020..2747eef5ca 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionRegistry.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/function/FunctionRegistry.java @@ -20,11 +20,11 @@ */ package org.apache.jena.sparql.function; -import java.util.HashMap; -import java.util.HashSet; + import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.apache.jena.atlas.logging.Log; import org.apache.jena.query.ARQ; @@ -39,8 +39,8 @@ public class FunctionRegistry static { JenaSystem.init(); } // Extract a Registry class and do casting and initialization here. - private Map<String, FunctionFactory> registry = new HashMap<>(); - private Set<String> attemptedLoads = new HashSet<>(); + private Map<String, FunctionFactory> registry = new ConcurrentHashMap<>(); + private Set<String> attemptedLoads = ConcurrentHashMap.newKeySet(); public static FunctionRegistry standardRegistry() { FunctionRegistry reg = get(ARQ.getContext()); @@ -98,29 +98,32 @@ public class FunctionRegistry return res; } - public FunctionRegistry() - {} + public FunctionRegistry() {} /** Insert a class that is the function implementation * * @param uri String URI * @param funcClass Class for the function (new instance called). + * @returns This registry */ - public void put(String uri, Class<? > funcClass) { + public FunctionRegistry put(String uri, Class<? > funcClass) { if ( !Function.class.isAssignableFrom(funcClass) ) { Log.warn(this, "Class " + funcClass.getName() + " is not a Function"); - return; + return this; } - - put(uri, new FunctionFactoryAuto(funcClass)); + return put(uri, new FunctionFactoryAuto(funcClass)); } /** Insert a function. Re-inserting with the same URI overwrites the old entry. * * @param uri * @param f + * @returns This registry */ - public void put(String uri, FunctionFactory f) { registry.put(uri,f); } + public FunctionRegistry put(String uri, FunctionFactory f) { + registry.put(uri, f); + return this; + } /** Lookup by URI */ public FunctionFactory get(String uri) { @@ -141,10 +144,14 @@ public class FunctionRegistry return registry.get(uri); } - public boolean isRegistered(String uri) { return registry.containsKey(uri); } + public boolean isRegistered(String uri) { + return registry.containsKey(uri); + } /** Remove by URI */ - public FunctionFactory remove(String uri) { return registry.remove(uri); } + public void remove(String uri) { + registry.remove(uri); + } /** Iterate over URIs */ public Iterator<String> keys() { return registry.keySet().iterator(); }
