1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.rribbit.retrieval;
17
18 import java.util.ArrayList;
19 import java.util.Collection;
20 import java.util.List;
21 import java.util.concurrent.CopyOnWriteArrayList;
22 import java.util.stream.Collectors;
23
24 import org.rribbit.ListenerObject;
25 import org.rribbit.creation.ListenerObjectCreator;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class DefaultListenerObjectRetriever implements ListenerObjectRetriever {
43
44 private static final Logger log = LoggerFactory.getLogger(DefaultListenerObjectRetriever.class);
45
46 protected List<ListenerObjectCreator> listenerObjectCreators;
47
48
49
50
51
52 public DefaultListenerObjectRetriever() {
53 listenerObjectCreators = new CopyOnWriteArrayList<>();
54 }
55
56
57
58
59
60
61
62 public DefaultListenerObjectRetriever(ListenerObjectCreator... listenerObjectCreators) {
63 this();
64 for(ListenerObjectCreator listenerObjectCreator : listenerObjectCreators) {
65 this.addListenerObjectCreator(listenerObjectCreator);
66 }
67 }
68
69 @Override
70 public Collection<ListenerObject> getListenerObjects() {
71
72 return this.getListenerObjectsFromAllCreators();
73 }
74
75 @Override
76 public Collection<ListenerObject> getListenerObjects(Class<?> returnType) {
77
78 return this.getListenerObjectsFromAllCreators()
79 .stream()
80 .filter(listenerObject -> this.matchesReturnType(listenerObject, returnType))
81 .collect(Collectors.toList());
82 }
83
84 @Override
85 public Collection<ListenerObject> getListenerObjects(String hint) {
86
87 return this.getListenerObjectsFromAllCreators()
88 .stream()
89 .filter(listenerObject -> this.matchesHint(listenerObject, hint))
90 .collect(Collectors.toList());
91 }
92
93 @Override
94 public Collection<ListenerObject> getListenerObjects(Class<?> returnType, String hint) {
95
96 return this.getListenerObjectsFromAllCreators()
97 .stream()
98 .filter(listenerObject -> this.matchesHint(listenerObject, hint) && this.matchesReturnType(listenerObject, returnType))
99 .collect(Collectors.toList());
100 }
101
102 protected Collection<ListenerObject> getListenerObjectsFromAllCreators() {
103
104 log.debug("Getting all ListenerObjects from all ListenerObjectCreators");
105 Collection<ListenerObject> listenerObjects = new ArrayList<>();
106 for(ListenerObjectCreator listenerObjectCreator : listenerObjectCreators) {
107 listenerObjects.addAll(listenerObjectCreator.getListenerObjects());
108 }
109 return listenerObjects;
110 }
111
112
113
114
115
116
117
118
119 protected boolean matchesHint(ListenerObject listenerObject, String hint) {
120
121 if(hint == null) {
122 throw new IllegalArgumentException("hint cannot be null!");
123 }
124 return listenerObject.getHints().contains(hint);
125 }
126
127
128
129
130
131
132
133
134 protected boolean matchesReturnType(ListenerObject listenerObject, Class<?> returnType) {
135
136 if(returnType == null) {
137 throw new IllegalArgumentException("returnType cannot be null!");
138 }
139 return returnType.isAssignableFrom(listenerObject.getReturnType());
140 }
141
142
143
144
145
146
147 public List<ListenerObjectCreator> getListenerObjectCreators() {
148 return listenerObjectCreators;
149 }
150
151
152
153
154
155
156 public void addListenerObjectCreator(ListenerObjectCreator listenerObjectCreator) {
157 listenerObjectCreators.add(listenerObjectCreator);
158 }
159
160
161
162
163
164
165
166 public void setListenerObjectCreator(ListenerObjectCreator listenerObjectCreator) {
167 listenerObjectCreators.clear();
168 listenerObjectCreators.add(listenerObjectCreator);
169 }
170 }