Add caching when searching for outer class fields

Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/49c5be40
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/49c5be40
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/49c5be40

Branch: refs/heads/master
Commit: 49c5be404c5e1053bcc7c2be691bb5d7c99c4c8d
Parents: ba0e648
Author: Svetoslav Neykov <[email protected]>
Authored: Tue Feb 24 23:13:48 2015 +0200
Committer: Svetoslav Neykov <[email protected]>
Committed: Tue Mar 3 17:42:10 2015 +0200

----------------------------------------------------------------------
 ...ompilerIndependentOuterClassFieldMapper.java | 22 +++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/49c5be40/core/src/main/java/brooklyn/util/xstream/CompilerIndependentOuterClassFieldMapper.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/util/xstream/CompilerIndependentOuterClassFieldMapper.java
 
b/core/src/main/java/brooklyn/util/xstream/CompilerIndependentOuterClassFieldMapper.java
index 7faeb02..f9a1f00 100644
--- 
a/core/src/main/java/brooklyn/util/xstream/CompilerIndependentOuterClassFieldMapper.java
+++ 
b/core/src/main/java/brooklyn/util/xstream/CompilerIndependentOuterClassFieldMapper.java
@@ -21,12 +21,16 @@ package brooklyn.util.xstream;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.thoughtworks.xstream.core.Caching;
 import com.thoughtworks.xstream.mapper.Mapper;
 import com.thoughtworks.xstream.mapper.MapperWrapper;
 
@@ -57,13 +61,16 @@ import com.thoughtworks.xstream.mapper.MapperWrapper;
  * <p>Currently available at
  *    
http://web.archive.org/web/20000830111107/http://java.sun.com/products/jdk/1.1/docs/guide/innerclasses/spec/innerclasses.doc10.html</p>
  */
-public class CompilerIndependentOuterClassFieldMapper extends MapperWrapper {
+public class CompilerIndependentOuterClassFieldMapper extends MapperWrapper 
implements Caching {
     public static final Logger LOG = 
LoggerFactory.getLogger(CompilerIndependentOuterClassFieldMapper.class);
 
     private static final String OUTER_CLASS_FIELD_PREFIX = "this$";
 
+    private final Map<String, Collection<String>> classOuterFields = new 
ConcurrentHashMap<String, Collection<String>>();
+
     public CompilerIndependentOuterClassFieldMapper(Mapper wrapped) {
         super(wrapped);
+        classOuterFields.put(Object.class.getName(), 
Collections.<String>emptyList());
     }
 
     @Override
@@ -131,8 +138,12 @@ public class CompilerIndependentOuterClassFieldMapper 
extends MapperWrapper {
     }
     
     private Collection<String> findOuterClassFieldNames(Class<?> type) {
-        Collection<String> fields = new ArrayList<String>();
-        addOuterClassFields(type, fields);
+        Collection<String> fields = classOuterFields.get(type.getName());
+        if (fields == null) {
+            fields = new ArrayList<String>();
+            addOuterClassFields(type, fields);
+            classOuterFields.put(type.getName(), fields);
+        }
         return fields;
     }
     
@@ -147,4 +158,9 @@ public class CompilerIndependentOuterClassFieldMapper 
extends MapperWrapper {
         }
     }
 
+    @Override
+    public void flushCache() {
+        
classOuterFields.keySet().retainAll(Collections.singletonList(Object.class.getName()));
+    }
+
 }
\ No newline at end of file

Reply via email to