Repository: cxf
Updated Branches:
  refs/heads/master 15504ab90 -> 2196b6c2c


[CXF-6826] Cache MediaTypeHeaderProvider.valueOf results (with automatic cache 
cleanup when reaching a threshold)


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/fa973bd7
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/fa973bd7
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/fa973bd7

Branch: refs/heads/master
Commit: fa973bd7ab43099151f83beea351b80c7140eaab
Parents: 53aed2e
Author: Alessio Soldano <asold...@redhat.com>
Authored: Thu Mar 10 20:39:49 2016 +0100
Committer: Alessio Soldano <asold...@redhat.com>
Committed: Thu Mar 10 20:39:49 2016 +0100

----------------------------------------------------------------------
 .../cxf/jaxrs/impl/MediaTypeHeaderProvider.java | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/fa973bd7/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MediaTypeHeaderProvider.java
----------------------------------------------------------------------
diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MediaTypeHeaderProvider.java
 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MediaTypeHeaderProvider.java
index 39f484e..5d297b6 100644
--- 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MediaTypeHeaderProvider.java
+++ 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/MediaTypeHeaderProvider.java
@@ -25,6 +25,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -45,17 +46,34 @@ public class MediaTypeHeaderProvider implements 
HeaderDelegate<MediaType> {
     private static final Pattern COMPLEX_PARAMETERS = 
         Pattern.compile("(([\\w-]+=\"[^\"]*\")|([\\w-]+=[\\w-/\\+]+))");
     
+    private static Map<String, MediaType> map = new ConcurrentHashMap<String, 
MediaType>();
+    private static final int MAX_MT_CACHE_SIZE = 
+        Integer.getInteger("org.apache.cxf.jaxrs.max_mediatype_cache_size", 
200);
+
     public MediaType fromString(String mType) {
         
         return valueOf(mType);
     }
 
     public static MediaType valueOf(String mType) {
-        
         if (mType == null) {
             throw new IllegalArgumentException("Media type value can not be 
null");
         }
         
+        MediaType result = map.get(mType);
+        if (result == null) {
+            result = internalValueOf(mType);
+            final int size = map.size();
+            if (size >= MAX_MT_CACHE_SIZE) {
+                map.clear();
+            }
+            map.put(mType, result);
+        }
+        return result;
+    }
+
+    public static MediaType internalValueOf(String mType) {
+        
         int i = mType.indexOf('/');
         if (i == -1) {
             return handleMediaTypeWithoutSubtype(mType.trim());

Reply via email to