|
1 | 1 | package io.github.kaiso.relmongo.config;
|
2 | 2 |
|
3 |
| -import io.github.kaiso.relmongo.events.processor.RelMongoProcessor; |
| 3 | +import java.lang.reflect.Field; |
| 4 | +import java.lang.reflect.InvocationTargetException; |
| 5 | +import java.lang.reflect.Method; |
4 | 6 |
|
5 | 7 | import org.springframework.beans.BeansException;
|
6 | 8 | import org.springframework.beans.factory.BeanInitializationException;
|
|
9 | 11 | import org.springframework.data.mongodb.core.MongoTemplate;
|
10 | 12 | import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent;
|
11 | 13 |
|
12 |
| -import java.lang.reflect.Field; |
| 14 | +import io.github.kaiso.relmongo.events.processor.RelMongoProcessor; |
13 | 15 |
|
14 | 16 | public class RelMongoBeanPostProcessor implements BeanPostProcessor {
|
15 | 17 |
|
16 |
| - private final String mongoTemplateRef; |
17 |
| - |
18 |
| - public RelMongoBeanPostProcessor(String mongoTemplateRef) { |
19 |
| - super(); |
20 |
| - this.mongoTemplateRef = mongoTemplateRef; |
21 |
| - } |
22 |
| - |
23 |
| - @Override |
24 |
| - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { |
25 |
| - |
26 |
| - if (bean instanceof MongoTemplate && beanName.equals(mongoTemplateRef)) { |
27 |
| - |
28 |
| - /* |
29 |
| - * Enhancer enhancer = new Enhancer(); |
30 |
| - * enhancer.setSuperclass(bean.getClass()); |
31 |
| - * enhancer.setCallbacks(new MethodInterceptor[] { new |
32 |
| - * RelMongoTemplateInvocationHandler() }); |
33 |
| - * |
34 |
| - * Object proxy = enhancer.create(new Class<?>[] { MongoDbFactory.class, |
35 |
| - * MongoConverter.class }, |
36 |
| - * new Object[] { ((MongoTemplate) bean).getMongoDbFactory(), ((MongoTemplate) |
37 |
| - * bean).getConverter() }); |
38 |
| - * |
39 |
| - * ((MongoTemplate) proxy).setApplicationContext(applicationContext); |
40 |
| - * |
41 |
| - * return proxy; |
42 |
| - */ |
43 |
| - |
44 |
| - try { |
45 |
| - Field ep = MongoTemplate.class.getDeclaredField("eventPublisher"); |
46 |
| - ep.setAccessible(true); |
47 |
| - ep.set(bean, new RelMongoEventPublisher((MongoTemplate) bean, (ApplicationEventPublisher) ep.get(bean))); |
48 |
| - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { |
49 |
| - throw new BeanInitializationException("Fatal: failed to init the RelMongo Engine", e); |
50 |
| - } |
51 |
| - } |
52 |
| - |
53 |
| - return bean; |
54 |
| - } |
55 |
| - |
56 |
| - private static final class RelMongoEventPublisher implements ApplicationEventPublisher { |
57 |
| - |
58 |
| - private final RelMongoProcessor relMongoProcessor; |
59 |
| - private final MongoTemplate mongoTemplate; |
60 |
| - private final ApplicationEventPublisher eventPublisher; |
61 |
| - |
62 |
| - public RelMongoEventPublisher(MongoTemplate mongoTemplate, ApplicationEventPublisher eventPublisher) { |
63 |
| - super(); |
64 |
| - this.relMongoProcessor = new RelMongoProcessor(); |
65 |
| - this.mongoTemplate = mongoTemplate; |
66 |
| - this.eventPublisher = eventPublisher; |
67 |
| - } |
68 |
| - |
69 |
| - @Override |
70 |
| - public void publishEvent(Object event) { |
71 |
| - relMongoProcessor.onApplicationEvent((MongoMappingEvent<?>) event, mongoTemplate); |
72 |
| - eventPublisher.publishEvent(event); |
73 |
| - } |
74 |
| - |
75 |
| - } |
| 18 | + private final String mongoTemplateRef; |
| 19 | + |
| 20 | + public RelMongoBeanPostProcessor(String mongoTemplateRef) { |
| 21 | + super(); |
| 22 | + this.mongoTemplateRef = mongoTemplateRef; |
| 23 | + } |
| 24 | + |
| 25 | + @Override |
| 26 | + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { |
| 27 | + |
| 28 | + if (bean instanceof MongoTemplate && beanName.equals(mongoTemplateRef)) { |
| 29 | + |
| 30 | + /* |
| 31 | + * Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(bean.getClass()); |
| 32 | + * enhancer.setCallbacks(new MethodInterceptor[] { new |
| 33 | + * RelMongoTemplateInvocationHandler() }); |
| 34 | + * |
| 35 | + * Object proxy = enhancer.create(new Class<?>[] { MongoDbFactory.class, |
| 36 | + * MongoConverter.class }, new Object[] { ((MongoTemplate) |
| 37 | + * bean).getMongoDbFactory(), ((MongoTemplate) bean).getConverter() }); |
| 38 | + * |
| 39 | + * ((MongoTemplate) proxy).setApplicationContext(applicationContext); |
| 40 | + * |
| 41 | + * return proxy; |
| 42 | + */ |
| 43 | + |
| 44 | + try { |
| 45 | + Field ep = MongoTemplate.class.getDeclaredField("eventPublisher"); |
| 46 | + ep.setAccessible(true); |
| 47 | + |
| 48 | + RelMongoEventPublisher eventPublisher = new RelMongoEventPublisher((MongoTemplate) bean, |
| 49 | + (ApplicationEventPublisher) ep.get(bean)); |
| 50 | + ep.set(bean, eventPublisher); |
| 51 | + |
| 52 | + Field edf = MongoTemplate.class.getDeclaredField("eventDelegate"); |
| 53 | + edf.setAccessible(true); |
| 54 | + |
| 55 | + Object ed = edf.get(bean); |
| 56 | + Method method = ed.getClass().getMethod("setPublisher", ApplicationEventPublisher.class); |
| 57 | + method.setAccessible(true); |
| 58 | + method.invoke(ed, eventPublisher); |
| 59 | + |
| 60 | + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException |
| 61 | + | InvocationTargetException | NoSuchMethodException e) { |
| 62 | + throw new BeanInitializationException("Fatal: failed to init the RelMongo Engine", e); |
| 63 | + } |
| 64 | + } |
| 65 | + |
| 66 | + return bean; |
| 67 | + } |
| 68 | + |
| 69 | + private static final class RelMongoEventPublisher implements ApplicationEventPublisher { |
| 70 | + |
| 71 | + private final RelMongoProcessor relMongoProcessor; |
| 72 | + private final MongoTemplate mongoTemplate; |
| 73 | + private final ApplicationEventPublisher eventPublisher; |
| 74 | + |
| 75 | + public RelMongoEventPublisher(MongoTemplate mongoTemplate, ApplicationEventPublisher eventPublisher) { |
| 76 | + super(); |
| 77 | + this.relMongoProcessor = new RelMongoProcessor(); |
| 78 | + this.mongoTemplate = mongoTemplate; |
| 79 | + this.eventPublisher = eventPublisher; |
| 80 | + } |
| 81 | + |
| 82 | + @Override |
| 83 | + public void publishEvent(Object event) { |
| 84 | + relMongoProcessor.onApplicationEvent((MongoMappingEvent<?>) event, mongoTemplate); |
| 85 | + eventPublisher.publishEvent(event); |
| 86 | + } |
| 87 | + |
| 88 | + } |
76 | 89 |
|
77 | 90 | }
|
0 commit comments