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