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
