/******************************************************************************* * Copyright (c) 2008, 2015 Angelo Zerr and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation * IBM Corporation *******************************************************************************/ package org.eclipse.e4.ui.css.core.resources; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * Abstract class resources registry which implement basic cache with Map. * * @version 1.0.0 * @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a> * */ public abstract class AbstractResourcesRegistry implements IResourcesRegistry { private Map<Object, Map<Object, Object>> allResourcesMap; @Override public Object getResource(Object type, Object key) { if (allResourcesMap == null) { return null; } Map<Object, Object> resourcesMap = allResourcesMap.get(type); if (resourcesMap == null) { return null; } return resourcesMap.get(key); } @Override public void registerResource(Object type, Object key, Object resource) { if (allResourcesMap == null) { allResourcesMap = new HashMap<>(); } Map<Object, Object> resourcesMap = allResourcesMap.get(type); if (resourcesMap == null) { resourcesMap = new HashMap<>(); allResourcesMap.put(type, resourcesMap); } resourcesMap.put(key, resource); } protected Map<Object, Object> getCacheByType(Object type) { if (allResourcesMap != null) { Map<Object, Object> resourcesMap = allResourcesMap.get(type); if (resourcesMap != null) { return resourcesMap; } } return Collections.emptyMap(); } @Override public void unregisterResource(Object type, Object key) { if (allResourcesMap == null) { return; } Map<Object, Object> resourcesMap = allResourcesMap.get(type); if (resourcesMap == null) { return; } Object resource = resourcesMap.get(key); if (resource != null) { resourcesMap.remove(resource); } } public void unregisterResource(Object resource) { Object type = getResourceType(resource); if (type != null) { Map<Object, Object> resourcesMap = allResourcesMap.get(type); if (resourcesMap != null) { resourcesMap.remove(resource); } } } public Object getResourceType(Object resource) { return resource.getClass(); } @Override public void dispose() { if (allResourcesMap == null) { return; } // Loop for all resources stored into cache Set<Entry<Object, Map<Object, Object>>> allResources = allResourcesMap.entrySet(); for (Entry<Object, Map<Object, Object>> entry : allResources) { Object type = entry.getKey(); Set<Entry<Object, Object>> resources = entry.getValue().entrySet(); for (Entry<Object, Object> entry2 : resources) { // Dispose the current resource. disposeResource(type, entry2.getKey(), entry2.getValue()); } } allResourcesMap = null; } public abstract void disposeResource(Object type, Object key, Object resource); }