Advertisement
jarinel

proxy

Oct 24th, 2018
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 2.05 KB | None | 0 0
  1. import org.springframework.cglib.proxy.Enhancer
  2. import org.springframework.cglib.proxy.MethodInterceptor
  3. import org.springframework.cglib.proxy.MethodProxy
  4.  
  5. import java.lang.reflect.Method
  6.  
  7. class Data {
  8.     Integer a = 0
  9.     Integer b = 0
  10.     Integer c = 0
  11.  
  12.  
  13.     @Override
  14.     public String toString() {
  15.         return "Data{" +
  16.                 "a=" + a +
  17.                 ", b=" + b +
  18.                 ", c=" + c +
  19.                 '}';
  20.     }
  21. }
  22.  
  23. @FunctionalInterface
  24. interface Subscriber {
  25.     void receiveMessage(String type, Data data)
  26. }
  27.  
  28. class Observable {
  29.     Map<String, List<Subscriber>> subscribers = new HashMap<>()
  30.  
  31.     def notifyAll(String type, Data data) {
  32.         subscribers.get('ANY').each { it.receiveMessage(type, data) }
  33.         subscribers.get(type).each { it.receiveMessage(type, data) }
  34.     }
  35.  
  36.     def subscribe(String type, Subscriber subscriber) {
  37.         subscribers.putIfAbsent(type, new ArrayList<>())
  38.         subscribers.get(type).add(subscriber)
  39.     }
  40.  
  41.     def subscribe(List<String> types, Subscriber subscriber) {
  42.         types.each { type ->
  43.             subscribers.putIfAbsent(type, new ArrayList<>())
  44.             subscribers.get(type).add(subscriber)
  45.         }
  46.     }
  47. }
  48.  
  49. def observable = new Observable()
  50.  
  51. def enhancer = new Enhancer()
  52. enhancer.setSuperclass(Data)
  53. MethodInterceptor interceptor = { Object object, Method method, Object[] args, MethodProxy proxy ->
  54.     if (method.getName().startsWith('set') && method.getName() != 'setProperty') {
  55. //        println method.getName()
  56. //        println args
  57. //        println ''
  58.         observable.notifyAll('SET_' + method.getName().substring(3), object as Data)
  59.         return proxy.invokeSuper(object, args)
  60.     } else {
  61.         return proxy.invokeSuper(object, args)
  62.     }
  63. } as MethodInterceptor
  64. enhancer.setCallback(interceptor)
  65.  
  66. observable.subscribe('ANY') { type, data -> println "$type" }
  67. observable.subscribe(['SET_A', 'SET_B']) { type, data -> data.c = data.a + data.b }
  68.  
  69.  
  70. Data data = (Data) enhancer.create()
  71. data.a = 12
  72. data.setB(10)
  73.  
  74. data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement