package co.codewizards.cloudstore.ls.core.invoke; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; public class ForceNonTransientClassSet { private final Set<Class<?>> forceNonTransientClasses; private final Map<Class<?>, Boolean> class2ForceNonTransient = new HashMap<>(); private static class Holder { public static ForceNonTransientClassSet instance = new ForceNonTransientClassSet(); } private ForceNonTransientClassSet() { Set<Class<?>> s = new HashSet<Class<?>>(); for (Iterator<ForceNonTransientAdvisor> it = ServiceLoader.load(ForceNonTransientAdvisor.class).iterator(); it.hasNext(); ) { final ForceNonTransientAdvisor advisor = it.next(); final Class<?>[] classes = advisor.getForceNonTransientClasses(); if (classes == null) throw new IllegalStateException("Implementation error: advisor.getForceNonTransientClasses() returned null! " + advisor.getClass().getName()); for (Class<?> clazz : classes) s.add(clazz); } forceNonTransientClasses = Collections.unmodifiableSet(s); } public synchronized boolean isForceNonTransientClass(Class<?> clazz) { Boolean result = class2ForceNonTransient.get(clazz); if (result == null) { for (final Class<?> forceNonTransientClass : forceNonTransientClasses) { if (forceNonTransientClass.isAssignableFrom(clazz)) { result = true; break; } } if (result == null) result = false; class2ForceNonTransient.put(clazz, result); } return result; } public static ForceNonTransientClassSet getInstance() { return Holder.instance; } }