1 /******************************************************************************* 2 * Copyright (c) 2008, 2015 Angelo Zerr and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation 13 * IBM Corporation 14 *******************************************************************************/ 15 package org.eclipse.e4.ui.css.core.resources; 16 17 import java.util.Collections; 18 import java.util.HashMap; 19 import java.util.Map; 20 import java.util.Map.Entry; 21 import java.util.Set; 22 23 /** 24 * Abstract class resources registry which implement basic cache with Map. 25 * 26 * @version 1.0.0 27 * @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a> 28 * 29 */ 30 public abstract class AbstractResourcesRegistry implements IResourcesRegistry { 31 32 private Map<Object, Map<Object, Object>> allResourcesMap; 33 34 @Override getResource(Object type, Object key)35 public Object getResource(Object type, Object key) { 36 if (allResourcesMap == null) { 37 return null; 38 } 39 Map<Object, Object> resourcesMap = allResourcesMap.get(type); 40 if (resourcesMap == null) { 41 return null; 42 } 43 return resourcesMap.get(key); 44 } 45 46 @Override registerResource(Object type, Object key, Object resource)47 public void registerResource(Object type, Object key, Object resource) { 48 if (allResourcesMap == null) { 49 allResourcesMap = new HashMap<>(); 50 } 51 Map<Object, Object> resourcesMap = allResourcesMap.get(type); 52 if (resourcesMap == null) { 53 resourcesMap = new HashMap<>(); 54 allResourcesMap.put(type, resourcesMap); 55 } 56 resourcesMap.put(key, resource); 57 } 58 getCacheByType(Object type)59 protected Map<Object, Object> getCacheByType(Object type) { 60 if (allResourcesMap != null) { 61 Map<Object, Object> resourcesMap = allResourcesMap.get(type); 62 if (resourcesMap != null) { 63 return resourcesMap; 64 } 65 } 66 return Collections.emptyMap(); 67 } 68 69 @Override unregisterResource(Object type, Object key)70 public void unregisterResource(Object type, Object key) { 71 if (allResourcesMap == null) { 72 return; 73 } 74 Map<Object, Object> resourcesMap = allResourcesMap.get(type); 75 if (resourcesMap == null) { 76 return; 77 } 78 Object resource = resourcesMap.get(key); 79 if (resource != null) { 80 resourcesMap.remove(resource); 81 } 82 } 83 unregisterResource(Object resource)84 public void unregisterResource(Object resource) { 85 Object type = getResourceType(resource); 86 if (type != null) { 87 Map<Object, Object> resourcesMap = allResourcesMap.get(type); 88 if (resourcesMap != null) { 89 resourcesMap.remove(resource); 90 } 91 } 92 } 93 getResourceType(Object resource)94 public Object getResourceType(Object resource) { 95 return resource.getClass(); 96 } 97 98 @Override dispose()99 public void dispose() { 100 if (allResourcesMap == null) { 101 return; 102 } 103 // Loop for all resources stored into cache 104 Set<Entry<Object, Map<Object, Object>>> allResources = allResourcesMap.entrySet(); 105 for (Entry<Object, Map<Object, Object>> entry : allResources) { 106 Object type = entry.getKey(); 107 Set<Entry<Object, Object>> resources = entry.getValue().entrySet(); 108 for (Entry<Object, Object> entry2 : resources) { 109 // Dispose the current resource. 110 disposeResource(type, entry2.getKey(), entry2.getValue()); 111 } 112 } 113 allResourcesMap = null; 114 } 115 disposeResource(Object type, Object key, Object resource)116 public abstract void disposeResource(Object type, Object key, Object resource); 117 } 118