You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2020/01/23 12:25:30 UTC

[jena] branch master updated: Fix thread safety issue with HashMaps in TypeMapper

This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/master by this push:
     new 4c494a3  Fix thread safety issue with HashMaps in TypeMapper
     new 049f87c  Merge pull request #676 from superfell/type_mapper
4c494a3 is described below

commit 4c494a3b779fd3ece960f2c4a8f0785e49b223b7
Author: Simon Fell <sf...@ebay.com>
AuthorDate: Wed Jan 22 10:21:44 2020 -0800

    Fix thread safety issue with HashMaps in TypeMapper
---
 .../java/org/apache/jena/datatypes/TypeMapper.java | 31 +++++++++++-----------
 1 file changed, 15 insertions(+), 16 deletions(-)

diff --git a/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java b/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java
index 1da6913..1f03d86 100644
--- a/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java
+++ b/jena-core/src/main/java/org/apache/jena/datatypes/TypeMapper.java
@@ -20,8 +20,8 @@ package org.apache.jena.datatypes;
 
 import java.net.URI;
 import java.net.URL;
-import java.util.HashMap;
 import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.jena.datatypes.xsd.XSDDatatype ;
 import org.apache.jena.datatypes.xsd.impl.RDFLangString ;
@@ -96,10 +96,10 @@ public class TypeMapper {
 // Variables
 
     /** Map from uri to datatype */
-    private final HashMap<String, RDFDatatype> uriToDT = new HashMap<>();
+    private final ConcurrentHashMap<String, RDFDatatype> uriToDT = new ConcurrentHashMap<>();
 
     /** Map from java class to datatype */
-    private final HashMap<Class<?>, RDFDatatype> classToDT = new HashMap<>();
+    private final ConcurrentHashMap<Class<?>, RDFDatatype> classToDT = new ConcurrentHashMap<>();
 
 //=======================================================================
 // Methods
@@ -120,20 +120,19 @@ public class TypeMapper {
      *         literal).
      */
     public RDFDatatype getSafeTypeByName(final String uri) {
+        if (uri == null) {
+            // Plain literal
+            return null;
+        }
         RDFDatatype dtype = uriToDT.get(uri);
         if (dtype == null) {
-            if (uri == null) {
-                // Plain literal
-                return null;
+            // Unknown datatype
+            if (JenaParameters.enableSilentAcceptanceOfUnknownDatatypes) {
+                dtype = new BaseDatatype(uri);
+                registerDatatype(dtype);
             } else {
-                // Unknown datatype
-                if (JenaParameters.enableSilentAcceptanceOfUnknownDatatypes) {
-                    dtype = new BaseDatatype(uri);
-                    registerDatatype(dtype);
-                } else {
-                    throw new DatatypeFormatException(
-                        "Attempted to created typed literal using an unknown datatype - " + uri);
-                }
+                throw new DatatypeFormatException(
+                    "Attempted to created typed literal using an unknown datatype - " + uri);
             }
         }
         return dtype;
@@ -147,7 +146,7 @@ public class TypeMapper {
      * @return Datatype the datatype definition of null if not known.
      */
     public RDFDatatype getTypeByName(final String uri) {
-        return uriToDT.get(uri);
+        return uri == null ? null : uriToDT.get(uri);
     }
 
     /**
@@ -177,7 +176,7 @@ public class TypeMapper {
      * @return a datatype whose value space matches the given java class
      */
     public RDFDatatype getTypeByClass(final Class<?> clazz) {
-        return classToDT.get(clazz);
+        return clazz == null ? null : classToDT.get(clazz);
     }
 
     /**