1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.config.registry;
35
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.HashMap;
39 import java.util.HashSet;
40 import java.util.Map;
41 import java.util.Set;
42
43 import org.apache.commons.lang3.StringUtils;
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public class RegistryMap<T> {
60
61 private final Map<DefinitionMetadata, DefinitionProvider<T>> map = new HashMap<>();
62
63 private final Map<String, DefinitionMetadata> stringKeysMap = new HashMap<>();
64
65 public synchronized DefinitionProvider<T> get(DefinitionMetadata key) {
66 return map.get(key);
67 }
68
69 public synchronized DefinitionProvider<T> getByStringKey(String stringKey) {
70 final DefinitionMetadata k = stringKeysMap.get(stringKey);
71 return get(k);
72 }
73
74 public synchronized DefinitionProvider<T> getRequired(DefinitionMetadata key) throws RegistrationException {
75 DefinitionProvider<T> value = map.get(key);
76 if (value == null) {
77 throw new RegistrationException("Entry for [" + key + "] not found in registry, available entries are: " +
78 (map.isEmpty() ? "<none>" : StringUtils.join(map.keySet(), ", ")));
79 }
80 return value;
81 }
82
83 public synchronized DefinitionProvider<T> getRequiredByStringKey(String stringKey) throws RegistrationException {
84 final DefinitionMetadata k = stringKeysMap.get(stringKey);
85 return getRequired(k);
86 }
87
88
89 public synchronized DefinitionMetadata put(DefinitionProvider<T> value) {
90 final DefinitionMetadata key = keyFromValue(value);
91 map.put(key, value);
92 stringKeysMap.put(asStringKey(value), key);
93 return key;
94 }
95
96 public synchronized void remove(DefinitionMetadata key) {
97 final DefinitionProvider<T> provider = map.remove(key);
98 stringKeysMap.remove(asStringKey(provider));
99 }
100
101 public synchronized Set<DefinitionMetadata> removeAndPutAll(Collection<DefinitionMetadata> toRemove, Collection<DefinitionProvider<T>> toPut) {
102
103 if (!toPut.isEmpty()) {
104 keyFromValue(toPut.iterator().next());
105 }
106 for (DefinitionMetadata key : toRemove) {
107 if (!map.containsKey(key)) {
108 throw new IllegalArgumentException(String.format("%s can't be removed from map, it is not an existing key", key));
109 }
110
111 final DefinitionProvider<T> provider = map.remove(key);
112 stringKeysMap.remove(asStringKey(provider));
113 }
114 final Set<DefinitionMetadata> keys = new HashSet<>();
115 for (DefinitionProvider<T> value : toPut) {
116 final DefinitionMetadata key = put(value);
117 keys.add(key);
118 }
119 return keys;
120 }
121
122 public synchronized Collection<DefinitionMetadata> keySet() {
123 return new ArrayList<>(map.keySet());
124 }
125
126 public synchronized Collection<DefinitionProvider<T>> values() {
127 return new ArrayList<>(map.values());
128 }
129
130 protected DefinitionMetadata keyFromValue(DefinitionProvider<T> provider) {
131 return provider.getMetadata();
132 }
133
134 protected String asStringKey(DefinitionProvider<T> provider) {
135 return provider.getMetadata().getReferenceId();
136 }
137 }