1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.rribbit.creation;
17
18 import java.lang.reflect.Method;
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Collection;
22 import java.util.concurrent.CopyOnWriteArrayList;
23
24 import org.rribbit.Listener;
25 import org.rribbit.ListenerObject;
26 import org.rribbit.creation.notification.ListenerObjectCreationObserver;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class ObjectBasedListenerObjectCreator implements ListenerObjectCreator {
43
44 private static final Logger log = LoggerFactory.getLogger(ObjectBasedListenerObjectCreator.class);
45
46
47
48
49 protected Collection<ListenerObject> listenerObjects;
50
51 protected Collection<ListenerObjectCreationObserver> observers;
52
53
54
55
56
57
58 public ObjectBasedListenerObjectCreator(Object... objects) {
59
60 listenerObjects = new CopyOnWriteArrayList<>();
61 observers = new CopyOnWriteArrayList<>();
62
63 for(Object object : objects) {
64 this.addObject(object);
65 }
66 }
67
68
69
70
71
72
73
74 public void addObject(Object object) {
75
76 log.debug("Processing Object");
77 Collection<ListenerObject> incompleteListenerObjects = this.getIncompleteListenerObjectsFromClass(object.getClass());
78 for(ListenerObject listenerObject : incompleteListenerObjects) {
79 listenerObject.setTarget(object);
80 }
81 listenerObjects.addAll(incompleteListenerObjects);
82 this.notifyObserversOnClassAdded(object.getClass());
83 }
84
85
86
87
88
89
90
91
92 protected Collection<ListenerObject> getIncompleteListenerObjectsFromClass(Class<?> clazz) {
93
94 Collection<ListenerObject> incompleteListenerObjects = new ArrayList<>();
95 for(Method method : clazz.getMethods()) {
96 Listener listener = method.getAnnotation(Listener.class);
97 if(listener != null) {
98 log.debug("Listener annotation found for method '{}', instantiating ListenerObject", method);
99 ListenerObject listenerObject = new ListenerObject();
100 listenerObject.setHints(Arrays.asList(listener.hint()));
101 listenerObject.setMethod(method);
102 listenerObject.setReturnType(method.getReturnType());
103 incompleteListenerObjects.add(listenerObject);
104 }
105 }
106 return incompleteListenerObjects;
107 }
108
109
110
111
112
113
114 protected void notifyObserversOnClassAdded(Class<?> addedClass) {
115
116 for(ListenerObjectCreationObserver listenerObjectCreationObserver : observers) {
117 listenerObjectCreationObserver.onClassAdded(addedClass);
118 }
119 }
120
121 @Override
122 public Collection<ListenerObject> getListenerObjects() {
123 return listenerObjects;
124 }
125
126 @Override
127 public void registerObserver(ListenerObjectCreationObserver listenerObjectCreationObserver) {
128 observers.add(listenerObjectCreationObserver);
129 }
130 }