Compare commits
551 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4152f7aed8 | ||
|
|
0b8973958c | ||
|
|
c079a8971e | ||
|
|
be65f060a0 | ||
|
|
2f89804d8d | ||
|
|
cc855d7cba | ||
|
|
83fe56a5e2 | ||
|
|
7f8f54066b | ||
|
|
8366136c67 | ||
|
|
282071b9c8 | ||
|
|
4202cdf694 | ||
|
|
929b60c426 | ||
|
|
0c52678170 | ||
|
|
8ff26ac0be | ||
|
|
d365463f56 | ||
|
|
0d00f0a1ca | ||
|
|
81998792eb | ||
|
|
1f7b0ac40b | ||
|
|
b3f691c128 | ||
|
|
e5c634c8f6 | ||
|
|
18355aed5e | ||
|
|
61e3cb1d75 | ||
|
|
d1a1bebc42 | ||
|
|
13d3dd1175 | ||
|
|
04a8ef2597 | ||
|
|
87ddbcf299 | ||
|
|
34e00adeba | ||
|
|
b823efa6ee | ||
|
|
278b23d5ee | ||
|
|
f4f26c6fd5 | ||
|
|
ce7dc13f99 | ||
|
|
8ee5942bba | ||
|
|
a7cd820f32 | ||
|
|
91cdf83a4f | ||
|
|
0b6f7ce3ce | ||
|
|
a48c6c5733 | ||
|
|
035a72ec1f | ||
|
|
06dcfc3098 | ||
|
|
d512f78479 | ||
|
|
7c9f744d9b | ||
|
|
fb5998fb62 | ||
|
|
edfd25fbcc | ||
|
|
325de75b11 | ||
|
|
859d9d5d83 | ||
|
|
8f5091b2d5 | ||
|
|
5e0ced9f3a | ||
|
|
8cf9ee0f1f | ||
|
|
5e77a08b30 | ||
|
|
6b1d95b20d | ||
|
|
0171084b1a | ||
|
|
b46baa8a25 | ||
|
|
96d45ca70d | ||
|
|
aeb3a89825 | ||
|
|
678e967318 | ||
|
|
ce6193a541 | ||
|
|
a3c21bf3af | ||
|
|
850e95946a | ||
|
|
c316aceda1 | ||
|
|
3385d96213 | ||
|
|
fa7d783940 | ||
|
|
39ba28cdae | ||
|
|
7a32d40dd0 | ||
|
|
6593fef803 | ||
|
|
5de3cb9ba3 | ||
|
|
cd42b19718 | ||
|
|
eacfd2c172 | ||
|
|
439616c788 | ||
|
|
40c3204fb8 | ||
|
|
6ad5f62d66 | ||
|
|
1585cc420d | ||
|
|
856f156318 | ||
|
|
00d9da3027 | ||
|
|
53eaaa02a0 | ||
|
|
315b642b3b | ||
|
|
958752e72f | ||
|
|
6b1dbe372e | ||
|
|
a644187131 | ||
|
|
681a4f9855 | ||
|
|
f2be1b2ca9 | ||
|
|
3c203eba8e | ||
|
|
f3b0665d94 | ||
|
|
9f43d3fc5a | ||
|
|
95985fffc8 | ||
|
|
6c6ac6da5b | ||
|
|
c1ac8767b7 | ||
|
|
96068eb0e2 | ||
|
|
36d2e0942b | ||
|
|
b585783b75 | ||
|
|
3924b6f12a | ||
|
|
2674880946 | ||
|
|
6c6f953a42 | ||
|
|
772e8ac85e | ||
|
|
2bbffed62b | ||
|
|
685990bdd6 | ||
|
|
ff83ac3fb4 | ||
|
|
6827a09f26 | ||
|
|
a5148f89c1 | ||
|
|
995a680823 | ||
|
|
9f0abb69fd | ||
|
|
d65eebe9c3 | ||
|
|
ca4f1f1b7c | ||
|
|
46b119ce71 | ||
|
|
fc0dd7d094 | ||
|
|
712d8be7bb | ||
|
|
536dcc14ca | ||
|
|
dc44c3a455 | ||
|
|
8e90366712 | ||
|
|
ed36fd7260 | ||
|
|
31a6a74743 | ||
|
|
001ff508b5 | ||
|
|
6882fa9d10 | ||
|
|
91eaae0ef6 | ||
|
|
785dc6ab78 | ||
|
|
f011a9a4ee | ||
|
|
c6c58050e7 | ||
|
|
5fce8bcac6 | ||
|
|
2f522bae5c | ||
|
|
2e6f91924d | ||
|
|
15f7a9c74a | ||
|
|
49f52f0258 | ||
|
|
396ea471fb | ||
|
|
eef17dd000 | ||
|
|
84dc03b9d1 | ||
|
|
0ce220d54f | ||
|
|
b693136396 | ||
|
|
3c117db43b | ||
|
|
075ccb1d00 | ||
|
|
e3bddd1c19 | ||
|
|
22b113ce64 | ||
|
|
0f5e91b091 | ||
|
|
557a528690 | ||
|
|
762569c826 | ||
|
|
ad7d82f521 | ||
|
|
04deaacbec | ||
|
|
ec443f2b5e | ||
|
|
f1b04ff354 | ||
|
|
62dd7d070a | ||
|
|
5df92a86a3 | ||
|
|
2ca3df1ff4 | ||
|
|
a8751249fd | ||
|
|
19abff826e | ||
|
|
5f199cf81f | ||
|
|
eb26b78a19 | ||
|
|
3d0053c61a | ||
|
|
7b15d246e8 | ||
|
|
b75f4a2834 | ||
|
|
d6ac4c6df5 | ||
|
|
02f56c88f5 | ||
|
|
cd35b9ed2a | ||
|
|
e8944a6c3a | ||
|
|
6fcbc225eb | ||
|
|
f06eda488c | ||
|
|
0ef910445d | ||
|
|
b22ee9d27c | ||
|
|
859a0e83c8 | ||
|
|
b35f151b80 | ||
|
|
17afb07e45 | ||
|
|
b407963344 | ||
|
|
8b31ba1836 | ||
|
|
0cf6edae43 | ||
|
|
0824105377 | ||
|
|
dc936a5b7b | ||
|
|
c8fe02e48e | ||
|
|
32547db306 | ||
|
|
41902154ca | ||
|
|
2354ced1bf | ||
|
|
791cc3a1b8 | ||
|
|
021c03fbbf | ||
|
|
e4a59f29d0 | ||
|
|
64d4880983 | ||
|
|
47c348e03a | ||
|
|
dea86535c1 | ||
|
|
eee6b62589 | ||
|
|
771ca8d84c | ||
|
|
8f5b334951 | ||
|
|
0dc6169282 | ||
|
|
abe78f0428 | ||
|
|
9930ec2d19 | ||
|
|
83d7f4477e | ||
|
|
18c3704c2e | ||
|
|
bef581caa5 | ||
|
|
2f0abe0604 | ||
|
|
4235b44c47 | ||
|
|
f318185ad0 | ||
|
|
43b496287c | ||
|
|
9d0c8ecdc3 | ||
|
|
5a78d99af0 | ||
|
|
693f5ddf6e | ||
|
|
ece655f67d | ||
|
|
119692c979 | ||
|
|
6068f3243a | ||
|
|
a7cda2e793 | ||
|
|
2687cb85f0 | ||
|
|
b2ce1700d2 | ||
|
|
0b634f8340 | ||
|
|
9a078b743f | ||
|
|
65b6576cfc | ||
|
|
78e99e6df2 | ||
|
|
bb0a42733d | ||
|
|
a2ae08e263 | ||
|
|
eaa9d6c7e6 | ||
|
|
8900695153 | ||
|
|
bfe548d573 | ||
|
|
7ab4002771 | ||
|
|
6eace856aa | ||
|
|
f10e5a19c5 | ||
|
|
90a4a63776 | ||
|
|
0f14e35ba3 | ||
|
|
ad0c4207d6 | ||
|
|
97da43645a | ||
|
|
42b7c42617 | ||
|
|
bd81e25e6b | ||
|
|
debe6aa649 | ||
|
|
6f433902f0 | ||
|
|
ba902e7f8e | ||
|
|
7e8ec21684 | ||
|
|
b7131b7efc | ||
|
|
ace99c3464 | ||
|
|
83fc5bc113 | ||
|
|
160de0adf6 | ||
|
|
b4753f3a83 | ||
|
|
bce6e2c78c | ||
|
|
b5ea0eccd2 | ||
|
|
87865b9761 | ||
|
|
13fa4703c0 | ||
|
|
5a21e00322 | ||
|
|
3feed2bc5a | ||
|
|
501b9501e0 | ||
|
|
727271e68c | ||
|
|
63a619dddf | ||
|
|
113566a6ab | ||
|
|
7862841b48 | ||
|
|
fe6cbaa03d | ||
|
|
9ef1fc7304 | ||
|
|
cf3a9d3ced | ||
|
|
1d1c80db7b | ||
|
|
eeb37e9104 | ||
|
|
18bf0daee7 | ||
|
|
1e9189aee7 | ||
|
|
95f6dfafdd | ||
|
|
bedaae8a90 | ||
|
|
7bfa3fe7fd | ||
|
|
143b0b73b9 | ||
|
|
cbfc46270e | ||
|
|
b31efb46ec | ||
|
|
ef3477098f | ||
|
|
9dce117555 | ||
|
|
e66e1e0502 | ||
|
|
19e1e9daeb | ||
|
|
ec8a948f3f | ||
|
|
38fc7641a0 | ||
|
|
ddc3925659 | ||
|
|
f8416edf8f | ||
|
|
4f94f37ce8 | ||
|
|
528de58418 | ||
|
|
e6ea34aed8 | ||
|
|
f171938b00 | ||
|
|
7b27368d2d | ||
|
|
f754df51bc | ||
|
|
77dce53c7a | ||
|
|
73f268e7c4 | ||
|
|
075d7d8131 | ||
|
|
206337044a | ||
|
|
55b44ff7aa | ||
|
|
ae48639ae9 | ||
|
|
6b5e78f810 | ||
|
|
3e485e0a88 | ||
|
|
335c78f908 | ||
|
|
b103e4eaf6 | ||
|
|
c4a6c63d23 | ||
|
|
4a4f10f97b | ||
|
|
a5712daab7 | ||
|
|
28cb1ef106 | ||
|
|
0d99a3e527 | ||
|
|
9da43263ce | ||
|
|
784e199068 | ||
|
|
1ffee802c0 | ||
|
|
6f0ac7f0c2 | ||
|
|
941d4d8985 | ||
|
|
44c76d8ffb | ||
|
|
df9a9f5fb6 | ||
|
|
bebd0fa0e6 | ||
|
|
594e90789d | ||
|
|
f2ab42cb80 | ||
|
|
3224fa8ce7 | ||
|
|
ce156c1344 | ||
|
|
434e553022 | ||
|
|
de5b5ee4b0 | ||
|
|
60636bf56d | ||
|
|
1ca71f93e9 | ||
|
|
63ff39bed6 | ||
|
|
cb0b9604d4 | ||
|
|
1dbe3b62d7 | ||
|
|
5c0707d221 | ||
|
|
c4ffc37dd5 | ||
|
|
aaf93b0f6f | ||
|
|
23eab1e84f | ||
|
|
218f32e552 | ||
|
|
62fbe4d08c | ||
|
|
41ffd00619 | ||
|
|
98b9a604cf | ||
|
|
01468b640a | ||
|
|
4d96b036a2 | ||
|
|
2d1ac15e24 | ||
|
|
2c27e8576f | ||
|
|
67f638d953 | ||
|
|
ea5bd5f7d3 | ||
|
|
394f695416 | ||
|
|
e4db466ab9 | ||
|
|
ee04c014c9 | ||
|
|
ea84f08de8 | ||
|
|
7d8a2b2d56 | ||
|
|
995d1e5aac | ||
|
|
3b918492ae | ||
|
|
66b419163c | ||
|
|
52bff39c22 | ||
|
|
d151a13e87 | ||
|
|
5e7e7d3598 | ||
|
|
356248bd05 | ||
|
|
73a60153f6 | ||
|
|
67cf0e62a7 | ||
|
|
21fbcc3e67 | ||
|
|
0d63ff92a0 | ||
|
|
983645e222 | ||
|
|
d2805bfa47 | ||
|
|
3f16b30631 | ||
|
|
8ebcbe3c5c | ||
|
|
363bed5c37 | ||
|
|
1547a646dd | ||
|
|
1408d51065 | ||
|
|
f5c319f18f | ||
|
|
a3c29054d0 | ||
|
|
01533ca34c | ||
|
|
a1f6dc6db4 | ||
|
|
37d53d936d | ||
|
|
bc0a2df653 | ||
|
|
7e50fd8273 | ||
|
|
ba560ffbad | ||
|
|
50ca32c8b9 | ||
|
|
bdfe3af505 | ||
|
|
798b56055d | ||
|
|
ce68e4a070 | ||
|
|
5da3130d26 | ||
|
|
6687cdc101 | ||
|
|
7e74ec6b62 | ||
|
|
b887fa70a5 | ||
|
|
1c6ab25253 | ||
|
|
1c43a3d1ee | ||
|
|
60ca1b3509 | ||
|
|
39d9312005 | ||
|
|
a0e42f5dfe | ||
|
|
7a3aff12a5 | ||
|
|
d4f1ef8704 | ||
|
|
a86d704bec | ||
|
|
57ab27aa5b | ||
|
|
909cc8b5d3 | ||
|
|
b7acbc4347 | ||
|
|
d276306ddc | ||
|
|
25b98b7ad2 | ||
|
|
819b424142 | ||
|
|
5d0328ba4b | ||
|
|
b219cff29c | ||
|
|
409eeaf962 | ||
|
|
4e5e8bd026 | ||
|
|
b91ec53ae0 | ||
|
|
ce0624b8b0 | ||
|
|
b4de2769cf | ||
|
|
3f7b0f1eb6 | ||
|
|
4055365c57 | ||
|
|
db7f782ca6 | ||
|
|
cde9d8d23a | ||
|
|
3dd9b0a2b6 | ||
|
|
59e54cecd2 | ||
|
|
5ed7e8efc2 | ||
|
|
fa85adfe0b | ||
|
|
a3e4f44a64 | ||
|
|
4a7a485e62 | ||
|
|
c353e02b3e | ||
|
|
1c2964cab4 | ||
|
|
47e083280a | ||
|
|
7db003100b | ||
|
|
f814b1ef47 | ||
|
|
f3d2ae366e | ||
|
|
b6ecce3aa2 | ||
|
|
c5235be9a7 | ||
|
|
23300de9d4 | ||
|
|
41dc57c84f | ||
|
|
85d1fe1ce6 | ||
|
|
ac6067ad53 | ||
|
|
173a62b5ce | ||
|
|
cbbafce73d | ||
|
|
2e74c19995 | ||
|
|
a212b7566c | ||
|
|
08faa52ef4 | ||
|
|
33bc4fffd9 | ||
|
|
eca2108e15 | ||
|
|
dab6034eb9 | ||
|
|
461e7d05d7 | ||
|
|
10c37b101d | ||
|
|
81f2c910f7 | ||
|
|
1fd97713c1 | ||
|
|
2d3eeed9ec | ||
|
|
b22eb6f12f | ||
|
|
dfb0a2a368 | ||
|
|
03bcc56429 | ||
|
|
457fda3fc3 | ||
|
|
54cee64610 | ||
|
|
477499248a | ||
|
|
3b70b6aeee | ||
|
|
163762e99e | ||
|
|
b99833df75 | ||
|
|
4be6231426 | ||
|
|
4673e3d511 | ||
|
|
00e48cc424 | ||
|
|
f8453825fb | ||
|
|
6cda9ab939 | ||
|
|
831d667896 | ||
|
|
17c342895a | ||
|
|
6ef518e6a0 | ||
|
|
ddee2fbb12 | ||
|
|
6512c2cdfb | ||
|
|
0eee05adaa | ||
|
|
17e0154ff3 | ||
|
|
2780f60c65 | ||
|
|
7dd3450362 | ||
|
|
ca4b2a61b8 | ||
|
|
d2ecd65ca5 | ||
|
|
03bd49f6c8 | ||
|
|
51607c5ed8 | ||
|
|
e2cbd3ee28 | ||
|
|
5944e6b57e | ||
|
|
efd46498ef | ||
|
|
3d705a737f | ||
|
|
996c57bccf | ||
|
|
a31e72ff06 | ||
|
|
f07d8fca8c | ||
|
|
69dbdee01f | ||
|
|
dedb9f3dc0 | ||
|
|
7d69b840fe | ||
|
|
4eaef300cb | ||
|
|
ec1a6b5edd | ||
|
|
adc5485c09 | ||
|
|
f622b2916d | ||
|
|
26be0cf948 | ||
|
|
e27c01fe5b | ||
|
|
d639e58fb9 | ||
|
|
0195c2cb48 | ||
|
|
068e2ec49b | ||
|
|
a9306b99ec | ||
|
|
3597194742 | ||
|
|
6f06ccec8e | ||
|
|
6fe7f220f9 | ||
|
|
45e70d493d | ||
|
|
ce71ab83f2 | ||
|
|
bf85d8facd | ||
|
|
c5ff7cdb2b | ||
|
|
f9ccf4f532 | ||
|
|
ab731f40a7 | ||
|
|
d8434fffa8 | ||
|
|
151b1d4510 | ||
|
|
168cf3e1f6 | ||
|
|
52dab0fa20 | ||
|
|
9257bab06e | ||
|
|
27f0a6f27a | ||
|
|
5bedbef2f2 | ||
|
|
51e7be8aa0 | ||
|
|
6c85bb39a3 | ||
|
|
07f7247707 | ||
|
|
f669711670 | ||
|
|
5f3671f349 | ||
|
|
1335cb699b | ||
|
|
84414b87c0 | ||
|
|
a1ecd4a501 | ||
|
|
d7e6f2ee41 | ||
|
|
04870fb8b3 | ||
|
|
9d196b78f7 | ||
|
|
4229525928 | ||
|
|
d861fecdb8 | ||
|
|
f280e23095 | ||
|
|
ed0e1d92c0 | ||
|
|
d82fc22659 | ||
|
|
6616d6788c | ||
|
|
322a7cf033 | ||
|
|
0f487c10ba | ||
|
|
11417144bd | ||
|
|
dafc59b163 | ||
|
|
566f9a80c4 | ||
|
|
89a42c5648 | ||
|
|
83ffbb00e8 | ||
|
|
84913cecab | ||
|
|
998bb09a92 | ||
|
|
cd68a8db54 | ||
|
|
df8477d180 | ||
|
|
244fbae0ce | ||
|
|
19e08a52c0 | ||
|
|
6389b1bb73 | ||
|
|
cadcbf6106 | ||
|
|
118f007ca6 | ||
|
|
cbb32bd29d | ||
|
|
9858dcd740 | ||
|
|
1fb76d135b | ||
|
|
bb62c8b2f1 | ||
|
|
2cbe7bf885 | ||
|
|
6043f6b74d | ||
|
|
ef1366592a | ||
|
|
01cf9fb8f3 | ||
|
|
285c406d5d | ||
|
|
ad29e52a57 | ||
|
|
3cfe207c83 | ||
|
|
c7e65cbc40 | ||
|
|
b8e02efb04 | ||
|
|
c7f20fb836 | ||
|
|
28a0202ef4 | ||
|
|
164e947045 | ||
|
|
7e65c0c87d | ||
|
|
9c1f753f17 | ||
|
|
0f821eb52d | ||
|
|
e3aadd63ab | ||
|
|
aa06d520df | ||
|
|
4fa1d4ba97 | ||
|
|
ba9f11b345 | ||
|
|
4777dd2e5e | ||
|
|
64b4591b72 | ||
|
|
bac5961fd8 | ||
|
|
b3cac862d8 | ||
|
|
b8ab2ad539 | ||
|
|
618d5bd5e9 | ||
|
|
096c3278b3 | ||
|
|
c9d9976c22 | ||
|
|
65497f93d4 | ||
|
|
af8a53bef6 | ||
|
|
916b856e97 | ||
|
|
7848da63f2 | ||
|
|
f359a1d31a | ||
|
|
72d645feae | ||
|
|
72fe382bba | ||
|
|
d25e840cf5 | ||
|
|
df1775572a | ||
|
|
86670cd49f | ||
|
|
31a4bf906e | ||
|
|
599291e8b7 | ||
|
|
f5a04fb9fb | ||
|
|
88558b67c3 | ||
|
|
d52cb255e0 | ||
|
|
6c214cbc37 | ||
|
|
01012c1448 | ||
|
|
4c7befb910 | ||
|
|
b62669ec8f | ||
|
|
0fb74caf9b | ||
|
|
9623dac01f | ||
|
|
695b27968c |
9
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
9
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
Thank you for proposing a pull request. This template will guide you through the essential steps necessary for a pull request.
|
||||||
|
Make sure that:
|
||||||
|
|
||||||
|
- [ ] You have read the [Spring Data contribution guidelines](https://github.com/spring-projects/spring-data-build/blob/master/CONTRIBUTING.adoc).
|
||||||
|
- [ ] There is a ticket in the bug tracker for the project in our [JIRA](https://jira.spring.io/browse/DATAMONGO).
|
||||||
|
- [ ] You use the code formatters provided [here](https://github.com/spring-projects/spring-data-build/tree/master/etc/ide) and have them applied to your changes. Don’t submit any formatting related changes.
|
||||||
|
- [ ] You submit test cases (unit or integration tests) that back your changes.
|
||||||
|
- [ ] You added yourself as author in the headers of the classes you touched. Amend the date range in the Apache license header if needed. For new types, add the license header (copy from another file and set the current year only).
|
||||||
|
- [ ] You provide your full name and an email address registered with your GitHub account. If you’re a first-time submitter, make sure you have completed the [Contributor’s License Agreement form](https://support.springsource.com/spring_committer_signup).
|
||||||
38
.travis.yml
Normal file
38
.travis.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
language: java
|
||||||
|
|
||||||
|
jdk:
|
||||||
|
- oraclejdk8
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- mongod --version
|
||||||
|
|
||||||
|
env:
|
||||||
|
matrix:
|
||||||
|
- PROFILE=ci
|
||||||
|
- PROFILE=mongo-next
|
||||||
|
- PROFILE=mongo3
|
||||||
|
- PROFILE=mongo3-next
|
||||||
|
- PROFILE=mongo31
|
||||||
|
- PROFILE=mongo32
|
||||||
|
- PROFILE=mongo33
|
||||||
|
- PROFILE=mongo34-next
|
||||||
|
|
||||||
|
# Current MongoDB version is 2.4.2 as of 2016-04, see https://github.com/travis-ci/travis-ci/issues/3694
|
||||||
|
# apt-get starts a MongoDB instance so it's not started using before_script
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- mongodb-3.2-precise
|
||||||
|
packages:
|
||||||
|
- mongodb-org-server
|
||||||
|
- mongodb-org-shell
|
||||||
|
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- $HOME/.m2
|
||||||
|
|
||||||
|
install: true
|
||||||
|
|
||||||
|
script: "mvn clean dependency:list test -P${PROFILE} -Dsort"
|
||||||
27
CODE_OF_CONDUCT.adoc
Normal file
27
CODE_OF_CONDUCT.adoc
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
= Contributor Code of Conduct
|
||||||
|
|
||||||
|
As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
||||||
|
|
||||||
|
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery
|
||||||
|
* Personal attacks
|
||||||
|
* Trolling or insulting/derogatory comments
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing other's private information, such as physical or electronic addresses,
|
||||||
|
without explicit permission
|
||||||
|
* Other unethical or unprofessional conduct
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer at spring-code-of-conduct@pivotal.io.
|
||||||
|
All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
|
||||||
|
Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the http://contributor-covenant.org[Contributor Covenant], version 1.3.0, available at http://contributor-covenant.org/version/1/3/0/[contributor-covenant.org/version/1/3/0/].
|
||||||
@@ -1 +0,0 @@
|
|||||||
You find the contribution guidelines for Spring Data projects [here](https://github.com/spring-projects/spring-data-build/blob/master/CONTRIBUTING.md).
|
|
||||||
3
CONTRIBUTING.adoc
Normal file
3
CONTRIBUTING.adoc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
= Spring Data contribution guidelines
|
||||||
|
|
||||||
|
You find the contribution guidelines for Spring Data projects https://github.com/spring-projects/spring-data-build/blob/master/CONTRIBUTING.adoc[here].
|
||||||
@@ -11,7 +11,7 @@ For a comprehensive treatment of all the Spring Data MongoDB features, please re
|
|||||||
* the [User Guide](http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/)
|
* the [User Guide](http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/)
|
||||||
* the [JavaDocs](http://docs.spring.io/spring-data/mongodb/docs/current/api/) have extensive comments in them as well.
|
* the [JavaDocs](http://docs.spring.io/spring-data/mongodb/docs/current/api/) have extensive comments in them as well.
|
||||||
* the home page of [Spring Data MongoDB](http://projects.spring.io/spring-data-mongodb) contains links to articles and other resources.
|
* the home page of [Spring Data MongoDB](http://projects.spring.io/spring-data-mongodb) contains links to articles and other resources.
|
||||||
* for more detailed questions, use the [forum](http://forum.spring.io/forum/spring-projects/data/nosql).
|
* for more detailed questions, use [Spring Data Mongodb on Stackoverflow](http://stackoverflow.com/questions/tagged/spring-data-mongodb).
|
||||||
|
|
||||||
If you are new to Spring as well as to Spring Data, look for information about [Spring projects](http://projects.spring.io/).
|
If you are new to Spring as well as to Spring Data, look for information about [Spring projects](http://projects.spring.io/).
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ Add the Maven dependency:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb</artifactId>
|
<artifactId>spring-data-mongodb</artifactId>
|
||||||
<version>1.4.1.RELEASE</version>
|
<version>1.5.0.RELEASE</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ If you'd rather like the latest snapshots of the upcoming major version, use our
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb</artifactId>
|
<artifactId>spring-data-mongodb</artifactId>
|
||||||
<version>1.5.0.BUILD-SNAPSHOT</version>
|
<version>1.6.0.BUILD-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
@@ -139,7 +139,7 @@ public class MyService {
|
|||||||
|
|
||||||
Here are some ways for you to get involved in the community:
|
Here are some ways for you to get involved in the community:
|
||||||
|
|
||||||
* Get involved with the Spring community on the Spring Community Forums. Please help out on the [forum](http://forum.spring.io/forum/spring-projects/data/nosql) by responding to questions and joining the debate.
|
* Get involved with the Spring community on Stackoverflow and help out on the [spring-data-mongodb](http://stackoverflow.com/questions/tagged/spring-data-mongodb) tag by responding to questions and joining the debate.
|
||||||
* Create [JIRA](https://jira.springframework.org/browse/DATADOC) tickets for bugs and new features and comment and vote on the ones that you are interested in.
|
* Create [JIRA](https://jira.springframework.org/browse/DATADOC) tickets for bugs and new features and comment and vote on the ones that you are interested in.
|
||||||
* Github is for social coding: if you want to write code, we encourage contributions through pull requests from [forks of this repository](http://help.github.com/forking/). If you want to contribute code this way, please reference a JIRA ticket as well covering the specific issue you are addressing.
|
* Github is for social coding: if you want to write code, we encourage contributions through pull requests from [forks of this repository](http://help.github.com/forking/). If you want to contribute code this way, please reference a JIRA ticket as well covering the specific issue you are addressing.
|
||||||
* Watch for upcoming articles on Spring by [subscribing](http://spring.io/blog) to spring.io.
|
* Watch for upcoming articles on Spring by [subscribing](http://spring.io/blog) to spring.io.
|
||||||
|
|||||||
2
lombok.config
Normal file
2
lombok.config
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
lombok.nonNull.exceptionType = IllegalArgumentException
|
||||||
|
lombok.log.fieldName = LOG
|
||||||
144
pom.xml
144
pom.xml
@@ -1,22 +1,21 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb-parent</artifactId>
|
<artifactId>spring-data-mongodb-parent</artifactId>
|
||||||
<version>1.5.0.M1</version>
|
<version>1.9.12.BUILD-SNAPSHOT</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<name>Spring Data MongoDB</name>
|
<name>Spring Data MongoDB</name>
|
||||||
<description>MongoDB support for Spring Data</description>
|
<description>MongoDB support for Spring Data</description>
|
||||||
<url>http://projects.spring.io/spring-data-mongodb</url>
|
<url>https://projects.spring.io/spring-data-mongodb</url>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data.build</groupId>
|
<groupId>org.springframework.data.build</groupId>
|
||||||
<artifactId>spring-data-parent</artifactId>
|
<artifactId>spring-data-parent</artifactId>
|
||||||
<version>1.4.0.M1</version>
|
<version>1.8.12.BUILD-SNAPSHOT</version>
|
||||||
<relativePath>../spring-data-build/parent/pom.xml</relativePath>
|
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
@@ -29,18 +28,18 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<project.type>multi</project.type>
|
<project.type>multi</project.type>
|
||||||
<dist.id>spring-data-mongodb</dist.id>
|
<dist.id>spring-data-mongodb</dist.id>
|
||||||
<springdata.commons>1.8.0.M1</springdata.commons>
|
<springdata.commons>1.12.12.BUILD-SNAPSHOT</springdata.commons>
|
||||||
<mongo>2.11.4</mongo>
|
<mongo>2.14.3</mongo>
|
||||||
<mongo-osgi>${mongo}</mongo-osgi>
|
<mongo.osgi>2.13.0</mongo.osgi>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
<developer>
|
<developer>
|
||||||
<id>ogierke</id>
|
<id>ogierke</id>
|
||||||
<name>Oliver Gierke</name>
|
<name>Oliver Gierke</name>
|
||||||
<email>ogierke at gopivotal.com</email>
|
<email>ogierke at gopivotal.com</email>
|
||||||
<organization>Pivotal</organization>
|
<organization>Pivotal</organization>
|
||||||
<organizationUrl>http://www.gopivotal.com</organizationUrl>
|
<organizationUrl>https://pivotal.io</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>Project Lead</role>
|
<role>Project Lead</role>
|
||||||
</roles>
|
</roles>
|
||||||
@@ -51,7 +50,7 @@
|
|||||||
<name>Thomas Risberg</name>
|
<name>Thomas Risberg</name>
|
||||||
<email>trisberg at vmware.com</email>
|
<email>trisberg at vmware.com</email>
|
||||||
<organization>Pivotal</organization>
|
<organization>Pivotal</organization>
|
||||||
<organizationUrl>http://www.gopivotal.com</organizationUrl>
|
<organizationUrl>https://pivotal.io</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>Developer</role>
|
<role>Developer</role>
|
||||||
</roles>
|
</roles>
|
||||||
@@ -62,7 +61,7 @@
|
|||||||
<name>Mark Pollack</name>
|
<name>Mark Pollack</name>
|
||||||
<email>mpollack at gopivotal.com</email>
|
<email>mpollack at gopivotal.com</email>
|
||||||
<organization>Pivotal</organization>
|
<organization>Pivotal</organization>
|
||||||
<organizationUrl>http://www.gopivotal.com</organizationUrl>
|
<organizationUrl>https://pivotal.io</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>Developer</role>
|
<role>Developer</role>
|
||||||
</roles>
|
</roles>
|
||||||
@@ -73,7 +72,7 @@
|
|||||||
<name>Jon Brisbin</name>
|
<name>Jon Brisbin</name>
|
||||||
<email>jbrisbin at gopivotal.com</email>
|
<email>jbrisbin at gopivotal.com</email>
|
||||||
<organization>Pivotal</organization>
|
<organization>Pivotal</organization>
|
||||||
<organizationUrl>http://www.gopivotal.com</organizationUrl>
|
<organizationUrl>https://pivotal.io</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>Developer</role>
|
<role>Developer</role>
|
||||||
</roles>
|
</roles>
|
||||||
@@ -84,7 +83,7 @@
|
|||||||
<name>Thomas Darimont</name>
|
<name>Thomas Darimont</name>
|
||||||
<email>tdarimont at gopivotal.com</email>
|
<email>tdarimont at gopivotal.com</email>
|
||||||
<organization>Pivotal</organization>
|
<organization>Pivotal</organization>
|
||||||
<organizationUrl>http://www.gopivotal.com</organizationUrl>
|
<organizationUrl>https://pivotal.io</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>Developer</role>
|
<role>Developer</role>
|
||||||
</roles>
|
</roles>
|
||||||
@@ -95,7 +94,7 @@
|
|||||||
<name>Christoph Strobl</name>
|
<name>Christoph Strobl</name>
|
||||||
<email>cstrobl at gopivotal.com</email>
|
<email>cstrobl at gopivotal.com</email>
|
||||||
<organization>Pivotal</organization>
|
<organization>Pivotal</organization>
|
||||||
<organizationUrl>http://www.gopivotal.com</organizationUrl>
|
<organizationUrl>https://pivotal.io</organizationUrl>
|
||||||
<roles>
|
<roles>
|
||||||
<role>Developer</role>
|
<role>Developer</role>
|
||||||
</roles>
|
</roles>
|
||||||
@@ -105,12 +104,109 @@
|
|||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
<profile>
|
<profile>
|
||||||
|
|
||||||
<id>mongo-next</id>
|
<id>mongo-next</id>
|
||||||
<properties>
|
<properties>
|
||||||
<mongo>2.12.0-rc0</mongo>
|
<mongo>2.15.0-SNAPSHOT</mongo>
|
||||||
<mongo-osgi>2.12.0</mongo-osgi>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>mongo-snapshots</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
</profile>
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
|
||||||
|
<id>mongo3</id>
|
||||||
|
<properties>
|
||||||
|
<mongo>3.0.4</mongo>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
|
||||||
|
<id>mongo3-next</id>
|
||||||
|
<properties>
|
||||||
|
<mongo>3.0.5-SNAPSHOT</mongo>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>mongo-snapshots</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
|
||||||
|
<id>mongo31</id>
|
||||||
|
<properties>
|
||||||
|
<mongo>3.1.1</mongo>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
|
||||||
|
<id>mongo32</id>
|
||||||
|
<properties>
|
||||||
|
<mongo>3.2.2</mongo>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
|
||||||
|
<id>mongo33</id>
|
||||||
|
<properties>
|
||||||
|
<mongo>3.3.0</mongo>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>mongo-snapshots</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
|
||||||
|
<id>mongo34-next</id>
|
||||||
|
<properties>
|
||||||
|
<mongo>3.4.0-SNAPSHOT</mongo>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>mongo-snapshots</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
</profile>
|
||||||
|
|
||||||
|
<profile>
|
||||||
|
<id>release</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jfrog.buildinfo</groupId>
|
||||||
|
<artifactId>artifactory-maven-plugin</artifactId>
|
||||||
|
<inherited>false</inherited>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@@ -121,18 +217,18 @@
|
|||||||
<version>${mongo}</version>
|
<version>${mongo}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>spring-libs-milestone</id>
|
<id>spring-libs-snapshot</id>
|
||||||
<url>http://repo.spring.io/libs-milestone/</url>
|
<url>https://repo.spring.io/libs-snapshot</url>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<pluginRepositories>
|
<pluginRepositories>
|
||||||
<pluginRepository>
|
<pluginRepository>
|
||||||
<id>spring-plugins-release</id>
|
<id>spring-plugins-release</id>
|
||||||
<url>http://repo.spring.io/plugins-release</url>
|
<url>https://repo.spring.io/plugins-release</url>
|
||||||
</pluginRepository>
|
</pluginRepository>
|
||||||
</pluginRepositories>
|
</pluginRepositories>
|
||||||
|
|
||||||
|
|||||||
7
spring-data-mongodb-cross-store/aop.xml
Normal file
7
spring-data-mongodb-cross-store/aop.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<aspectj>
|
||||||
|
<aspects>
|
||||||
|
<aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect" />
|
||||||
|
<aspect name="org.springframework.data.mongodb.crossstore.MongoDocumentBacking" />
|
||||||
|
</aspects>
|
||||||
|
</aspectj>
|
||||||
@@ -1,23 +1,23 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb-parent</artifactId>
|
<artifactId>spring-data-mongodb-parent</artifactId>
|
||||||
<version>1.5.0.M1</version>
|
<version>1.9.12.BUILD-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>spring-data-mongodb-cross-store</artifactId>
|
<artifactId>spring-data-mongodb-cross-store</artifactId>
|
||||||
<name>Spring Data MongoDB - Cross-Store Support</name>
|
<name>Spring Data MongoDB - Cross-Store Support</name>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<jpa>1.0.0.Final</jpa>
|
<jpa>2.0.0</jpa>
|
||||||
<hibernate>3.6.10.Final</hibernate>
|
<hibernate>3.6.10.Final</hibernate>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<!-- Spring -->
|
<!-- Spring -->
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb</artifactId>
|
<artifactId>spring-data-mongodb</artifactId>
|
||||||
<version>1.5.0.M1</version>
|
<version>1.9.12.BUILD-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -56,17 +56,13 @@
|
|||||||
<artifactId>aspectjrt</artifactId>
|
<artifactId>aspectjrt</artifactId>
|
||||||
<version>${aspectj}</version>
|
<version>${aspectj}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>cglib</groupId>
|
|
||||||
<artifactId>cglib</artifactId>
|
|
||||||
<version>2.2</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- JPA -->
|
<!-- JPA -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hibernate.javax.persistence</groupId>
|
<groupId>org.eclipse.persistence</groupId>
|
||||||
<artifactId>hibernate-jpa-2.0-api</artifactId>
|
<artifactId>javax.persistence</artifactId>
|
||||||
<version>${jpa}</version>
|
<version>${jpa}</version>
|
||||||
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- For Tests -->
|
<!-- For Tests -->
|
||||||
@@ -102,7 +98,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>aspectj-maven-plugin</artifactId>
|
<artifactId>aspectj-maven-plugin</artifactId>
|
||||||
<version>1.4</version>
|
<version>1.6</version>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.aspectj</groupId>
|
<groupId>org.aspectj</groupId>
|
||||||
@@ -131,8 +127,10 @@
|
|||||||
<artifactId>spring-aspects</artifactId>
|
<artifactId>spring-aspects</artifactId>
|
||||||
</aspectLibrary>
|
</aspectLibrary>
|
||||||
</aspectLibraries>
|
</aspectLibraries>
|
||||||
|
<complianceLevel>${source.level}</complianceLevel>
|
||||||
<source>${source.level}</source>
|
<source>${source.level}</source>
|
||||||
<target>${source.level}</target>
|
<target>${source.level}</target>
|
||||||
|
<xmlConfigured>aop.xml</xmlConfigured>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 the original author or authors.
|
* Copyright 2011-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -37,6 +37,8 @@ import com.mongodb.MongoException;
|
|||||||
/**
|
/**
|
||||||
* @author Thomas Risberg
|
* @author Thomas Risberg
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Alex Vengrovsk
|
||||||
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
||||||
|
|
||||||
@@ -45,7 +47,7 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
|||||||
private static final String ENTITY_FIELD_NAME = "_entity_field_name";
|
private static final String ENTITY_FIELD_NAME = "_entity_field_name";
|
||||||
private static final String ENTITY_FIELD_CLASS = "_entity_field_class";
|
private static final String ENTITY_FIELD_CLASS = "_entity_field_class";
|
||||||
|
|
||||||
protected final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
private MongoTemplate mongoTemplate;
|
private MongoTemplate mongoTemplate;
|
||||||
private EntityManagerFactory entityManagerFactory;
|
private EntityManagerFactory entityManagerFactory;
|
||||||
@@ -76,25 +78,25 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
|||||||
dbk.put(ENTITY_ID, id);
|
dbk.put(ENTITY_ID, id);
|
||||||
dbk.put(ENTITY_CLASS, entityClass.getName());
|
dbk.put(ENTITY_CLASS, entityClass.getName());
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Loading MongoDB data for " + dbk);
|
log.debug("Loading MongoDB data for {}", dbk);
|
||||||
}
|
}
|
||||||
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
|
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
|
||||||
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
||||||
for (DBObject dbo : collection.find(dbk)) {
|
for (DBObject dbo : collection.find(dbk)) {
|
||||||
String key = (String) dbo.get(ENTITY_FIELD_NAME);
|
String key = (String) dbo.get(ENTITY_FIELD_NAME);
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Processing key: " + key);
|
log.debug("Processing key: {}", key);
|
||||||
}
|
}
|
||||||
if (!changeSet.getValues().containsKey(key)) {
|
if (!changeSet.getValues().containsKey(key)) {
|
||||||
String className = (String) dbo.get(ENTITY_FIELD_CLASS);
|
String className = (String) dbo.get(ENTITY_FIELD_CLASS);
|
||||||
if (className == null) {
|
if (className == null) {
|
||||||
throw new DataIntegrityViolationException("Unble to convert property " + key + ": Invalid metadata, "
|
throw new DataIntegrityViolationException(
|
||||||
+ ENTITY_FIELD_CLASS + " not available");
|
"Unble to convert property " + key + ": Invalid metadata, " + ENTITY_FIELD_CLASS + " not available");
|
||||||
}
|
}
|
||||||
Class<?> clazz = ClassUtils.resolveClassName(className, ClassUtils.getDefaultClassLoader());
|
Class<?> clazz = ClassUtils.resolveClassName(className, ClassUtils.getDefaultClassLoader());
|
||||||
Object value = mongoTemplate.getConverter().read(clazz, dbo);
|
Object value = mongoTemplate.getConverter().read(clazz, dbo);
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Adding to ChangeSet: " + key);
|
log.debug("Adding to ChangeSet: {}", key);
|
||||||
}
|
}
|
||||||
changeSet.set(key, value);
|
changeSet.set(key, value);
|
||||||
}
|
}
|
||||||
@@ -109,9 +111,9 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
|||||||
* @see org.springframework.data.crossstore.ChangeSetPersister#getPersistentId(org.springframework.data.crossstore.ChangeSetBacked, org.springframework.data.crossstore.ChangeSet)
|
* @see org.springframework.data.crossstore.ChangeSetPersister#getPersistentId(org.springframework.data.crossstore.ChangeSetBacked, org.springframework.data.crossstore.ChangeSet)
|
||||||
*/
|
*/
|
||||||
public Object getPersistentId(ChangeSetBacked entity, ChangeSet cs) throws DataAccessException {
|
public Object getPersistentId(ChangeSetBacked entity, ChangeSet cs) throws DataAccessException {
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("getPersistentId called on " + entity);
|
log.debug("getPersistentId called on {}", entity);
|
||||||
|
}
|
||||||
if (entityManagerFactory == null) {
|
if (entityManagerFactory == null) {
|
||||||
throw new DataAccessResourceFailureException("EntityManagerFactory cannot be null");
|
throw new DataAccessResourceFailureException("EntityManagerFactory cannot be null");
|
||||||
}
|
}
|
||||||
@@ -130,7 +132,7 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Flush: changeset: " + cs.getValues());
|
log.debug("Flush: changeset: {}", cs.getValues());
|
||||||
}
|
}
|
||||||
|
|
||||||
String collName = getCollectionNameForEntity(entity.getClass());
|
String collName = getCollectionNameForEntity(entity.getClass());
|
||||||
@@ -152,7 +154,7 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
|||||||
});
|
});
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Flush: removing: " + dbQuery);
|
log.debug("Flush: removing: {}", dbQuery);
|
||||||
}
|
}
|
||||||
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
|
mongoTemplate.execute(collName, new CollectionCallback<Object>() {
|
||||||
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
||||||
@@ -164,7 +166,7 @@ public class MongoChangeSetPersister implements ChangeSetPersister<Object> {
|
|||||||
final DBObject dbDoc = new BasicDBObject();
|
final DBObject dbDoc = new BasicDBObject();
|
||||||
dbDoc.putAll(dbQuery);
|
dbDoc.putAll(dbQuery);
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Flush: saving: " + dbQuery);
|
log.debug("Flush: saving: {}", dbQuery);
|
||||||
}
|
}
|
||||||
mongoTemplate.getConverter().write(value, dbDoc);
|
mongoTemplate.getConverter().write(value, dbDoc);
|
||||||
dbDoc.put(ENTITY_FIELD_CLASS, value.getClass().getName());
|
dbDoc.put(ENTITY_FIELD_CLASS, value.getClass().getName());
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ Bundle-SymbolicName: org.springframework.data.mongodb.crossstore
|
|||||||
Bundle-Name: Spring Data MongoDB Cross Store Support
|
Bundle-Name: Spring Data MongoDB Cross Store Support
|
||||||
Bundle-Vendor: Pivotal Software, Inc.
|
Bundle-Vendor: Pivotal Software, Inc.
|
||||||
Bundle-ManifestVersion: 2
|
Bundle-ManifestVersion: 2
|
||||||
Import-Package:
|
Import-Package:
|
||||||
sun.reflect;version="0";resolution:=optional
|
sun.reflect;version="0";resolution:=optional
|
||||||
Export-Template:
|
Export-Template:
|
||||||
org.springframework.data.mongodb.crossstore.*;version="${project.version}"
|
org.springframework.data.mongodb.crossstore.*;version="${project.version}"
|
||||||
Import-Template:
|
Import-Template:
|
||||||
com.mongodb.*;version="${mongo-osgi:[=.=.=,+1.0.0)}",
|
com.mongodb.*;version="${mongo.osgi:[=.=.=,+1.0.0)}",
|
||||||
javax.persistence.*;version="${jpa:[=.=.=,+1.0.0)}",
|
javax.persistence.*;version="${jpa:[=.=.=,+1.0.0)}",
|
||||||
org.aspectj.*;version="${aspectj:[1.0.0, 2.0.0)}",
|
org.aspectj.*;version="${aspectj:[1.0.0, 2.0.0)}",
|
||||||
org.bson.*;version="0",
|
org.bson.*;version="0",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<artifactId>spring-data-mongodb-distribution</artifactId>
|
<artifactId>spring-data-mongodb-distribution</artifactId>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
@@ -13,10 +13,10 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb-parent</artifactId>
|
<artifactId>spring-data-mongodb-parent</artifactId>
|
||||||
<version>1.5.0.M1</version>
|
<version>1.9.12.BUILD-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.root>${basedir}/..</project.root>
|
<project.root>${basedir}/..</project.root>
|
||||||
<dist.key>SDMONGO</dist.key>
|
<dist.key>SDMONGO</dist.key>
|
||||||
@@ -32,6 +32,10 @@
|
|||||||
<groupId>org.codehaus.mojo</groupId>
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
<artifactId>wagon-maven-plugin</artifactId>
|
<artifactId>wagon-maven-plugin</artifactId>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.asciidoctor</groupId>
|
||||||
|
<artifactId>asciidoctor-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb-parent</artifactId>
|
<artifactId>spring-data-mongodb-parent</artifactId>
|
||||||
<version>1.5.0.M1</version>
|
<version>1.9.12.BUILD-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -30,6 +30,7 @@ import com.mongodb.BasicDBList;
|
|||||||
import com.mongodb.BasicDBObject;
|
import com.mongodb.BasicDBObject;
|
||||||
import com.mongodb.DB;
|
import com.mongodb.DB;
|
||||||
import com.mongodb.Mongo;
|
import com.mongodb.Mongo;
|
||||||
|
import com.mongodb.MongoClient;
|
||||||
import com.mongodb.WriteConcern;
|
import com.mongodb.WriteConcern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,6 +38,7 @@ import com.mongodb.WriteConcern;
|
|||||||
*
|
*
|
||||||
* @author Jon Brisbin
|
* @author Jon Brisbin
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @auhtor Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class MongoLog4jAppender extends AppenderSkeleton {
|
public class MongoLog4jAppender extends AppenderSkeleton {
|
||||||
|
|
||||||
@@ -58,8 +60,8 @@ public class MongoLog4jAppender extends AppenderSkeleton {
|
|||||||
protected String collectionPattern = "%c";
|
protected String collectionPattern = "%c";
|
||||||
protected PatternLayout collectionLayout = new PatternLayout(collectionPattern);
|
protected PatternLayout collectionLayout = new PatternLayout(collectionPattern);
|
||||||
protected String applicationId = System.getProperty("APPLICATION_ID", null);
|
protected String applicationId = System.getProperty("APPLICATION_ID", null);
|
||||||
protected WriteConcern warnOrHigherWriteConcern = WriteConcern.SAFE;
|
protected WriteConcern warnOrHigherWriteConcern = WriteConcern.ACKNOWLEDGED;
|
||||||
protected WriteConcern infoOrLowerWriteConcern = WriteConcern.NORMAL;
|
protected WriteConcern infoOrLowerWriteConcern = WriteConcern.UNACKNOWLEDGED;
|
||||||
protected Mongo mongo;
|
protected Mongo mongo;
|
||||||
protected DB db;
|
protected DB db;
|
||||||
|
|
||||||
@@ -128,7 +130,7 @@ public class MongoLog4jAppender extends AppenderSkeleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void connectToMongo() throws UnknownHostException {
|
protected void connectToMongo() throws UnknownHostException {
|
||||||
this.mongo = new Mongo(host, port);
|
this.mongo = new MongoClient(host, port);
|
||||||
this.db = mongo.getDB(database);
|
this.db = mongo.getDB(database);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,7 +162,7 @@ public class MongoLog4jAppender extends AppenderSkeleton {
|
|||||||
|
|
||||||
// Copy properties into document
|
// Copy properties into document
|
||||||
Map<Object, Object> props = event.getProperties();
|
Map<Object, Object> props = event.getProperties();
|
||||||
if (null != props && props.size() > 0) {
|
if (null != props && !props.isEmpty()) {
|
||||||
BasicDBObject propsDbo = new BasicDBObject();
|
BasicDBObject propsDbo = new BasicDBObject();
|
||||||
for (Map.Entry<Object, Object> entry : props.entrySet()) {
|
for (Map.Entry<Object, Object> entry : props.entrySet()) {
|
||||||
propsDbo.put(entry.getKey().toString(), entry.getValue().toString());
|
propsDbo.put(entry.getKey().toString(), entry.getValue().toString());
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -22,37 +22,44 @@ import java.util.Calendar;
|
|||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.apache.log4j.MDC;
|
import org.apache.log4j.MDC;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.mongodb.BasicDBObject;
|
||||||
import com.mongodb.DB;
|
import com.mongodb.DB;
|
||||||
import com.mongodb.DBCursor;
|
import com.mongodb.DBCursor;
|
||||||
import com.mongodb.Mongo;
|
import com.mongodb.MongoClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Integration tests for {@link MongoLog4jAppender}.
|
* Integration tests for {@link MongoLog4jAppender}.
|
||||||
*
|
*
|
||||||
* @author Jon Brisbin
|
* @author Jon Brisbin
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class MongoLog4jAppenderIntegrationTests {
|
public class MongoLog4jAppenderIntegrationTests {
|
||||||
|
|
||||||
static final String NAME = MongoLog4jAppenderIntegrationTests.class.getName();
|
static final String NAME = MongoLog4jAppenderIntegrationTests.class.getName();
|
||||||
|
|
||||||
Logger log = Logger.getLogger(NAME);
|
private static final Logger log = Logger.getLogger(NAME);
|
||||||
Mongo mongo;
|
MongoClient mongo;
|
||||||
DB db;
|
DB db;
|
||||||
String collection;
|
String collection;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
|
|
||||||
mongo = new Mongo("localhost", 27017);
|
mongo = new MongoClient("localhost", 27017);
|
||||||
db = mongo.getDB("logs");
|
db = mongo.getDB("logs");
|
||||||
|
|
||||||
Calendar now = Calendar.getInstance();
|
Calendar now = Calendar.getInstance();
|
||||||
collection = String.valueOf(now.get(Calendar.YEAR)) + String.format("%1$02d", now.get(Calendar.MONTH) + 1);
|
collection = String.valueOf(now.get(Calendar.YEAR)) + String.format("%1$02d", now.get(Calendar.MONTH) + 1);
|
||||||
db.getCollection(collection).drop();
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
db.getCollection(collection).remove(new BasicDBObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -64,7 +71,6 @@ public class MongoLog4jAppenderIntegrationTests {
|
|||||||
log.error("ERROR message");
|
log.error("ERROR message");
|
||||||
|
|
||||||
DBCursor msgs = db.getCollection(collection).find();
|
DBCursor msgs = db.getCollection(collection).find();
|
||||||
|
|
||||||
assertThat(msgs.count(), is(4));
|
assertThat(msgs.count(), is(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ Bundle-ManifestVersion: 2
|
|||||||
Import-Package:
|
Import-Package:
|
||||||
sun.reflect;version="0";resolution:=optional
|
sun.reflect;version="0";resolution:=optional
|
||||||
Import-Template:
|
Import-Template:
|
||||||
com.mongodb.*;version="${mongo-osgi:[=.=.=,+1.0.0)}",
|
com.mongodb.*;version="${mongo.osgi:[=.=.=,+1.0.0)}",
|
||||||
org.apache.log4j.*;version="${log4j:[=.=.=,+1.0.0)}"
|
org.apache.log4j.*;version="${log4j:[=.=.=,+1.0.0)}"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<context version="7.1.9.205">
|
<context version="7.2.2.230">
|
||||||
<scope type="Project" name="spring-data-mongodb">
|
<scope type="Project" name="spring-data-mongodb">
|
||||||
<element type="TypeFilterReferenceOverridden" name="Filter">
|
<element type="TypeFilterReferenceOverridden" name="Filter">
|
||||||
<element type="IncludeTypePattern" name="org.springframework.data.mongodb.**"/>
|
<element type="IncludeTypePattern" name="org.springframework.data.mongodb.**"/>
|
||||||
@@ -32,8 +32,15 @@
|
|||||||
<element type="IncludeTypePattern" name="**.config.**"/>
|
<element type="IncludeTypePattern" name="**.config.**"/>
|
||||||
</element>
|
</element>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
||||||
|
<dependency toName="Project|spring-data-mongodb::Layer|Repositories::Subsystem|API" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Repositories::Subsystem|Implementation" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Repositories::Subsystem|Implementation" type="AllowedDependency"/>
|
||||||
</element>
|
</element>
|
||||||
|
<element type="Subsystem" name="CDI">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="**.cdi.**"/>
|
||||||
|
</element>
|
||||||
|
<stereotype name="Unrestricted"/>
|
||||||
|
</element>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Config" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Config" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core" type="AllowedDependency"/>
|
||||||
</element>
|
</element>
|
||||||
@@ -75,6 +82,11 @@
|
|||||||
</element>
|
</element>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Geospatial" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Geospatial" type="AllowedDependency"/>
|
||||||
</element>
|
</element>
|
||||||
|
<element type="Subsystem" name="Script">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="**.script.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
<element type="Subsystem" name="Conversion">
|
<element type="Subsystem" name="Conversion">
|
||||||
<element type="TypeFilter" name="Assignment">
|
<element type="TypeFilter" name="Assignment">
|
||||||
<element type="IncludeTypePattern" name="**.core.convert.**"/>
|
<element type="IncludeTypePattern" name="**.core.convert.**"/>
|
||||||
@@ -82,6 +94,7 @@
|
|||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Geospatial" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Geospatial" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Query" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Query" type="AllowedDependency"/>
|
||||||
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Script" type="AllowedDependency"/>
|
||||||
</element>
|
</element>
|
||||||
<element type="Subsystem" name="SpEL">
|
<element type="Subsystem" name="SpEL">
|
||||||
<element type="TypeFilter" name="Assignment">
|
<element type="TypeFilter" name="Assignment">
|
||||||
@@ -104,6 +117,11 @@
|
|||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Query" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Query" type="AllowedDependency"/>
|
||||||
</element>
|
</element>
|
||||||
|
<element type="Subsystem" name="MapReduce">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="**.mapreduce.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
<element type="Subsystem" name="Core">
|
<element type="Subsystem" name="Core">
|
||||||
<element type="TypeFilter" name="Assignment">
|
<element type="TypeFilter" name="Assignment">
|
||||||
<element type="WeakTypePattern" name="**.core.**"/>
|
<element type="WeakTypePattern" name="**.core.**"/>
|
||||||
@@ -112,8 +130,10 @@
|
|||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Conversion" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Conversion" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Geospatial" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Geospatial" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Index" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Index" type="AllowedDependency"/>
|
||||||
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|MapReduce" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Mapping" type="AllowedDependency"/>
|
||||||
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Query" type="AllowedDependency"/>
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Query" type="AllowedDependency"/>
|
||||||
|
<dependency toName="Project|spring-data-mongodb::Layer|Core::Subsystem|Script" type="AllowedDependency"/>
|
||||||
</element>
|
</element>
|
||||||
<element type="Subsystem" name="Util">
|
<element type="Subsystem" name="Util">
|
||||||
<element type="TypeFilter" name="Assignment">
|
<element type="TypeFilter" name="Assignment">
|
||||||
@@ -168,7 +188,32 @@
|
|||||||
</element>
|
</element>
|
||||||
<element type="Subsystem" name="Querydsl">
|
<element type="Subsystem" name="Querydsl">
|
||||||
<element type="TypeFilter" name="Assignment">
|
<element type="TypeFilter" name="Assignment">
|
||||||
<element type="IncludeTypePattern" name="com.mysema.query.**"/>
|
<element type="IncludeTypePattern" name="com.querydsl.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
|
<element type="Subsystem" name="Slf4j">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="org.slf4j.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
|
<element type="Subsystem" name="Jackson">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="com.fasterxml.jackson.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
|
<element type="Subsystem" name="DOM">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="org.w3c.dom.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
|
<element type="Subsystem" name="AOP Alliance">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="org.aopalliance.**"/>
|
||||||
|
</element>
|
||||||
|
</element>
|
||||||
|
<element type="Subsystem" name="Guava">
|
||||||
|
<element type="TypeFilter" name="Assignment">
|
||||||
|
<element type="IncludeTypePattern" name="com.google.common.**"/>
|
||||||
</element>
|
</element>
|
||||||
</element>
|
</element>
|
||||||
</architecture>
|
</architecture>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<artifactId>spring-data-mongodb</artifactId>
|
<artifactId>spring-data-mongodb</artifactId>
|
||||||
|
|
||||||
<name>Spring Data MongoDB - Core</name>
|
<name>Spring Data MongoDB - Core</name>
|
||||||
@@ -11,18 +11,19 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.data</groupId>
|
<groupId>org.springframework.data</groupId>
|
||||||
<artifactId>spring-data-mongodb-parent</artifactId>
|
<artifactId>spring-data-mongodb-parent</artifactId>
|
||||||
<version>1.5.0.M1</version>
|
<version>1.9.12.BUILD-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<validation>1.0.0.GA</validation>
|
<validation>1.0.0.GA</validation>
|
||||||
<objenesis>1.3</objenesis>
|
<objenesis>1.3</objenesis>
|
||||||
|
<equalsverifier>1.5</equalsverifier>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<!-- Spring -->
|
<!-- Spring -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework</groupId>
|
<groupId>org.springframework</groupId>
|
||||||
<artifactId>spring-tx</artifactId>
|
<artifactId>spring-tx</artifactId>
|
||||||
@@ -50,7 +51,7 @@
|
|||||||
<artifactId>spring-expression</artifactId>
|
<artifactId>spring-expression</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Spring Data -->
|
<!-- Spring Data -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>${project.groupId}</groupId>
|
<groupId>${project.groupId}</groupId>
|
||||||
<artifactId>spring-data-commons</artifactId>
|
<artifactId>spring-data-commons</artifactId>
|
||||||
@@ -58,14 +59,14 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.mysema.querydsl</groupId>
|
<groupId>com.querydsl</groupId>
|
||||||
<artifactId>querydsl-mongodb</artifactId>
|
<artifactId>querydsl-mongodb</artifactId>
|
||||||
<version>${querydsl}</version>
|
<version>${querydsl}</version>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.mysema.querydsl</groupId>
|
<groupId>com.querydsl</groupId>
|
||||||
<artifactId>querydsl-apt</artifactId>
|
<artifactId>querydsl-apt</artifactId>
|
||||||
<version>${querydsl}</version>
|
<version>${querydsl}</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
@@ -77,7 +78,7 @@
|
|||||||
<version>1.0</version>
|
<version>1.0</version>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- CDI -->
|
<!-- CDI -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.enterprise</groupId>
|
<groupId>javax.enterprise</groupId>
|
||||||
@@ -86,21 +87,21 @@
|
|||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.el</groupId>
|
<groupId>javax.el</groupId>
|
||||||
<artifactId>el-api</artifactId>
|
<artifactId>el-api</artifactId>
|
||||||
<version>${cdi}</version>
|
<version>${cdi}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.openwebbeans.test</groupId>
|
<groupId>org.apache.openwebbeans.test</groupId>
|
||||||
<artifactId>cditest-owb</artifactId>
|
<artifactId>cditest-owb</artifactId>
|
||||||
<version>${webbeans}</version>
|
<version>${webbeans}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.servlet</groupId>
|
<groupId>javax.servlet</groupId>
|
||||||
<artifactId>servlet-api</artifactId>
|
<artifactId>servlet-api</artifactId>
|
||||||
@@ -115,7 +116,7 @@
|
|||||||
<version>${validation}</version>
|
<version>${validation}</version>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.objenesis</groupId>
|
<groupId>org.objenesis</groupId>
|
||||||
<artifactId>objenesis</artifactId>
|
<artifactId>objenesis</artifactId>
|
||||||
@@ -129,23 +130,50 @@
|
|||||||
<version>4.2.0.Final</version>
|
<version>4.2.0.Final</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>joda-time</groupId>
|
<groupId>joda-time</groupId>
|
||||||
<artifactId>joda-time</artifactId>
|
<artifactId>joda-time</artifactId>
|
||||||
<version>${jodatime}</version>
|
<version>${jodatime}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.threeten</groupId>
|
||||||
|
<artifactId>threetenbp</artifactId>
|
||||||
|
<version>${threetenbp}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>${jackson}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>jul-to-slf4j</artifactId>
|
<artifactId>jul-to-slf4j</artifactId>
|
||||||
<version>${slf4j}</version>
|
<version>${slf4j}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>nl.jqno.equalsverifier</groupId>
|
||||||
|
<artifactId>equalsverifier</artifactId>
|
||||||
|
<version>${equalsverifier}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-webmvc</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
|
||||||
@@ -155,7 +183,7 @@
|
|||||||
<version>${apt}</version>
|
<version>${apt}</version>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.mysema.querydsl</groupId>
|
<groupId>com.querydsl</groupId>
|
||||||
<artifactId>querydsl-apt</artifactId>
|
<artifactId>querydsl-apt</artifactId>
|
||||||
<version>${querydsl}</version>
|
<version>${querydsl}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
@@ -189,9 +217,14 @@
|
|||||||
<systemPropertyVariables>
|
<systemPropertyVariables>
|
||||||
<java.util.logging.config.file>src/test/resources/logging.properties</java.util.logging.config.file>
|
<java.util.logging.config.file>src/test/resources/logging.properties</java.util.logging.config.file>
|
||||||
</systemPropertyVariables>
|
</systemPropertyVariables>
|
||||||
|
<properties>
|
||||||
|
<property>
|
||||||
|
<name>listener</name>
|
||||||
|
<value>org.springframework.data.mongodb.test.util.CleanMongoDBJunitRunListener</value>
|
||||||
|
</property>
|
||||||
|
</properties>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
|
||||||
|
import com.mongodb.BulkWriteError;
|
||||||
|
import com.mongodb.BulkWriteException;
|
||||||
|
import com.mongodb.BulkWriteResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is thrown when errors occur during bulk operations.
|
||||||
|
*
|
||||||
|
* @author Tobias Trelle
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.9
|
||||||
|
*/
|
||||||
|
public class BulkOperationException extends DataAccessException {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 73929601661154421L;
|
||||||
|
|
||||||
|
private final List<BulkWriteError> errors;
|
||||||
|
private final BulkWriteResult result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link BulkOperationException} with the given message and source {@link BulkWriteException}.
|
||||||
|
*
|
||||||
|
* @param message must not be {@literal null}.
|
||||||
|
* @param source must not be {@literal null}.
|
||||||
|
*/
|
||||||
|
public BulkOperationException(String message, BulkWriteException source) {
|
||||||
|
|
||||||
|
super(message, source);
|
||||||
|
|
||||||
|
this.errors = source.getWriteErrors();
|
||||||
|
this.result = source.getWriteResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BulkWriteError> getErrors() {
|
||||||
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BulkWriteResult getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -28,6 +28,9 @@ import org.springframework.core.type.filter.AnnotationTypeFilter;
|
|||||||
import org.springframework.data.annotation.Persistent;
|
import org.springframework.data.annotation.Persistent;
|
||||||
import org.springframework.data.authentication.UserCredentials;
|
import org.springframework.data.authentication.UserCredentials;
|
||||||
import org.springframework.data.mapping.context.MappingContextIsNewStrategyFactory;
|
import org.springframework.data.mapping.context.MappingContextIsNewStrategyFactory;
|
||||||
|
import org.springframework.data.mapping.model.CamelCaseAbbreviatingFieldNamingStrategy;
|
||||||
|
import org.springframework.data.mapping.model.FieldNamingStrategy;
|
||||||
|
import org.springframework.data.mapping.model.PropertyNameFieldNamingStrategy;
|
||||||
import org.springframework.data.mongodb.MongoDbFactory;
|
import org.springframework.data.mongodb.MongoDbFactory;
|
||||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||||
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
|
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
|
||||||
@@ -35,7 +38,6 @@ import org.springframework.data.mongodb.core.convert.CustomConversions;
|
|||||||
import org.springframework.data.mongodb.core.convert.DbRefResolver;
|
import org.springframework.data.mongodb.core.convert.DbRefResolver;
|
||||||
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
|
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
|
||||||
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
||||||
import org.springframework.data.mongodb.core.mapping.CamelCaseAbbreviatingFieldNamingStrategy;
|
|
||||||
import org.springframework.data.mongodb.core.mapping.Document;
|
import org.springframework.data.mongodb.core.mapping.Document;
|
||||||
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
||||||
import org.springframework.data.support.CachingIsNewStrategyFactory;
|
import org.springframework.data.support.CachingIsNewStrategyFactory;
|
||||||
@@ -44,6 +46,7 @@ import org.springframework.util.ClassUtils;
|
|||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import com.mongodb.Mongo;
|
import com.mongodb.Mongo;
|
||||||
|
import com.mongodb.MongoClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for Spring Data MongoDB configuration using JavaConfig.
|
* Base class for Spring Data MongoDB configuration using JavaConfig.
|
||||||
@@ -51,6 +54,8 @@ import com.mongodb.Mongo;
|
|||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Ryan Tenney
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
public abstract class AbstractMongoConfiguration {
|
public abstract class AbstractMongoConfiguration {
|
||||||
@@ -67,7 +72,10 @@ public abstract class AbstractMongoConfiguration {
|
|||||||
* returned by {@link #getDatabaseName()} later on effectively.
|
* returned by {@link #getDatabaseName()} later on effectively.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
|
* @deprecated since 1.7. {@link MongoClient} should hold authentication data within
|
||||||
|
* {@link MongoClient#getCredentialsList()}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
protected String getAuthenticationDatabaseName() {
|
protected String getAuthenticationDatabaseName() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -126,7 +134,10 @@ public abstract class AbstractMongoConfiguration {
|
|||||||
* be used.
|
* be used.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
|
* @deprecated since 1.7. {@link MongoClient} should hold authentication data within
|
||||||
|
* {@link MongoClient#getCredentialsList()}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
protected UserCredentials getUserCredentials() {
|
protected UserCredentials getUserCredentials() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -144,10 +155,7 @@ public abstract class AbstractMongoConfiguration {
|
|||||||
MongoMappingContext mappingContext = new MongoMappingContext();
|
MongoMappingContext mappingContext = new MongoMappingContext();
|
||||||
mappingContext.setInitialEntitySet(getInitialEntitySet());
|
mappingContext.setInitialEntitySet(getInitialEntitySet());
|
||||||
mappingContext.setSimpleTypeHolder(customConversions().getSimpleTypeHolder());
|
mappingContext.setSimpleTypeHolder(customConversions().getSimpleTypeHolder());
|
||||||
|
mappingContext.setFieldNamingStrategy(fieldNamingStrategy());
|
||||||
if (abbreviateFieldNames()) {
|
|
||||||
mappingContext.setFieldNamingStrategy(new CamelCaseAbbreviatingFieldNamingStrategy());
|
|
||||||
}
|
|
||||||
|
|
||||||
return mappingContext;
|
return mappingContext;
|
||||||
}
|
}
|
||||||
@@ -232,4 +240,15 @@ public abstract class AbstractMongoConfiguration {
|
|||||||
protected boolean abbreviateFieldNames() {
|
protected boolean abbreviateFieldNames() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures a {@link FieldNamingStrategy} on the {@link MongoMappingContext} instance created.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @since 1.5
|
||||||
|
*/
|
||||||
|
protected FieldNamingStrategy fieldNamingStrategy() {
|
||||||
|
return abbreviateFieldNames() ? new CamelCaseAbbreviatingFieldNamingStrategy()
|
||||||
|
: PropertyNameFieldNamingStrategy.INSTANCE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 the original author or authors.
|
* Copyright 2011-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -30,6 +30,7 @@ import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
|||||||
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
import org.springframework.beans.factory.config.RuntimeBeanReference;
|
||||||
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
||||||
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
||||||
|
import org.springframework.beans.factory.parsing.ReaderContext;
|
||||||
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||||
@@ -51,10 +52,10 @@ import org.springframework.core.type.filter.TypeFilter;
|
|||||||
import org.springframework.data.annotation.Persistent;
|
import org.springframework.data.annotation.Persistent;
|
||||||
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
||||||
import org.springframework.data.mapping.context.MappingContextIsNewStrategyFactory;
|
import org.springframework.data.mapping.context.MappingContextIsNewStrategyFactory;
|
||||||
|
import org.springframework.data.mapping.model.CamelCaseAbbreviatingFieldNamingStrategy;
|
||||||
import org.springframework.data.mongodb.core.convert.CustomConversions;
|
import org.springframework.data.mongodb.core.convert.CustomConversions;
|
||||||
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
||||||
import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator;
|
import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator;
|
||||||
import org.springframework.data.mongodb.core.mapping.CamelCaseAbbreviatingFieldNamingStrategy;
|
|
||||||
import org.springframework.data.mongodb.core.mapping.Document;
|
import org.springframework.data.mongodb.core.mapping.Document;
|
||||||
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
||||||
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
|
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
|
||||||
@@ -71,6 +72,7 @@ import org.w3c.dom.Element;
|
|||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Maciej Walkowiak
|
* @author Maciej Walkowiak
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class MappingMongoConverterParser implements BeanDefinitionParser {
|
public class MappingMongoConverterParser implements BeanDefinitionParser {
|
||||||
|
|
||||||
@@ -83,8 +85,11 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
*/
|
*/
|
||||||
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
||||||
|
|
||||||
BeanDefinitionRegistry registry = parserContext.getRegistry();
|
if (parserContext.isNested()) {
|
||||||
|
parserContext.getReaderContext().error("Mongo Converter must not be defined as nested bean.", element);
|
||||||
|
}
|
||||||
|
|
||||||
|
BeanDefinitionRegistry registry = parserContext.getRegistry();
|
||||||
String id = element.getAttribute(AbstractBeanDefinitionParser.ID_ATTRIBUTE);
|
String id = element.getAttribute(AbstractBeanDefinitionParser.ID_ATTRIBUTE);
|
||||||
id = StringUtils.hasText(id) ? id : DEFAULT_CONVERTER_BEAN_NAME;
|
id = StringUtils.hasText(id) ? id : DEFAULT_CONVERTER_BEAN_NAME;
|
||||||
|
|
||||||
@@ -209,11 +214,7 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition);
|
mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition);
|
||||||
}
|
}
|
||||||
|
|
||||||
String abbreviateFieldNames = element.getAttribute("abbreviate-field-names");
|
parseFieldNamingStrategy(element, parserContext.getReaderContext(), mappingContextBuilder);
|
||||||
if ("true".equals(abbreviateFieldNames)) {
|
|
||||||
mappingContextBuilder.addPropertyValue("fieldNamingStrategy", new RootBeanDefinition(
|
|
||||||
CamelCaseAbbreviatingFieldNamingStrategy.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
ctxRef = converterId == null || DEFAULT_CONVERTER_BEAN_NAME.equals(converterId) ? MAPPING_CONTEXT_BEAN_NAME
|
ctxRef = converterId == null || DEFAULT_CONVERTER_BEAN_NAME.equals(converterId) ? MAPPING_CONTEXT_BEAN_NAME
|
||||||
: converterId + "." + MAPPING_CONTEXT_BEAN_NAME;
|
: converterId + "." + MAPPING_CONTEXT_BEAN_NAME;
|
||||||
@@ -222,6 +223,34 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
return ctxRef;
|
return ctxRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void parseFieldNamingStrategy(Element element, ReaderContext context, BeanDefinitionBuilder builder) {
|
||||||
|
|
||||||
|
String abbreviateFieldNames = element.getAttribute("abbreviate-field-names");
|
||||||
|
String fieldNamingStrategy = element.getAttribute("field-naming-strategy-ref");
|
||||||
|
|
||||||
|
boolean fieldNamingStrategyReferenced = StringUtils.hasText(fieldNamingStrategy);
|
||||||
|
boolean abbreviationActivated = StringUtils.hasText(abbreviateFieldNames)
|
||||||
|
&& Boolean.parseBoolean(abbreviateFieldNames);
|
||||||
|
|
||||||
|
if (fieldNamingStrategyReferenced && abbreviationActivated) {
|
||||||
|
context.error("Field name abbreviation cannot be activated if a field-naming-strategy-ref is configured!",
|
||||||
|
element);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object value = null;
|
||||||
|
|
||||||
|
if ("true".equals(abbreviateFieldNames)) {
|
||||||
|
value = new RootBeanDefinition(CamelCaseAbbreviatingFieldNamingStrategy.class);
|
||||||
|
} else if (fieldNamingStrategyReferenced) {
|
||||||
|
value = new RuntimeBeanReference(fieldNamingStrategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value != null) {
|
||||||
|
builder.addPropertyValue("fieldNamingStrategy", value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private BeanDefinition getCustomConversions(Element element, ParserContext parserContext) {
|
private BeanDefinition getCustomConversions(Element element, ParserContext parserContext) {
|
||||||
|
|
||||||
List<Element> customConvertersElements = DomUtils.getChildElementsByTagName(element, "custom-converters");
|
List<Element> customConvertersElements = DomUtils.getChildElementsByTagName(element, "custom-converters");
|
||||||
@@ -332,7 +361,9 @@ public class MappingMongoConverterParser implements BeanDefinitionParser {
|
|||||||
* @param filters
|
* @param filters
|
||||||
*/
|
*/
|
||||||
public NegatingFilter(TypeFilter... filters) {
|
public NegatingFilter(TypeFilter... filters) {
|
||||||
Assert.notNull(filters);
|
|
||||||
|
Assert.notNull(filters, "TypeFilters must not be null");
|
||||||
|
|
||||||
this.delegates = new HashSet<TypeFilter>(Arrays.asList(filters));
|
this.delegates = new HashSet<TypeFilter>(Arrays.asList(filters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013-2014 the original author or authors.
|
* Copyright 2013-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -15,24 +15,24 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.mongodb.config;
|
package org.springframework.data.mongodb.config;
|
||||||
|
|
||||||
import static org.springframework.beans.factory.config.BeanDefinition.*;
|
|
||||||
import static org.springframework.data.mongodb.config.BeanNames.*;
|
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.FactoryBean;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
|
||||||
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
||||||
import org.springframework.core.type.AnnotationMetadata;
|
import org.springframework.core.type.AnnotationMetadata;
|
||||||
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
|
import org.springframework.data.auditing.IsNewAwareAuditingHandler;
|
||||||
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
|
import org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport;
|
||||||
import org.springframework.data.auditing.config.AuditingConfiguration;
|
import org.springframework.data.auditing.config.AuditingConfiguration;
|
||||||
import org.springframework.data.config.ParsingUtils;
|
import org.springframework.data.config.ParsingUtils;
|
||||||
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
|
import org.springframework.data.mapping.context.MappingContext;
|
||||||
|
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty;
|
||||||
import org.springframework.data.mongodb.core.mapping.event.AuditingEventListener;
|
import org.springframework.data.mongodb.core.mapping.event.AuditingEventListener;
|
||||||
import org.springframework.data.support.IsNewStrategyFactory;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,7 +71,6 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
|
|||||||
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!");
|
Assert.notNull(annotationMetadata, "AnnotationMetadata must not be null!");
|
||||||
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
|
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
|
||||||
|
|
||||||
defaultDependenciesIfNecessary(registry, annotationMetadata);
|
|
||||||
super.registerBeanDefinitions(annotationMetadata, registry);
|
super.registerBeanDefinitions(annotationMetadata, registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +84,11 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
|
|||||||
Assert.notNull(configuration, "AuditingConfiguration must not be null!");
|
Assert.notNull(configuration, "AuditingConfiguration must not be null!");
|
||||||
|
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(IsNewAwareAuditingHandler.class);
|
||||||
builder.addConstructorArgReference(MAPPING_CONTEXT_BEAN_NAME);
|
|
||||||
|
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(MongoMappingContextLookup.class);
|
||||||
|
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
|
||||||
|
|
||||||
|
builder.addConstructorArgValue(definition.getBeanDefinition());
|
||||||
return configureDefaultAuditHandlerAttributes(configuration, builder);
|
return configureDefaultAuditHandlerAttributes(configuration, builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,29 +105,58 @@ class MongoAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
|
|||||||
|
|
||||||
BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
|
BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
|
||||||
.rootBeanDefinition(AuditingEventListener.class);
|
.rootBeanDefinition(AuditingEventListener.class);
|
||||||
listenerBeanDefinitionBuilder.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition(
|
listenerBeanDefinitionBuilder
|
||||||
getAuditingHandlerBeanName(), registry));
|
.addConstructorArgValue(ParsingUtils.getObjectFactoryBeanDefinition(getAuditingHandlerBeanName(), registry));
|
||||||
|
|
||||||
registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder.getBeanDefinition(),
|
registerInfrastructureBeanWithId(listenerBeanDefinitionBuilder.getBeanDefinition(),
|
||||||
AuditingEventListener.class.getName(), registry);
|
AuditingEventListener.class.getName(), registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register default bean definitions for a {@link MongoMappingContext} and an {@link IsNewStrategyFactory} in case we
|
* Simple helper to be able to wire the {@link MappingContext} from a {@link MappingMongoConverter} bean available in
|
||||||
* don't find beans with the assumed names in the registry.
|
* the application context.
|
||||||
*
|
*
|
||||||
* @param registry the {@link BeanDefinitionRegistry} to use to register the components into.
|
* @author Oliver Gierke
|
||||||
* @param source the source which the registered components shall be registered with
|
|
||||||
*/
|
*/
|
||||||
private void defaultDependenciesIfNecessary(BeanDefinitionRegistry registry, Object source) {
|
static class MongoMappingContextLookup
|
||||||
|
implements FactoryBean<MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty>> {
|
||||||
|
|
||||||
if (!registry.containsBeanDefinition(MAPPING_CONTEXT_BEAN_NAME)) {
|
private final MappingMongoConverter converter;
|
||||||
|
|
||||||
RootBeanDefinition definition = new RootBeanDefinition(MongoMappingContext.class);
|
/**
|
||||||
definition.setRole(ROLE_INFRASTRUCTURE);
|
* Creates a new {@link MongoMappingContextLookup} for the given {@link MappingMongoConverter}.
|
||||||
definition.setSource(source);
|
*
|
||||||
|
* @param converter must not be {@literal null}.
|
||||||
|
*/
|
||||||
|
public MongoMappingContextLookup(MappingMongoConverter converter) {
|
||||||
|
this.converter = converter;
|
||||||
|
}
|
||||||
|
|
||||||
registry.registerBeanDefinition(MAPPING_CONTEXT_BEAN_NAME, definition);
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.FactoryBean#getObject()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> getObject() throws Exception {
|
||||||
|
return converter.getMappingContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Class<?> getObjectType() {
|
||||||
|
return MappingContext.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isSingleton() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.config;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
|
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
||||||
|
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
||||||
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
||||||
|
import org.springframework.beans.factory.xml.ParserContext;
|
||||||
|
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
||||||
|
import org.springframework.data.config.ParsingUtils;
|
||||||
|
import org.springframework.data.mongodb.core.MongoClientFactoryBean;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parser for {@code mongo-client} definitions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public class MongoClientParser implements BeanDefinitionParser {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.xml.BeanDefinitionParser#parse(org.w3c.dom.Element, org.springframework.beans.factory.xml.ParserContext)
|
||||||
|
*/
|
||||||
|
public BeanDefinition parse(Element element, ParserContext parserContext) {
|
||||||
|
|
||||||
|
Object source = parserContext.extractSource(element);
|
||||||
|
String id = element.getAttribute("id");
|
||||||
|
|
||||||
|
BeanComponentDefinitionBuilder helper = new BeanComponentDefinitionBuilder(element, parserContext);
|
||||||
|
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MongoClientFactoryBean.class);
|
||||||
|
|
||||||
|
ParsingUtils.setPropertyValue(builder, element, "port", "port");
|
||||||
|
ParsingUtils.setPropertyValue(builder, element, "host", "host");
|
||||||
|
ParsingUtils.setPropertyValue(builder, element, "credentials", "credentials");
|
||||||
|
|
||||||
|
MongoParsingUtils.parseMongoClientOptions(element, builder);
|
||||||
|
MongoParsingUtils.parseReplicaSet(element, builder);
|
||||||
|
|
||||||
|
String defaultedId = StringUtils.hasText(id) ? id : BeanNames.MONGO_BEAN_NAME;
|
||||||
|
|
||||||
|
parserContext.pushContainingComponent(new CompositeComponentDefinition("Mongo", source));
|
||||||
|
|
||||||
|
BeanComponentDefinition mongoComponent = helper.getComponent(builder, defaultedId);
|
||||||
|
parserContext.registerBeanComponent(mongoComponent);
|
||||||
|
|
||||||
|
BeanComponentDefinition serverAddressPropertyEditor = helper.getComponent(MongoParsingUtils
|
||||||
|
.getServerAddressPropertyEditorBuilder());
|
||||||
|
parserContext.registerBeanComponent(serverAddressPropertyEditor);
|
||||||
|
|
||||||
|
BeanComponentDefinition writeConcernEditor = helper.getComponent(MongoParsingUtils
|
||||||
|
.getWriteConcernPropertyEditorBuilder());
|
||||||
|
parserContext.registerBeanComponent(writeConcernEditor);
|
||||||
|
|
||||||
|
BeanComponentDefinition readPreferenceEditor = helper.getComponent(MongoParsingUtils
|
||||||
|
.getReadPreferencePropertyEditorBuilder());
|
||||||
|
parserContext.registerBeanComponent(readPreferenceEditor);
|
||||||
|
|
||||||
|
BeanComponentDefinition credentialsEditor = helper.getComponent(MongoParsingUtils
|
||||||
|
.getMongoCredentialPropertyEditor());
|
||||||
|
parserContext.registerBeanComponent(credentialsEditor);
|
||||||
|
|
||||||
|
parserContext.popAndRegisterContainingComponent();
|
||||||
|
|
||||||
|
return mongoComponent.getBeanDefinition();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,198 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.config;
|
||||||
|
|
||||||
|
import java.beans.PropertyEditorSupport;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import com.mongodb.MongoCredential;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a {@link String} to a Collection of {@link MongoCredential}.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public class MongoCredentialPropertyEditor extends PropertyEditorSupport {
|
||||||
|
|
||||||
|
private static final Pattern GROUP_PATTERN = Pattern.compile("(\\\\?')(.*?)\\1");
|
||||||
|
|
||||||
|
private static final String AUTH_MECHANISM_KEY = "uri.authMechanism";
|
||||||
|
private static final String USERNAME_PASSWORD_DELIMINATOR = ":";
|
||||||
|
private static final String DATABASE_DELIMINATOR = "@";
|
||||||
|
private static final String OPTIONS_DELIMINATOR = "?";
|
||||||
|
private static final String OPTION_VALUE_DELIMINATOR = "&";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setAsText(String text) throws IllegalArgumentException {
|
||||||
|
|
||||||
|
if (!StringUtils.hasText(text)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
|
||||||
|
|
||||||
|
for (String credentialString : extractCredentialsString(text)) {
|
||||||
|
|
||||||
|
String[] userNameAndPassword = extractUserNameAndPassword(credentialString);
|
||||||
|
String database = extractDB(credentialString);
|
||||||
|
Properties options = extractOptions(credentialString);
|
||||||
|
|
||||||
|
if (!options.isEmpty()) {
|
||||||
|
|
||||||
|
if (options.containsKey(AUTH_MECHANISM_KEY)) {
|
||||||
|
|
||||||
|
String authMechanism = options.getProperty(AUTH_MECHANISM_KEY);
|
||||||
|
|
||||||
|
if (MongoCredential.GSSAPI_MECHANISM.equals(authMechanism)) {
|
||||||
|
|
||||||
|
verifyUserNamePresent(userNameAndPassword);
|
||||||
|
credentials.add(MongoCredential.createGSSAPICredential(userNameAndPassword[0]));
|
||||||
|
} else if (MongoCredential.MONGODB_CR_MECHANISM.equals(authMechanism)) {
|
||||||
|
|
||||||
|
verifyUsernameAndPasswordPresent(userNameAndPassword);
|
||||||
|
verifyDatabasePresent(database);
|
||||||
|
credentials.add(MongoCredential.createMongoCRCredential(userNameAndPassword[0], database,
|
||||||
|
userNameAndPassword[1].toCharArray()));
|
||||||
|
} else if (MongoCredential.MONGODB_X509_MECHANISM.equals(authMechanism)) {
|
||||||
|
|
||||||
|
verifyUserNamePresent(userNameAndPassword);
|
||||||
|
credentials.add(MongoCredential.createMongoX509Credential(userNameAndPassword[0]));
|
||||||
|
} else if (MongoCredential.PLAIN_MECHANISM.equals(authMechanism)) {
|
||||||
|
|
||||||
|
verifyUsernameAndPasswordPresent(userNameAndPassword);
|
||||||
|
verifyDatabasePresent(database);
|
||||||
|
credentials.add(MongoCredential.createPlainCredential(userNameAndPassword[0], database,
|
||||||
|
userNameAndPassword[1].toCharArray()));
|
||||||
|
} else if (MongoCredential.SCRAM_SHA_1_MECHANISM.equals(authMechanism)) {
|
||||||
|
|
||||||
|
verifyUsernameAndPasswordPresent(userNameAndPassword);
|
||||||
|
verifyDatabasePresent(database);
|
||||||
|
credentials.add(MongoCredential.createScramSha1Credential(userNameAndPassword[0], database,
|
||||||
|
userNameAndPassword[1].toCharArray()));
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("Cannot create MongoCredentials for unknown auth mechanism '%s'!", authMechanism));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
verifyUsernameAndPasswordPresent(userNameAndPassword);
|
||||||
|
verifyDatabasePresent(database);
|
||||||
|
credentials.add(
|
||||||
|
MongoCredential.createCredential(userNameAndPassword[0], database, userNameAndPassword[1].toCharArray()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setValue(credentials);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> extractCredentialsString(String source) {
|
||||||
|
|
||||||
|
Matcher matcher = GROUP_PATTERN.matcher(source);
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
|
||||||
|
while (matcher.find()) {
|
||||||
|
|
||||||
|
String value = StringUtils.trimLeadingCharacter(matcher.group(), '\'');
|
||||||
|
list.add(StringUtils.trimTrailingCharacter(value, '\''));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!list.isEmpty()) {
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Arrays.asList(source.split(","));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] extractUserNameAndPassword(String text) {
|
||||||
|
|
||||||
|
int index = text.lastIndexOf(DATABASE_DELIMINATOR);
|
||||||
|
|
||||||
|
index = index != -1 ? index : text.lastIndexOf(OPTIONS_DELIMINATOR);
|
||||||
|
|
||||||
|
return index == -1 ? new String[] {} : text.substring(0, index).split(USERNAME_PASSWORD_DELIMINATOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String extractDB(String text) {
|
||||||
|
|
||||||
|
int dbSeperationIndex = text.lastIndexOf(DATABASE_DELIMINATOR);
|
||||||
|
|
||||||
|
if (dbSeperationIndex == -1) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
String tmp = text.substring(dbSeperationIndex + 1);
|
||||||
|
int optionsSeperationIndex = tmp.lastIndexOf(OPTIONS_DELIMINATOR);
|
||||||
|
|
||||||
|
return optionsSeperationIndex > -1 ? tmp.substring(0, optionsSeperationIndex) : tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties extractOptions(String text) {
|
||||||
|
|
||||||
|
int optionsSeperationIndex = text.lastIndexOf(OPTIONS_DELIMINATOR);
|
||||||
|
int dbSeperationIndex = text.lastIndexOf(OPTIONS_DELIMINATOR);
|
||||||
|
|
||||||
|
if (optionsSeperationIndex == -1 || dbSeperationIndex > optionsSeperationIndex) {
|
||||||
|
return new Properties();
|
||||||
|
}
|
||||||
|
|
||||||
|
Properties properties = new Properties();
|
||||||
|
|
||||||
|
for (String option : text.substring(optionsSeperationIndex + 1).split(OPTION_VALUE_DELIMINATOR)) {
|
||||||
|
String[] optionArgs = option.split("=");
|
||||||
|
properties.put(optionArgs[0], optionArgs[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyUsernameAndPasswordPresent(String[] source) {
|
||||||
|
|
||||||
|
verifyUserNamePresent(source);
|
||||||
|
|
||||||
|
if (source.length != 2) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Credentials need to specify username and password like in 'username:password@database'!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyDatabasePresent(String source) {
|
||||||
|
|
||||||
|
if (!StringUtils.hasText(source)) {
|
||||||
|
throw new IllegalArgumentException("Credentials need to specify database like in 'username:password@database'!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyUserNamePresent(String[] source) {
|
||||||
|
|
||||||
|
if (source.length == 0 || !StringUtils.hasText(source[0])) {
|
||||||
|
throw new IllegalArgumentException("Credentials need to specify username!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 by the original author(s).
|
* Copyright 2011-2015 by the original author(s).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -18,6 +18,10 @@ package org.springframework.data.mongodb.config;
|
|||||||
import static org.springframework.data.config.ParsingUtils.*;
|
import static org.springframework.data.config.ParsingUtils.*;
|
||||||
import static org.springframework.data.mongodb.config.MongoParsingUtils.*;
|
import static org.springframework.data.mongodb.config.MongoParsingUtils.*;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
import org.springframework.beans.factory.BeanDefinitionStoreException;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
||||||
@@ -34,6 +38,7 @@ import org.springframework.util.StringUtils;
|
|||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
import com.mongodb.Mongo;
|
import com.mongodb.Mongo;
|
||||||
|
import com.mongodb.MongoClientURI;
|
||||||
import com.mongodb.MongoURI;
|
import com.mongodb.MongoURI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,9 +47,22 @@ import com.mongodb.MongoURI;
|
|||||||
* @author Jon Brisbin
|
* @author Jon Brisbin
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Viktor Khoroshko
|
||||||
*/
|
*/
|
||||||
public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
|
public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
|
||||||
|
|
||||||
|
private static final Set<String> MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
Set<String> mongoUriAllowedAdditionalAttributes = new HashSet<String>();
|
||||||
|
mongoUriAllowedAdditionalAttributes.add("id");
|
||||||
|
mongoUriAllowedAdditionalAttributes.add("write-concern");
|
||||||
|
|
||||||
|
MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES = Collections.unmodifiableSet(mongoUriAllowedAdditionalAttributes);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
|
* @see org.springframework.beans.factory.xml.AbstractBeanDefinitionParser#resolveId(org.w3c.dom.Element, org.springframework.beans.factory.support.AbstractBeanDefinition, org.springframework.beans.factory.xml.ParserContext)
|
||||||
@@ -64,29 +82,25 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
|
|||||||
@Override
|
@Override
|
||||||
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
|
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
|
||||||
|
|
||||||
Object source = parserContext.extractSource(element);
|
|
||||||
|
|
||||||
BeanComponentDefinitionBuilder helper = new BeanComponentDefinitionBuilder(element, parserContext);
|
|
||||||
|
|
||||||
String uri = element.getAttribute("uri");
|
|
||||||
String mongoRef = element.getAttribute("mongo-ref");
|
|
||||||
String dbname = element.getAttribute("dbname");
|
|
||||||
|
|
||||||
BeanDefinition userCredentials = getUserCredentialsBeanDefinition(element, parserContext);
|
|
||||||
|
|
||||||
// Common setup
|
// Common setup
|
||||||
BeanDefinitionBuilder dbFactoryBuilder = BeanDefinitionBuilder.genericBeanDefinition(SimpleMongoDbFactory.class);
|
BeanDefinitionBuilder dbFactoryBuilder = BeanDefinitionBuilder.genericBeanDefinition(SimpleMongoDbFactory.class);
|
||||||
setPropertyValue(dbFactoryBuilder, element, "write-concern", "writeConcern");
|
setPropertyValue(dbFactoryBuilder, element, "write-concern", "writeConcern");
|
||||||
|
|
||||||
if (StringUtils.hasText(uri)) {
|
BeanDefinition mongoUri = getMongoUri(element, parserContext);
|
||||||
if (StringUtils.hasText(mongoRef) || StringUtils.hasText(dbname) || userCredentials != null) {
|
|
||||||
parserContext.getReaderContext().error("Configure either Mongo URI or details individually!", source);
|
|
||||||
}
|
|
||||||
|
|
||||||
dbFactoryBuilder.addConstructorArgValue(getMongoUri(uri));
|
if (mongoUri != null) {
|
||||||
|
|
||||||
|
dbFactoryBuilder.addConstructorArgValue(mongoUri);
|
||||||
return getSourceBeanDefinition(dbFactoryBuilder, parserContext, element);
|
return getSourceBeanDefinition(dbFactoryBuilder, parserContext, element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BeanComponentDefinitionBuilder helper = new BeanComponentDefinitionBuilder(element, parserContext);
|
||||||
|
|
||||||
|
String mongoRef = element.getAttribute("mongo-ref");
|
||||||
|
String dbname = element.getAttribute("dbname");
|
||||||
|
|
||||||
|
BeanDefinition userCredentials = getUserCredentialsBeanDefinition(element, parserContext);
|
||||||
|
|
||||||
// Defaulting
|
// Defaulting
|
||||||
if (StringUtils.hasText(mongoRef)) {
|
if (StringUtils.hasText(mongoRef)) {
|
||||||
dbFactoryBuilder.addConstructorArgReference(mongoRef);
|
dbFactoryBuilder.addConstructorArgReference(mongoRef);
|
||||||
@@ -147,14 +161,42 @@ public class MongoDbFactoryParser extends AbstractBeanDefinitionParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a {@link BeanDefinition} for a {@link MongoURI}.
|
* Creates a {@link BeanDefinition} for a {@link MongoURI} or {@link MongoClientURI} depending on configured
|
||||||
|
* attributes. <br />
|
||||||
|
* Errors when configured element contains {@literal uri} or {@literal client-uri} along with other attributes except
|
||||||
|
* {@literal write-concern} and/or {@literal id}.
|
||||||
*
|
*
|
||||||
* @param uri
|
* @param element must not be {@literal null}.
|
||||||
* @return
|
* @param parserContext
|
||||||
|
* @return {@literal null} in case no client-/uri defined.
|
||||||
*/
|
*/
|
||||||
private BeanDefinition getMongoUri(String uri) {
|
private BeanDefinition getMongoUri(Element element, ParserContext parserContext) {
|
||||||
|
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MongoURI.class);
|
boolean hasClientUri = element.hasAttribute("client-uri");
|
||||||
|
|
||||||
|
if (!hasClientUri && !element.hasAttribute("uri")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int allowedAttributesCount = 1;
|
||||||
|
for (String attribute : MONGO_URI_ALLOWED_ADDITIONAL_ATTRIBUTES) {
|
||||||
|
|
||||||
|
if (element.hasAttribute(attribute)) {
|
||||||
|
allowedAttributesCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.getAttributes().getLength() > allowedAttributesCount) {
|
||||||
|
|
||||||
|
parserContext.getReaderContext().error(
|
||||||
|
"Configure either " + (hasClientUri ? "Mongo Client URI" : "Mongo URI") + " or details individually!",
|
||||||
|
parserContext.extractSource(element));
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> type = hasClientUri ? MongoClientURI.class : MongoURI.class;
|
||||||
|
String uri = hasClientUri ? element.getAttribute("client-uri") : element.getAttribute("uri");
|
||||||
|
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(type);
|
||||||
builder.addConstructorArgValue(uri);
|
builder.addConstructorArgValue(uri);
|
||||||
|
|
||||||
return builder.getBeanDefinition();
|
return builder.getBeanDefinition();
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -22,6 +22,7 @@ import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
|
|||||||
*
|
*
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Martin Baumgartner
|
* @author Martin Baumgartner
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class MongoNamespaceHandler extends NamespaceHandlerSupport {
|
public class MongoNamespaceHandler extends NamespaceHandlerSupport {
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ public class MongoNamespaceHandler extends NamespaceHandlerSupport {
|
|||||||
|
|
||||||
registerBeanDefinitionParser("mapping-converter", new MappingMongoConverterParser());
|
registerBeanDefinitionParser("mapping-converter", new MappingMongoConverterParser());
|
||||||
registerBeanDefinitionParser("mongo", new MongoParser());
|
registerBeanDefinitionParser("mongo", new MongoParser());
|
||||||
|
registerBeanDefinitionParser("mongo-client", new MongoClientParser());
|
||||||
registerBeanDefinitionParser("db-factory", new MongoDbFactoryParser());
|
registerBeanDefinitionParser("db-factory", new MongoDbFactoryParser());
|
||||||
registerBeanDefinitionParser("jmx", new MongoJmxParser());
|
registerBeanDefinitionParser("jmx", new MongoJmxParser());
|
||||||
registerBeanDefinitionParser("auditing", new MongoAuditingBeanDefinitionParser());
|
registerBeanDefinitionParser("auditing", new MongoAuditingBeanDefinitionParser());
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -15,14 +15,10 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.mongodb.config;
|
package org.springframework.data.mongodb.config;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.config.CustomEditorConfigurer;
|
|
||||||
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
import org.springframework.beans.factory.parsing.BeanComponentDefinition;
|
||||||
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
|
||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.ManagedMap;
|
|
||||||
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
||||||
import org.springframework.beans.factory.xml.ParserContext;
|
import org.springframework.beans.factory.xml.ParserContext;
|
||||||
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
import org.springframework.data.config.BeanComponentDefinitionBuilder;
|
||||||
@@ -36,6 +32,7 @@ import org.w3c.dom.Element;
|
|||||||
*
|
*
|
||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class MongoParser implements BeanDefinitionParser {
|
public class MongoParser implements BeanDefinitionParser {
|
||||||
|
|
||||||
@@ -64,7 +61,8 @@ public class MongoParser implements BeanDefinitionParser {
|
|||||||
|
|
||||||
BeanComponentDefinition mongoComponent = helper.getComponent(builder, defaultedId);
|
BeanComponentDefinition mongoComponent = helper.getComponent(builder, defaultedId);
|
||||||
parserContext.registerBeanComponent(mongoComponent);
|
parserContext.registerBeanComponent(mongoComponent);
|
||||||
BeanComponentDefinition serverAddressPropertyEditor = helper.getComponent(registerServerAddressPropertyEditor());
|
BeanComponentDefinition serverAddressPropertyEditor = helper.getComponent(MongoParsingUtils
|
||||||
|
.getServerAddressPropertyEditorBuilder());
|
||||||
parserContext.registerBeanComponent(serverAddressPropertyEditor);
|
parserContext.registerBeanComponent(serverAddressPropertyEditor);
|
||||||
BeanComponentDefinition writeConcernPropertyEditor = helper.getComponent(MongoParsingUtils
|
BeanComponentDefinition writeConcernPropertyEditor = helper.getComponent(MongoParsingUtils
|
||||||
.getWriteConcernPropertyEditorBuilder());
|
.getWriteConcernPropertyEditorBuilder());
|
||||||
@@ -75,19 +73,4 @@ public class MongoParser implements BeanDefinitionParser {
|
|||||||
return mongoComponent.getBeanDefinition();
|
return mongoComponent.getBeanDefinition();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* One should only register one bean definition but want to have the convenience of using
|
|
||||||
* AbstractSingleBeanDefinitionParser but have the side effect of registering a 'default' property editor with the
|
|
||||||
* container.
|
|
||||||
*/
|
|
||||||
private BeanDefinitionBuilder registerServerAddressPropertyEditor() {
|
|
||||||
|
|
||||||
Map<String, String> customEditors = new ManagedMap<String, String>();
|
|
||||||
customEditors.put("com.mongodb.ServerAddress[]",
|
|
||||||
"org.springframework.data.mongodb.config.ServerAddressPropertyEditor");
|
|
||||||
|
|
||||||
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CustomEditorConfigurer.class);
|
|
||||||
builder.addPropertyValue("customEditors", customEditors);
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -24,6 +24,7 @@ import org.springframework.beans.factory.config.CustomEditorConfigurer;
|
|||||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||||
import org.springframework.beans.factory.support.ManagedMap;
|
import org.springframework.beans.factory.support.ManagedMap;
|
||||||
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
||||||
|
import org.springframework.data.mongodb.core.MongoClientOptionsFactoryBean;
|
||||||
import org.springframework.data.mongodb.core.MongoOptionsFactoryBean;
|
import org.springframework.data.mongodb.core.MongoOptionsFactoryBean;
|
||||||
import org.springframework.util.xml.DomUtils;
|
import org.springframework.util.xml.DomUtils;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
@@ -33,13 +34,13 @@ import org.w3c.dom.Element;
|
|||||||
*
|
*
|
||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
abstract class MongoParsingUtils {
|
abstract class MongoParsingUtils {
|
||||||
|
|
||||||
private MongoParsingUtils() {
|
private MongoParsingUtils() {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the mongo replica-set element.
|
* Parses the mongo replica-set element.
|
||||||
@@ -54,12 +55,14 @@ abstract class MongoParsingUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the mongo:options sub-element. Populates the given attribute factory with the proper attributes.
|
* Parses the {@code mongo:options} sub-element. Populates the given attribute factory with the proper attributes.
|
||||||
*
|
*
|
||||||
* @return true if parsing actually occured, false otherwise
|
* @return true if parsing actually occured, {@literal false} otherwise
|
||||||
*/
|
*/
|
||||||
static boolean parseMongoOptions(Element element, BeanDefinitionBuilder mongoBuilder) {
|
static boolean parseMongoOptions(Element element, BeanDefinitionBuilder mongoBuilder) {
|
||||||
|
|
||||||
Element optionsElement = DomUtils.getChildElementByTagName(element, "options");
|
Element optionsElement = DomUtils.getChildElementByTagName(element, "options");
|
||||||
|
|
||||||
if (optionsElement == null) {
|
if (optionsElement == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -80,13 +83,58 @@ abstract class MongoParsingUtils {
|
|||||||
setPropertyValue(optionsDefBuilder, optionsElement, "write-timeout", "writeTimeout");
|
setPropertyValue(optionsDefBuilder, optionsElement, "write-timeout", "writeTimeout");
|
||||||
setPropertyValue(optionsDefBuilder, optionsElement, "write-fsync", "writeFsync");
|
setPropertyValue(optionsDefBuilder, optionsElement, "write-fsync", "writeFsync");
|
||||||
setPropertyValue(optionsDefBuilder, optionsElement, "slave-ok", "slaveOk");
|
setPropertyValue(optionsDefBuilder, optionsElement, "slave-ok", "slaveOk");
|
||||||
setPropertyValue(optionsDefBuilder, optionsElement, "ssl", "ssl");
|
setPropertyValue(optionsDefBuilder, optionsElement, "ssl", "ssl");
|
||||||
setPropertyReference(optionsDefBuilder, optionsElement, "ssl-socket-factory-ref", "sslSocketFactory");
|
setPropertyReference(optionsDefBuilder, optionsElement, "ssl-socket-factory-ref", "sslSocketFactory");
|
||||||
|
|
||||||
mongoBuilder.addPropertyValue("mongoOptions", optionsDefBuilder.getBeanDefinition());
|
mongoBuilder.addPropertyValue("mongoOptions", optionsDefBuilder.getBeanDefinition());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the {@code mongo:client-options} sub-element. Populates the given attribute factory with the proper
|
||||||
|
* attributes.
|
||||||
|
*
|
||||||
|
* @param element must not be {@literal null}.
|
||||||
|
* @param mongoClientBuilder must not be {@literal null}.
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public static boolean parseMongoClientOptions(Element element, BeanDefinitionBuilder mongoClientBuilder) {
|
||||||
|
|
||||||
|
Element optionsElement = DomUtils.getChildElementByTagName(element, "client-options");
|
||||||
|
|
||||||
|
if (optionsElement == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
BeanDefinitionBuilder clientOptionsDefBuilder = BeanDefinitionBuilder
|
||||||
|
.genericBeanDefinition(MongoClientOptionsFactoryBean.class);
|
||||||
|
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "description", "description");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "min-connections-per-host", "minConnectionsPerHost");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "connections-per-host", "connectionsPerHost");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "threads-allowed-to-block-for-connection-multiplier",
|
||||||
|
"threadsAllowedToBlockForConnectionMultiplier");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "max-wait-time", "maxWaitTime");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "max-connection-idle-time", "maxConnectionIdleTime");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "max-connection-life-time", "maxConnectionLifeTime");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "connect-timeout", "connectTimeout");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "socket-timeout", "socketTimeout");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "socket-keep-alive", "socketKeepAlive");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "read-preference", "readPreference");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "write-concern", "writeConcern");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "heartbeat-frequency", "heartbeatFrequency");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "min-heartbeat-frequency", "minHeartbeatFrequency");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "heartbeat-connect-timeout", "heartbeatConnectTimeout");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "heartbeat-socket-timeout", "heartbeatSocketTimeout");
|
||||||
|
setPropertyValue(clientOptionsDefBuilder, optionsElement, "ssl", "ssl");
|
||||||
|
setPropertyReference(clientOptionsDefBuilder, optionsElement, "ssl-socket-factory-ref", "sslSocketFactory");
|
||||||
|
|
||||||
|
mongoClientBuilder.addPropertyValue("mongoClientOptions", clientOptionsDefBuilder.getBeanDefinition());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link BeanDefinitionBuilder} to build a {@link BeanDefinition} for a
|
* Returns the {@link BeanDefinitionBuilder} to build a {@link BeanDefinition} for a
|
||||||
* {@link WriteConcernPropertyEditor}.
|
* {@link WriteConcernPropertyEditor}.
|
||||||
@@ -103,4 +151,56 @@ abstract class MongoParsingUtils {
|
|||||||
|
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* One should only register one bean definition but want to have the convenience of using
|
||||||
|
* AbstractSingleBeanDefinitionParser but have the side effect of registering a 'default' property editor with the
|
||||||
|
* container.
|
||||||
|
*/
|
||||||
|
static BeanDefinitionBuilder getServerAddressPropertyEditorBuilder() {
|
||||||
|
|
||||||
|
Map<String, String> customEditors = new ManagedMap<String, String>();
|
||||||
|
customEditors.put("com.mongodb.ServerAddress[]",
|
||||||
|
"org.springframework.data.mongodb.config.ServerAddressPropertyEditor");
|
||||||
|
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CustomEditorConfigurer.class);
|
||||||
|
builder.addPropertyValue("customEditors", customEditors);
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link BeanDefinitionBuilder} to build a {@link BeanDefinition} for a
|
||||||
|
* {@link ReadPreferencePropertyEditor}.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
static BeanDefinitionBuilder getReadPreferencePropertyEditorBuilder() {
|
||||||
|
|
||||||
|
Map<String, Class<?>> customEditors = new ManagedMap<String, Class<?>>();
|
||||||
|
customEditors.put("com.mongodb.ReadPreference", ReadPreferencePropertyEditor.class);
|
||||||
|
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CustomEditorConfigurer.class);
|
||||||
|
builder.addPropertyValue("customEditors", customEditors);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link BeanDefinitionBuilder} to build a {@link BeanDefinition} for a
|
||||||
|
* {@link MongoCredentialPropertyEditor}.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
static BeanDefinitionBuilder getMongoCredentialPropertyEditor() {
|
||||||
|
|
||||||
|
Map<String, Class<?>> customEditors = new ManagedMap<String, Class<?>>();
|
||||||
|
customEditors.put("com.mongodb.MongoCredential[]", MongoCredentialPropertyEditor.class);
|
||||||
|
|
||||||
|
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(CustomEditorConfigurer.class);
|
||||||
|
builder.addPropertyValue("customEditors", customEditors);
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.config;
|
||||||
|
|
||||||
|
import java.beans.PropertyEditorSupport;
|
||||||
|
|
||||||
|
import com.mongodb.ReadPreference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a {@link String} to a {@link ReadPreference}.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public class ReadPreferencePropertyEditor extends PropertyEditorSupport {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see java.beans.PropertyEditorSupport#setAsText(java.lang.String)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setAsText(String readPreferenceString) throws IllegalArgumentException {
|
||||||
|
|
||||||
|
if (readPreferenceString == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadPreference preference = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
preference = ReadPreference.valueOf(readPreferenceString);
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
// ignore this one and try to map it differently
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preference != null) {
|
||||||
|
setValue(preference);
|
||||||
|
} else if ("PRIMARY".equalsIgnoreCase(readPreferenceString)) {
|
||||||
|
setValue(ReadPreference.primary());
|
||||||
|
} else if ("PRIMARY_PREFERRED".equalsIgnoreCase(readPreferenceString)) {
|
||||||
|
setValue(ReadPreference.primaryPreferred());
|
||||||
|
} else if ("SECONDARY".equalsIgnoreCase(readPreferenceString)) {
|
||||||
|
setValue(ReadPreference.secondary());
|
||||||
|
} else if ("SECONDARY_PREFERRED".equalsIgnoreCase(readPreferenceString)) {
|
||||||
|
setValue(ReadPreference.secondaryPreferred());
|
||||||
|
} else if ("NEAREST".equalsIgnoreCase(readPreferenceString)) {
|
||||||
|
setValue(ReadPreference.nearest());
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(String.format("Cannot find matching ReadPreference for %s",
|
||||||
|
readPreferenceString));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2017 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.data.mongodb.core.query.Query;
|
||||||
|
import org.springframework.data.mongodb.core.query.Update;
|
||||||
|
import org.springframework.data.util.Pair;
|
||||||
|
|
||||||
|
import com.mongodb.BulkWriteResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bulk operations for insert/update/remove actions on a collection. These bulks operation are available since MongoDB
|
||||||
|
* 2.6 and make use of low level bulk commands on the protocol level. This interface defines a fluent API to add
|
||||||
|
* multiple single operations or list of similar operations in sequence which can then eventually be executed by calling
|
||||||
|
* {@link #execute()}.
|
||||||
|
*
|
||||||
|
* @author Tobias Trelle
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.9
|
||||||
|
*/
|
||||||
|
public interface BulkOperations {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode for bulk operation.
|
||||||
|
**/
|
||||||
|
public enum BulkMode {
|
||||||
|
|
||||||
|
/** Perform bulk operations in sequence. The first error will cancel processing. */
|
||||||
|
ORDERED,
|
||||||
|
|
||||||
|
/** Perform bulk operations in parallel. Processing will continue on errors. */
|
||||||
|
UNORDERED
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single insert to the bulk operation.
|
||||||
|
*
|
||||||
|
* @param documents the document to insert, must not be {@literal null}.
|
||||||
|
* @return the current {@link BulkOperations} instance with the insert added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations insert(Object documents);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of inserts to the bulk operation.
|
||||||
|
*
|
||||||
|
* @param documents List of documents to insert, must not be {@literal null}.
|
||||||
|
* @return the current {@link BulkOperations} instance with the insert added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations insert(List<? extends Object> documents);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single update to the bulk operation. For the update request, only the first matching document is updated.
|
||||||
|
*
|
||||||
|
* @param query update criteria, must not be {@literal null}.
|
||||||
|
* @param update {@link Update} operation to perform, must not be {@literal null}.
|
||||||
|
* @return the current {@link BulkOperations} instance with the update added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations updateOne(Query query, Update update);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of updates to the bulk operation. For each update request, only the first matching document is updated.
|
||||||
|
*
|
||||||
|
* @param updates Update operations to perform.
|
||||||
|
* @return the current {@link BulkOperations} instance with the update added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations updateOne(List<Pair<Query, Update>> updates);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single update to the bulk operation. For the update request, all matching documents are updated.
|
||||||
|
*
|
||||||
|
* @param query Update criteria.
|
||||||
|
* @param update Update operation to perform.
|
||||||
|
* @return the current {@link BulkOperations} instance with the update added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations updateMulti(Query query, Update update);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of updates to the bulk operation. For each update request, all matching documents are updated.
|
||||||
|
*
|
||||||
|
* @param updates Update operations to perform.
|
||||||
|
* @return The bulk operation.
|
||||||
|
* @return the current {@link BulkOperations} instance with the update added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations updateMulti(List<Pair<Query, Update>> updates);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single upsert to the bulk operation. An upsert is an update if the set of matching documents is not empty,
|
||||||
|
* else an insert.
|
||||||
|
*
|
||||||
|
* @param query Update criteria.
|
||||||
|
* @param update Update operation to perform.
|
||||||
|
* @return The bulk operation.
|
||||||
|
* @return the current {@link BulkOperations} instance with the update added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations upsert(Query query, Update update);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of upserts to the bulk operation. An upsert is an update if the set of matching documents is not empty,
|
||||||
|
* else an insert.
|
||||||
|
*
|
||||||
|
* @param updates Updates/insert operations to perform.
|
||||||
|
* @return The bulk operation.
|
||||||
|
* @return the current {@link BulkOperations} instance with the update added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations upsert(List<Pair<Query, Update>> updates);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a single remove operation to the bulk operation.
|
||||||
|
*
|
||||||
|
* @param remove the {@link Query} to select the documents to be removed, must not be {@literal null}.
|
||||||
|
* @return the current {@link BulkOperations} instance with the removal added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations remove(Query remove);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a list of remove operations to the bulk operation.
|
||||||
|
*
|
||||||
|
* @param removes the remove operations to perform, must not be {@literal null}.
|
||||||
|
* @return the current {@link BulkOperations} instance with the removal added, will never be {@literal null}.
|
||||||
|
*/
|
||||||
|
BulkOperations remove(List<Query> removes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute all bulk operations using the default write concern.
|
||||||
|
*
|
||||||
|
* @return Result of the bulk operation providing counters for inserts/updates etc.
|
||||||
|
* @throws org.springframework.data.mongodb.BulkOperationException if an error occurred during bulk processing.
|
||||||
|
*/
|
||||||
|
BulkWriteResult execute();
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -25,7 +25,7 @@ import com.mongodb.DBCursor;
|
|||||||
interface CursorPreparer {
|
interface CursorPreparer {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare the given cursor (apply limits, skips and so on). Returns th eprepared cursor.
|
* Prepare the given cursor (apply limits, skips and so on). Returns the prepared cursor.
|
||||||
*
|
*
|
||||||
* @param cursor
|
* @param cursor
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,367 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.Value;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||||
|
import org.springframework.data.mongodb.core.convert.QueryMapper;
|
||||||
|
import org.springframework.data.mongodb.core.convert.UpdateMapper;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
|
||||||
|
import org.springframework.data.mongodb.core.query.Query;
|
||||||
|
import org.springframework.data.mongodb.core.query.Update;
|
||||||
|
import org.springframework.data.util.Pair;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import com.mongodb.BasicDBObject;
|
||||||
|
import com.mongodb.BulkWriteException;
|
||||||
|
import com.mongodb.BulkWriteOperation;
|
||||||
|
import com.mongodb.BulkWriteRequestBuilder;
|
||||||
|
import com.mongodb.BulkWriteResult;
|
||||||
|
import com.mongodb.DBCollection;
|
||||||
|
import com.mongodb.DBObject;
|
||||||
|
import com.mongodb.WriteConcern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation for {@link BulkOperations}.
|
||||||
|
*
|
||||||
|
* @author Tobias Trelle
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Mark Paluch
|
||||||
|
* @since 1.9
|
||||||
|
*/
|
||||||
|
class DefaultBulkOperations implements BulkOperations {
|
||||||
|
|
||||||
|
private final MongoOperations mongoOperations;
|
||||||
|
private final String collectionName;
|
||||||
|
private final BulkOperationContext bulkOperationContext;
|
||||||
|
|
||||||
|
private PersistenceExceptionTranslator exceptionTranslator;
|
||||||
|
private WriteConcernResolver writeConcernResolver;
|
||||||
|
private WriteConcern defaultWriteConcern;
|
||||||
|
|
||||||
|
private BulkWriteOperation bulk;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link DefaultBulkOperations} for the given {@link MongoOperations}, collection name and
|
||||||
|
* {@link BulkOperationContext}.
|
||||||
|
*
|
||||||
|
* @param mongoOperations must not be {@literal null}.
|
||||||
|
* @param collectionName must not be {@literal null}.
|
||||||
|
* @param bulkOperationContext must not be {@literal null}.
|
||||||
|
* @since 1.9.12
|
||||||
|
*/
|
||||||
|
DefaultBulkOperations(MongoOperations mongoOperations, String collectionName,
|
||||||
|
BulkOperationContext bulkOperationContext) {
|
||||||
|
|
||||||
|
Assert.notNull(mongoOperations, "MongoOperations must not be null!");
|
||||||
|
Assert.hasText(collectionName, "CollectionName must not be null nor empty!");
|
||||||
|
Assert.notNull(bulkOperationContext, "BulkOperationContext must not be null!");
|
||||||
|
|
||||||
|
this.mongoOperations = mongoOperations;
|
||||||
|
this.collectionName = collectionName;
|
||||||
|
this.bulkOperationContext = bulkOperationContext;
|
||||||
|
this.exceptionTranslator = new MongoExceptionTranslator();
|
||||||
|
this.writeConcernResolver = DefaultWriteConcernResolver.INSTANCE;
|
||||||
|
this.bulk = getBulkWriteOptions(bulkOperationContext.getBulkMode());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the {@link PersistenceExceptionTranslator} to be used. Defaults to {@link MongoExceptionTranslator}.
|
||||||
|
*
|
||||||
|
* @param exceptionTranslator can be {@literal null}.
|
||||||
|
*/
|
||||||
|
public void setExceptionTranslator(PersistenceExceptionTranslator exceptionTranslator) {
|
||||||
|
this.exceptionTranslator = exceptionTranslator == null ? new MongoExceptionTranslator() : exceptionTranslator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the {@link WriteConcernResolver} to be used. Defaults to {@link DefaultWriteConcernResolver}.
|
||||||
|
*
|
||||||
|
* @param writeConcernResolver can be {@literal null}.
|
||||||
|
*/
|
||||||
|
public void setWriteConcernResolver(WriteConcernResolver writeConcernResolver) {
|
||||||
|
this.writeConcernResolver = writeConcernResolver == null ? DefaultWriteConcernResolver.INSTANCE
|
||||||
|
: writeConcernResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the default {@link WriteConcern} to be used. Defaults to {@literal null}.
|
||||||
|
*
|
||||||
|
* @param defaultWriteConcern can be {@literal null}.
|
||||||
|
*/
|
||||||
|
void setDefaultWriteConcern(WriteConcern defaultWriteConcern) {
|
||||||
|
this.defaultWriteConcern = defaultWriteConcern;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#insert(java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations insert(Object document) {
|
||||||
|
|
||||||
|
Assert.notNull(document, "Document must not be null!");
|
||||||
|
|
||||||
|
if (document instanceof DBObject) {
|
||||||
|
|
||||||
|
bulk.insert((DBObject) document);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBObject sink = new BasicDBObject();
|
||||||
|
mongoOperations.getConverter().write(document, sink);
|
||||||
|
bulk.insert(sink);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#insert(java.util.List)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations insert(List<? extends Object> documents) {
|
||||||
|
|
||||||
|
Assert.notNull(documents, "Documents must not be null!");
|
||||||
|
|
||||||
|
for (Object document : documents) {
|
||||||
|
insert(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#updateOne(org.springframework.data.mongodb.core.query.Query, org.springframework.data.mongodb.core.query.Update)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public BulkOperations updateOne(Query query, Update update) {
|
||||||
|
|
||||||
|
Assert.notNull(query, "Query must not be null!");
|
||||||
|
Assert.notNull(update, "Update must not be null!");
|
||||||
|
|
||||||
|
return updateOne(Collections.singletonList(Pair.of(query, update)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#updateOne(java.util.List)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations updateOne(List<Pair<Query, Update>> updates) {
|
||||||
|
|
||||||
|
Assert.notNull(updates, "Updates must not be null!");
|
||||||
|
|
||||||
|
for (Pair<Query, Update> update : updates) {
|
||||||
|
update(update.getFirst(), update.getSecond(), false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#updateMulti(org.springframework.data.mongodb.core.query.Query, org.springframework.data.mongodb.core.query.Update)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public BulkOperations updateMulti(Query query, Update update) {
|
||||||
|
|
||||||
|
Assert.notNull(query, "Query must not be null!");
|
||||||
|
Assert.notNull(update, "Update must not be null!");
|
||||||
|
|
||||||
|
return updateMulti(Collections.singletonList(Pair.of(query, update)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#updateMulti(java.util.List)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations updateMulti(List<Pair<Query, Update>> updates) {
|
||||||
|
|
||||||
|
Assert.notNull(updates, "Updates must not be null!");
|
||||||
|
|
||||||
|
for (Pair<Query, Update> update : updates) {
|
||||||
|
update(update.getFirst(), update.getSecond(), false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#upsert(org.springframework.data.mongodb.core.query.Query, org.springframework.data.mongodb.core.query.Update)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations upsert(Query query, Update update) {
|
||||||
|
return update(query, update, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#upsert(java.util.List)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations upsert(List<Pair<Query, Update>> updates) {
|
||||||
|
|
||||||
|
for (Pair<Query, Update> update : updates) {
|
||||||
|
upsert(update.getFirst(), update.getSecond());
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#remove(org.springframework.data.mongodb.core.query.Query)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations remove(Query query) {
|
||||||
|
|
||||||
|
Assert.notNull(query, "Query must not be null!");
|
||||||
|
|
||||||
|
bulk.find(getMappedQuery(query.getQueryObject())).remove();
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#remove(java.util.List)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkOperations remove(List<Query> removes) {
|
||||||
|
|
||||||
|
Assert.notNull(removes, "Removals must not be null!");
|
||||||
|
|
||||||
|
for (Query query : removes) {
|
||||||
|
remove(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.BulkOperations#executeBulk()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BulkWriteResult execute() {
|
||||||
|
|
||||||
|
MongoAction action = new MongoAction(defaultWriteConcern, MongoActionOperation.BULK, collectionName,
|
||||||
|
bulkOperationContext.getEntityType(), null, null);
|
||||||
|
WriteConcern writeConcern = writeConcernResolver.resolve(action);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return writeConcern == null ? bulk.execute() : bulk.execute(writeConcern);
|
||||||
|
} catch (BulkWriteException o_O) {
|
||||||
|
|
||||||
|
DataAccessException toThrow = exceptionTranslator.translateExceptionIfPossible(o_O);
|
||||||
|
throw toThrow == null ? o_O : toThrow;
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
this.bulk = getBulkWriteOptions(bulkOperationContext.getBulkMode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs update and upsert bulk operations.
|
||||||
|
*
|
||||||
|
* @param query the {@link Query} to determine documents to update.
|
||||||
|
* @param update the {@link Update} to perform, must not be {@literal null}.
|
||||||
|
* @param upsert whether to upsert.
|
||||||
|
* @param multi whether to issue a multi-update.
|
||||||
|
* @return the {@link BulkOperations} with the update registered.
|
||||||
|
*/
|
||||||
|
private BulkOperations update(Query query, Update update, boolean upsert, boolean multi) {
|
||||||
|
|
||||||
|
Assert.notNull(query, "Query must not be null!");
|
||||||
|
Assert.notNull(update, "Update must not be null!");
|
||||||
|
|
||||||
|
BulkWriteRequestBuilder builder = bulk.find(getMappedQuery(query.getQueryObject()));
|
||||||
|
|
||||||
|
if (upsert) {
|
||||||
|
|
||||||
|
if (multi) {
|
||||||
|
builder.upsert().update(getMappedUpdate(update.getUpdateObject()));
|
||||||
|
} else {
|
||||||
|
builder.upsert().updateOne(getMappedUpdate(update.getUpdateObject()));
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (multi) {
|
||||||
|
builder.update(getMappedUpdate(update.getUpdateObject()));
|
||||||
|
} else {
|
||||||
|
builder.updateOne(getMappedUpdate(update.getUpdateObject()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private DBObject getMappedUpdate(DBObject update) {
|
||||||
|
return bulkOperationContext.getUpdateMapper().getMappedObject(update, bulkOperationContext.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
private DBObject getMappedQuery(DBObject query) {
|
||||||
|
return bulkOperationContext.getQueryMapper().getMappedObject(query, bulkOperationContext.getEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
private BulkWriteOperation getBulkWriteOptions(BulkMode bulkMode) {
|
||||||
|
|
||||||
|
DBCollection collection = mongoOperations.getCollection(collectionName);
|
||||||
|
|
||||||
|
switch (bulkMode) {
|
||||||
|
case ORDERED:
|
||||||
|
return collection.initializeOrderedBulkOperation();
|
||||||
|
case UNORDERED:
|
||||||
|
return collection.initializeUnorderedBulkOperation();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalStateException("BulkMode was null!");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link BulkOperationContext} holds information about
|
||||||
|
* {@link org.springframework.data.mongodb.core.BulkOperations.BulkMode} the entity in use as well as references to
|
||||||
|
* {@link QueryMapper} and {@link UpdateMapper}.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @since 2.0
|
||||||
|
*/
|
||||||
|
@Value
|
||||||
|
static class BulkOperationContext {
|
||||||
|
|
||||||
|
@NonNull BulkMode bulkMode;
|
||||||
|
MongoPersistentEntity<?> entity;
|
||||||
|
@NonNull QueryMapper queryMapper;
|
||||||
|
@NonNull UpdateMapper updateMapper;
|
||||||
|
|
||||||
|
Class<?> getEntityType() {
|
||||||
|
return entity != null ? entity.getType() : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -15,15 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.mongodb.core;
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
import static org.springframework.data.domain.Sort.Direction.*;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.data.mongodb.core.convert.QueryMapper;
|
||||||
import org.springframework.data.mongodb.core.index.IndexDefinition;
|
import org.springframework.data.mongodb.core.index.IndexDefinition;
|
||||||
import org.springframework.data.mongodb.core.index.IndexField;
|
|
||||||
import org.springframework.data.mongodb.core.index.IndexInfo;
|
import org.springframework.data.mongodb.core.index.IndexInfo;
|
||||||
|
import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import com.mongodb.DBCollection;
|
import com.mongodb.DBCollection;
|
||||||
@@ -36,14 +36,16 @@ import com.mongodb.MongoException;
|
|||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Komi Innocent
|
* @author Komi Innocent
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class DefaultIndexOperations implements IndexOperations {
|
public class DefaultIndexOperations implements IndexOperations {
|
||||||
|
|
||||||
private static final Double ONE = Double.valueOf(1);
|
private static final String PARTIAL_FILTER_EXPRESSION_KEY = "partialFilterExpression";
|
||||||
private static final Double MINUS_ONE = Double.valueOf(-1);
|
|
||||||
|
|
||||||
private final MongoOperations mongoOperations;
|
private final MongoOperations mongoOperations;
|
||||||
private final String collectionName;
|
private final String collectionName;
|
||||||
|
private final QueryMapper mapper;
|
||||||
|
private final Class<?> type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link DefaultIndexOperations}.
|
* Creates a new {@link DefaultIndexOperations}.
|
||||||
@@ -52,12 +54,26 @@ public class DefaultIndexOperations implements IndexOperations {
|
|||||||
* @param collectionName must not be {@literal null}.
|
* @param collectionName must not be {@literal null}.
|
||||||
*/
|
*/
|
||||||
public DefaultIndexOperations(MongoOperations mongoOperations, String collectionName) {
|
public DefaultIndexOperations(MongoOperations mongoOperations, String collectionName) {
|
||||||
|
this(mongoOperations, collectionName, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link DefaultIndexOperations}.
|
||||||
|
*
|
||||||
|
* @param mongoOperations must not be {@literal null}.
|
||||||
|
* @param collectionName must not be {@literal null}.
|
||||||
|
* @param type Type used for mapping potential partial index filter expression. Can be {@literal null}.
|
||||||
|
* @since 1.10
|
||||||
|
*/
|
||||||
|
public DefaultIndexOperations(MongoOperations mongoOperations, String collectionName, Class<?> type) {
|
||||||
|
|
||||||
Assert.notNull(mongoOperations, "MongoOperations must not be null!");
|
Assert.notNull(mongoOperations, "MongoOperations must not be null!");
|
||||||
Assert.notNull(collectionName, "Collection name can not be null!");
|
Assert.notNull(collectionName, "Collection name can not be null!");
|
||||||
|
|
||||||
this.mongoOperations = mongoOperations;
|
this.mongoOperations = mongoOperations;
|
||||||
this.collectionName = collectionName;
|
this.collectionName = collectionName;
|
||||||
|
this.mapper = new QueryMapper(mongoOperations.getConverter());
|
||||||
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -65,14 +81,43 @@ public class DefaultIndexOperations implements IndexOperations {
|
|||||||
* @see org.springframework.data.mongodb.core.IndexOperations#ensureIndex(org.springframework.data.mongodb.core.index.IndexDefinition)
|
* @see org.springframework.data.mongodb.core.IndexOperations#ensureIndex(org.springframework.data.mongodb.core.index.IndexDefinition)
|
||||||
*/
|
*/
|
||||||
public void ensureIndex(final IndexDefinition indexDefinition) {
|
public void ensureIndex(final IndexDefinition indexDefinition) {
|
||||||
|
|
||||||
mongoOperations.execute(collectionName, new CollectionCallback<Object>() {
|
mongoOperations.execute(collectionName, new CollectionCallback<Object>() {
|
||||||
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
public Object doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
||||||
DBObject indexOptions = indexDefinition.getIndexOptions();
|
DBObject indexOptions = indexDefinition.getIndexOptions();
|
||||||
if (indexOptions != null) {
|
|
||||||
collection.ensureIndex(indexDefinition.getIndexKeys(), indexOptions);
|
if (indexOptions != null && indexOptions.containsField(PARTIAL_FILTER_EXPRESSION_KEY)) {
|
||||||
} else {
|
|
||||||
collection.ensureIndex(indexDefinition.getIndexKeys());
|
Assert.isInstanceOf(DBObject.class, indexOptions.get(PARTIAL_FILTER_EXPRESSION_KEY));
|
||||||
|
|
||||||
|
indexOptions.put(PARTIAL_FILTER_EXPRESSION_KEY,
|
||||||
|
mapper.getMappedObject((DBObject) indexOptions.get(PARTIAL_FILTER_EXPRESSION_KEY),
|
||||||
|
lookupPersistentEntity(type, collectionName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (indexOptions != null) {
|
||||||
|
collection.createIndex(indexDefinition.getIndexKeys(), indexOptions);
|
||||||
|
} else {
|
||||||
|
collection.createIndex(indexDefinition.getIndexKeys());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MongoPersistentEntity<?> lookupPersistentEntity(Class<?> entityType, String collection) {
|
||||||
|
|
||||||
|
if (entityType != null) {
|
||||||
|
return mongoOperations.getConverter().getMappingContext().getPersistentEntity(entityType);
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<? extends MongoPersistentEntity<?>> entities = mongoOperations.getConverter().getMappingContext()
|
||||||
|
.getPersistentEntities();
|
||||||
|
|
||||||
|
for (MongoPersistentEntity<?> entity : entities) {
|
||||||
|
if (entity.getCollection().equals(collection)) {
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -104,10 +149,12 @@ public class DefaultIndexOperations implements IndexOperations {
|
|||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.data.mongodb.core.IndexOperations#resetIndexCache()
|
* @see org.springframework.data.mongodb.core.IndexOperations#resetIndexCache()
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void resetIndexCache() {
|
public void resetIndexCache() {
|
||||||
mongoOperations.execute(collectionName, new CollectionCallback<Void>() {
|
mongoOperations.execute(collectionName, new CollectionCallback<Void>() {
|
||||||
public Void doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
public Void doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
||||||
collection.resetIndexCache();
|
|
||||||
|
ReflectiveDBCollectionInvoker.resetIndexCache(collection);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -120,7 +167,9 @@ public class DefaultIndexOperations implements IndexOperations {
|
|||||||
public List<IndexInfo> getIndexInfo() {
|
public List<IndexInfo> getIndexInfo() {
|
||||||
|
|
||||||
return mongoOperations.execute(collectionName, new CollectionCallback<List<IndexInfo>>() {
|
return mongoOperations.execute(collectionName, new CollectionCallback<List<IndexInfo>>() {
|
||||||
|
|
||||||
public List<IndexInfo> doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
public List<IndexInfo> doInCollection(DBCollection collection) throws MongoException, DataAccessException {
|
||||||
|
|
||||||
List<DBObject> dbObjectList = collection.getIndexInfo();
|
List<DBObject> dbObjectList = collection.getIndexInfo();
|
||||||
return getIndexData(dbObjectList);
|
return getIndexData(dbObjectList);
|
||||||
}
|
}
|
||||||
@@ -130,37 +179,7 @@ public class DefaultIndexOperations implements IndexOperations {
|
|||||||
List<IndexInfo> indexInfoList = new ArrayList<IndexInfo>();
|
List<IndexInfo> indexInfoList = new ArrayList<IndexInfo>();
|
||||||
|
|
||||||
for (DBObject ix : dbObjectList) {
|
for (DBObject ix : dbObjectList) {
|
||||||
|
indexInfoList.add(IndexInfo.indexInfoOf(ix));
|
||||||
DBObject keyDbObject = (DBObject) ix.get("key");
|
|
||||||
int numberOfElements = keyDbObject.keySet().size();
|
|
||||||
|
|
||||||
List<IndexField> indexFields = new ArrayList<IndexField>(numberOfElements);
|
|
||||||
|
|
||||||
for (String key : keyDbObject.keySet()) {
|
|
||||||
|
|
||||||
Object value = keyDbObject.get(key);
|
|
||||||
|
|
||||||
if ("2d".equals(value)) {
|
|
||||||
indexFields.add(IndexField.geo(key));
|
|
||||||
} else {
|
|
||||||
|
|
||||||
Double keyValue = new Double(value.toString());
|
|
||||||
|
|
||||||
if (ONE.equals(keyValue)) {
|
|
||||||
indexFields.add(IndexField.create(key, ASC));
|
|
||||||
} else if (MINUS_ONE.equals(keyValue)) {
|
|
||||||
indexFields.add(IndexField.create(key, DESC));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String name = ix.get("name").toString();
|
|
||||||
|
|
||||||
boolean unique = ix.containsField("unique") ? (Boolean) ix.get("unique") : false;
|
|
||||||
boolean dropDuplicates = ix.containsField("dropDups") ? (Boolean) ix.get("dropDups") : false;
|
|
||||||
boolean sparse = ix.containsField("sparse") ? (Boolean) ix.get("sparse") : false;
|
|
||||||
|
|
||||||
indexInfoList.add(new IndexInfo(indexFields, name, unique, dropDuplicates, sparse));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return indexInfoList;
|
return indexInfoList;
|
||||||
|
|||||||
@@ -0,0 +1,188 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static java.util.UUID.*;
|
||||||
|
import static org.springframework.data.mongodb.core.query.Criteria.*;
|
||||||
|
import static org.springframework.data.mongodb.core.query.Query.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.bson.types.ObjectId;
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.data.mongodb.core.script.ExecutableMongoScript;
|
||||||
|
import org.springframework.data.mongodb.core.script.NamedMongoScript;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import com.mongodb.DB;
|
||||||
|
import com.mongodb.MongoException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of {@link ScriptOperations} capable of saving and executing {@link ServerSideJavaScript}.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
class DefaultScriptOperations implements ScriptOperations {
|
||||||
|
|
||||||
|
private static final String SCRIPT_COLLECTION_NAME = "system.js";
|
||||||
|
private static final String SCRIPT_NAME_PREFIX = "func_";
|
||||||
|
|
||||||
|
private final MongoOperations mongoOperations;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates new {@link DefaultScriptOperations} using given {@link MongoOperations}.
|
||||||
|
*
|
||||||
|
* @param mongoOperations must not be {@literal null}.
|
||||||
|
*/
|
||||||
|
public DefaultScriptOperations(MongoOperations mongoOperations) {
|
||||||
|
|
||||||
|
Assert.notNull(mongoOperations, "MongoOperations must not be null!");
|
||||||
|
|
||||||
|
this.mongoOperations = mongoOperations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.ScriptOperations#register(org.springframework.data.mongodb.core.script.ExecutableMongoScript)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public NamedMongoScript register(ExecutableMongoScript script) {
|
||||||
|
return register(new NamedMongoScript(generateScriptName(), script));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.ScriptOperations#register(org.springframework.data.mongodb.core.script.NamedMongoScript)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public NamedMongoScript register(NamedMongoScript script) {
|
||||||
|
|
||||||
|
Assert.notNull(script, "Script must not be null!");
|
||||||
|
|
||||||
|
mongoOperations.save(script, SCRIPT_COLLECTION_NAME);
|
||||||
|
return script;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.ScriptOperations#execute(org.springframework.data.mongodb.core.script.ExecutableMongoScript, java.lang.Object[])
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object execute(final ExecutableMongoScript script, final Object... args) {
|
||||||
|
|
||||||
|
Assert.notNull(script, "Script must not be null!");
|
||||||
|
|
||||||
|
return mongoOperations.execute(new DbCallback<Object>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object doInDB(DB db) throws MongoException, DataAccessException {
|
||||||
|
return db.eval(script.getCode(), convertScriptArgs(false, args));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.ScriptOperations#call(java.lang.String, java.lang.Object[])
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object call(final String scriptName, final Object... args) {
|
||||||
|
|
||||||
|
Assert.hasText(scriptName, "ScriptName must not be null or empty!");
|
||||||
|
|
||||||
|
return mongoOperations.execute(new DbCallback<Object>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object doInDB(DB db) throws MongoException, DataAccessException {
|
||||||
|
return db.eval(String.format("%s(%s)", scriptName, convertAndJoinScriptArgs(args)));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.ScriptOperations#exists(java.lang.String)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean exists(String scriptName) {
|
||||||
|
|
||||||
|
Assert.hasText(scriptName, "ScriptName must not be null or empty!");
|
||||||
|
|
||||||
|
return mongoOperations.exists(query(where("name").is(scriptName)), NamedMongoScript.class, SCRIPT_COLLECTION_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.ScriptOperations#getScriptNames()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Set<String> getScriptNames() {
|
||||||
|
|
||||||
|
List<NamedMongoScript> scripts = mongoOperations.findAll(NamedMongoScript.class, SCRIPT_COLLECTION_NAME);
|
||||||
|
|
||||||
|
if (CollectionUtils.isEmpty(scripts)) {
|
||||||
|
return Collections.emptySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> scriptNames = new HashSet<String>();
|
||||||
|
|
||||||
|
for (NamedMongoScript script : scripts) {
|
||||||
|
scriptNames.add(script.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return scriptNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object[] convertScriptArgs(boolean quote, Object... args) {
|
||||||
|
|
||||||
|
if (ObjectUtils.isEmpty(args)) {
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Object> convertedValues = new ArrayList<Object>(args.length);
|
||||||
|
|
||||||
|
for (Object arg : args) {
|
||||||
|
convertedValues.add(arg instanceof String && quote ? String.format("'%s'", arg)
|
||||||
|
: this.mongoOperations.getConverter().convertToMongoType(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
return convertedValues.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String convertAndJoinScriptArgs(Object... args) {
|
||||||
|
return ObjectUtils.isEmpty(args) ? "" : StringUtils.arrayToCommaDelimitedString(convertScriptArgs(true, args));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a valid name for the {@literal JavaScript}. MongoDB requires an id of type String for scripts. Calling
|
||||||
|
* scripts having {@link ObjectId} as id fails. Therefore we create a random UUID without {@code -} (as this won't
|
||||||
|
* work) an prefix the result with {@link #SCRIPT_NAME_PREFIX}.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String generateScriptName() {
|
||||||
|
return SCRIPT_NAME_PREFIX + randomUUID().toString().replaceAll("-", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 the original author or authors.
|
* Copyright 2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -13,15 +13,20 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.data.mongodb.core.geo;
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import com.mongodb.WriteConcern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for {@link Metric}s that can be applied to a base scale.
|
* Default {@link WriteConcernResolver} resolving the {@link WriteConcern} from the given {@link MongoAction}.
|
||||||
*
|
*
|
||||||
* @deprecated As of release 1.5, replaced by {@link org.springframework.data.geo.Metric}. This class is scheduled to be
|
|
||||||
* removed in the next major release.
|
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Thomas Darimont
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
enum DefaultWriteConcernResolver implements WriteConcernResolver {
|
||||||
public interface Metric extends org.springframework.data.geo.Metric {}
|
|
||||||
|
INSTANCE;
|
||||||
|
|
||||||
|
public WriteConcern resolve(MongoAction action) {
|
||||||
|
return action.getDefaultWriteConcern();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import com.mongodb.BasicDBObject;
|
||||||
|
import com.mongodb.DBObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Value object to mitigate different representations of geo command execution results in MongoDB.
|
||||||
|
*
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @soundtrack Fruitcake - Jeff Coffin (The Inside of the Outside)
|
||||||
|
*/
|
||||||
|
class GeoCommandStatistics {
|
||||||
|
|
||||||
|
private static final GeoCommandStatistics NONE = new GeoCommandStatistics(new BasicDBObject());
|
||||||
|
|
||||||
|
private final DBObject source;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link GeoCommandStatistics} instance with the given source document.
|
||||||
|
*
|
||||||
|
* @param source must not be {@literal null}.
|
||||||
|
*/
|
||||||
|
private GeoCommandStatistics(DBObject source) {
|
||||||
|
|
||||||
|
Assert.notNull(source, "Source document must not be null!");
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link GeoCommandStatistics} from the given command result extracting the statistics.
|
||||||
|
*
|
||||||
|
* @param commandResult must not be {@literal null}.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static GeoCommandStatistics from(DBObject commandResult) {
|
||||||
|
|
||||||
|
Assert.notNull(commandResult, "Command result must not be null!");
|
||||||
|
|
||||||
|
Object stats = commandResult.get("stats");
|
||||||
|
return stats == null ? NONE : new GeoCommandStatistics((DBObject) stats);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the average distance reported by the command result. Mitigating a removal of the field in case the command
|
||||||
|
* didn't return any result introduced in MongoDB 3.2 RC1.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @see https://jira.mongodb.org/browse/SERVER-21024
|
||||||
|
*/
|
||||||
|
public double getAverageDistance() {
|
||||||
|
|
||||||
|
Object averageDistance = source.get("avgDistance");
|
||||||
|
return averageDistance == null ? Double.NaN : (Double) averageDistance;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.data.mongodb.core.geo.GeoJsonModule;
|
||||||
|
import org.springframework.data.web.config.SpringDataWebConfigurationMixin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration class to expose {@link GeoJsonModule} as a Spring bean.
|
||||||
|
*
|
||||||
|
* @author Oliver Gierke
|
||||||
|
*/
|
||||||
|
@SpringDataWebConfigurationMixin
|
||||||
|
public class GeoJsonConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public GeoJsonModule geoJsonModule() {
|
||||||
|
return new GeoJsonModule();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -20,12 +20,12 @@ import java.util.List;
|
|||||||
import org.springframework.data.mongodb.core.index.IndexDefinition;
|
import org.springframework.data.mongodb.core.index.IndexDefinition;
|
||||||
import org.springframework.data.mongodb.core.index.IndexInfo;
|
import org.springframework.data.mongodb.core.index.IndexInfo;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Index operations on a collection.
|
* Index operations on a collection.
|
||||||
*
|
*
|
||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public interface IndexOperations {
|
public interface IndexOperations {
|
||||||
|
|
||||||
@@ -51,7 +51,11 @@ public interface IndexOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all indices that have not yet been applied to this collection.
|
* Clears all indices that have not yet been applied to this collection.
|
||||||
|
*
|
||||||
|
* @deprecated since 1.7. The MongoDB Java driver version 3.0 does no longer support reseting the index cache.
|
||||||
|
* @throws {@link UnsupportedOperationException} when used with MongoDB Java driver version 3.0.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
void resetIndexCache();
|
void resetIndexCache();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -49,7 +49,7 @@ public class MongoAction {
|
|||||||
* @param collectionName the collection name, must not be {@literal null} or empty.
|
* @param collectionName the collection name, must not be {@literal null} or empty.
|
||||||
* @param entityType the POJO that is being operated against
|
* @param entityType the POJO that is being operated against
|
||||||
* @param document the converted DBObject from the POJO or Spring Update object
|
* @param document the converted DBObject from the POJO or Spring Update object
|
||||||
* @param query the converted DBOjbect from the Spring Query object
|
* @param query the converted DBObject from the Spring Query object
|
||||||
*/
|
*/
|
||||||
public MongoAction(WriteConcern defaultWriteConcern, MongoActionOperation mongoActionOperation,
|
public MongoAction(WriteConcern defaultWriteConcern, MongoActionOperation mongoActionOperation,
|
||||||
String collectionName, Class<?> entityType, DBObject document, DBObject query) {
|
String collectionName, Class<?> entityType, DBObject document, DBObject query) {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2012 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -25,5 +25,5 @@ package org.springframework.data.mongodb.core;
|
|||||||
*/
|
*/
|
||||||
public enum MongoActionOperation {
|
public enum MongoActionOperation {
|
||||||
|
|
||||||
REMOVE, UPDATE, INSERT, INSERT_LIST, SAVE
|
REMOVE, UPDATE, INSERT, INSERT_LIST, SAVE, BULK;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -27,7 +27,8 @@ import com.mongodb.Mongo;
|
|||||||
* Mongo server administration exposed via JMX annotations
|
* Mongo server administration exposed via JMX annotations
|
||||||
*
|
*
|
||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Mark Paluch
|
||||||
*/
|
*/
|
||||||
@ManagedResource(description = "Mongo Admin Operations")
|
@ManagedResource(description = "Mongo Admin Operations")
|
||||||
public class MongoAdmin implements MongoAdminOperations {
|
public class MongoAdmin implements MongoAdminOperations {
|
||||||
@@ -35,10 +36,11 @@ public class MongoAdmin implements MongoAdminOperations {
|
|||||||
private final Mongo mongo;
|
private final Mongo mongo;
|
||||||
private String username;
|
private String username;
|
||||||
private String password;
|
private String password;
|
||||||
private String authenticationDatabaseName;
|
private String authenticationDatabaseName;
|
||||||
|
|
||||||
public MongoAdmin(Mongo mongo) {
|
public MongoAdmin(Mongo mongo) {
|
||||||
Assert.notNull(mongo);
|
|
||||||
|
Assert.notNull(mongo, "Mongo must not be null!");
|
||||||
this.mongo = mongo;
|
this.mongo = mongo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,16 +86,16 @@ public class MongoAdmin implements MongoAdminOperations {
|
|||||||
this.password = password;
|
this.password = password;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the authenticationDatabaseName to use to authenticate with the Mongo database.
|
* Sets the authenticationDatabaseName to use to authenticate with the Mongo database.
|
||||||
*
|
*
|
||||||
* @param authenticationDatabaseName The authenticationDatabaseName to use.
|
* @param authenticationDatabaseName The authenticationDatabaseName to use.
|
||||||
*/
|
*/
|
||||||
public void setAuthenticationDatabaseName(String authenticationDatabaseName) {
|
public void setAuthenticationDatabaseName(String authenticationDatabaseName) {
|
||||||
this.authenticationDatabaseName = authenticationDatabaseName;
|
this.authenticationDatabaseName = authenticationDatabaseName;
|
||||||
}
|
}
|
||||||
|
|
||||||
DB getDB(String databaseName) {
|
DB getDB(String databaseName) {
|
||||||
return MongoDbUtils.getDB(mongo, databaseName, new UserCredentials(username, password), authenticationDatabaseName);
|
return MongoDbUtils.getDB(mongo, databaseName, new UserCredentials(username, password), authenticationDatabaseName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.config.AbstractFactoryBean;
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import com.mongodb.Mongo;
|
||||||
|
import com.mongodb.MongoClient;
|
||||||
|
import com.mongodb.MongoClientOptions;
|
||||||
|
import com.mongodb.MongoCredential;
|
||||||
|
import com.mongodb.ServerAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenient factory for configuring MongoDB.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public class MongoClientFactoryBean extends AbstractFactoryBean<Mongo> implements PersistenceExceptionTranslator {
|
||||||
|
|
||||||
|
private static final PersistenceExceptionTranslator DEFAULT_EXCEPTION_TRANSLATOR = new MongoExceptionTranslator();
|
||||||
|
|
||||||
|
private MongoClientOptions mongoClientOptions;
|
||||||
|
private String host;
|
||||||
|
private Integer port;
|
||||||
|
private List<ServerAddress> replicaSetSeeds;
|
||||||
|
private List<MongoCredential> credentials;
|
||||||
|
|
||||||
|
private PersistenceExceptionTranslator exceptionTranslator = DEFAULT_EXCEPTION_TRANSLATOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the {@link MongoClientOptions} to be used when creating {@link MongoClient}.
|
||||||
|
*
|
||||||
|
* @param mongoClientOptions
|
||||||
|
*/
|
||||||
|
public void setMongoClientOptions(MongoClientOptions mongoClientOptions) {
|
||||||
|
this.mongoClientOptions = mongoClientOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the list of credentials to be used when creating {@link MongoClient}.
|
||||||
|
*
|
||||||
|
* @param credentials can be {@literal null}.
|
||||||
|
*/
|
||||||
|
public void setCredentials(MongoCredential[] credentials) {
|
||||||
|
this.credentials = filterNonNullElementsAsList(credentials);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the list of {@link ServerAddress} to build up a replica set for.
|
||||||
|
*
|
||||||
|
* @param replicaSetSeeds can be {@literal null}.
|
||||||
|
*/
|
||||||
|
public void setReplicaSetSeeds(ServerAddress[] replicaSetSeeds) {
|
||||||
|
this.replicaSetSeeds = filterNonNullElementsAsList(replicaSetSeeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the host to connect to.
|
||||||
|
*
|
||||||
|
* @param host
|
||||||
|
*/
|
||||||
|
public void setHost(String host) {
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the port to connect to.
|
||||||
|
*
|
||||||
|
* @param port
|
||||||
|
*/
|
||||||
|
public void setPort(int port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the {@link PersistenceExceptionTranslator} to use.
|
||||||
|
*
|
||||||
|
* @param exceptionTranslator
|
||||||
|
*/
|
||||||
|
public void setExceptionTranslator(PersistenceExceptionTranslator exceptionTranslator) {
|
||||||
|
this.exceptionTranslator = exceptionTranslator == null ? DEFAULT_EXCEPTION_TRANSLATOR : exceptionTranslator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||||
|
*/
|
||||||
|
public Class<? extends Mongo> getObjectType() {
|
||||||
|
return Mongo.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
|
||||||
|
*/
|
||||||
|
public DataAccessException translateExceptionIfPossible(RuntimeException ex) {
|
||||||
|
return exceptionTranslator.translateExceptionIfPossible(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Mongo createInstance() throws Exception {
|
||||||
|
|
||||||
|
if (mongoClientOptions == null) {
|
||||||
|
mongoClientOptions = MongoClientOptions.builder().build();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (credentials == null) {
|
||||||
|
credentials = Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return createMongoClient();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.config.AbstractFactoryBean#destroyInstance(java.lang.Object)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void destroyInstance(Mongo instance) throws Exception {
|
||||||
|
instance.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MongoClient createMongoClient() throws UnknownHostException {
|
||||||
|
|
||||||
|
if (!CollectionUtils.isEmpty(replicaSetSeeds)) {
|
||||||
|
return new MongoClient(replicaSetSeeds, credentials, mongoClientOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new MongoClient(createConfiguredOrDefaultServerAddress(), credentials, mongoClientOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServerAddress createConfiguredOrDefaultServerAddress() throws UnknownHostException {
|
||||||
|
|
||||||
|
ServerAddress defaultAddress = new ServerAddress();
|
||||||
|
|
||||||
|
return new ServerAddress(StringUtils.hasText(host) ? host : defaultAddress.getHost(),
|
||||||
|
port != null ? port.intValue() : defaultAddress.getPort());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given array as {@link List} with all {@literal null} elements removed.
|
||||||
|
*
|
||||||
|
* @param elements the elements to filter <T>, can be {@literal null}.
|
||||||
|
* @return a new unmodifiable {@link List#} from the given elements without {@literal null}s.
|
||||||
|
*/
|
||||||
|
private static <T> List<T> filterNonNullElementsAsList(T[] elements) {
|
||||||
|
|
||||||
|
if (elements == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<T> candidateElements = new ArrayList<T>();
|
||||||
|
|
||||||
|
for (T element : elements) {
|
||||||
|
if (element != null) {
|
||||||
|
candidateElements.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.unmodifiableList(candidateElements);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,295 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import javax.net.SocketFactory;
|
||||||
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.config.AbstractFactoryBean;
|
||||||
|
import org.springframework.data.mongodb.MongoDbFactory;
|
||||||
|
|
||||||
|
import com.mongodb.DBDecoderFactory;
|
||||||
|
import com.mongodb.DBEncoderFactory;
|
||||||
|
import com.mongodb.MongoClient;
|
||||||
|
import com.mongodb.MongoClientOptions;
|
||||||
|
import com.mongodb.ReadPreference;
|
||||||
|
import com.mongodb.WriteConcern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A factory bean for construction of a {@link MongoClientOptions} instance.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public class MongoClientOptionsFactoryBean extends AbstractFactoryBean<MongoClientOptions> {
|
||||||
|
|
||||||
|
private static final MongoClientOptions DEFAULT_MONGO_OPTIONS = MongoClientOptions.builder().build();
|
||||||
|
|
||||||
|
private String description = DEFAULT_MONGO_OPTIONS.getDescription();
|
||||||
|
private int minConnectionsPerHost = DEFAULT_MONGO_OPTIONS.getMinConnectionsPerHost();
|
||||||
|
private int connectionsPerHost = DEFAULT_MONGO_OPTIONS.getConnectionsPerHost();
|
||||||
|
private int threadsAllowedToBlockForConnectionMultiplier = DEFAULT_MONGO_OPTIONS
|
||||||
|
.getThreadsAllowedToBlockForConnectionMultiplier();
|
||||||
|
private int maxWaitTime = DEFAULT_MONGO_OPTIONS.getMaxWaitTime();
|
||||||
|
private int maxConnectionIdleTime = DEFAULT_MONGO_OPTIONS.getMaxConnectionIdleTime();
|
||||||
|
private int maxConnectionLifeTime = DEFAULT_MONGO_OPTIONS.getMaxConnectionLifeTime();
|
||||||
|
private int connectTimeout = DEFAULT_MONGO_OPTIONS.getConnectTimeout();
|
||||||
|
private int socketTimeout = DEFAULT_MONGO_OPTIONS.getSocketTimeout();
|
||||||
|
private boolean socketKeepAlive = DEFAULT_MONGO_OPTIONS.isSocketKeepAlive();
|
||||||
|
private ReadPreference readPreference = DEFAULT_MONGO_OPTIONS.getReadPreference();
|
||||||
|
private DBDecoderFactory dbDecoderFactory = DEFAULT_MONGO_OPTIONS.getDbDecoderFactory();
|
||||||
|
private DBEncoderFactory dbEncoderFactory = DEFAULT_MONGO_OPTIONS.getDbEncoderFactory();
|
||||||
|
private WriteConcern writeConcern = DEFAULT_MONGO_OPTIONS.getWriteConcern();
|
||||||
|
private SocketFactory socketFactory = DEFAULT_MONGO_OPTIONS.getSocketFactory();
|
||||||
|
private boolean cursorFinalizerEnabled = DEFAULT_MONGO_OPTIONS.isCursorFinalizerEnabled();
|
||||||
|
private boolean alwaysUseMBeans = DEFAULT_MONGO_OPTIONS.isAlwaysUseMBeans();
|
||||||
|
private int heartbeatFrequency = DEFAULT_MONGO_OPTIONS.getHeartbeatFrequency();
|
||||||
|
private int minHeartbeatFrequency = DEFAULT_MONGO_OPTIONS.getMinHeartbeatFrequency();
|
||||||
|
private int heartbeatConnectTimeout = DEFAULT_MONGO_OPTIONS.getHeartbeatConnectTimeout();
|
||||||
|
private int heartbeatSocketTimeout = DEFAULT_MONGO_OPTIONS.getHeartbeatSocketTimeout();
|
||||||
|
private String requiredReplicaSetName = DEFAULT_MONGO_OPTIONS.getRequiredReplicaSetName();
|
||||||
|
|
||||||
|
private boolean ssl;
|
||||||
|
private SSLSocketFactory sslSocketFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the {@link MongoClient} description.
|
||||||
|
*
|
||||||
|
* @param description
|
||||||
|
*/
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the minimum number of connections per host.
|
||||||
|
*
|
||||||
|
* @param minConnectionsPerHost
|
||||||
|
*/
|
||||||
|
public void setMinConnectionsPerHost(int minConnectionsPerHost) {
|
||||||
|
this.minConnectionsPerHost = minConnectionsPerHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the number of connections allowed per host. Will block if run out. Default is 10. System property
|
||||||
|
* {@code MONGO.POOLSIZE} can override
|
||||||
|
*
|
||||||
|
* @param connectionsPerHost
|
||||||
|
*/
|
||||||
|
public void setConnectionsPerHost(int connectionsPerHost) {
|
||||||
|
this.connectionsPerHost = connectionsPerHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the multiplier for connectionsPerHost for # of threads that can block. Default is 5. If connectionsPerHost is
|
||||||
|
* 10, and threadsAllowedToBlockForConnectionMultiplier is 5, then 50 threads can block more than that and an
|
||||||
|
* exception will be thrown.
|
||||||
|
*
|
||||||
|
* @param threadsAllowedToBlockForConnectionMultiplier
|
||||||
|
*/
|
||||||
|
public void setThreadsAllowedToBlockForConnectionMultiplier(int threadsAllowedToBlockForConnectionMultiplier) {
|
||||||
|
this.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the max wait time of a blocking thread for a connection. Default is 12000 ms (2 minutes)
|
||||||
|
*
|
||||||
|
* @param maxWaitTime
|
||||||
|
*/
|
||||||
|
public void setMaxWaitTime(int maxWaitTime) {
|
||||||
|
this.maxWaitTime = maxWaitTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum idle time for a pooled connection.
|
||||||
|
*
|
||||||
|
* @param maxConnectionIdleTime
|
||||||
|
*/
|
||||||
|
public void setMaxConnectionIdleTime(int maxConnectionIdleTime) {
|
||||||
|
this.maxConnectionIdleTime = maxConnectionIdleTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the maximum life time for a pooled connection.
|
||||||
|
*
|
||||||
|
* @param maxConnectionLifeTime
|
||||||
|
*/
|
||||||
|
public void setMaxConnectionLifeTime(int maxConnectionLifeTime) {
|
||||||
|
this.maxConnectionLifeTime = maxConnectionLifeTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the connect timeout in milliseconds. 0 is default and infinite.
|
||||||
|
*
|
||||||
|
* @param connectTimeout
|
||||||
|
*/
|
||||||
|
public void setConnectTimeout(int connectTimeout) {
|
||||||
|
this.connectTimeout = connectTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the socket timeout. 0 is default and infinite.
|
||||||
|
*
|
||||||
|
* @param socketTimeout
|
||||||
|
*/
|
||||||
|
public void setSocketTimeout(int socketTimeout) {
|
||||||
|
this.socketTimeout = socketTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the keep alive flag, controls whether or not to have socket keep alive timeout. Defaults to false.
|
||||||
|
*
|
||||||
|
* @param socketKeepAlive
|
||||||
|
*/
|
||||||
|
public void setSocketKeepAlive(boolean socketKeepAlive) {
|
||||||
|
this.socketKeepAlive = socketKeepAlive;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the {@link ReadPreference}.
|
||||||
|
*
|
||||||
|
* @param readPreference
|
||||||
|
*/
|
||||||
|
public void setReadPreference(ReadPreference readPreference) {
|
||||||
|
this.readPreference = readPreference;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the {@link WriteConcern} that will be the default value used when asking the {@link MongoDbFactory} for a DB
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @param writeConcern
|
||||||
|
*/
|
||||||
|
public void setWriteConcern(WriteConcern writeConcern) {
|
||||||
|
this.writeConcern = writeConcern;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param socketFactory
|
||||||
|
*/
|
||||||
|
public void setSocketFactory(SocketFactory socketFactory) {
|
||||||
|
this.socketFactory = socketFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the frequency that the driver will attempt to determine the current state of each server in the cluster.
|
||||||
|
*
|
||||||
|
* @param heartbeatFrequency
|
||||||
|
*/
|
||||||
|
public void setHeartbeatFrequency(int heartbeatFrequency) {
|
||||||
|
this.heartbeatFrequency = heartbeatFrequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In the event that the driver has to frequently re-check a server's availability, it will wait at least this long
|
||||||
|
* since the previous check to avoid wasted effort.
|
||||||
|
*
|
||||||
|
* @param minHeartbeatFrequency
|
||||||
|
*/
|
||||||
|
public void setMinHeartbeatFrequency(int minHeartbeatFrequency) {
|
||||||
|
this.minHeartbeatFrequency = minHeartbeatFrequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the connect timeout for connections used for the cluster heartbeat.
|
||||||
|
*
|
||||||
|
* @param heartbeatConnectTimeout
|
||||||
|
*/
|
||||||
|
public void setHeartbeatConnectTimeout(int heartbeatConnectTimeout) {
|
||||||
|
this.heartbeatConnectTimeout = heartbeatConnectTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the socket timeout for connections used for the cluster heartbeat.
|
||||||
|
*
|
||||||
|
* @param heartbeatSocketTimeout
|
||||||
|
*/
|
||||||
|
public void setHeartbeatSocketTimeout(int heartbeatSocketTimeout) {
|
||||||
|
this.heartbeatSocketTimeout = heartbeatSocketTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the name of the replica set.
|
||||||
|
*
|
||||||
|
* @param requiredReplicaSetName
|
||||||
|
*/
|
||||||
|
public void setRequiredReplicaSetName(String requiredReplicaSetName) {
|
||||||
|
this.requiredReplicaSetName = requiredReplicaSetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This controls if the driver should us an SSL connection. Defaults to |@literal false}.
|
||||||
|
*
|
||||||
|
* @param ssl
|
||||||
|
*/
|
||||||
|
public void setSsl(boolean ssl) {
|
||||||
|
this.ssl = ssl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the {@link SSLSocketFactory} to use for the {@literal SSL} connection. If none is configured here,
|
||||||
|
* {@link SSLSocketFactory#getDefault()} will be used.
|
||||||
|
*
|
||||||
|
* @param sslSocketFactory
|
||||||
|
*/
|
||||||
|
public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) {
|
||||||
|
this.sslSocketFactory = sslSocketFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected MongoClientOptions createInstance() throws Exception {
|
||||||
|
|
||||||
|
SocketFactory socketFactoryToUse = ssl ? (sslSocketFactory != null ? sslSocketFactory : SSLSocketFactory
|
||||||
|
.getDefault()) : this.socketFactory;
|
||||||
|
|
||||||
|
return MongoClientOptions.builder() //
|
||||||
|
.alwaysUseMBeans(this.alwaysUseMBeans) //
|
||||||
|
.connectionsPerHost(this.connectionsPerHost) //
|
||||||
|
.connectTimeout(connectTimeout) //
|
||||||
|
.cursorFinalizerEnabled(cursorFinalizerEnabled) //
|
||||||
|
.dbDecoderFactory(dbDecoderFactory) //
|
||||||
|
.dbEncoderFactory(dbEncoderFactory) //
|
||||||
|
.description(description) //
|
||||||
|
.heartbeatConnectTimeout(heartbeatConnectTimeout) //
|
||||||
|
.heartbeatFrequency(heartbeatFrequency) //
|
||||||
|
.heartbeatSocketTimeout(heartbeatSocketTimeout) //
|
||||||
|
.maxConnectionIdleTime(maxConnectionIdleTime) //
|
||||||
|
.maxConnectionLifeTime(maxConnectionLifeTime) //
|
||||||
|
.maxWaitTime(maxWaitTime) //
|
||||||
|
.minConnectionsPerHost(minConnectionsPerHost) //
|
||||||
|
.minHeartbeatFrequency(minHeartbeatFrequency) //
|
||||||
|
.readPreference(readPreference) //
|
||||||
|
.requiredReplicaSetName(requiredReplicaSetName) //
|
||||||
|
.socketFactory(socketFactoryToUse) //
|
||||||
|
.socketKeepAlive(socketKeepAlive) //
|
||||||
|
.socketTimeout(socketTimeout) //
|
||||||
|
.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier) //
|
||||||
|
.writeConcern(writeConcern).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
|
||||||
|
*/
|
||||||
|
public Class<?> getObjectType() {
|
||||||
|
return MongoClientOptions.class;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2013 the original author or authors.
|
* Copyright 2010-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -18,12 +18,13 @@ package org.springframework.data.mongodb.core;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.data.authentication.UserCredentials;
|
import org.springframework.data.authentication.UserCredentials;
|
||||||
import org.springframework.data.mongodb.CannotGetMongoDbConnectionException;
|
import org.springframework.data.mongodb.util.MongoClientVersion;
|
||||||
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import com.mongodb.DB;
|
import com.mongodb.DB;
|
||||||
import com.mongodb.Mongo;
|
import com.mongodb.Mongo;
|
||||||
|
import com.mongodb.MongoClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class featuring helper methods for internal MongoDb classes. Mainly intended for internal use within the
|
* Helper class featuring helper methods for internal MongoDb classes. Mainly intended for internal use within the
|
||||||
@@ -34,6 +35,7 @@ import com.mongodb.Mongo;
|
|||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Randy Watler
|
* @author Randy Watler
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
*/
|
*/
|
||||||
public abstract class MongoDbUtils {
|
public abstract class MongoDbUtils {
|
||||||
@@ -43,9 +45,7 @@ public abstract class MongoDbUtils {
|
|||||||
/**
|
/**
|
||||||
* Private constructor to prevent instantiation.
|
* Private constructor to prevent instantiation.
|
||||||
*/
|
*/
|
||||||
private MongoDbUtils() {
|
private MongoDbUtils() {}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtains a {@link DB} connection for the given {@link Mongo} instance and database name
|
* Obtains a {@link DB} connection for the given {@link Mongo} instance and database name
|
||||||
@@ -65,11 +65,24 @@ public abstract class MongoDbUtils {
|
|||||||
* @param databaseName the database name, must not be {@literal null} or empty.
|
* @param databaseName the database name, must not be {@literal null} or empty.
|
||||||
* @param credentials the credentials to use, must not be {@literal null}.
|
* @param credentials the credentials to use, must not be {@literal null}.
|
||||||
* @return the {@link DB} connection
|
* @return the {@link DB} connection
|
||||||
|
* @deprecated since 1.7. The {@link MongoClient} itself should hold credentials within
|
||||||
|
* {@link MongoClient#getCredentialsList()}.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static DB getDB(Mongo mongo, String databaseName, UserCredentials credentials) {
|
public static DB getDB(Mongo mongo, String databaseName, UserCredentials credentials) {
|
||||||
return getDB(mongo, databaseName, credentials, databaseName);
|
return getDB(mongo, databaseName, credentials, databaseName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mongo
|
||||||
|
* @param databaseName
|
||||||
|
* @param credentials
|
||||||
|
* @param authenticationDatabaseName
|
||||||
|
* @return
|
||||||
|
* @deprecated since 1.7. The {@link MongoClient} itself should hold credentials within
|
||||||
|
* {@link MongoClient#getCredentialsList()}.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public static DB getDB(Mongo mongo, String databaseName, UserCredentials credentials,
|
public static DB getDB(Mongo mongo, String databaseName, UserCredentials credentials,
|
||||||
String authenticationDatabaseName) {
|
String authenticationDatabaseName) {
|
||||||
|
|
||||||
@@ -109,22 +122,9 @@ public abstract class MongoDbUtils {
|
|||||||
LOGGER.debug("Getting Mongo Database name=[{}]", databaseName);
|
LOGGER.debug("Getting Mongo Database name=[{}]", databaseName);
|
||||||
|
|
||||||
DB db = mongo.getDB(databaseName);
|
DB db = mongo.getDB(databaseName);
|
||||||
boolean credentialsGiven = credentials.hasUsername() && credentials.hasPassword();
|
|
||||||
|
|
||||||
DB authDb = databaseName.equals(authenticationDatabaseName) ? db : mongo.getDB(authenticationDatabaseName);
|
if (!(mongo instanceof MongoClient) && requiresAuthDbAuthentication(credentials)) {
|
||||||
|
ReflectiveDbInvoker.authenticate(mongo, db, credentials, authenticationDatabaseName);
|
||||||
synchronized (authDb) {
|
|
||||||
|
|
||||||
if (credentialsGiven && !authDb.isAuthenticated()) {
|
|
||||||
|
|
||||||
String username = credentials.getUsername();
|
|
||||||
String password = credentials.hasPassword() ? credentials.getPassword() : null;
|
|
||||||
|
|
||||||
if (!authDb.authenticate(username, password == null ? null : password.toCharArray())) {
|
|
||||||
throw new CannotGetMongoDbConnectionException("Failed to authenticate to database [" + databaseName + "], "
|
|
||||||
+ credentials.toString(), databaseName, credentials);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TX sync active, bind new database to thread
|
// TX sync active, bind new database to thread
|
||||||
@@ -181,16 +181,36 @@ public abstract class MongoDbUtils {
|
|||||||
* Perform actual closing of the Mongo DB object, catching and logging any cleanup exceptions thrown.
|
* Perform actual closing of the Mongo DB object, catching and logging any cleanup exceptions thrown.
|
||||||
*
|
*
|
||||||
* @param db the DB to close (may be <code>null</code>)
|
* @param db the DB to close (may be <code>null</code>)
|
||||||
|
* @deprecated since 1.7. The main use case for this method is to ensure that applications can read their own
|
||||||
|
* unacknowledged writes, but this is no longer so prevalent since the MongoDB Java driver version 3
|
||||||
|
* started defaulting to acknowledged writes.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static void closeDB(DB db) {
|
public static void closeDB(DB db) {
|
||||||
|
|
||||||
if (db != null) {
|
if (db != null) {
|
||||||
LOGGER.debug("Closing Mongo DB object");
|
LOGGER.debug("Closing Mongo DB object");
|
||||||
try {
|
try {
|
||||||
db.requestDone();
|
ReflectiveDbInvoker.requestDone(db);
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
LOGGER.debug("Unexpected exception on closing Mongo DB object", ex);
|
LOGGER.debug("Unexpected exception on closing Mongo DB object", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if credentials present. In case we're using a mongo-java-driver version 3 or above we do not have the need
|
||||||
|
* for authentication as the auth data has to be provided within the MongoClient
|
||||||
|
*
|
||||||
|
* @param credentials
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static boolean requiresAuthDbAuthentication(UserCredentials credentials) {
|
||||||
|
|
||||||
|
if (credentials == null || !credentials.hasUsername()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !MongoClientVersion.isMongo3Driver();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2013 the original author or authors.
|
* Copyright 2010-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -15,19 +15,25 @@
|
|||||||
*/
|
*/
|
||||||
package org.springframework.data.mongodb.core;
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
import org.springframework.dao.DataAccessResourceFailureException;
|
import org.springframework.dao.DataAccessResourceFailureException;
|
||||||
|
import org.springframework.dao.DataIntegrityViolationException;
|
||||||
import org.springframework.dao.DuplicateKeyException;
|
import org.springframework.dao.DuplicateKeyException;
|
||||||
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||||
import org.springframework.dao.InvalidDataAccessResourceUsageException;
|
import org.springframework.dao.InvalidDataAccessResourceUsageException;
|
||||||
|
import org.springframework.dao.PermissionDeniedDataAccessException;
|
||||||
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||||
|
import org.springframework.data.mongodb.BulkOperationException;
|
||||||
import org.springframework.data.mongodb.UncategorizedMongoDbException;
|
import org.springframework.data.mongodb.UncategorizedMongoDbException;
|
||||||
|
import org.springframework.data.mongodb.util.MongoDbErrorCodes;
|
||||||
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
|
import com.mongodb.BulkWriteException;
|
||||||
import com.mongodb.MongoException;
|
import com.mongodb.MongoException;
|
||||||
import com.mongodb.MongoException.CursorNotFound;
|
|
||||||
import com.mongodb.MongoException.DuplicateKey;
|
|
||||||
import com.mongodb.MongoException.Network;
|
|
||||||
import com.mongodb.MongoInternalException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple {@link PersistenceExceptionTranslator} for Mongo. Convert the given runtime exception to an appropriate
|
* Simple {@link PersistenceExceptionTranslator} for Mongo. Convert the given runtime exception to an appropriate
|
||||||
@@ -36,9 +42,23 @@ import com.mongodb.MongoInternalException;
|
|||||||
*
|
*
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Michal Vich
|
* @author Michal Vich
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class MongoExceptionTranslator implements PersistenceExceptionTranslator {
|
public class MongoExceptionTranslator implements PersistenceExceptionTranslator {
|
||||||
|
|
||||||
|
private static final Set<String> DULICATE_KEY_EXCEPTIONS = new HashSet<String>(
|
||||||
|
Arrays.asList("MongoException.DuplicateKey", "DuplicateKeyException"));
|
||||||
|
|
||||||
|
private static final Set<String> RESOURCE_FAILURE_EXCEPTIONS = new HashSet<String>(
|
||||||
|
Arrays.asList("MongoException.Network", "MongoSocketException", "MongoException.CursorNotFound",
|
||||||
|
"MongoCursorNotFoundException", "MongoServerSelectionException", "MongoTimeoutException"));
|
||||||
|
|
||||||
|
private static final Set<String> RESOURCE_USAGE_EXCEPTIONS = new HashSet<String>(
|
||||||
|
Arrays.asList("MongoInternalException"));
|
||||||
|
|
||||||
|
private static final Set<String> DATA_INTEGRETY_EXCEPTIONS = new HashSet<String>(
|
||||||
|
Arrays.asList("WriteConcernException"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
|
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
|
||||||
@@ -47,38 +67,42 @@ public class MongoExceptionTranslator implements PersistenceExceptionTranslator
|
|||||||
|
|
||||||
// Check for well-known MongoException subclasses.
|
// Check for well-known MongoException subclasses.
|
||||||
|
|
||||||
// All other MongoExceptions
|
String exception = ClassUtils.getShortName(ClassUtils.getUserClass(ex.getClass()));
|
||||||
if (ex instanceof DuplicateKey) {
|
|
||||||
|
if (DULICATE_KEY_EXCEPTIONS.contains(exception)) {
|
||||||
return new DuplicateKeyException(ex.getMessage(), ex);
|
return new DuplicateKeyException(ex.getMessage(), ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ex instanceof Network) {
|
if (RESOURCE_FAILURE_EXCEPTIONS.contains(exception)) {
|
||||||
return new DataAccessResourceFailureException(ex.getMessage(), ex);
|
return new DataAccessResourceFailureException(ex.getMessage(), ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ex instanceof CursorNotFound) {
|
if (RESOURCE_USAGE_EXCEPTIONS.contains(exception)) {
|
||||||
return new DataAccessResourceFailureException(ex.getMessage(), ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Driver 2.12 throws this to indicate connection problems. String comparison to avoid hard dependency
|
|
||||||
if (ex.getClass().getName().equals("com.mongodb.MongoServerSelectionException")) {
|
|
||||||
return new DataAccessResourceFailureException(ex.getMessage(), ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ex instanceof MongoInternalException) {
|
|
||||||
return new InvalidDataAccessResourceUsageException(ex.getMessage(), ex);
|
return new InvalidDataAccessResourceUsageException(ex.getMessage(), ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DATA_INTEGRETY_EXCEPTIONS.contains(exception)) {
|
||||||
|
return new DataIntegrityViolationException(ex.getMessage(), ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ex instanceof BulkWriteException) {
|
||||||
|
return new BulkOperationException(ex.getMessage(), (BulkWriteException) ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// All other MongoExceptions
|
||||||
if (ex instanceof MongoException) {
|
if (ex instanceof MongoException) {
|
||||||
|
|
||||||
int code = ((MongoException) ex).getCode();
|
int code = ((MongoException) ex).getCode();
|
||||||
|
|
||||||
if (code == 11000 || code == 11001) {
|
if (MongoDbErrorCodes.isDuplicateKeyCode(code)) {
|
||||||
throw new DuplicateKeyException(ex.getMessage(), ex);
|
throw new DuplicateKeyException(ex.getMessage(), ex);
|
||||||
} else if (code == 12000 || code == 13440) {
|
} else if (MongoDbErrorCodes.isDataAccessResourceFailureCode(code)) {
|
||||||
throw new DataAccessResourceFailureException(ex.getMessage(), ex);
|
throw new DataAccessResourceFailureException(ex.getMessage(), ex);
|
||||||
} else if (code == 10003 || code == 12001 || code == 12010 || code == 12011 || code == 12012) {
|
} else if (MongoDbErrorCodes.isInvalidDataAccessApiUsageCode(code) || code == 10003 || code == 12001
|
||||||
|
|| code == 12010 || code == 12011 || code == 12012) {
|
||||||
throw new InvalidDataAccessApiUsageException(ex.getMessage(), ex);
|
throw new InvalidDataAccessApiUsageException(ex.getMessage(), ex);
|
||||||
|
} else if (MongoDbErrorCodes.isPermissionDeniedCode(code)) {
|
||||||
|
throw new PermissionDeniedDataAccessException(ex.getMessage(), ex);
|
||||||
}
|
}
|
||||||
return new UncategorizedMongoDbException(ex.getMessage(), ex);
|
return new UncategorizedMongoDbException(ex.getMessage(), ex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2013 the original author or authors.
|
* Copyright 2010-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -20,9 +20,7 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.beans.factory.config.AbstractFactoryBean;
|
||||||
import org.springframework.beans.factory.FactoryBean;
|
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
|
||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||||
import org.springframework.data.mongodb.CannotGetMongoDbConnectionException;
|
import org.springframework.data.mongodb.CannotGetMongoDbConnectionException;
|
||||||
@@ -40,12 +38,14 @@ import com.mongodb.WriteConcern;
|
|||||||
* @author Graeme Rocher
|
* @author Graeme Rocher
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
* @since 1.0
|
* @since 1.0
|
||||||
|
* @deprecated since 1.7. Please use {@link MongoClientFactoryBean} instead.
|
||||||
*/
|
*/
|
||||||
public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, DisposableBean,
|
@Deprecated
|
||||||
PersistenceExceptionTranslator {
|
public class MongoFactoryBean extends AbstractFactoryBean<Mongo> implements PersistenceExceptionTranslator {
|
||||||
|
|
||||||
private Mongo mongo;
|
private static final PersistenceExceptionTranslator DEFAULT_EXCEPTION_TRANSLATOR = new MongoExceptionTranslator();
|
||||||
|
|
||||||
private MongoOptions mongoOptions;
|
private MongoOptions mongoOptions;
|
||||||
private String host;
|
private String host;
|
||||||
@@ -53,9 +53,11 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
private WriteConcern writeConcern;
|
private WriteConcern writeConcern;
|
||||||
private List<ServerAddress> replicaSetSeeds;
|
private List<ServerAddress> replicaSetSeeds;
|
||||||
private List<ServerAddress> replicaPair;
|
private List<ServerAddress> replicaPair;
|
||||||
|
private PersistenceExceptionTranslator exceptionTranslator = DEFAULT_EXCEPTION_TRANSLATOR;
|
||||||
|
|
||||||
private PersistenceExceptionTranslator exceptionTranslator = new MongoExceptionTranslator();
|
/**
|
||||||
|
* @param mongoOptions
|
||||||
|
*/
|
||||||
public void setMongoOptions(MongoOptions mongoOptions) {
|
public void setMongoOptions(MongoOptions mongoOptions) {
|
||||||
this.mongoOptions = mongoOptions;
|
this.mongoOptions = mongoOptions;
|
||||||
}
|
}
|
||||||
@@ -66,7 +68,6 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated use {@link #setReplicaSetSeeds(ServerAddress[])} instead
|
* @deprecated use {@link #setReplicaSetSeeds(ServerAddress[])} instead
|
||||||
*
|
|
||||||
* @param replicaPair
|
* @param replicaPair
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@@ -75,30 +76,19 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param elements the elements to filter <T>
|
* Configures the host to connect to.
|
||||||
* @return a new unmodifiable {@link List#} from the given elements without nulls
|
*
|
||||||
|
* @param host
|
||||||
*/
|
*/
|
||||||
private <T> List<T> filterNonNullElementsAsList(T[] elements) {
|
|
||||||
|
|
||||||
if (elements == null) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<T> candidateElements = new ArrayList<T>();
|
|
||||||
|
|
||||||
for (T element : elements) {
|
|
||||||
if (element != null) {
|
|
||||||
candidateElements.add(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Collections.unmodifiableList(candidateElements);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHost(String host) {
|
public void setHost(String host) {
|
||||||
this.host = host;
|
this.host = host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the port to connect to.
|
||||||
|
*
|
||||||
|
* @param port
|
||||||
|
*/
|
||||||
public void setPort(int port) {
|
public void setPort(int port) {
|
||||||
this.port = port;
|
this.port = port;
|
||||||
}
|
}
|
||||||
@@ -112,12 +102,13 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
this.writeConcern = writeConcern;
|
this.writeConcern = writeConcern;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the {@link PersistenceExceptionTranslator} to use.
|
||||||
|
*
|
||||||
|
* @param exceptionTranslator can be {@literal null}.
|
||||||
|
*/
|
||||||
public void setExceptionTranslator(PersistenceExceptionTranslator exceptionTranslator) {
|
public void setExceptionTranslator(PersistenceExceptionTranslator exceptionTranslator) {
|
||||||
this.exceptionTranslator = exceptionTranslator;
|
this.exceptionTranslator = exceptionTranslator == null ? DEFAULT_EXCEPTION_TRANSLATOR : exceptionTranslator;
|
||||||
}
|
|
||||||
|
|
||||||
public Mongo getObject() throws Exception {
|
|
||||||
return mongo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -128,14 +119,6 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
return Mongo.class;
|
return Mongo.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
|
||||||
*/
|
|
||||||
public boolean isSingleton() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
|
* @see org.springframework.dao.support.PersistenceExceptionTranslator#translateExceptionIfPossible(java.lang.RuntimeException)
|
||||||
@@ -146,10 +129,10 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
protected Mongo createInstance() throws Exception {
|
||||||
|
|
||||||
Mongo mongo;
|
Mongo mongo;
|
||||||
ServerAddress defaultOptions = new ServerAddress();
|
ServerAddress defaultOptions = new ServerAddress();
|
||||||
@@ -175,18 +158,42 @@ public class MongoFactoryBean implements FactoryBean<Mongo>, InitializingBean, D
|
|||||||
mongo.setWriteConcern(writeConcern);
|
mongo.setWriteConcern(writeConcern);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mongo = mongo;
|
return mongo;
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isNullOrEmpty(Collection<?> elements) {
|
|
||||||
return elements == null || elements.isEmpty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.beans.factory.DisposableBean#destroy()
|
* @see org.springframework.beans.factory.config.AbstractFactoryBean#destroyInstance(java.lang.Object)
|
||||||
*/
|
*/
|
||||||
public void destroy() throws Exception {
|
@Override
|
||||||
this.mongo.close();
|
protected void destroyInstance(Mongo mongo) throws Exception {
|
||||||
|
mongo.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isNullOrEmpty(Collection<?> elements) {
|
||||||
|
return elements == null || elements.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given array as {@link List} with all {@literal null} elements removed.
|
||||||
|
*
|
||||||
|
* @param elements the elements to filter <T>
|
||||||
|
* @return a new unmodifiable {@link List#} from the given elements without nulls
|
||||||
|
*/
|
||||||
|
private static <T> List<T> filterNonNullElementsAsList(T[] elements) {
|
||||||
|
|
||||||
|
if (elements == null) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<T> candidateElements = new ArrayList<T>();
|
||||||
|
|
||||||
|
for (T element : elements) {
|
||||||
|
if (element != null) {
|
||||||
|
candidateElements.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Collections.unmodifiableList(candidateElements);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2014 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -19,11 +19,12 @@ import java.util.Collection;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.springframework.data.geo.GeoResults;
|
||||||
|
import org.springframework.data.mongodb.core.BulkOperations.BulkMode;
|
||||||
import org.springframework.data.mongodb.core.aggregation.Aggregation;
|
import org.springframework.data.mongodb.core.aggregation.Aggregation;
|
||||||
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
|
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
|
||||||
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
|
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
|
||||||
import org.springframework.data.mongodb.core.convert.MongoConverter;
|
import org.springframework.data.mongodb.core.convert.MongoConverter;
|
||||||
import org.springframework.data.mongodb.core.geo.GeoResults;
|
|
||||||
import org.springframework.data.mongodb.core.mapreduce.GroupBy;
|
import org.springframework.data.mongodb.core.mapreduce.GroupBy;
|
||||||
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
|
import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
|
||||||
import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
|
import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions;
|
||||||
@@ -33,17 +34,21 @@ import org.springframework.data.mongodb.core.query.Criteria;
|
|||||||
import org.springframework.data.mongodb.core.query.NearQuery;
|
import org.springframework.data.mongodb.core.query.NearQuery;
|
||||||
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.data.mongodb.core.query.Query;
|
||||||
import org.springframework.data.mongodb.core.query.Update;
|
import org.springframework.data.mongodb.core.query.Update;
|
||||||
|
import org.springframework.data.util.CloseableIterator;
|
||||||
|
|
||||||
import com.mongodb.CommandResult;
|
import com.mongodb.CommandResult;
|
||||||
|
import com.mongodb.Cursor;
|
||||||
|
import com.mongodb.DB;
|
||||||
import com.mongodb.DBCollection;
|
import com.mongodb.DBCollection;
|
||||||
import com.mongodb.DBObject;
|
import com.mongodb.DBObject;
|
||||||
|
import com.mongodb.ReadPreference;
|
||||||
import com.mongodb.WriteResult;
|
import com.mongodb.WriteResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface that specifies a basic set of MongoDB operations. Implemented by {@link MongoTemplate}. Not often used but
|
* Interface that specifies a basic set of MongoDB operations. Implemented by {@link MongoTemplate}. Not often used but
|
||||||
* a useful option for extensibility and testability (as it can be easily mocked, stubbed, or be the target of a JDK
|
* a useful option for extensibility and testability (as it can be easily mocked, stubbed, or be the target of a JDK
|
||||||
* proxy).
|
* proxy).
|
||||||
*
|
*
|
||||||
* @author Thomas Risberg
|
* @author Thomas Risberg
|
||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
@@ -52,12 +57,11 @@ import com.mongodb.WriteResult;
|
|||||||
* @author Christoph Strobl
|
* @author Christoph Strobl
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public interface MongoOperations {
|
public interface MongoOperations {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The collection name used for the specified class by this template.
|
* The collection name used for the specified class by this template.
|
||||||
*
|
*
|
||||||
* @param entityClass must not be {@literal null}.
|
* @param entityClass must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -67,7 +71,7 @@ public interface MongoOperations {
|
|||||||
* Execute the a MongoDB command expressed as a JSON string. This will call the method JSON.parse that is part of the
|
* Execute the a MongoDB command expressed as a JSON string. This will call the method JSON.parse that is part of the
|
||||||
* MongoDB driver to convert the JSON string to a DBObject. Any errors that result from executing this command will be
|
* MongoDB driver to convert the JSON string to a DBObject. Any errors that result from executing this command will be
|
||||||
* converted into Spring's DAO exception hierarchy.
|
* converted into Spring's DAO exception hierarchy.
|
||||||
*
|
*
|
||||||
* @param jsonCommand a MongoDB command expressed as a JSON string.
|
* @param jsonCommand a MongoDB command expressed as a JSON string.
|
||||||
*/
|
*/
|
||||||
CommandResult executeCommand(String jsonCommand);
|
CommandResult executeCommand(String jsonCommand);
|
||||||
@@ -75,7 +79,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Execute a MongoDB command. Any errors that result from executing this command will be converted into Spring's DAO
|
* Execute a MongoDB command. Any errors that result from executing this command will be converted into Spring's DAO
|
||||||
* exception hierarchy.
|
* exception hierarchy.
|
||||||
*
|
*
|
||||||
* @param command a MongoDB command
|
* @param command a MongoDB command
|
||||||
*/
|
*/
|
||||||
CommandResult executeCommand(DBObject command);
|
CommandResult executeCommand(DBObject command);
|
||||||
@@ -83,15 +87,29 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Execute a MongoDB command. Any errors that result from executing this command will be converted into Spring's DAO
|
* Execute a MongoDB command. Any errors that result from executing this command will be converted into Spring's DAO
|
||||||
* exception hierarchy.
|
* exception hierarchy.
|
||||||
*
|
*
|
||||||
* @param command a MongoDB command
|
* @param command a MongoDB command
|
||||||
* @param options query options to use
|
* @param options query options to use
|
||||||
|
* @deprecated since 1.7. Please use {@link #executeCommand(DBObject, ReadPreference)}, as the MongoDB Java driver
|
||||||
|
* version 3 no longer supports this operation.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
CommandResult executeCommand(DBObject command, int options);
|
CommandResult executeCommand(DBObject command, int options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute a MongoDB command. Any errors that result from executing this command will be converted into Spring's data
|
||||||
|
* access exception hierarchy.
|
||||||
|
*
|
||||||
|
* @param command a MongoDB command, must not be {@literal null}.
|
||||||
|
* @param readPreference read preferences to use, can be {@literal null}.
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
CommandResult executeCommand(DBObject command, ReadPreference readPreference);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a MongoDB query and iterate over the query results on a per-document basis with a DocumentCallbackHandler.
|
* Execute a MongoDB query and iterate over the query results on a per-document basis with a DocumentCallbackHandler.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param collectionName name of the collection to retrieve the objects from
|
* @param collectionName name of the collection to retrieve the objects from
|
||||||
@@ -103,7 +121,7 @@ public interface MongoOperations {
|
|||||||
* Executes a {@link DbCallback} translating any exceptions as necessary.
|
* Executes a {@link DbCallback} translating any exceptions as necessary.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
||||||
*
|
*
|
||||||
* @param <T> return type
|
* @param <T> return type
|
||||||
* @param action callback object that specifies the MongoDB actions to perform on the passed in DB instance.
|
* @param action callback object that specifies the MongoDB actions to perform on the passed in DB instance.
|
||||||
* @return a result object returned by the action or <tt>null</tt>
|
* @return a result object returned by the action or <tt>null</tt>
|
||||||
@@ -114,7 +132,7 @@ public interface MongoOperations {
|
|||||||
* Executes the given {@link CollectionCallback} on the entity collection of the specified class.
|
* Executes the given {@link CollectionCallback} on the entity collection of the specified class.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
||||||
*
|
*
|
||||||
* @param entityClass class that determines the collection to use
|
* @param entityClass class that determines the collection to use
|
||||||
* @param <T> return type
|
* @param <T> return type
|
||||||
* @param action callback object that specifies the MongoDB action
|
* @param action callback object that specifies the MongoDB action
|
||||||
@@ -126,7 +144,7 @@ public interface MongoOperations {
|
|||||||
* Executes the given {@link CollectionCallback} on the collection of the given name.
|
* Executes the given {@link CollectionCallback} on the collection of the given name.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
||||||
*
|
*
|
||||||
* @param <T> return type
|
* @param <T> return type
|
||||||
* @param collectionName the name of the collection that specifies which DBCollection instance will be passed into
|
* @param collectionName the name of the collection that specifies which DBCollection instance will be passed into
|
||||||
* @param action callback object that specifies the MongoDB action the callback action.
|
* @param action callback object that specifies the MongoDB action the callback action.
|
||||||
@@ -140,24 +158,41 @@ public interface MongoOperations {
|
|||||||
* href=http://www.mongodb.org/display/DOCS/Java+Driver+Concurrency>Java Driver Concurrency</a>}
|
* href=http://www.mongodb.org/display/DOCS/Java+Driver+Concurrency>Java Driver Concurrency</a>}
|
||||||
* <p/>
|
* <p/>
|
||||||
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
* Allows for returning a result object, that is a domain object or a collection of domain objects.
|
||||||
*
|
*
|
||||||
* @param <T> return type
|
* @param <T> return type
|
||||||
* @param action callback that specified the MongoDB actions to perform on the DB instance
|
* @param action callback that specified the MongoDB actions to perform on the DB instance
|
||||||
* @return a result object returned by the action or <tt>null</tt>
|
* @return a result object returned by the action or <tt>null</tt>
|
||||||
|
* @deprecated since 1.7 as the MongoDB Java driver version 3 does not longer support request boundaries via
|
||||||
|
* {@link DB#requestStart()} and {@link DB#requestDone()}.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
<T> T executeInSession(DbCallback<T> action);
|
<T> T executeInSession(DbCallback<T> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the given {@link Query} on the entity collection of the specified {@code entityType} backed by a Mongo DB
|
||||||
|
* {@link Cursor}.
|
||||||
|
* <p>
|
||||||
|
* Returns a {@link CloseableIterator} that wraps the a Mongo DB {@link Cursor} that needs to be closed.
|
||||||
|
*
|
||||||
|
* @param <T> element return type
|
||||||
|
* @param query
|
||||||
|
* @param entityType
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
<T> CloseableIterator<T> stream(Query query, Class<T> entityType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an uncapped collection with a name based on the provided entity class.
|
* Create an uncapped collection with a name based on the provided entity class.
|
||||||
*
|
*
|
||||||
* @param entityClass class that determines the collection to create
|
* @param entityClass class that determines the collection to create
|
||||||
* @return the created collection
|
* @return the created collection
|
||||||
*/
|
*/
|
||||||
<T> DBCollection createCollection(Class<T> entityClass);
|
<T> DBCollection createCollection(Class<T> entityClass);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a collect with a name based on the provided entity class using the options.
|
* Create a collection with a name based on the provided entity class using the options.
|
||||||
*
|
*
|
||||||
* @param entityClass class that determines the collection to create
|
* @param entityClass class that determines the collection to create
|
||||||
* @param collectionOptions options to use when creating the collection.
|
* @param collectionOptions options to use when creating the collection.
|
||||||
* @return the created collection
|
* @return the created collection
|
||||||
@@ -166,15 +201,15 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an uncapped collection with the provided name.
|
* Create an uncapped collection with the provided name.
|
||||||
*
|
*
|
||||||
* @param collectionName name of the collection
|
* @param collectionName name of the collection
|
||||||
* @return the created collection
|
* @return the created collection
|
||||||
*/
|
*/
|
||||||
DBCollection createCollection(String collectionName);
|
DBCollection createCollection(String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a collect with the provided name and options.
|
* Create a collection with the provided name and options.
|
||||||
*
|
*
|
||||||
* @param collectionName name of the collection
|
* @param collectionName name of the collection
|
||||||
* @param collectionOptions options to use when creating the collection.
|
* @param collectionOptions options to use when creating the collection.
|
||||||
* @return the created collection
|
* @return the created collection
|
||||||
@@ -183,7 +218,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A set of collection names.
|
* A set of collection names.
|
||||||
*
|
*
|
||||||
* @return list of collection names
|
* @return list of collection names
|
||||||
*/
|
*/
|
||||||
Set<String> getCollectionNames();
|
Set<String> getCollectionNames();
|
||||||
@@ -192,7 +227,7 @@ public interface MongoOperations {
|
|||||||
* Get a collection by name, creating it if it doesn't exist.
|
* Get a collection by name, creating it if it doesn't exist.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Translate any exceptions as necessary.
|
* Translate any exceptions as necessary.
|
||||||
*
|
*
|
||||||
* @param collectionName name of the collection
|
* @param collectionName name of the collection
|
||||||
* @return an existing collection or a newly created one.
|
* @return an existing collection or a newly created one.
|
||||||
*/
|
*/
|
||||||
@@ -202,7 +237,7 @@ public interface MongoOperations {
|
|||||||
* Check to see if a collection with a name indicated by the entity class exists.
|
* Check to see if a collection with a name indicated by the entity class exists.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Translate any exceptions as necessary.
|
* Translate any exceptions as necessary.
|
||||||
*
|
*
|
||||||
* @param entityClass class that determines the name of the collection
|
* @param entityClass class that determines the name of the collection
|
||||||
* @return true if a collection with the given name is found, false otherwise.
|
* @return true if a collection with the given name is found, false otherwise.
|
||||||
*/
|
*/
|
||||||
@@ -212,7 +247,7 @@ public interface MongoOperations {
|
|||||||
* Check to see if a collection with a given name exists.
|
* Check to see if a collection with a given name exists.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Translate any exceptions as necessary.
|
* Translate any exceptions as necessary.
|
||||||
*
|
*
|
||||||
* @param collectionName name of the collection
|
* @param collectionName name of the collection
|
||||||
* @return true if a collection with the given name is found, false otherwise.
|
* @return true if a collection with the given name is found, false otherwise.
|
||||||
*/
|
*/
|
||||||
@@ -222,7 +257,7 @@ public interface MongoOperations {
|
|||||||
* Drop the collection with the name indicated by the entity class.
|
* Drop the collection with the name indicated by the entity class.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Translate any exceptions as necessary.
|
* Translate any exceptions as necessary.
|
||||||
*
|
*
|
||||||
* @param entityClass class that determines the collection to drop/delete.
|
* @param entityClass class that determines the collection to drop/delete.
|
||||||
*/
|
*/
|
||||||
<T> void dropCollection(Class<T> entityClass);
|
<T> void dropCollection(Class<T> entityClass);
|
||||||
@@ -231,25 +266,64 @@ public interface MongoOperations {
|
|||||||
* Drop the collection with the given name.
|
* Drop the collection with the given name.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Translate any exceptions as necessary.
|
* Translate any exceptions as necessary.
|
||||||
*
|
*
|
||||||
* @param collectionName name of the collection to drop/delete.
|
* @param collectionName name of the collection to drop/delete.
|
||||||
*/
|
*/
|
||||||
void dropCollection(String collectionName);
|
void dropCollection(String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the operations that can be performed on indexes
|
* Returns the operations that can be performed on indexes
|
||||||
*
|
*
|
||||||
* @return index operations on the named collection
|
* @return index operations on the named collection
|
||||||
*/
|
*/
|
||||||
IndexOperations indexOps(String collectionName);
|
IndexOperations indexOps(String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the operations that can be performed on indexes
|
* Returns the operations that can be performed on indexes
|
||||||
*
|
*
|
||||||
* @return index operations on the named collection associated with the given entity class
|
* @return index operations on the named collection associated with the given entity class
|
||||||
*/
|
*/
|
||||||
IndexOperations indexOps(Class<?> entityClass);
|
IndexOperations indexOps(Class<?> entityClass);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link ScriptOperations} that can be performed on {@link com.mongodb.DB} level.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
ScriptOperations scriptOps();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link BulkOperations} for the given collection. <br />
|
||||||
|
* <strong>NOTE:</strong> Any additional support for field mapping, etc. is not available for {@literal update} or
|
||||||
|
* {@literal remove} operations in bulk mode due to the lack of domain type information. Use
|
||||||
|
* {@link #bulkOps(BulkMode, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
|
* @param mode the {@link BulkMode} to use for bulk operations, must not be {@literal null}.
|
||||||
|
* @param collectionName the name of the collection to work on, must not be {@literal null} or empty.
|
||||||
|
* @return {@link BulkOperations} on the named collection
|
||||||
|
*/
|
||||||
|
BulkOperations bulkOps(BulkMode mode, String collectionName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link BulkOperations} for the given entity type.
|
||||||
|
*
|
||||||
|
* @param mode the {@link BulkMode} to use for bulk operations, must not be {@literal null}.
|
||||||
|
* @param entityType the name of the entity class, must not be {@literal null}.
|
||||||
|
* @return {@link BulkOperations} on the named collection associated of the given entity class.
|
||||||
|
*/
|
||||||
|
BulkOperations bulkOps(BulkMode mode, Class<?> entityType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link BulkOperations} for the given entity type and collection name.
|
||||||
|
*
|
||||||
|
* @param mode the {@link BulkMode} to use for bulk operations, must not be {@literal null}.
|
||||||
|
* @param entityClass the name of the entity class, must not be {@literal null}.
|
||||||
|
* @param collectionName the name of the collection to work on, must not be {@literal null} or empty.
|
||||||
|
* @return {@link BulkOperations} on the named collection associated with the given entity class.
|
||||||
|
*/
|
||||||
|
BulkOperations bulkOps(BulkMode mode, Class<?> entityType, String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query for a list of objects of type T from the collection used by the entity class.
|
* Query for a list of objects of type T from the collection used by the entity class.
|
||||||
* <p/>
|
* <p/>
|
||||||
@@ -258,7 +332,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
|
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
|
||||||
* to map objects since the test for class type is done in the client and not on the server.
|
* to map objects since the test for class type is done in the client and not on the server.
|
||||||
*
|
*
|
||||||
* @param entityClass the parameterized type of the returned list
|
* @param entityClass the parameterized type of the returned list
|
||||||
* @return the converted collection
|
* @return the converted collection
|
||||||
*/
|
*/
|
||||||
@@ -272,7 +346,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
|
* If your collection does not contain a homogeneous collection of types, this operation will not be an efficient way
|
||||||
* to map objects since the test for class type is done in the client and not on the server.
|
* to map objects since the test for class type is done in the client and not on the server.
|
||||||
*
|
*
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
* @param collectionName name of the collection to retrieve the objects from
|
* @param collectionName name of the collection to retrieve the objects from
|
||||||
* @return the converted collection
|
* @return the converted collection
|
||||||
@@ -282,7 +356,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Execute a group operation over the entire collection. The group operation entity class should match the 'shape' of
|
* Execute a group operation over the entire collection. The group operation entity class should match the 'shape' of
|
||||||
* the returned object that takes int account the initial document structure as well as any finalize functions.
|
* the returned object that takes int account the initial document structure as well as any finalize functions.
|
||||||
*
|
*
|
||||||
* @param criteria The criteria that restricts the row that are considered for grouping. If not specified all rows are
|
* @param criteria The criteria that restricts the row that are considered for grouping. If not specified all rows are
|
||||||
* considered.
|
* considered.
|
||||||
* @param inputCollectionName the collection where the group operation will read from
|
* @param inputCollectionName the collection where the group operation will read from
|
||||||
@@ -297,7 +371,7 @@ public interface MongoOperations {
|
|||||||
* Execute a group operation restricting the rows to those which match the provided Criteria. The group operation
|
* Execute a group operation restricting the rows to those which match the provided Criteria. The group operation
|
||||||
* entity class should match the 'shape' of the returned object that takes int account the initial document structure
|
* entity class should match the 'shape' of the returned object that takes int account the initial document structure
|
||||||
* as well as any finalize functions.
|
* as well as any finalize functions.
|
||||||
*
|
*
|
||||||
* @param criteria The criteria that restricts the row that are considered for grouping. If not specified all rows are
|
* @param criteria The criteria that restricts the row that are considered for grouping. If not specified all rows are
|
||||||
* considered.
|
* considered.
|
||||||
* @param inputCollectionName the collection where the group operation will read from
|
* @param inputCollectionName the collection where the group operation will read from
|
||||||
@@ -311,7 +385,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Execute an aggregation operation. The raw results will be mapped to the given entity class. The name of the
|
* Execute an aggregation operation. The raw results will be mapped to the given entity class. The name of the
|
||||||
* inputCollection is derived from the inputType of the aggregation.
|
* inputCollection is derived from the inputType of the aggregation.
|
||||||
*
|
*
|
||||||
* @param aggregation The {@link TypedAggregation} specification holding the aggregation operations, must not be
|
* @param aggregation The {@link TypedAggregation} specification holding the aggregation operations, must not be
|
||||||
* {@literal null}.
|
* {@literal null}.
|
||||||
* @param collectionName The name of the input collection to use for the aggreation.
|
* @param collectionName The name of the input collection to use for the aggreation.
|
||||||
@@ -324,7 +398,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Execute an aggregation operation. The raw results will be mapped to the given entity class. The name of the
|
* Execute an aggregation operation. The raw results will be mapped to the given entity class. The name of the
|
||||||
* inputCollection is derived from the inputType of the aggregation.
|
* inputCollection is derived from the inputType of the aggregation.
|
||||||
*
|
*
|
||||||
* @param aggregation The {@link TypedAggregation} specification holding the aggregation operations, must not be
|
* @param aggregation The {@link TypedAggregation} specification holding the aggregation operations, must not be
|
||||||
* {@literal null}.
|
* {@literal null}.
|
||||||
* @param outputType The parameterized type of the returned list, must not be {@literal null}.
|
* @param outputType The parameterized type of the returned list, must not be {@literal null}.
|
||||||
@@ -335,7 +409,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute an aggregation operation. The raw results will be mapped to the given entity class.
|
* Execute an aggregation operation. The raw results will be mapped to the given entity class.
|
||||||
*
|
*
|
||||||
* @param aggregation The {@link Aggregation} specification holding the aggregation operations, must not be
|
* @param aggregation The {@link Aggregation} specification holding the aggregation operations, must not be
|
||||||
* {@literal null}.
|
* {@literal null}.
|
||||||
* @param inputType the inputType where the aggregation operation will read from, must not be {@literal null} or
|
* @param inputType the inputType where the aggregation operation will read from, must not be {@literal null} or
|
||||||
@@ -348,7 +422,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute an aggregation operation. The raw results will be mapped to the given entity class.
|
* Execute an aggregation operation. The raw results will be mapped to the given entity class.
|
||||||
*
|
*
|
||||||
* @param aggregation The {@link Aggregation} specification holding the aggregation operations, must not be
|
* @param aggregation The {@link Aggregation} specification holding the aggregation operations, must not be
|
||||||
* {@literal null}.
|
* {@literal null}.
|
||||||
* @param collectionName the collection where the aggregation operation will read from, must not be {@literal null} or
|
* @param collectionName the collection where the aggregation operation will read from, must not be {@literal null} or
|
||||||
@@ -361,7 +435,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a map-reduce operation. The map-reduce operation will be formed with an output type of INLINE
|
* Execute a map-reduce operation. The map-reduce operation will be formed with an output type of INLINE
|
||||||
*
|
*
|
||||||
* @param inputCollectionName the collection where the map-reduce will read from
|
* @param inputCollectionName the collection where the map-reduce will read from
|
||||||
* @param mapFunction The JavaScript map function
|
* @param mapFunction The JavaScript map function
|
||||||
* @param reduceFunction The JavaScript reduce function
|
* @param reduceFunction The JavaScript reduce function
|
||||||
@@ -374,7 +448,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a map-reduce operation that takes additional map-reduce options.
|
* Execute a map-reduce operation that takes additional map-reduce options.
|
||||||
*
|
*
|
||||||
* @param inputCollectionName the collection where the map-reduce will read from
|
* @param inputCollectionName the collection where the map-reduce will read from
|
||||||
* @param mapFunction The JavaScript map function
|
* @param mapFunction The JavaScript map function
|
||||||
* @param reduceFunction The JavaScript reduce function
|
* @param reduceFunction The JavaScript reduce function
|
||||||
@@ -388,7 +462,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Execute a map-reduce operation that takes a query. The map-reduce operation will be formed with an output type of
|
* Execute a map-reduce operation that takes a query. The map-reduce operation will be formed with an output type of
|
||||||
* INLINE
|
* INLINE
|
||||||
*
|
*
|
||||||
* @param query The query to use to select the data for the map phase
|
* @param query The query to use to select the data for the map phase
|
||||||
* @param inputCollectionName the collection where the map-reduce will read from
|
* @param inputCollectionName the collection where the map-reduce will read from
|
||||||
* @param mapFunction The JavaScript map function
|
* @param mapFunction The JavaScript map function
|
||||||
@@ -402,7 +476,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a map-reduce operation that takes a query and additional map-reduce options
|
* Execute a map-reduce operation that takes a query and additional map-reduce options
|
||||||
*
|
*
|
||||||
* @param query The query to use to select the data for the map phase
|
* @param query The query to use to select the data for the map phase
|
||||||
* @param inputCollectionName the collection where the map-reduce will read from
|
* @param inputCollectionName the collection where the map-reduce will read from
|
||||||
* @param mapFunction The JavaScript map function
|
* @param mapFunction The JavaScript map function
|
||||||
@@ -416,8 +490,10 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@link GeoResults} for all entities matching the given {@link NearQuery}. Will consider entity mapping
|
* Returns {@link GeoResults} for all entities matching the given {@link NearQuery}. Will consider entity mapping
|
||||||
* information to determine the collection the query is ran against.
|
* information to determine the collection the query is ran against. Note, that MongoDB limits the number of results
|
||||||
*
|
* by default. Make sure to add an explicit limit to the {@link NearQuery} if you expect a particular number of
|
||||||
|
* results.
|
||||||
|
*
|
||||||
* @param near must not be {@literal null}.
|
* @param near must not be {@literal null}.
|
||||||
* @param entityClass must not be {@literal null}.
|
* @param entityClass must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
@@ -425,8 +501,10 @@ public interface MongoOperations {
|
|||||||
<T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass);
|
<T> GeoResults<T> geoNear(NearQuery near, Class<T> entityClass);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns {@link GeoResults} for all entities matching the given {@link NearQuery}.
|
* Returns {@link GeoResults} for all entities matching the given {@link NearQuery}. Note, that MongoDB limits the
|
||||||
*
|
* number of results by default. Make sure to add an explicit limit to the {@link NearQuery} if you expect a
|
||||||
|
* particular number of results.
|
||||||
|
*
|
||||||
* @param near must not be {@literal null}.
|
* @param near must not be {@literal null}.
|
||||||
* @param entityClass must not be {@literal null}.
|
* @param entityClass must not be {@literal null}.
|
||||||
* @param collectionName the collection to trigger the query against. If no collection name is given the entity class
|
* @param collectionName the collection to trigger the query against. If no collection name is given the entity class
|
||||||
@@ -444,7 +522,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
||||||
* feature rich {@link Query}.
|
* feature rich {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
@@ -461,7 +539,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
||||||
* feature rich {@link Query}.
|
* feature rich {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
@@ -471,8 +549,10 @@ public interface MongoOperations {
|
|||||||
<T> T findOne(Query query, Class<T> entityClass, String collectionName);
|
<T> T findOne(Query query, Class<T> entityClass, String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine result of given {@link Query} contains at least one element.
|
* Determine result of given {@link Query} contains at least one element. <br />
|
||||||
*
|
* <strong>NOTE:</strong> Any additional support for query/field mapping, etc. is not available due to the lack of
|
||||||
|
* domain type information. Use {@link #exists(Query, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
* @param query the {@link Query} class that specifies the criteria used to find a record.
|
* @param query the {@link Query} class that specifies the criteria used to find a record.
|
||||||
* @param collectionName name of the collection to check for objects.
|
* @param collectionName name of the collection to check for objects.
|
||||||
* @return
|
* @return
|
||||||
@@ -481,7 +561,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine result of given {@link Query} contains at least one element.
|
* Determine result of given {@link Query} contains at least one element.
|
||||||
*
|
*
|
||||||
* @param query the {@link Query} class that specifies the criteria used to find a record.
|
* @param query the {@link Query} class that specifies the criteria used to find a record.
|
||||||
* @param entityClass the parameterized type.
|
* @param entityClass the parameterized type.
|
||||||
* @return
|
* @return
|
||||||
@@ -490,7 +570,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine result of given {@link Query} contains at least one element.
|
* Determine result of given {@link Query} contains at least one element.
|
||||||
*
|
*
|
||||||
* @param query the {@link Query} class that specifies the criteria used to find a record.
|
* @param query the {@link Query} class that specifies the criteria used to find a record.
|
||||||
* @param entityClass the parameterized type.
|
* @param entityClass the parameterized type.
|
||||||
* @param collectionName name of the collection to check for objects.
|
* @param collectionName name of the collection to check for objects.
|
||||||
@@ -506,7 +586,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
||||||
* feature rich {@link Query}.
|
* feature rich {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
@@ -522,7 +602,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
||||||
* feature rich {@link Query}.
|
* feature rich {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
@@ -534,7 +614,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Returns a document with the given id mapped onto the given class. The collection the query is ran against will be
|
* Returns a document with the given id mapped onto the given class. The collection the query is ran against will be
|
||||||
* derived from the given target class as well.
|
* derived from the given target class as well.
|
||||||
*
|
*
|
||||||
* @param <T>
|
* @param <T>
|
||||||
* @param id the id of the document to return.
|
* @param id the id of the document to return.
|
||||||
* @param entityClass the type the document shall be converted into.
|
* @param entityClass the type the document shall be converted into.
|
||||||
@@ -544,7 +624,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the document with the given id from the given collection mapped onto the given target class.
|
* Returns the document with the given id from the given collection mapped onto the given target class.
|
||||||
*
|
*
|
||||||
* @param id the id of the document to return
|
* @param id the id of the document to return
|
||||||
* @param entityClass the type to convert the document to
|
* @param entityClass the type to convert the document to
|
||||||
* @param collectionName the collection to query for the document
|
* @param collectionName the collection to query for the document
|
||||||
@@ -554,9 +634,9 @@ public interface MongoOperations {
|
|||||||
<T> T findById(Object id, Class<T> entityClass, String collectionName);
|
<T> T findById(Object id, Class<T> entityClass, String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify<a/>
|
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify
|
||||||
* to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query}.
|
* <a/> to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
||||||
* fields specification.
|
* fields specification.
|
||||||
* @param update the {@link Update} to apply on matching documents.
|
* @param update the {@link Update} to apply on matching documents.
|
||||||
@@ -566,9 +646,9 @@ public interface MongoOperations {
|
|||||||
<T> T findAndModify(Query query, Update update, Class<T> entityClass);
|
<T> T findAndModify(Query query, Update update, Class<T> entityClass);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify<a/>
|
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify
|
||||||
* to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query}.
|
* <a/> to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
||||||
* fields specification.
|
* fields specification.
|
||||||
* @param update the {@link Update} to apply on matching documents.
|
* @param update the {@link Update} to apply on matching documents.
|
||||||
@@ -579,10 +659,10 @@ public interface MongoOperations {
|
|||||||
<T> T findAndModify(Query query, Update update, Class<T> entityClass, String collectionName);
|
<T> T findAndModify(Query query, Update update, Class<T> entityClass, String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify<a/>
|
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify
|
||||||
* to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query} taking
|
* <a/> to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query} taking
|
||||||
* {@link FindAndModifyOptions} into account.
|
* {@link FindAndModifyOptions} into account.
|
||||||
*
|
*
|
||||||
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
||||||
* fields specification.
|
* fields specification.
|
||||||
* @param update the {@link Update} to apply on matching documents.
|
* @param update the {@link Update} to apply on matching documents.
|
||||||
@@ -593,10 +673,10 @@ public interface MongoOperations {
|
|||||||
<T> T findAndModify(Query query, Update update, FindAndModifyOptions options, Class<T> entityClass);
|
<T> T findAndModify(Query query, Update update, FindAndModifyOptions options, Class<T> entityClass);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify<a/>
|
* Triggers <a href="http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/">findAndModify
|
||||||
* to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query} taking
|
* <a/> to apply provided {@link Update} on documents matching {@link Criteria} of given {@link Query} taking
|
||||||
* {@link FindAndModifyOptions} into account.
|
* {@link FindAndModifyOptions} into account.
|
||||||
*
|
*
|
||||||
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
* @param query the {@link Query} class that specifies the {@link Criteria} used to find a record and also an optional
|
||||||
* fields specification.
|
* fields specification.
|
||||||
* @param update the {@link Update} to apply on matching documents.
|
* @param update the {@link Update} to apply on matching documents.
|
||||||
@@ -617,7 +697,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
||||||
* feature rich {@link Query}.
|
* feature rich {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
@@ -634,7 +714,7 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
* The query is specified as a {@link Query} which can be created either using the {@link BasicQuery} or the more
|
||||||
* feature rich {@link Query}.
|
* feature rich {@link Query}.
|
||||||
*
|
*
|
||||||
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
* @param query the query class that specifies the criteria used to find a record and also an optional fields
|
||||||
* specification
|
* specification
|
||||||
* @param entityClass the parameterized type of the returned list.
|
* @param entityClass the parameterized type of the returned list.
|
||||||
@@ -645,7 +725,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of documents for the given {@link Query} by querying the collection of the given entity class.
|
* Returns the number of documents for the given {@link Query} by querying the collection of the given entity class.
|
||||||
*
|
*
|
||||||
* @param query
|
* @param query
|
||||||
* @param entityClass must not be {@literal null}.
|
* @param entityClass must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
@@ -653,14 +733,28 @@ public interface MongoOperations {
|
|||||||
long count(Query query, Class<?> entityClass);
|
long count(Query query, Class<?> entityClass);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of documents for the given {@link Query} querying the given collection.
|
* Returns the number of documents for the given {@link Query} querying the given collection. The given {@link Query}
|
||||||
*
|
* must solely consist of document field references as we lack type information to map potential property references
|
||||||
|
* onto document fields. Use {@link #count(Query, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
* @param query
|
* @param query
|
||||||
* @param collectionName must not be {@literal null} or empty.
|
* @param collectionName must not be {@literal null} or empty.
|
||||||
* @return
|
* @return
|
||||||
|
* @see #count(Query, Class, String)
|
||||||
*/
|
*/
|
||||||
long count(Query query, String collectionName);
|
long count(Query query, String collectionName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of documents for the given {@link Query} by querying the given collection using the given entity
|
||||||
|
* class to map the given {@link Query}.
|
||||||
|
*
|
||||||
|
* @param query
|
||||||
|
* @param entityClass must not be {@literal null}.
|
||||||
|
* @param collectionName must not be {@literal null} or empty.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
long count(Query query, Class<?> entityClass, String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert the object into the collection for the entity type of the object to save.
|
* Insert the object into the collection for the entity type of the object to save.
|
||||||
* <p/>
|
* <p/>
|
||||||
@@ -668,13 +762,13 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* If you object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
|
* If you object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
|
||||||
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
|
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
|
||||||
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See <a
|
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
|
||||||
* href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert"
|
* <a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert" >
|
||||||
* >Spring's Type Conversion"</a> for more details.
|
* Spring's Type Conversion"</a> for more details.
|
||||||
* <p/>
|
* <p/>
|
||||||
* <p/>
|
* <p/>
|
||||||
* Insert is used to initially store the object into the database. To update an existing object use the save method.
|
* Insert is used to initially store the object into the database. To update an existing object use the save method.
|
||||||
*
|
*
|
||||||
* @param objectToSave the object to store in the collection.
|
* @param objectToSave the object to store in the collection.
|
||||||
*/
|
*/
|
||||||
void insert(Object objectToSave);
|
void insert(Object objectToSave);
|
||||||
@@ -686,7 +780,7 @@ public interface MongoOperations {
|
|||||||
* configured otherwise, an instance of MappingMongoConverter will be used.
|
* configured otherwise, an instance of MappingMongoConverter will be used.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Insert is used to initially store the object into the database. To update an existing object use the save method.
|
* Insert is used to initially store the object into the database. To update an existing object use the save method.
|
||||||
*
|
*
|
||||||
* @param objectToSave the object to store in the collection
|
* @param objectToSave the object to store in the collection
|
||||||
* @param collectionName name of the collection to store the object in
|
* @param collectionName name of the collection to store the object in
|
||||||
*/
|
*/
|
||||||
@@ -694,7 +788,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert a Collection of objects into a collection in a single batch write to the database.
|
* Insert a Collection of objects into a collection in a single batch write to the database.
|
||||||
*
|
*
|
||||||
* @param batchToSave the list of objects to save.
|
* @param batchToSave the list of objects to save.
|
||||||
* @param entityClass class that determines the collection to use
|
* @param entityClass class that determines the collection to use
|
||||||
*/
|
*/
|
||||||
@@ -702,7 +796,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert a list of objects into the specified collection in a single batch write to the database.
|
* Insert a list of objects into the specified collection in a single batch write to the database.
|
||||||
*
|
*
|
||||||
* @param batchToSave the list of objects to save.
|
* @param batchToSave the list of objects to save.
|
||||||
* @param collectionName name of the collection to store the object in
|
* @param collectionName name of the collection to store the object in
|
||||||
*/
|
*/
|
||||||
@@ -711,7 +805,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Insert a mixed Collection of objects into a database collection determining the collection name to use based on the
|
* Insert a mixed Collection of objects into a database collection determining the collection name to use based on the
|
||||||
* class.
|
* class.
|
||||||
*
|
*
|
||||||
* @param collectionToSave the list of objects to save.
|
* @param collectionToSave the list of objects to save.
|
||||||
*/
|
*/
|
||||||
void insertAll(Collection<? extends Object> objectsToSave);
|
void insertAll(Collection<? extends Object> objectsToSave);
|
||||||
@@ -725,10 +819,10 @@ public interface MongoOperations {
|
|||||||
* <p/>
|
* <p/>
|
||||||
* If you object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
|
* If you object has an "Id' property, it will be set with the generated Id from MongoDB. If your Id property is a
|
||||||
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
|
* String then MongoDB ObjectId will be used to populate that string. Otherwise, the conversion from ObjectId to your
|
||||||
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See <a
|
* property type will be handled by Spring's BeanWrapper class that leverages Type Conversion API. See
|
||||||
* href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert"
|
* <a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert" >
|
||||||
* >Spring's Type Conversion"</a> for more details.
|
* Spring's Type Conversion"</a> for more details.
|
||||||
*
|
*
|
||||||
* @param objectToSave the object to store in the collection
|
* @param objectToSave the object to store in the collection
|
||||||
*/
|
*/
|
||||||
void save(Object objectToSave);
|
void save(Object objectToSave);
|
||||||
@@ -745,7 +839,7 @@ public interface MongoOperations {
|
|||||||
* property type will be handled by Spring's BeanWrapper class that leverages Type Cobnversion API. See <a
|
* property type will be handled by Spring's BeanWrapper class that leverages Type Cobnversion API. See <a
|
||||||
* http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert">Spring's
|
* http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert">Spring's
|
||||||
* Type Conversion"</a> for more details.
|
* Type Conversion"</a> for more details.
|
||||||
*
|
*
|
||||||
* @param objectToSave the object to store in the collection
|
* @param objectToSave the object to store in the collection
|
||||||
* @param collectionName name of the collection to store the object in
|
* @param collectionName name of the collection to store the object in
|
||||||
*/
|
*/
|
||||||
@@ -754,7 +848,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Performs an upsert. If no document is found that matches the query, a new document is created and inserted by
|
* Performs an upsert. If no document is found that matches the query, a new document is created and inserted by
|
||||||
* combining the query document and the update document.
|
* combining the query document and the update document.
|
||||||
*
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be upserted
|
* @param query the query document that specifies the criteria used to select a record to be upserted
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing object
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing object
|
||||||
* @param entityClass class that determines the collection to use
|
* @param entityClass class that determines the collection to use
|
||||||
@@ -764,8 +858,10 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs an upsert. If no document is found that matches the query, a new document is created and inserted by
|
* Performs an upsert. If no document is found that matches the query, a new document is created and inserted by
|
||||||
* combining the query document and the update document.
|
* combining the query document and the update document. <br />
|
||||||
*
|
* <strong>NOTE:</strong> Any additional support for field mapping, versions, etc. is not available due to the lack of
|
||||||
|
* domain type information. Use {@link #upsert(Query, Update, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -777,7 +873,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Performs an upsert. If no document is found that matches the query, a new document is created and inserted by
|
* Performs an upsert. If no document is found that matches the query, a new document is created and inserted by
|
||||||
* combining the query document and the update document.
|
* combining the query document and the update document.
|
||||||
*
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be upserted
|
* @param query the query document that specifies the criteria used to select a record to be upserted
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing object
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing object
|
||||||
* @param entityClass class of the pojo to be operated on
|
* @param entityClass class of the pojo to be operated on
|
||||||
@@ -789,7 +885,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Updates the first object that is found in the collection of the entity class that matches the query document with
|
* Updates the first object that is found in the collection of the entity class that matches the query document with
|
||||||
* the provided update document.
|
* the provided update document.
|
||||||
*
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -800,8 +896,10 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the first object that is found in the specified collection that matches the query document criteria with
|
* Updates the first object that is found in the specified collection that matches the query document criteria with
|
||||||
* the provided updated document.
|
* the provided updated document. <br />
|
||||||
*
|
* <strong>NOTE:</strong> Any additional support for field mapping, versions, etc. is not available due to the lack of
|
||||||
|
* domain type information. Use {@link #updateFirst(Query, Update, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -813,7 +911,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Updates the first object that is found in the specified collection that matches the query document criteria with
|
* Updates the first object that is found in the specified collection that matches the query document criteria with
|
||||||
* the provided updated document.
|
* the provided updated document.
|
||||||
*
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -826,7 +924,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Updates all objects that are found in the collection for the entity class that matches the query document criteria
|
* Updates all objects that are found in the collection for the entity class that matches the query document criteria
|
||||||
* with the provided updated document.
|
* with the provided updated document.
|
||||||
*
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -837,8 +935,10 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates all objects that are found in the specified collection that matches the query document criteria with the
|
* Updates all objects that are found in the specified collection that matches the query document criteria with the
|
||||||
* provided updated document.
|
* provided updated document. <br />
|
||||||
*
|
* <strong>NOTE:</strong> Any additional support for field mapping, versions, etc. is not available due to the lack of
|
||||||
|
* domain type information. Use {@link #updateMulti(Query, Update, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -850,7 +950,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Updates all objects that are found in the collection for the entity class that matches the query document criteria
|
* Updates all objects that are found in the collection for the entity class that matches the query document criteria
|
||||||
* with the provided updated document.
|
* with the provided updated document.
|
||||||
*
|
*
|
||||||
* @param query the query document that specifies the criteria used to select a record to be updated
|
* @param query the query document that specifies the criteria used to select a record to be updated
|
||||||
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
* @param update the update document that contains the updated object or $ operators to manipulate the existing
|
||||||
* object.
|
* object.
|
||||||
@@ -862,14 +962,14 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the given object from the collection by id.
|
* Remove the given object from the collection by id.
|
||||||
*
|
*
|
||||||
* @param object
|
* @param object
|
||||||
*/
|
*/
|
||||||
WriteResult remove(Object object);
|
WriteResult remove(Object object);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the given object from the given collection.
|
* Removes the given object from the given collection.
|
||||||
*
|
*
|
||||||
* @param object
|
* @param object
|
||||||
* @param collection must not be {@literal null} or empty.
|
* @param collection must not be {@literal null} or empty.
|
||||||
*/
|
*/
|
||||||
@@ -878,7 +978,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Remove all documents that match the provided query document criteria from the the collection used to store the
|
* Remove all documents that match the provided query document criteria from the the collection used to store the
|
||||||
* entityClass. The Class parameter is also used to help convert the Id of the object if it is present in the query.
|
* entityClass. The Class parameter is also used to help convert the Id of the object if it is present in the query.
|
||||||
*
|
*
|
||||||
* @param query
|
* @param query
|
||||||
* @param entityClass
|
* @param entityClass
|
||||||
*/
|
*/
|
||||||
@@ -887,7 +987,7 @@ public interface MongoOperations {
|
|||||||
/**
|
/**
|
||||||
* Remove all documents that match the provided query document criteria from the the collection used to store the
|
* Remove all documents that match the provided query document criteria from the the collection used to store the
|
||||||
* entityClass. The Class parameter is also used to help convert the Id of the object if it is present in the query.
|
* entityClass. The Class parameter is also used to help convert the Id of the object if it is present in the query.
|
||||||
*
|
*
|
||||||
* @param query
|
* @param query
|
||||||
* @param entityClass
|
* @param entityClass
|
||||||
* @param collectionName
|
* @param collectionName
|
||||||
@@ -896,18 +996,22 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove all documents from the specified collection that match the provided query document criteria. There is no
|
* Remove all documents from the specified collection that match the provided query document criteria. There is no
|
||||||
* conversion/mapping done for any criteria using the id field.
|
* conversion/mapping done for any criteria using the id field. <br />
|
||||||
*
|
* <strong>NOTE:</strong> Any additional support for field mapping is not available due to the lack of domain type
|
||||||
|
* information. Use {@link #remove(Query, Class, String)} to get full type specific support.
|
||||||
|
*
|
||||||
* @param query the query document that specifies the criteria used to remove a record
|
* @param query the query document that specifies the criteria used to remove a record
|
||||||
* @param collectionName name of the collection where the objects will removed
|
* @param collectionName name of the collection where the objects will removed
|
||||||
*/
|
*/
|
||||||
WriteResult remove(Query query, String collectionName);
|
WriteResult remove(Query query, String collectionName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns and removes all documents form the specified collection that match the provided query.
|
* Returns and removes all documents form the specified collection that match the provided query. <br />
|
||||||
*
|
* <strong>NOTE:</strong> Any additional support for field mapping is not available due to the lack of domain type
|
||||||
* @param query
|
* information. Use {@link #findAllAndRemove(Query, Class, String)} to get full type specific support.
|
||||||
* @param collectionName
|
*
|
||||||
|
* @param query must not be {@literal null}.
|
||||||
|
* @param collectionName must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
* @since 1.5
|
* @since 1.5
|
||||||
*/
|
*/
|
||||||
@@ -915,7 +1019,7 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns and removes all documents matching the given query form the collection used to store the entityClass.
|
* Returns and removes all documents matching the given query form the collection used to store the entityClass.
|
||||||
*
|
*
|
||||||
* @param query
|
* @param query
|
||||||
* @param entityClass
|
* @param entityClass
|
||||||
* @return
|
* @return
|
||||||
@@ -927,7 +1031,7 @@ public interface MongoOperations {
|
|||||||
* Returns and removes all documents that match the provided query document criteria from the the collection used to
|
* Returns and removes all documents that match the provided query document criteria from the the collection used to
|
||||||
* store the entityClass. The Class parameter is also used to help convert the Id of the object if it is present in
|
* store the entityClass. The Class parameter is also used to help convert the Id of the object if it is present in
|
||||||
* the query.
|
* the query.
|
||||||
*
|
*
|
||||||
* @param query
|
* @param query
|
||||||
* @param entityClass
|
* @param entityClass
|
||||||
* @param collectionName
|
* @param collectionName
|
||||||
@@ -938,8 +1042,9 @@ public interface MongoOperations {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the underlying {@link MongoConverter}.
|
* Returns the underlying {@link MongoConverter}.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
MongoConverter getConverter();
|
MongoConverter getConverter();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2014 the original author or authors.
|
* Copyright 2010-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -17,41 +17,48 @@ package org.springframework.data.mongodb.core;
|
|||||||
|
|
||||||
import javax.net.ssl.SSLSocketFactory;
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
|
|
||||||
import org.springframework.beans.factory.FactoryBean;
|
import org.springframework.beans.factory.config.AbstractFactoryBean;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.data.mongodb.util.MongoClientVersion;
|
||||||
|
|
||||||
import com.mongodb.MongoOptions;
|
import com.mongodb.MongoOptions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A factory bean for construction of a {@link MongoOptions} instance.
|
* A factory bean for construction of a {@link MongoOptions} instance. In case used with MongoDB Java driver version 3
|
||||||
*
|
* porperties not suppprted by the driver will be ignored.
|
||||||
|
*
|
||||||
* @author Graeme Rocher
|
* @author Graeme Rocher
|
||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Mike Saavedra
|
* @author Mike Saavedra
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @deprecated since 1.7. Please use {@link MongoClientOptionsFactoryBean} instead.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@Deprecated
|
||||||
public class MongoOptionsFactoryBean implements FactoryBean<MongoOptions>, InitializingBean {
|
public class MongoOptionsFactoryBean extends AbstractFactoryBean<MongoOptions> {
|
||||||
|
|
||||||
private static final MongoOptions DEFAULT_MONGO_OPTIONS = new MongoOptions();
|
private static final MongoOptions DEFAULT_MONGO_OPTIONS = new MongoOptions();
|
||||||
|
|
||||||
private int connectionsPerHost = DEFAULT_MONGO_OPTIONS.connectionsPerHost;
|
private int connectionsPerHost = DEFAULT_MONGO_OPTIONS.getConnectionsPerHost();
|
||||||
private int threadsAllowedToBlockForConnectionMultiplier = DEFAULT_MONGO_OPTIONS.threadsAllowedToBlockForConnectionMultiplier;
|
private int threadsAllowedToBlockForConnectionMultiplier = DEFAULT_MONGO_OPTIONS
|
||||||
private int maxWaitTime = DEFAULT_MONGO_OPTIONS.maxWaitTime;
|
.getThreadsAllowedToBlockForConnectionMultiplier();
|
||||||
private int connectTimeout = DEFAULT_MONGO_OPTIONS.connectTimeout;
|
private int maxWaitTime = DEFAULT_MONGO_OPTIONS.getMaxWaitTime();
|
||||||
private int socketTimeout = DEFAULT_MONGO_OPTIONS.socketTimeout;
|
private int connectTimeout = DEFAULT_MONGO_OPTIONS.getConnectTimeout();
|
||||||
private boolean socketKeepAlive = DEFAULT_MONGO_OPTIONS.socketKeepAlive;
|
private int socketTimeout = DEFAULT_MONGO_OPTIONS.getSocketTimeout();
|
||||||
private boolean autoConnectRetry = DEFAULT_MONGO_OPTIONS.autoConnectRetry;
|
private boolean socketKeepAlive = DEFAULT_MONGO_OPTIONS.isSocketKeepAlive();
|
||||||
private long maxAutoConnectRetryTime = DEFAULT_MONGO_OPTIONS.maxAutoConnectRetryTime;
|
private int writeNumber = DEFAULT_MONGO_OPTIONS.getW();
|
||||||
private int writeNumber = DEFAULT_MONGO_OPTIONS.w;
|
private int writeTimeout = DEFAULT_MONGO_OPTIONS.getWtimeout();
|
||||||
private int writeTimeout = DEFAULT_MONGO_OPTIONS.wtimeout;
|
private boolean writeFsync = DEFAULT_MONGO_OPTIONS.isFsync();
|
||||||
private boolean writeFsync = DEFAULT_MONGO_OPTIONS.fsync;
|
|
||||||
private boolean slaveOk = DEFAULT_MONGO_OPTIONS.slaveOk;
|
private boolean autoConnectRetry = !MongoClientVersion.isMongo3Driver() ? ReflectiveMongoOptionsInvoker
|
||||||
|
.getAutoConnectRetry(DEFAULT_MONGO_OPTIONS) : false;
|
||||||
|
private long maxAutoConnectRetryTime = !MongoClientVersion.isMongo3Driver() ? ReflectiveMongoOptionsInvoker
|
||||||
|
.getMaxAutoConnectRetryTime(DEFAULT_MONGO_OPTIONS) : -1;
|
||||||
|
private boolean slaveOk = !MongoClientVersion.isMongo3Driver() ? ReflectiveMongoOptionsInvoker
|
||||||
|
.getSlaveOk(DEFAULT_MONGO_OPTIONS) : false;
|
||||||
|
|
||||||
private boolean ssl;
|
private boolean ssl;
|
||||||
private SSLSocketFactory sslSocketFactory;
|
private SSLSocketFactory sslSocketFactory;
|
||||||
|
|
||||||
private MongoOptions options;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the maximum number of connections allowed per host until we will block.
|
* Configures the maximum number of connections allowed per host until we will block.
|
||||||
*
|
*
|
||||||
@@ -144,7 +151,10 @@ public class MongoOptionsFactoryBean implements FactoryBean<MongoOptions>, Initi
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures whether or not the system retries automatically on a failed connect. This defaults to {@literal false}.
|
* Configures whether or not the system retries automatically on a failed connect. This defaults to {@literal false}.
|
||||||
|
*
|
||||||
|
* @deprecated since 1.7.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setAutoConnectRetry(boolean autoConnectRetry) {
|
public void setAutoConnectRetry(boolean autoConnectRetry) {
|
||||||
this.autoConnectRetry = autoConnectRetry;
|
this.autoConnectRetry = autoConnectRetry;
|
||||||
}
|
}
|
||||||
@@ -154,7 +164,9 @@ public class MongoOptionsFactoryBean implements FactoryBean<MongoOptions>, Initi
|
|||||||
* defaults to {@literal 0}, which means to use the default {@literal 15s} if {@link #autoConnectRetry} is on.
|
* defaults to {@literal 0}, which means to use the default {@literal 15s} if {@link #autoConnectRetry} is on.
|
||||||
*
|
*
|
||||||
* @param maxAutoConnectRetryTime the maxAutoConnectRetryTime to set
|
* @param maxAutoConnectRetryTime the maxAutoConnectRetryTime to set
|
||||||
|
* @deprecated since 1.7
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setMaxAutoConnectRetryTime(long maxAutoConnectRetryTime) {
|
public void setMaxAutoConnectRetryTime(long maxAutoConnectRetryTime) {
|
||||||
this.maxAutoConnectRetryTime = maxAutoConnectRetryTime;
|
this.maxAutoConnectRetryTime = maxAutoConnectRetryTime;
|
||||||
}
|
}
|
||||||
@@ -163,7 +175,9 @@ public class MongoOptionsFactoryBean implements FactoryBean<MongoOptions>, Initi
|
|||||||
* Specifies if the driver is allowed to read from secondaries or slaves. Defaults to {@literal false}.
|
* Specifies if the driver is allowed to read from secondaries or slaves. Defaults to {@literal false}.
|
||||||
*
|
*
|
||||||
* @param slaveOk true if the driver should read from secondaries or slaves.
|
* @param slaveOk true if the driver should read from secondaries or slaves.
|
||||||
|
* @deprecated since 1.7
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setSlaveOk(boolean slaveOk) {
|
public void setSlaveOk(boolean slaveOk) {
|
||||||
this.slaveOk = slaveOk;
|
this.slaveOk = slaveOk;
|
||||||
}
|
}
|
||||||
@@ -194,40 +208,41 @@ public class MongoOptionsFactoryBean implements FactoryBean<MongoOptions>, Initi
|
|||||||
this.sslSocketFactory = sslSocketFactory;
|
this.sslSocketFactory = sslSocketFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
* @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance()
|
||||||
*/
|
*/
|
||||||
public void afterPropertiesSet() {
|
@Override
|
||||||
|
protected MongoOptions createInstance() throws Exception {
|
||||||
|
|
||||||
|
if (MongoClientVersion.isMongo3Driver()) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String
|
||||||
|
.format("Usage of 'mongo-options' is no longer supported for MongoDB Java driver version 3 and above. Please use 'mongo-client-options' and refer to chapter 'MongoDB 3.0 Support' for details."));
|
||||||
|
}
|
||||||
|
|
||||||
MongoOptions options = new MongoOptions();
|
MongoOptions options = new MongoOptions();
|
||||||
|
|
||||||
options.connectionsPerHost = connectionsPerHost;
|
options.setConnectionsPerHost(connectionsPerHost);
|
||||||
options.threadsAllowedToBlockForConnectionMultiplier = threadsAllowedToBlockForConnectionMultiplier;
|
options.setThreadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);
|
||||||
options.maxWaitTime = maxWaitTime;
|
options.setMaxWaitTime(maxWaitTime);
|
||||||
options.connectTimeout = connectTimeout;
|
options.setConnectTimeout(connectTimeout);
|
||||||
options.socketTimeout = socketTimeout;
|
options.setSocketTimeout(socketTimeout);
|
||||||
options.socketKeepAlive = socketKeepAlive;
|
options.setSocketKeepAlive(socketKeepAlive);
|
||||||
options.autoConnectRetry = autoConnectRetry;
|
|
||||||
options.maxAutoConnectRetryTime = maxAutoConnectRetryTime;
|
options.setW(writeNumber);
|
||||||
options.slaveOk = slaveOk;
|
options.setWtimeout(writeTimeout);
|
||||||
options.w = writeNumber;
|
options.setFsync(writeFsync);
|
||||||
options.wtimeout = writeTimeout;
|
|
||||||
options.fsync = writeFsync;
|
|
||||||
|
|
||||||
if (ssl) {
|
if (ssl) {
|
||||||
options.setSocketFactory(sslSocketFactory != null ? sslSocketFactory : SSLSocketFactory.getDefault());
|
options.setSocketFactory(sslSocketFactory != null ? sslSocketFactory : SSLSocketFactory.getDefault());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.options = options;
|
ReflectiveMongoOptionsInvoker.setAutoConnectRetry(options, autoConnectRetry);
|
||||||
}
|
ReflectiveMongoOptionsInvoker.setMaxAutoConnectRetryTime(options, maxAutoConnectRetryTime);
|
||||||
|
ReflectiveMongoOptionsInvoker.setSlaveOk(options, slaveOk);
|
||||||
|
|
||||||
/*
|
return options;
|
||||||
* (non-Javadoc)
|
|
||||||
* @see org.springframework.beans.factory.FactoryBean#getObject()
|
|
||||||
*/
|
|
||||||
public MongoOptions getObject() {
|
|
||||||
return this.options;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -237,12 +252,4 @@ public class MongoOptionsFactoryBean implements FactoryBean<MongoOptions>, Initi
|
|||||||
public Class<?> getObjectType() {
|
public Class<?> getObjectType() {
|
||||||
return MongoOptions.class;
|
return MongoOptions.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* (non-Javadoc)
|
|
||||||
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
|
|
||||||
*/
|
|
||||||
public boolean isSingleton() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static org.springframework.data.mongodb.util.MongoClientVersion.*;
|
||||||
|
import static org.springframework.util.ReflectionUtils.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.springframework.data.mongodb.util.MongoClientVersion;
|
||||||
|
|
||||||
|
import com.mongodb.DBCollection;
|
||||||
|
import com.mongodb.DBObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ReflectiveDBCollectionInvoker} provides reflective access to {@link DBCollection} API that is not consistently
|
||||||
|
* available for various driver versions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
class ReflectiveDBCollectionInvoker {
|
||||||
|
|
||||||
|
private static final Method GEN_INDEX_NAME_METHOD;
|
||||||
|
private static final Method RESET_INDEX_CHACHE_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
GEN_INDEX_NAME_METHOD = findMethod(DBCollection.class, "genIndexName", DBObject.class);
|
||||||
|
RESET_INDEX_CHACHE_METHOD = findMethod(DBCollection.class, "resetIndexCache");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ReflectiveDBCollectionInvoker() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience method to generate an index name from the set of fields it is over. Will fall back to a MongoDB Java
|
||||||
|
* driver version 2 compatible way of generating index name in case of {@link MongoClientVersion#isMongo3Driver()}.
|
||||||
|
*
|
||||||
|
* @param keys the names of the fields used in this index
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String generateIndexName(DBObject keys) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return genIndexName(keys);
|
||||||
|
}
|
||||||
|
return (String) invokeMethod(GEN_INDEX_NAME_METHOD, null, keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In case of MongoDB Java driver version 2 all indices that have not yet been applied to this collection will be
|
||||||
|
* cleared. Since this method is not available for the MongoDB Java driver version 3 the operation will throw
|
||||||
|
* {@link UnsupportedOperationException}.
|
||||||
|
*
|
||||||
|
* @param dbCollection
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*/
|
||||||
|
public static void resetIndexCache(DBCollection dbCollection) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
throw new UnsupportedOperationException("The mongo java driver 3 does no loger support resetIndexCache!");
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeMethod(RESET_INDEX_CHACHE_METHOD, dbCollection);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Borrowed from MongoDB Java driver version 2. See <a
|
||||||
|
* href="http://github.com/mongodb/mongo-java-driver/blob/r2.13.0/src/main/com/mongodb/DBCollection.java#L754"
|
||||||
|
* >http://github.com/mongodb/mongo-java-driver/blob/r2.13.0/src/main/com/mongodb/DBCollection.java#L754</a>
|
||||||
|
*
|
||||||
|
* @param keys
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private static String genIndexName(DBObject keys) {
|
||||||
|
|
||||||
|
StringBuilder name = new StringBuilder();
|
||||||
|
|
||||||
|
for (String s : keys.keySet()) {
|
||||||
|
|
||||||
|
if (name.length() > 0) {
|
||||||
|
name.append('_');
|
||||||
|
}
|
||||||
|
|
||||||
|
name.append(s).append('_');
|
||||||
|
Object val = keys.get(s);
|
||||||
|
|
||||||
|
if (val instanceof Number || val instanceof String) {
|
||||||
|
name.append(val.toString().replace(' ', '_'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return name.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static org.springframework.data.mongodb.util.MongoClientVersion.*;
|
||||||
|
import static org.springframework.util.ReflectionUtils.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.springframework.data.authentication.UserCredentials;
|
||||||
|
import org.springframework.data.mongodb.CannotGetMongoDbConnectionException;
|
||||||
|
import org.springframework.data.mongodb.util.MongoClientVersion;
|
||||||
|
|
||||||
|
import com.mongodb.DB;
|
||||||
|
import com.mongodb.Mongo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ReflectiveDbInvoker} provides reflective access to {@link DB} API that is not consistently available for
|
||||||
|
* various driver versions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
final class ReflectiveDbInvoker {
|
||||||
|
|
||||||
|
private static final Method DB_IS_AUTHENTICATED_METHOD;
|
||||||
|
private static final Method DB_AUTHENTICATE_METHOD;
|
||||||
|
private static final Method DB_REQUEST_DONE_METHOD;
|
||||||
|
private static final Method DB_ADD_USER_METHOD;
|
||||||
|
private static final Method DB_REQUEST_START_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
DB_IS_AUTHENTICATED_METHOD = findMethod(DB.class, "isAuthenticated");
|
||||||
|
DB_AUTHENTICATE_METHOD = findMethod(DB.class, "authenticate", String.class, char[].class);
|
||||||
|
DB_REQUEST_DONE_METHOD = findMethod(DB.class, "requestDone");
|
||||||
|
DB_ADD_USER_METHOD = findMethod(DB.class, "addUser", String.class, char[].class);
|
||||||
|
DB_REQUEST_START_METHOD = findMethod(DB.class, "requestStart");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ReflectiveDbInvoker() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticate against database using provided credentials in case of a MongoDB Java driver version 2.
|
||||||
|
*
|
||||||
|
* @param mongo must not be {@literal null}.
|
||||||
|
* @param db must not be {@literal null}.
|
||||||
|
* @param credentials must not be {@literal null}.
|
||||||
|
* @param authenticationDatabaseName
|
||||||
|
*/
|
||||||
|
public static void authenticate(Mongo mongo, DB db, UserCredentials credentials, String authenticationDatabaseName) {
|
||||||
|
|
||||||
|
String databaseName = db.getName();
|
||||||
|
|
||||||
|
DB authDb = databaseName.equals(authenticationDatabaseName) ? db : mongo.getDB(authenticationDatabaseName);
|
||||||
|
|
||||||
|
synchronized (authDb) {
|
||||||
|
|
||||||
|
Boolean isAuthenticated = (Boolean) invokeMethod(DB_IS_AUTHENTICATED_METHOD, authDb);
|
||||||
|
if (!isAuthenticated) {
|
||||||
|
|
||||||
|
String username = credentials.getUsername();
|
||||||
|
String password = credentials.hasPassword() ? credentials.getPassword() : null;
|
||||||
|
|
||||||
|
Boolean authenticated = (Boolean) invokeMethod(DB_AUTHENTICATE_METHOD, authDb, username,
|
||||||
|
password == null ? null : password.toCharArray());
|
||||||
|
if (!authenticated) {
|
||||||
|
throw new CannotGetMongoDbConnectionException("Failed to authenticate to database [" + databaseName + "], "
|
||||||
|
+ credentials.toString(), databaseName, credentials);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a new 'consistent request' in case of MongoDB Java driver version 2. Will do nothing for MongoDB Java driver
|
||||||
|
* version 3 since the operation is no longer available.
|
||||||
|
*
|
||||||
|
* @param db
|
||||||
|
*/
|
||||||
|
public static void requestStart(DB db) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeMethod(DB_REQUEST_START_METHOD, db);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ends the current 'consistent request'. a new 'consistent request' in case of MongoDB Java driver version 2. Will do
|
||||||
|
* nothing for MongoDB Java driver version 3 since the operation is no longer available
|
||||||
|
*
|
||||||
|
* @param db
|
||||||
|
*/
|
||||||
|
public static void requestDone(DB db) {
|
||||||
|
|
||||||
|
if (MongoClientVersion.isMongo3Driver()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeMethod(DB_REQUEST_DONE_METHOD, db);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param db
|
||||||
|
* @param username
|
||||||
|
* @param password
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*/
|
||||||
|
public static void addUser(DB db, String username, char[] password) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Please use DB.command(…) to call either the createUser or updateUser command!");
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeMethod(DB_ADD_USER_METHOD, db, username, password);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static org.springframework.data.mongodb.util.MongoClientVersion.*;
|
||||||
|
import static org.springframework.util.ReflectionUtils.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import com.mongodb.MapReduceCommand;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ReflectiveMapReduceInvoker} provides reflective access to {@link MapReduceCommand} API that is not
|
||||||
|
* consistently available for various driver versions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
final class ReflectiveMapReduceInvoker {
|
||||||
|
|
||||||
|
private static final Method ADD_EXTRA_OPTION_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
ADD_EXTRA_OPTION_METHOD = findMethod(MapReduceCommand.class, "addExtraOption", String.class, Object.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ReflectiveMapReduceInvoker() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the extra option for MongoDB Java driver version 2. Will do nothing for MongoDB Java driver version 2.
|
||||||
|
*
|
||||||
|
* @param cmd can be {@literal null} for MongoDB Java driver version 2.
|
||||||
|
* @param key
|
||||||
|
* @param value
|
||||||
|
*/
|
||||||
|
public static void addExtraOption(MapReduceCommand cmd, String key, Object value) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.notNull(cmd, "MapReduceCommand must not be null!");
|
||||||
|
invokeMethod(ADD_EXTRA_OPTION_METHOD, cmd, key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static org.springframework.data.mongodb.util.MongoClientVersion.*;
|
||||||
|
import static org.springframework.util.ReflectionUtils.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.springframework.beans.DirectFieldAccessor;
|
||||||
|
import org.springframework.util.ReflectionUtils;
|
||||||
|
|
||||||
|
import com.mongodb.MongoOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ReflectiveMongoOptionsInvoker} provides reflective access to {@link MongoOptions} API that is not consistently
|
||||||
|
* available for various driver versions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
class ReflectiveMongoOptionsInvoker {
|
||||||
|
|
||||||
|
private static final Method GET_AUTO_CONNECT_RETRY_METHOD;
|
||||||
|
private static final Method SET_AUTO_CONNECT_RETRY_METHOD;
|
||||||
|
private static final Method GET_MAX_AUTO_CONNECT_RETRY_TIME_METHOD;
|
||||||
|
private static final Method SET_MAX_AUTO_CONNECT_RETRY_TIME_METHOD;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
SET_AUTO_CONNECT_RETRY_METHOD = ReflectionUtils
|
||||||
|
.findMethod(MongoOptions.class, "setAutoConnectRetry", boolean.class);
|
||||||
|
GET_AUTO_CONNECT_RETRY_METHOD = ReflectionUtils.findMethod(MongoOptions.class, "isAutoConnectRetry");
|
||||||
|
SET_MAX_AUTO_CONNECT_RETRY_TIME_METHOD = ReflectionUtils.findMethod(MongoOptions.class,
|
||||||
|
"setMaxAutoConnectRetryTime", long.class);
|
||||||
|
GET_MAX_AUTO_CONNECT_RETRY_TIME_METHOD = ReflectionUtils.findMethod(MongoOptions.class,
|
||||||
|
"getMaxAutoConnectRetryTime");
|
||||||
|
}
|
||||||
|
|
||||||
|
private ReflectiveMongoOptionsInvoker() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the retry connection flag for MongoDB Java driver version 2. Will do nothing for MongoDB Java driver version 3
|
||||||
|
* since the method has been removed.
|
||||||
|
*
|
||||||
|
* @param options can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @param autoConnectRetry
|
||||||
|
*/
|
||||||
|
public static void setAutoConnectRetry(MongoOptions options, boolean autoConnectRetry) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeMethod(SET_AUTO_CONNECT_RETRY_METHOD, options, autoConnectRetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the maxAutoConnectRetryTime attribute for MongoDB Java driver version 2. Will do nothing for MongoDB Java
|
||||||
|
* driver version 3 since the method has been removed.
|
||||||
|
*
|
||||||
|
* @param options can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @param maxAutoConnectRetryTime
|
||||||
|
*/
|
||||||
|
public static void setMaxAutoConnectRetryTime(MongoOptions options, long maxAutoConnectRetryTime) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
invokeMethod(SET_MAX_AUTO_CONNECT_RETRY_TIME_METHOD, options, maxAutoConnectRetryTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the slaveOk attribute for MongoDB Java driver version 2. Will do nothing for MongoDB Java driver version 3
|
||||||
|
* since the method has been removed.
|
||||||
|
*
|
||||||
|
* @param options can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @param slaveOk
|
||||||
|
*/
|
||||||
|
public static void setSlaveOk(MongoOptions options, boolean slaveOk) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new DirectFieldAccessor(options).setPropertyValue("slaveOk", slaveOk);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the slaveOk attribute for MongoDB Java driver version 2. Throws {@link UnsupportedOperationException} for
|
||||||
|
* MongoDB Java driver version 3 since the method has been removed.
|
||||||
|
*
|
||||||
|
* @param options can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @return
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*/
|
||||||
|
public static boolean getSlaveOk(MongoOptions options) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Cannot get value for autoConnectRetry which has been removed in MongoDB Java driver version 3.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((Boolean) new DirectFieldAccessor(options).getPropertyValue("slaveOk")).booleanValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the autoConnectRetry attribute for MongoDB Java driver version 2. Throws {@link UnsupportedOperationException}
|
||||||
|
* for MongoDB Java driver version 3 since the method has been removed.
|
||||||
|
*
|
||||||
|
* @param options can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @return
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*/
|
||||||
|
public static boolean getAutoConnectRetry(MongoOptions options) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Cannot get value for autoConnectRetry which has been removed in MongoDB Java driver version 3.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((Boolean) invokeMethod(GET_AUTO_CONNECT_RETRY_METHOD, options)).booleanValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the maxAutoConnectRetryTime attribute for MongoDB Java driver version 2. Throws
|
||||||
|
* {@link UnsupportedOperationException} for MongoDB Java driver version 3 since the method has been removed.
|
||||||
|
*
|
||||||
|
* @param options can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @return
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*/
|
||||||
|
public static long getMaxAutoConnectRetryTime(MongoOptions options) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Cannot get value for maxAutoConnectRetryTime which has been removed in MongoDB Java driver version 3.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((Long) invokeMethod(GET_MAX_AUTO_CONNECT_RETRY_TIME_METHOD, options)).longValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static org.springframework.data.mongodb.util.MongoClientVersion.*;
|
||||||
|
|
||||||
|
import org.springframework.beans.DirectFieldAccessor;
|
||||||
|
|
||||||
|
import com.mongodb.WriteConcern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ReflectiveWriteConcernInvoker} provides reflective access to {@link WriteConcern} API that is not consistently
|
||||||
|
* available for various driver versions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
class ReflectiveWriteConcernInvoker {
|
||||||
|
|
||||||
|
private static final WriteConcern NONE_OR_UNACKNOWLEDGED;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
NONE_OR_UNACKNOWLEDGED = isMongo3Driver() ? WriteConcern.UNACKNOWLEDGED : (WriteConcern) new DirectFieldAccessor(
|
||||||
|
new WriteConcern()).getPropertyValue("NONE");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {@link WriteConcern#NONE} for MongoDB Java driver version 2, otherwise {@link WriteConcern#UNACKNOWLEDGED}.
|
||||||
|
*/
|
||||||
|
public static WriteConcern noneOrUnacknowledged() {
|
||||||
|
return NONE_OR_UNACKNOWLEDGED;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import static org.springframework.data.mongodb.util.MongoClientVersion.*;
|
||||||
|
import static org.springframework.util.ReflectionUtils.*;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import com.mongodb.MongoException;
|
||||||
|
import com.mongodb.WriteResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ReflectiveWriteResultInvoker} provides reflective access to {@link WriteResult} API that is not consistently
|
||||||
|
* available for various driver versions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
final class ReflectiveWriteResultInvoker {
|
||||||
|
|
||||||
|
private static final Method GET_ERROR_METHOD;
|
||||||
|
private static final Method WAS_ACKNOWLEDGED_METHOD;
|
||||||
|
|
||||||
|
private ReflectiveWriteResultInvoker() {}
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
GET_ERROR_METHOD = findMethod(WriteResult.class, "getError");
|
||||||
|
WAS_ACKNOWLEDGED_METHOD = findMethod(WriteResult.class, "wasAcknowledged");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param writeResult can be {@literal null} for MongoDB Java driver version 3.
|
||||||
|
* @return null in case of MongoDB Java driver version 3 since errors are thrown as {@link MongoException}.
|
||||||
|
*/
|
||||||
|
public static String getError(WriteResult writeResult) {
|
||||||
|
|
||||||
|
if (isMongo3Driver()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (String) invokeMethod(GET_ERROR_METHOD, writeResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param writeResult
|
||||||
|
* @return return in case of MongoDB Java driver version 2.
|
||||||
|
*/
|
||||||
|
public static boolean wasAcknowledged(WriteResult writeResult) {
|
||||||
|
return isMongo3Driver() ? ((Boolean) invokeMethod(WAS_ACKNOWLEDGED_METHOD, writeResult)).booleanValue() : true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014-2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.springframework.data.mongodb.core.script.ExecutableMongoScript;
|
||||||
|
import org.springframework.data.mongodb.core.script.NamedMongoScript;
|
||||||
|
|
||||||
|
import com.mongodb.DB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Script operations on {@link com.mongodb.DB} level. Allows interaction with server side JavaScript functions.
|
||||||
|
*
|
||||||
|
* @author Christoph Strobl
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public interface ScriptOperations {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store given {@link ExecutableMongoScript} generating a syntheitcal name so that it can be called by it
|
||||||
|
* subsequently.
|
||||||
|
*
|
||||||
|
* @param script must not be {@literal null}.
|
||||||
|
* @return {@link NamedMongoScript} with name under which the {@code JavaScript} function can be called.
|
||||||
|
*/
|
||||||
|
NamedMongoScript register(ExecutableMongoScript script);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the given {@link NamedMongoScript} in the database.
|
||||||
|
*
|
||||||
|
* @param script the {@link NamedMongoScript} to be registered.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
NamedMongoScript register(NamedMongoScript script);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the {@literal script} by either calling it via its {@literal name} or directly sending it.
|
||||||
|
*
|
||||||
|
* @param script must not be {@literal null}.
|
||||||
|
* @param args arguments to pass on for script execution.
|
||||||
|
* @return the script evaluation result.
|
||||||
|
* @throws org.springframework.dao.DataAccessException
|
||||||
|
*/
|
||||||
|
Object execute(ExecutableMongoScript script, Object... args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call the {@literal JavaScript} by its name.
|
||||||
|
*
|
||||||
|
* @param scriptName must not be {@literal null} or empty.
|
||||||
|
* @param args
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Object call(String scriptName, Object... args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks {@link DB} for existence of {@link ServerSideJavaScript} with given name.
|
||||||
|
*
|
||||||
|
* @param scriptName must not be {@literal null} or empty.
|
||||||
|
* @return false if no {@link ServerSideJavaScript} with given name exists.
|
||||||
|
*/
|
||||||
|
boolean exists(String scriptName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns names of {@literal JavaScript} functions that can be called.
|
||||||
|
*
|
||||||
|
* @return empty {@link Set} if no scripts found.
|
||||||
|
*/
|
||||||
|
Set<String> getScriptNames();
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011-2013 the original author or authors.
|
* Copyright 2011-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -19,6 +19,7 @@ import java.net.UnknownHostException;
|
|||||||
|
|
||||||
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||||
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
import org.springframework.dao.support.PersistenceExceptionTranslator;
|
||||||
import org.springframework.data.authentication.UserCredentials;
|
import org.springframework.data.authentication.UserCredentials;
|
||||||
import org.springframework.data.mongodb.MongoDbFactory;
|
import org.springframework.data.mongodb.MongoDbFactory;
|
||||||
@@ -27,6 +28,8 @@ import org.springframework.util.StringUtils;
|
|||||||
|
|
||||||
import com.mongodb.DB;
|
import com.mongodb.DB;
|
||||||
import com.mongodb.Mongo;
|
import com.mongodb.Mongo;
|
||||||
|
import com.mongodb.MongoClient;
|
||||||
|
import com.mongodb.MongoClientURI;
|
||||||
import com.mongodb.MongoException;
|
import com.mongodb.MongoException;
|
||||||
import com.mongodb.MongoURI;
|
import com.mongodb.MongoURI;
|
||||||
import com.mongodb.WriteConcern;
|
import com.mongodb.WriteConcern;
|
||||||
@@ -37,6 +40,7 @@ import com.mongodb.WriteConcern;
|
|||||||
* @author Mark Pollack
|
* @author Mark Pollack
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
|
* @author Christoph Strobl
|
||||||
*/
|
*/
|
||||||
public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
||||||
|
|
||||||
@@ -54,7 +58,9 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
|||||||
*
|
*
|
||||||
* @param mongo Mongo instance, must not be {@literal null}.
|
* @param mongo Mongo instance, must not be {@literal null}.
|
||||||
* @param databaseName database name, not be {@literal null} or empty.
|
* @param databaseName database name, not be {@literal null} or empty.
|
||||||
|
* @deprecated since 1.7. Please use {@link #SimpleMongoDbFactory(MongoClient, String)}.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public SimpleMongoDbFactory(Mongo mongo, String databaseName) {
|
public SimpleMongoDbFactory(Mongo mongo, String databaseName) {
|
||||||
this(mongo, databaseName, null);
|
this(mongo, databaseName, null);
|
||||||
}
|
}
|
||||||
@@ -65,7 +71,9 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
|||||||
* @param mongo Mongo instance, must not be {@literal null}.
|
* @param mongo Mongo instance, must not be {@literal null}.
|
||||||
* @param databaseName Database name, must not be {@literal null} or empty.
|
* @param databaseName Database name, must not be {@literal null} or empty.
|
||||||
* @param credentials username and password.
|
* @param credentials username and password.
|
||||||
|
* @deprecated since 1.7. The credentials used should be provided by {@link MongoClient#getCredentialsList()}.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public SimpleMongoDbFactory(Mongo mongo, String databaseName, UserCredentials credentials) {
|
public SimpleMongoDbFactory(Mongo mongo, String databaseName, UserCredentials credentials) {
|
||||||
this(mongo, databaseName, credentials, false, null);
|
this(mongo, databaseName, credentials, false, null);
|
||||||
}
|
}
|
||||||
@@ -77,7 +85,9 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
|||||||
* @param databaseName Database name, must not be {@literal null} or empty.
|
* @param databaseName Database name, must not be {@literal null} or empty.
|
||||||
* @param credentials username and password.
|
* @param credentials username and password.
|
||||||
* @param authenticationDatabaseName the database name to use for authentication
|
* @param authenticationDatabaseName the database name to use for authentication
|
||||||
|
* @deprecated since 1.7. The credentials used should be provided by {@link MongoClient#getCredentialsList()}.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public SimpleMongoDbFactory(Mongo mongo, String databaseName, UserCredentials credentials,
|
public SimpleMongoDbFactory(Mongo mongo, String databaseName, UserCredentials credentials,
|
||||||
String authenticationDatabaseName) {
|
String authenticationDatabaseName) {
|
||||||
this(mongo, databaseName, credentials, false, authenticationDatabaseName);
|
this(mongo, databaseName, credentials, false, authenticationDatabaseName);
|
||||||
@@ -90,16 +100,44 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
|||||||
* @throws MongoException
|
* @throws MongoException
|
||||||
* @throws UnknownHostException
|
* @throws UnknownHostException
|
||||||
* @see MongoURI
|
* @see MongoURI
|
||||||
|
* @deprecated since 1.7. Please use {@link #SimpleMongoDbFactory(MongoClientURI)} instead.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
@Deprecated
|
||||||
public SimpleMongoDbFactory(MongoURI uri) throws MongoException, UnknownHostException {
|
public SimpleMongoDbFactory(MongoURI uri) throws MongoException, UnknownHostException {
|
||||||
this(new Mongo(uri), uri.getDatabase(), new UserCredentials(uri.getUsername(), parseChars(uri.getPassword())),
|
this(new Mongo(uri), uri.getDatabase(), new UserCredentials(uri.getUsername(), parseChars(uri.getPassword())), true,
|
||||||
true, uri.getDatabase());
|
uri.getDatabase());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link SimpleMongoDbFactory} instance from the given {@link MongoClientURI}.
|
||||||
|
*
|
||||||
|
* @param uri must not be {@literal null}.
|
||||||
|
* @throws UnknownHostException
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public SimpleMongoDbFactory(MongoClientURI uri) throws UnknownHostException {
|
||||||
|
this(new MongoClient(uri), uri.getDatabase(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link SimpleMongoDbFactory} instance from the given {@link MongoClient}.
|
||||||
|
*
|
||||||
|
* @param mongoClient must not be {@literal null}.
|
||||||
|
* @param databaseName must not be {@literal null}.
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public SimpleMongoDbFactory(MongoClient mongoClient, String databaseName) {
|
||||||
|
this(mongoClient, databaseName, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private SimpleMongoDbFactory(Mongo mongo, String databaseName, UserCredentials credentials,
|
private SimpleMongoDbFactory(Mongo mongo, String databaseName, UserCredentials credentials,
|
||||||
boolean mongoInstanceCreated, String authenticationDatabaseName) {
|
boolean mongoInstanceCreated, String authenticationDatabaseName) {
|
||||||
|
|
||||||
|
if (mongo instanceof MongoClient && (credentials != null && !UserCredentials.NO_CREDENTIALS.equals(credentials))) {
|
||||||
|
throw new InvalidDataAccessApiUsageException(
|
||||||
|
"Usage of 'UserCredentials' with 'MongoClient' is no longer supported. Please use 'MongoCredential' for 'MongoClient' or just 'Mongo'.");
|
||||||
|
}
|
||||||
|
|
||||||
Assert.notNull(mongo, "Mongo must not be null");
|
Assert.notNull(mongo, "Mongo must not be null");
|
||||||
Assert.hasText(databaseName, "Database name must not be empty");
|
Assert.hasText(databaseName, "Database name must not be empty");
|
||||||
Assert.isTrue(databaseName.matches("[\\w-]+"),
|
Assert.isTrue(databaseName.matches("[\\w-]+"),
|
||||||
@@ -117,6 +155,25 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
|||||||
"Authentication database name must only contain letters, numbers, underscores and dashes!");
|
"Authentication database name must only contain letters, numbers, underscores and dashes!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param client
|
||||||
|
* @param databaseName
|
||||||
|
* @param mongoInstanceCreated
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
private SimpleMongoDbFactory(MongoClient client, String databaseName, boolean mongoInstanceCreated) {
|
||||||
|
|
||||||
|
Assert.notNull(client, "MongoClient must not be null!");
|
||||||
|
Assert.hasText(databaseName, "Database name must not be empty!");
|
||||||
|
|
||||||
|
this.mongo = client;
|
||||||
|
this.databaseName = databaseName;
|
||||||
|
this.mongoInstanceCreated = mongoInstanceCreated;
|
||||||
|
this.exceptionTranslator = new MongoExceptionTranslator();
|
||||||
|
this.credentials = UserCredentials.NO_CREDENTIALS;
|
||||||
|
this.authenticationDatabaseName = databaseName;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the {@link WriteConcern} to be used on the {@link DB} instance being created.
|
* Configures the {@link WriteConcern} to be used on the {@link DB} instance being created.
|
||||||
*
|
*
|
||||||
@@ -138,6 +195,7 @@ public class SimpleMongoDbFactory implements DisposableBean, MongoDbFactory {
|
|||||||
* (non-Javadoc)
|
* (non-Javadoc)
|
||||||
* @see org.springframework.data.mongodb.MongoDbFactory#getDb(java.lang.String)
|
* @see org.springframework.data.mongodb.MongoDbFactory#getDb(java.lang.String)
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public DB getDb(String dbName) throws DataAccessException {
|
public DB getDb(String dbName) throws DataAccessException {
|
||||||
|
|
||||||
Assert.hasText(dbName, "Database name must not be empty.");
|
Assert.hasText(dbName, "Database name must not be empty.");
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013-2016 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -26,7 +26,9 @@ import org.springframework.data.domain.Sort.Direction;
|
|||||||
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
|
import org.springframework.data.mongodb.core.aggregation.ExposedFields.ExposedField;
|
||||||
import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference;
|
import org.springframework.data.mongodb.core.aggregation.ExposedFields.FieldReference;
|
||||||
import org.springframework.data.mongodb.core.aggregation.Fields.AggregationField;
|
import org.springframework.data.mongodb.core.aggregation.Fields.AggregationField;
|
||||||
|
import org.springframework.data.mongodb.core.aggregation.FieldsExposingAggregationOperation.InheritsFieldsAggregationOperation;
|
||||||
import org.springframework.data.mongodb.core.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Criteria;
|
||||||
|
import org.springframework.data.mongodb.core.query.NearQuery;
|
||||||
import org.springframework.data.mongodb.core.query.SerializationUtils;
|
import org.springframework.data.mongodb.core.query.SerializationUtils;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
@@ -36,21 +38,37 @@ import com.mongodb.DBObject;
|
|||||||
/**
|
/**
|
||||||
* An {@code Aggregation} is a representation of a list of aggregation steps to be performed by the MongoDB Aggregation
|
* An {@code Aggregation} is a representation of a list of aggregation steps to be performed by the MongoDB Aggregation
|
||||||
* Framework.
|
* Framework.
|
||||||
*
|
*
|
||||||
* @author Tobias Trelle
|
* @author Tobias Trelle
|
||||||
* @author Thomas Darimont
|
* @author Thomas Darimont
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Mark Paluch
|
||||||
|
* @author Alessio Fachechi
|
||||||
* @since 1.3
|
* @since 1.3
|
||||||
*/
|
*/
|
||||||
public class Aggregation {
|
public class Aggregation {
|
||||||
|
|
||||||
public static final AggregationOperationContext DEFAULT_CONTEXT = new NoOpAggregationOperationContext();
|
/**
|
||||||
|
* References the root document, i.e. the top-level document, currently being processed in the aggregation pipeline
|
||||||
|
* stage.
|
||||||
|
*/
|
||||||
|
public static final String ROOT = SystemVariable.ROOT.toString();
|
||||||
|
|
||||||
private final List<AggregationOperation> operations;
|
/**
|
||||||
|
* References the start of the field path being processed in the aggregation pipeline stage. Unless documented
|
||||||
|
* otherwise, all stages start with CURRENT the same as ROOT.
|
||||||
|
*/
|
||||||
|
public static final String CURRENT = SystemVariable.CURRENT.toString();
|
||||||
|
|
||||||
|
public static final AggregationOperationContext DEFAULT_CONTEXT = new NoOpAggregationOperationContext();
|
||||||
|
public static final AggregationOptions DEFAULT_OPTIONS = newAggregationOptions().build();
|
||||||
|
|
||||||
|
protected final List<AggregationOperation> operations;
|
||||||
|
private final AggregationOptions options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
||||||
*
|
*
|
||||||
* @param operations must not be {@literal null} or empty.
|
* @param operations must not be {@literal null} or empty.
|
||||||
*/
|
*/
|
||||||
public static Aggregation newAggregation(List<? extends AggregationOperation> operations) {
|
public static Aggregation newAggregation(List<? extends AggregationOperation> operations) {
|
||||||
@@ -59,16 +77,30 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
||||||
*
|
*
|
||||||
* @param operations must not be {@literal null} or empty.
|
* @param operations must not be {@literal null} or empty.
|
||||||
*/
|
*/
|
||||||
public static Aggregation newAggregation(AggregationOperation... operations) {
|
public static Aggregation newAggregation(AggregationOperation... operations) {
|
||||||
return new Aggregation(operations);
|
return new Aggregation(operations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a copy of this {@link Aggregation} with the given {@link AggregationOptions} set. Note that options are
|
||||||
|
* supported in MongoDB version 2.6+.
|
||||||
|
*
|
||||||
|
* @param options must not be {@literal null}.
|
||||||
|
* @return
|
||||||
|
* @since 1.6
|
||||||
|
*/
|
||||||
|
public Aggregation withOptions(AggregationOptions options) {
|
||||||
|
|
||||||
|
Assert.notNull(options, "AggregationOptions must not be null.");
|
||||||
|
return new Aggregation(this.operations, options);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link TypedAggregation} for the given type and {@link AggregationOperation}s.
|
* Creates a new {@link TypedAggregation} for the given type and {@link AggregationOperation}s.
|
||||||
*
|
*
|
||||||
* @param type must not be {@literal null}.
|
* @param type must not be {@literal null}.
|
||||||
* @param operations must not be {@literal null} or empty.
|
* @param operations must not be {@literal null} or empty.
|
||||||
*/
|
*/
|
||||||
@@ -78,7 +110,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link TypedAggregation} for the given type and {@link AggregationOperation}s.
|
* Creates a new {@link TypedAggregation} for the given type and {@link AggregationOperation}s.
|
||||||
*
|
*
|
||||||
* @param type must not be {@literal null}.
|
* @param type must not be {@literal null}.
|
||||||
* @param operations must not be {@literal null} or empty.
|
* @param operations must not be {@literal null} or empty.
|
||||||
*/
|
*/
|
||||||
@@ -88,20 +120,52 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
||||||
*
|
*
|
||||||
* @param aggregationOperations must not be {@literal null} or empty.
|
* @param aggregationOperations must not be {@literal null} or empty.
|
||||||
*/
|
*/
|
||||||
protected Aggregation(AggregationOperation... aggregationOperations) {
|
protected Aggregation(AggregationOperation... aggregationOperations) {
|
||||||
|
this(asAggregationList(aggregationOperations));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param aggregationOperations must not be {@literal null} or empty.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected static List<AggregationOperation> asAggregationList(AggregationOperation... aggregationOperations) {
|
||||||
|
|
||||||
|
Assert.notEmpty(aggregationOperations, "AggregationOperations must not be null or empty!");
|
||||||
|
|
||||||
|
return Arrays.asList(aggregationOperations);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
||||||
|
*
|
||||||
|
* @param aggregationOperations must not be {@literal null} or empty.
|
||||||
|
*/
|
||||||
|
protected Aggregation(List<AggregationOperation> aggregationOperations) {
|
||||||
|
this(aggregationOperations, DEFAULT_OPTIONS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link Aggregation} from the given {@link AggregationOperation}s.
|
||||||
|
*
|
||||||
|
* @param aggregationOperations must not be {@literal null} or empty.
|
||||||
|
* @param options must not be {@literal null} or empty.
|
||||||
|
*/
|
||||||
|
protected Aggregation(List<AggregationOperation> aggregationOperations, AggregationOptions options) {
|
||||||
|
|
||||||
Assert.notNull(aggregationOperations, "AggregationOperations must not be null!");
|
Assert.notNull(aggregationOperations, "AggregationOperations must not be null!");
|
||||||
Assert.isTrue(aggregationOperations.length > 0, "At least one AggregationOperation has to be provided");
|
Assert.isTrue(!aggregationOperations.isEmpty(), "At least one AggregationOperation has to be provided");
|
||||||
|
Assert.notNull(options, "AggregationOptions must not be null!");
|
||||||
|
|
||||||
this.operations = Arrays.asList(aggregationOperations);
|
this.operations = aggregationOperations;
|
||||||
|
this.options = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A pointer to the previous {@link AggregationOperation}.
|
* A pointer to the previous {@link AggregationOperation}.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String previousOperation() {
|
public static String previousOperation() {
|
||||||
@@ -110,7 +174,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ProjectionOperation} including the given fields.
|
* Creates a new {@link ProjectionOperation} including the given fields.
|
||||||
*
|
*
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -120,7 +184,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ProjectionOperation} includeing the given {@link Fields}.
|
* Creates a new {@link ProjectionOperation} includeing the given {@link Fields}.
|
||||||
*
|
*
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -130,7 +194,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory method to create a new {@link UnwindOperation} for the field with the given name.
|
* Factory method to create a new {@link UnwindOperation} for the field with the given name.
|
||||||
*
|
*
|
||||||
* @param fieldName must not be {@literal null} or empty.
|
* @param fieldName must not be {@literal null} or empty.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -140,7 +204,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link GroupOperation} for the given fields.
|
* Creates a new {@link GroupOperation} for the given fields.
|
||||||
*
|
*
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -150,7 +214,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link GroupOperation} for the given {@link Fields}.
|
* Creates a new {@link GroupOperation} for the given {@link Fields}.
|
||||||
*
|
*
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -160,7 +224,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory method to create a new {@link SortOperation} for the given {@link Sort}.
|
* Factory method to create a new {@link SortOperation} for the given {@link Sort}.
|
||||||
*
|
*
|
||||||
* @param sort must not be {@literal null}.
|
* @param sort must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -170,7 +234,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory method to create a new {@link SortOperation} for the given sort {@link Direction} and {@code fields}.
|
* Factory method to create a new {@link SortOperation} for the given sort {@link Direction} and {@code fields}.
|
||||||
*
|
*
|
||||||
* @param direction must not be {@literal null}.
|
* @param direction must not be {@literal null}.
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
@@ -181,17 +245,28 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link SkipOperation} skipping the given number of elements.
|
* Creates a new {@link SkipOperation} skipping the given number of elements.
|
||||||
*
|
*
|
||||||
* @param elementsToSkip must not be less than zero.
|
* @param elementsToSkip must not be less than zero.
|
||||||
* @return
|
* @return
|
||||||
|
* @deprecated prepare to get this one removed in favor of {@link #skip(long)}.
|
||||||
*/
|
*/
|
||||||
public static SkipOperation skip(int elementsToSkip) {
|
public static SkipOperation skip(int elementsToSkip) {
|
||||||
return new SkipOperation(elementsToSkip);
|
return new SkipOperation(elementsToSkip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link SkipOperation} skipping the given number of elements.
|
||||||
|
*
|
||||||
|
* @param elementsToSkip must not be less than zero.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static SkipOperation skip(long elementsToSkip) {
|
||||||
|
return new SkipOperation(elementsToSkip);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link LimitOperation} limiting the result to the given number of elements.
|
* Creates a new {@link LimitOperation} limiting the result to the given number of elements.
|
||||||
*
|
*
|
||||||
* @param maxElements must not be less than zero.
|
* @param maxElements must not be less than zero.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -201,7 +276,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link MatchOperation} using the given {@link Criteria}.
|
* Creates a new {@link MatchOperation} using the given {@link Criteria}.
|
||||||
*
|
*
|
||||||
* @param criteria must not be {@literal null}.
|
* @param criteria must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -209,12 +284,40 @@ public class Aggregation {
|
|||||||
return new MatchOperation(criteria);
|
return new MatchOperation(criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link LookupOperation}.
|
||||||
|
*
|
||||||
|
* @param from must not be {@literal null}.
|
||||||
|
* @param localField must not be {@literal null}.
|
||||||
|
* @param foreignField must not be {@literal null}.
|
||||||
|
* @param as must not be {@literal null}.
|
||||||
|
* @return never {@literal null}.
|
||||||
|
* @since 1.9
|
||||||
|
*/
|
||||||
|
public static LookupOperation lookup(String from, String localField, String foreignField, String as) {
|
||||||
|
return lookup(field(from), field(localField), field(foreignField), field(as));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link LookupOperation} for the given {@link Fields}.
|
||||||
|
*
|
||||||
|
* @param from must not be {@literal null}.
|
||||||
|
* @param localField must not be {@literal null}.
|
||||||
|
* @param foreignField must not be {@literal null}.
|
||||||
|
* @param as must not be {@literal null}.
|
||||||
|
* @return never {@literal null}.
|
||||||
|
* @since 1.9
|
||||||
|
*/
|
||||||
|
public static LookupOperation lookup(Field from, Field localField, Field foreignField, Field as) {
|
||||||
|
return new LookupOperation(from, localField, foreignField, as);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Fields} instance for the given field names.
|
* Creates a new {@link Fields} instance for the given field names.
|
||||||
*
|
*
|
||||||
* @see Fields#fields(String...)
|
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @return
|
* @return
|
||||||
|
* @see Fields#fields(String...)
|
||||||
*/
|
*/
|
||||||
public static Fields fields(String... fields) {
|
public static Fields fields(String... fields) {
|
||||||
return Fields.fields(fields);
|
return Fields.fields(fields);
|
||||||
@@ -222,7 +325,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link Fields} instance from the given field name and target reference.
|
* Creates a new {@link Fields} instance from the given field name and target reference.
|
||||||
*
|
*
|
||||||
* @param name must not be {@literal null} or empty.
|
* @param name must not be {@literal null} or empty.
|
||||||
* @param target must not be {@literal null} or empty.
|
* @param target must not be {@literal null} or empty.
|
||||||
* @return
|
* @return
|
||||||
@@ -231,9 +334,32 @@ public class Aggregation {
|
|||||||
return Fields.from(field(name, target));
|
return Fields.from(field(name, target));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link GeoNearOperation} instance from the given {@link NearQuery} and the{@code distanceField}. The
|
||||||
|
* {@code distanceField} defines output field that contains the calculated distance.
|
||||||
|
*
|
||||||
|
* @param query must not be {@literal null}.
|
||||||
|
* @param distanceField must not be {@literal null} or empty.
|
||||||
|
* @return
|
||||||
|
* @since 1.7
|
||||||
|
*/
|
||||||
|
public static GeoNearOperation geoNear(NearQuery query, String distanceField) {
|
||||||
|
return new GeoNearOperation(query, distanceField);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link AggregationOptions.Builder}.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @since 1.6
|
||||||
|
*/
|
||||||
|
public static AggregationOptions.Builder newAggregationOptions() {
|
||||||
|
return new AggregationOptions.Builder();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts this {@link Aggregation} specification to a {@link DBObject}.
|
* Converts this {@link Aggregation} specification to a {@link DBObject}.
|
||||||
*
|
*
|
||||||
* @param inputCollectionName the name of the input collection
|
* @param inputCollectionName the name of the input collection
|
||||||
* @return the {@code DBObject} representing this aggregation
|
* @return the {@code DBObject} representing this aggregation
|
||||||
*/
|
*/
|
||||||
@@ -247,14 +373,22 @@ public class Aggregation {
|
|||||||
operationDocuments.add(operation.toDBObject(context));
|
operationDocuments.add(operation.toDBObject(context));
|
||||||
|
|
||||||
if (operation instanceof FieldsExposingAggregationOperation) {
|
if (operation instanceof FieldsExposingAggregationOperation) {
|
||||||
|
|
||||||
FieldsExposingAggregationOperation exposedFieldsOperation = (FieldsExposingAggregationOperation) operation;
|
FieldsExposingAggregationOperation exposedFieldsOperation = (FieldsExposingAggregationOperation) operation;
|
||||||
context = new ExposedFieldsAggregationOperationContext(exposedFieldsOperation.getFields());
|
|
||||||
|
if (operation instanceof InheritsFieldsAggregationOperation) {
|
||||||
|
context = new InheritingExposedFieldsAggregationOperationContext(exposedFieldsOperation.getFields(), context);
|
||||||
|
} else {
|
||||||
|
context = new ExposedFieldsAggregationOperationContext(exposedFieldsOperation.getFields(), context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBObject command = new BasicDBObject("aggregate", inputCollectionName);
|
DBObject command = new BasicDBObject("aggregate", inputCollectionName);
|
||||||
command.put("pipeline", operationDocuments);
|
command.put("pipeline", operationDocuments);
|
||||||
|
|
||||||
|
command = options.applyAndReturnPotentiallyChangedCommand(command);
|
||||||
|
|
||||||
return command;
|
return command;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,7 +404,7 @@ public class Aggregation {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple {@link AggregationOperationContext} that just returns {@link FieldReference}s as is.
|
* Simple {@link AggregationOperationContext} that just returns {@link FieldReference}s as is.
|
||||||
*
|
*
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
*/
|
*/
|
||||||
private static class NoOpAggregationOperationContext implements AggregationOperationContext {
|
private static class NoOpAggregationOperationContext implements AggregationOperationContext {
|
||||||
@@ -302,4 +436,51 @@ public class Aggregation {
|
|||||||
return new FieldReference(new ExposedField(new AggregationField(name), true));
|
return new FieldReference(new ExposedField(new AggregationField(name), true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the system variables available in MongoDB aggregation framework pipeline expressions.
|
||||||
|
*
|
||||||
|
* @author Thomas Darimont
|
||||||
|
* @see http://docs.mongodb.org/manual/reference/aggregation-variables
|
||||||
|
*/
|
||||||
|
enum SystemVariable {
|
||||||
|
|
||||||
|
ROOT, CURRENT;
|
||||||
|
|
||||||
|
private static final String PREFIX = "$$";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return {@literal true} if the given {@code fieldRef} denotes a well-known system variable, {@literal false}
|
||||||
|
* otherwise.
|
||||||
|
*
|
||||||
|
* @param fieldRef may be {@literal null}.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean isReferingToSystemVariable(String fieldRef) {
|
||||||
|
|
||||||
|
if (fieldRef == null || !fieldRef.startsWith(PREFIX) || fieldRef.length() <= 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int indexOfFirstDot = fieldRef.indexOf('.');
|
||||||
|
String candidate = fieldRef.substring(2, indexOfFirstDot == -1 ? fieldRef.length() : indexOfFirstDot);
|
||||||
|
|
||||||
|
for (SystemVariable value : values()) {
|
||||||
|
if (value.name().equals(candidate)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see java.lang.Enum#toString()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return PREFIX.concat(name());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2016 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core.aggregation;
|
||||||
|
|
||||||
|
import com.mongodb.DBObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An {@link AggregationExpression} can be used with field expressions in aggregation pipeline stages like
|
||||||
|
* {@code project} and {@code group}.
|
||||||
|
*
|
||||||
|
* @author Thomas Darimont
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @author Christoph Strobl
|
||||||
|
*/
|
||||||
|
public interface AggregationExpression {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns the {@link AggregationExpression} into a {@link DBObject} within the given
|
||||||
|
* {@link AggregationOperationContext}.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
DBObject toDbObject(AggregationOperationContext context);
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core.aggregation;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import com.mongodb.BasicDBObject;
|
||||||
|
import com.mongodb.DBObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An enum of supported {@link AggregationExpression}s in aggregation pipeline stages.
|
||||||
|
*
|
||||||
|
* @author Thomas Darimont
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.10
|
||||||
|
*/
|
||||||
|
public enum AggregationFunctionExpressions {
|
||||||
|
|
||||||
|
SIZE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an {@link AggregationExpression} build from the current {@link Enum} name and the given parameters.
|
||||||
|
*
|
||||||
|
* @param parameters must not be {@literal null}
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public AggregationExpression of(Object... parameters) {
|
||||||
|
|
||||||
|
Assert.notNull(parameters, "Parameters must not be null!");
|
||||||
|
return new FunctionExpression(name().toLowerCase(), parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An {@link AggregationExpression} representing a function call.
|
||||||
|
*
|
||||||
|
* @author Thomas Darimont
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @since 1.10
|
||||||
|
*/
|
||||||
|
static class FunctionExpression implements AggregationExpression {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final List<Object> values;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link FunctionExpression} for the given name and values.
|
||||||
|
*
|
||||||
|
* @param name must not be {@literal null} or empty.
|
||||||
|
* @param values must not be {@literal null}.
|
||||||
|
*/
|
||||||
|
public FunctionExpression(String name, Object[] values) {
|
||||||
|
|
||||||
|
Assert.hasText(name, "Name must not be null!");
|
||||||
|
Assert.notNull(values, "Values must not be null!");
|
||||||
|
|
||||||
|
this.name = name;
|
||||||
|
this.values = Arrays.asList(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see org.springframework.data.mongodb.core.aggregation.Expression#toDbObject(org.springframework.data.mongodb.core.aggregation.AggregationOperationContext)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DBObject toDbObject(AggregationOperationContext context) {
|
||||||
|
|
||||||
|
List<Object> args = new ArrayList<Object>(values.size());
|
||||||
|
|
||||||
|
for (Object value : values) {
|
||||||
|
args.add(unpack(value, context));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BasicDBObject("$" + name, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object unpack(Object value, AggregationOperationContext context) {
|
||||||
|
|
||||||
|
if (value instanceof AggregationExpression) {
|
||||||
|
return ((AggregationExpression) value).toDbObject(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value instanceof Field) {
|
||||||
|
return context.getReference((Field) value).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|||||||
@@ -0,0 +1,189 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2014 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.data.mongodb.core.aggregation;
|
||||||
|
|
||||||
|
import com.mongodb.BasicDBObject;
|
||||||
|
import com.mongodb.DBObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds a set of configurable aggregation options that can be used within an aggregation pipeline. A list of support
|
||||||
|
* aggregation options can be found in the MongoDB reference documentation
|
||||||
|
* http://docs.mongodb.org/manual/reference/command/aggregate/#aggregate
|
||||||
|
*
|
||||||
|
* @author Thomas Darimont
|
||||||
|
* @author Oliver Gierke
|
||||||
|
* @see Aggregation#withOptions(AggregationOptions)
|
||||||
|
* @see TypedAggregation#withOptions(AggregationOptions)
|
||||||
|
* @since 1.6
|
||||||
|
*/
|
||||||
|
public class AggregationOptions {
|
||||||
|
|
||||||
|
private static final String CURSOR = "cursor";
|
||||||
|
private static final String EXPLAIN = "explain";
|
||||||
|
private static final String ALLOW_DISK_USE = "allowDiskUse";
|
||||||
|
|
||||||
|
private final boolean allowDiskUse;
|
||||||
|
private final boolean explain;
|
||||||
|
private final DBObject cursor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new {@link AggregationOptions}.
|
||||||
|
*
|
||||||
|
* @param allowDiskUse whether to off-load intensive sort-operations to disk.
|
||||||
|
* @param explain whether to get the execution plan for the aggregation instead of the actual results.
|
||||||
|
* @param cursor can be {@literal null}, used to pass additional options to the aggregation.
|
||||||
|
*/
|
||||||
|
public AggregationOptions(boolean allowDiskUse, boolean explain, DBObject cursor) {
|
||||||
|
|
||||||
|
this.allowDiskUse = allowDiskUse;
|
||||||
|
this.explain = explain;
|
||||||
|
this.cursor = cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables writing to temporary files. When set to true, aggregation stages can write data to the _tmp subdirectory in
|
||||||
|
* the dbPath directory.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isAllowDiskUse() {
|
||||||
|
return allowDiskUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies to return the information on the processing of the pipeline.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean isExplain() {
|
||||||
|
return explain;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify a document that contains options that control the creation of the cursor object.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public DBObject getCursor() {
|
||||||
|
return cursor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new potentially adjusted copy for the given {@code aggregationCommandObject} with the configuration
|
||||||
|
* applied.
|
||||||
|
*
|
||||||
|
* @param command the aggregation command.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
DBObject applyAndReturnPotentiallyChangedCommand(DBObject command) {
|
||||||
|
|
||||||
|
DBObject result = new BasicDBObject(command.toMap());
|
||||||
|
|
||||||
|
if (allowDiskUse && !result.containsField(ALLOW_DISK_USE)) {
|
||||||
|
result.put(ALLOW_DISK_USE, allowDiskUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (explain && !result.containsField(EXPLAIN)) {
|
||||||
|
result.put(EXPLAIN, explain);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cursor != null && !result.containsField(CURSOR)) {
|
||||||
|
result.put("cursor", cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a {@link DBObject} representation of this {@link AggregationOptions}.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public DBObject toDbObject() {
|
||||||
|
|
||||||
|
DBObject dbo = new BasicDBObject();
|
||||||
|
dbo.put(ALLOW_DISK_USE, allowDiskUse);
|
||||||
|
dbo.put(EXPLAIN, explain);
|
||||||
|
dbo.put(CURSOR, cursor);
|
||||||
|
|
||||||
|
return dbo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see java.lang.Object#toString()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toDbObject().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Builder for {@link AggregationOptions}.
|
||||||
|
*
|
||||||
|
* @author Thomas Darimont
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
|
||||||
|
private boolean allowDiskUse;
|
||||||
|
private boolean explain;
|
||||||
|
private DBObject cursor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines whether to off-load intensive sort-operations to disk.
|
||||||
|
*
|
||||||
|
* @param allowDiskUse
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Builder allowDiskUse(boolean allowDiskUse) {
|
||||||
|
|
||||||
|
this.allowDiskUse = allowDiskUse;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines whether to get the execution plan for the aggregation instead of the actual results.
|
||||||
|
*
|
||||||
|
* @param explain
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Builder explain(boolean explain) {
|
||||||
|
|
||||||
|
this.explain = explain;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Additional options to the aggregation.
|
||||||
|
*
|
||||||
|
* @param cursor
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Builder cursor(DBObject cursor) {
|
||||||
|
|
||||||
|
this.cursor = cursor;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new {@link AggregationOptions} instance with the given configuration.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public AggregationOptions build() {
|
||||||
|
return new AggregationOptions(allowDiskUse, explain, cursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 the original author or authors.
|
* Copyright 2013-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -28,6 +28,8 @@ import com.mongodb.DBObject;
|
|||||||
*
|
*
|
||||||
* @author Tobias Trelle
|
* @author Tobias Trelle
|
||||||
* @author Oliver Gierke
|
* @author Oliver Gierke
|
||||||
|
* @author Thomas Darimont
|
||||||
|
* @author Mark Paluch
|
||||||
* @param <T> The class in which the results are mapped onto.
|
* @param <T> The class in which the results are mapped onto.
|
||||||
* @since 1.3
|
* @since 1.3
|
||||||
*/
|
*/
|
||||||
@@ -45,8 +47,8 @@ public class AggregationResults<T> implements Iterable<T> {
|
|||||||
*/
|
*/
|
||||||
public AggregationResults(List<T> mappedResults, DBObject rawResults) {
|
public AggregationResults(List<T> mappedResults, DBObject rawResults) {
|
||||||
|
|
||||||
Assert.notNull(mappedResults);
|
Assert.notNull(mappedResults, "List of mapped results must not be null!");
|
||||||
Assert.notNull(rawResults);
|
Assert.notNull(rawResults, "Raw results must not be null!");
|
||||||
|
|
||||||
this.mappedResults = Collections.unmodifiableList(mappedResults);
|
this.mappedResults = Collections.unmodifiableList(mappedResults);
|
||||||
this.rawResults = rawResults;
|
this.rawResults = rawResults;
|
||||||
@@ -90,6 +92,16 @@ public class AggregationResults<T> implements Iterable<T> {
|
|||||||
return serverUsed;
|
return serverUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw result that was returned by the server.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @since 1.6
|
||||||
|
*/
|
||||||
|
public DBObject getRawResults() {
|
||||||
|
return rawResults;
|
||||||
|
}
|
||||||
|
|
||||||
private String parseServerUsed() {
|
private String parseServerUsed() {
|
||||||
|
|
||||||
Object object = rawResults.get("serverUsed");
|
Object object = rawResults.get("serverUsed");
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
@@ -88,7 +88,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ExposedFields} instance for the given fields in either sythetic or non-synthetic way.
|
* Creates a new {@link ExposedFields} instance for the given fields in either synthetic or non-synthetic way.
|
||||||
*
|
*
|
||||||
* @param fields must not be {@literal null}.
|
* @param fields must not be {@literal null}.
|
||||||
* @param synthetic
|
* @param synthetic
|
||||||
@@ -107,7 +107,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new {@link ExposedFields} with the given orignals and synthetics.
|
* Creates a new {@link ExposedFields} with the given originals and synthetics.
|
||||||
*
|
*
|
||||||
* @param originals must not be {@literal null}.
|
* @param originals must not be {@literal null}.
|
||||||
* @param synthetic must not be {@literal null}.
|
* @param synthetic must not be {@literal null}.
|
||||||
@@ -268,14 +268,21 @@ public final class ExposedFields implements Iterable<ExposedField> {
|
|||||||
return field.isAliased();
|
return field.isAliased();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the synthetic
|
||||||
|
*/
|
||||||
|
public boolean isSynthetic() {
|
||||||
|
return synthetic;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the field can be referred to using the given name.
|
* Returns whether the field can be referred to using the given name.
|
||||||
*
|
*
|
||||||
* @param input
|
* @param name
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean canBeReferredToBy(String input) {
|
public boolean canBeReferredToBy(String name) {
|
||||||
return getTarget().equals(input);
|
return getName().equals(name) || getTarget().equals(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -340,6 +347,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
|
|||||||
public FieldReference(ExposedField field) {
|
public FieldReference(ExposedField field) {
|
||||||
|
|
||||||
Assert.notNull(field, "ExposedField must not be null!");
|
Assert.notNull(field, "ExposedField must not be null!");
|
||||||
|
|
||||||
this.field = field;
|
this.field = field;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,7 +363,7 @@ public final class ExposedFields implements Iterable<ExposedField> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the referenve value for the given field reference. Will return 1 for a synthetic, unaliased field or the
|
* Returns the reference value for the given field reference. Will return 1 for a synthetic, unaliased field or the
|
||||||
* raw rendering of the reference otherwise.
|
* raw rendering of the reference otherwise.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user