package org.eclipse.iee.web.renderer; import java.util.Set; import org.eclipse.iee.core.HandlerManager; import org.eclipse.iee.core.IHasPropertyChangeListener; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicy; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.reflect.TypeToken; @Component public class HTMLRendererManager implements IHTMLRendererManager { private static final LoadingCache<Class<?>, Set<Class<?>>> flattenHierarchyCache = CacheBuilder .newBuilder().weakKeys() .build(new CacheLoader<Class<?>, Set<Class<?>>>() { @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public Set<Class<?>> load(Class<?> concreteClass) { return (Set) TypeToken.of(concreteClass).getTypes() .rawTypes(); } }); /** Registered pad html renderers. */ @SuppressWarnings("rawtypes") private final HandlerManager<IHTMLRenderer> fhtmlRenderers = new HandlerManager<>( IHTMLRenderer.class); @Reference(cardinality = ReferenceCardinality.MULTIPLE, unbind = "unregisterPadHTMLRenderer", policy = ReferencePolicy.DYNAMIC) public void registerPadHTMLRenderer(IHTMLRenderer<?> renderer) { fhtmlRenderers.registerHandler(renderer); } public void unregisterPadHTMLRenderer(IHTMLRenderer<?> renderer) { fhtmlRenderers.unregisterHandler(renderer); } /* (non-Javadoc) * @see org.eclipse.iee.web.renderer.IHTMLRendererManager#getPadHTMLRenderer(T) */ @Override @SuppressWarnings("unchecked") public <T extends IHasPropertyChangeListener> IHTMLRenderer<T> getPadHTMLRenderer(T part) { Set<Class<?>> hierarchy = flattenHierarchyCache.getUnchecked(part.getClass()); for (Class<?> clz : hierarchy) { IHTMLRenderer<T> handler = fhtmlRenderers.getHandler(clz); if (handler != null) { return handler; } } return null; } }