package co.codewizards.cloudstore.core.context; import static co.codewizards.cloudstore.core.util.AssertUtil.assertNotNull; import java.util.HashMap; import java.util.Map; public class ExtensibleContextSupport implements ExtensibleContext { private final Map<Class<?>, Object> contextClass2ContextObject = new HashMap<>(); @Override public void setContextObject(final Object object) { assertNotNull(object, "object"); Class<?> clazz = object.getClass(); if (clazz == Object.class) throw new IllegalArgumentException("object is of type java.lang.Object! Must be a sub-class!"); if (clazz == Class.class) throw new IllegalArgumentException("object is of type java.lang.Class!"); while (clazz != Object.class) { registerContextObject(clazz, object); clazz = clazz.getSuperclass(); } } private void registerContextObject(final Class<?> clazz, final Object object) { contextClass2ContextObject.put(clazz, object); final Class<?>[] interfaces = clazz.getInterfaces(); for (final Class<?> iface : interfaces) registerContextObject(iface, object); } @Override public <T> T getContextObject(final Class<T> clazz) { assertNotNull(clazz, "clazz"); return clazz.cast(contextClass2ContextObject.get(clazz)); } @Override public void removeContextObject(Object object) { assertNotNull(object, "object"); removeContextObject(object.getClass()); } @Override public void removeContextObject(Class<?> clazz) { assertNotNull(clazz, "clazz"); while (clazz != Object.class) { contextClass2ContextObject.remove(clazz); final Class<?>[] interfaces = clazz.getInterfaces(); for (final Class<?> iface : interfaces) contextClass2ContextObject.remove(iface); clazz = clazz.getSuperclass(); } } }