Skip to content

Commit eb5c54f

Browse files
authored
Merge pull request #99 from kaiso/F#72
[F#72] Enable multiple mongoTemplate support
2 parents 42d028c + e6b8820 commit eb5c54f

20 files changed

+638
-576
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ pom.xml.versionsBackup
55
.settings/
66
.sass-cache
77
docs/robots.txt
8+
docs/src/_site
9+
docs/src/.ruby-version

docs/src/Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
source 'https://rubygems.org'
44
#gems
55
gem "jekyll-theme-architect"
6+
gem "kramdown-parser-gfm"
67
group :jekyll_plugins do
78
gem 'jekyll-sitemap'
89
end

docs/src/Gemfile.lock

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ GEM
44
addressable (2.7.0)
55
public_suffix (>= 2.0.2, < 5.0)
66
colorator (1.1.0)
7-
concurrent-ruby (1.1.7)
7+
concurrent-ruby (1.1.8)
88
em-websocket (0.5.2)
99
eventmachine (>= 0.12.9)
1010
http_parser.rb (~> 0.6.0)
1111
eventmachine (1.2.7)
12-
ffi (1.13.1)
12+
ffi (1.15.0)
1313
forwardable-extended (2.6.0)
1414
http_parser.rb (0.6.0)
1515
i18n (0.9.5)
1616
concurrent-ruby (~> 1.0)
17-
jekyll (3.9.0)
17+
jekyll (3.9.1)
1818
addressable (~> 2.4)
1919
colorator (~> 1.0)
2020
em-websocket (~> 0.5)
@@ -38,10 +38,12 @@ GEM
3838
jekyll-seo-tag (~> 2.0)
3939
jekyll-watch (2.2.1)
4040
listen (~> 3.0)
41-
kramdown (2.3.0)
41+
kramdown (2.3.1)
4242
rexml
43+
kramdown-parser-gfm (1.1.0)
44+
kramdown (~> 2.0)
4345
liquid (4.0.3)
44-
listen (3.2.1)
46+
listen (3.5.1)
4547
rb-fsevent (~> 0.10, >= 0.10.3)
4648
rb-inotify (~> 0.9, >= 0.9.10)
4749
mercenary (0.3.6)
@@ -51,8 +53,8 @@ GEM
5153
rb-fsevent (0.10.4)
5254
rb-inotify (0.10.1)
5355
ffi (~> 1.0)
54-
rexml (3.2.4)
55-
rouge (3.24.0)
56+
rexml (3.2.5)
57+
rouge (3.26.0)
5658
safe_yaml (1.0.5)
5759
sass (3.7.4)
5860
sass-listen (~> 4.0.0)
@@ -66,6 +68,7 @@ PLATFORMS
6668
DEPENDENCIES
6769
jekyll-sitemap
6870
jekyll-theme-architect
71+
kramdown-parser-gfm
6972

7073
BUNDLED WITH
71-
2.1.1
74+
2.2.16

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>io.github.kaiso.relmongo</groupId>
77
<artifactId>relmongo</artifactId>
8-
<version>3.4.2</version>
8+
<version>3.5.0-RC4</version>
99
<packaging>jar</packaging>
1010

1111
<name>relmongo</name>

src/main/java/io/github/kaiso/relmongo/config/EnableRelMongo.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,33 @@
2020
import io.github.kaiso.relmongo.annotation.OneToOne;
2121

2222
import org.springframework.context.annotation.Import;
23+
import org.springframework.data.mongodb.core.MongoTemplate;
2324

2425
import java.lang.annotation.ElementType;
2526
import java.lang.annotation.Retention;
2627
import java.lang.annotation.RetentionPolicy;
2728
import java.lang.annotation.Target;
29+
2830
/**
2931
* Enables the RelMongo framework processing.<br>
30-
* RelMongo allows to implement relations and associations between MongoDB collections <br>
32+
* RelMongo allows to implement relations and associations between MongoDB
33+
* collections <br>
34+
*
3135
* @see OneToMany
3236
* @see OneToOne
3337
* @author Kais OMRI
3438
*
3539
*/
3640
@Retention(RetentionPolicy.RUNTIME)
3741
@Target(value = { ElementType.TYPE })
38-
@Import(value = RelMongoConfiguration.class)
42+
@Import(value = RelMongoProcessorRegistrar.class)
3943
public @interface EnableRelMongo {
44+
45+
/**
46+
* Configures the name of the {@link MongoTemplate} bean to be used with RelMongo.
47+
*
48+
* @return
49+
*/
50+
String mongoTemplateRef() default "mongoTemplate";
4051

4152
}

src/main/java/io/github/kaiso/relmongo/config/EnableRelationalMongo.java

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package io.github.kaiso.relmongo.config;
2+
3+
import io.github.kaiso.relmongo.events.processor.RelMongoProcessor;
4+
5+
import org.springframework.beans.BeansException;
6+
import org.springframework.beans.factory.BeanInitializationException;
7+
import org.springframework.beans.factory.config.BeanPostProcessor;
8+
import org.springframework.context.ApplicationEventPublisher;
9+
import org.springframework.data.mongodb.core.MongoTemplate;
10+
import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent;
11+
12+
import java.lang.reflect.Field;
13+
14+
public class RelMongoBeanPostProcessor implements BeanPostProcessor {
15+
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+
}
76+
77+
}

src/main/java/io/github/kaiso/relmongo/config/RelMongoConfiguration.java

Lines changed: 0 additions & 100 deletions
This file was deleted.

0 commit comments

Comments
 (0)