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(); }

Reply via email to