From ef2b0235c71a24a38ef986ed3573bf85bcefc363 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 27 Apr 2011 18:28:07 +0200 Subject: [PATCH] DATADOC-109 - Introduced MappingContext implementation for SimpleMongoConverter. Adapted changes in Spring Data Commons. Adapted test cases accordingly. Introduced SimpleMongoMappingContext that that reflects the meta-model assumptions in SimpleMongoConverter. Adapted repository factories accordingly as we can now assume that there is a MappingContext available always. Refactored QueryMapper to be stateless so that we don't need to recreate instances of it. Added unit tests to verify id property to key mapping and type conversion to ObjectId. Polished MappingTests to simply drop the database after all test were finished to make sure it starts with a clean state on a potential next run. --- ajcore.20110315.195433.898.txt | 476 ++++++++++++++++++ pom.xml.orig | 293 +++++++++++ spring-data-mongodb/.classpath.orig | 16 + .../data/document/mongodb/MongoTemplate.java | 306 ++++++----- .../config/AbstractMongoConfiguration.java | 10 +- .../convert/MappingMongoConverter.java | 39 +- .../mongodb/convert/MongoConverter.java | 3 + .../mongodb/convert/SimpleMongoConverter.java | 12 + .../mapping/BasicMongoPersistentEntity.java | 79 +++ .../mongodb/mapping/MongoMappingContext.java | 39 +- .../mapping/MongoPersistentEntity.java | 61 +-- .../MongoPersistentEntityIndexCreator.java | 11 +- .../mapping/MongoPersistentProperty.java | 17 +- .../mapping/SimpleMongoMappingContext.java | 75 +++ .../document/mongodb/query/QueryMapper.java | 42 +- .../ConvertingParameterAccessor.java | 10 +- .../MappingMongoEntityInformation.java | 5 +- .../MongoRepositoryFactoryBean.java | 26 +- .../SimpleMongoEntityInformation.java | 111 ---- .../mongodb/MongoOperationsUnitTests.java | 6 + .../document/mongodb/MongoTemplateTests.java | 24 +- .../mongodb/analytics/MvcAnalyticsTests.java | 2 +- .../convert/CustomConvertersUnitTests.java | 31 +- .../document/mongodb/mapping/Address.java | 1 + .../mongodb/mapping/GenericMappingTests.java | 14 +- .../MappingMongoConverterUnitTests.java | 5 +- .../mongodb/mapping/MappingTests.java | 5 - .../mapping/PersonCustomCollection1.java | 5 + .../mapping/PersonCustomCollection2.java | 5 + .../mongodb/mapping/PersonMultiDimArrays.java | 5 + .../SimpleMappingContextUnitTests.java | 30 ++ .../mongodb/query/QueryMapperUnitTests.java | 78 +++ .../MongoQueryCreatorUnitTests.java | 14 + .../MongoRepositoryFactoryUnitTests.java | 7 +- ...SimpleMongoEntityInformationUnitTests.java | 59 --- .../StringBasedMongoQueryUnitTests.java | 5 +- .../src/test/resources/infrastructure.xml | 4 +- src/main/resources/changelog.txt | 2 +- 38 files changed, 1422 insertions(+), 511 deletions(-) create mode 100644 ajcore.20110315.195433.898.txt create mode 100644 pom.xml.orig create mode 100644 spring-data-mongodb/.classpath.orig create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/BasicMongoPersistentEntity.java create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/SimpleMongoMappingContext.java delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformation.java create mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/SimpleMappingContextUnitTests.java create mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryMapperUnitTests.java delete mode 100644 spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformationUnitTests.java diff --git a/ajcore.20110315.195433.898.txt b/ajcore.20110315.195433.898.txt new file mode 100644 index 000000000..3fdd1e33c --- /dev/null +++ b/ajcore.20110315.195433.898.txt @@ -0,0 +1,476 @@ +---- AspectJ Properties --- +AspectJ Compiler 1.6.11.M2 built on Tuesday Feb 22, 2011 at 17:15:06 GMT +---- Dump Properties --- +Dump file: ajcore.20110315.195433.898.txt +Dump reason: abort +Dump on exception: true +Dump at exit condition: abort +---- System Properties --- +java.runtime.name=Java(TM) SE Runtime Environment +sun.boot.library.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries +java.vm.version=19.1-b02-334 +awt.nativeDoubleBuffering=true +gopherProxySet=false +mrj.build=10M3326 +java.vm.vendor=Apple Inc. +java.vendor.url=http://www.apple.com/ +guice.disable.misplaced.annotation.check=true +path.separator=: +java.vm.name=Java HotSpot(TM) 64-Bit Server VM +file.encoding.pkg=sun.io +sun.java.launcher=SUN_STANDARD +user.country=DE +sun.os.patch.level=unknown +java.vm.specification.name=Java Virtual Machine Specification +user.dir=/Users/olivergierke/Documents/workspace/spring-data-document +java.runtime.version=1.6.0_24-b07-334-10M3326 +java.awt.graphicsenv=apple.awt.CGraphicsEnvironment +java.endorsed.dirs=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/endorsed +os.arch=x86_64 +java.io.tmpdir=/var/folders/pM/pMiDtflBHwGXrI8njdh15k+++TI/-Tmp-/ +line.separator= + +java.vm.specification.vendor=Sun Microsystems Inc. +os.name=Mac OS X +classworlds.conf=/Applications/Tools/maven-3/bin/m2.conf +sun.jnu.encoding=MacRoman +java.library.path=.:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java +java.specification.name=Java Platform API Specification +java.class.version=50.0 +sun.management.compiler=HotSpot 64-Bit Server Compiler +os.version=10.6.6 +http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 +user.home=/Users/olivergierke +user.timezone=Europe/Berlin +java.awt.printerjob=apple.awt.CPrinterJob +file.encoding=MacRoman +java.specification.version=1.6 +java.class.path=/Applications/Tools/maven-3/boot/plexus-classworlds-2.4.jar +user.name=olivergierke +java.vm.specification.version=1.0 +java.home=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home +sun.arch.data.model=64 +user.language=de +java.specification.vendor=Sun Microsystems Inc. +awt.toolkit=apple.awt.CToolkit +java.vm.info=mixed mode +java.version=1.6.0_24 +java.ext.dirs=/Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext +sun.boot.class.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsfd.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/ui.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/laf.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/sunrsasign.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsse.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jce.jar:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/charsets.jar +java.vendor=Apple Inc. +maven.home=/Applications/Tools/maven-3 +file.separator=/ +java.vendor.url.bug=http://bugreport.apple.com/ +sun.io.unicode.encoding=UnicodeLittle +sun.cpu.endian=little +mrj.version=1060.1.6.0_24-334 +socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16 +ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16 +sun.cpu.isalist= +---- Command Line --- +-encoding +UTF-8 +-outxml +-source +1.6 +-target +1.6 +-classpath +/Users/olivergierke/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar:/Users/olivergierke/.m2/repository/asm/asm/3.1/asm-3.1.jar:/Users/olivergierke/.m2/repository/cglib/cglib/2.2/cglib-2.2.jar:/Users/olivergierke/.m2/repository/hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.jar:/Users/olivergierke/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar:/Users/olivergierke/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar:/Users/olivergierke/.m2/repository/javax/validation/validation-api/1.0.0.GA/validation-api-1.0.0.GA.jar:/Users/olivergierke/.m2/repository/junit/junit/4.8.1/junit-4.8.1.jar:/Users/olivergierke/.m2/repository/log4j/log4j/1.2.15/log4j-1.2.15.jar:/Users/olivergierke/.m2/repository/org/aspectj/aspectjrt/1.6.11.M2/aspectjrt-1.6.11.M2.jar:/Users/olivergierke/.m2/repository/org/hibernate/hibernate-entitymanager/3.5.5-Final/hibernate-entitymanager-3.5.5-Final.jar:/Users/olivergierke/.m2/repository/org/hibernate/hibernate-validator/4.0.2.GA/hibernate-validator-4.0.2.GA.jar:/Users/olivergierke/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.0.Final/hibernate-jpa-2.0-api-1.0.0.Final.jar:/Users/olivergierke/.m2/repository/org/mockito/mockito-all/1.8.4/mockito-all-1.8.4.jar:/Users/olivergierke/.m2/repository/org/slf4j/jcl-over-slf4j/1.5.10/jcl-over-slf4j-1.5.10.jar:/Users/olivergierke/.m2/repository/org/slf4j/slf4j-api/1.5.10/slf4j-api-1.5.10.jar:/Users/olivergierke/.m2/repository/org/slf4j/slf4j-log4j12/1.5.10/slf4j-log4j12-1.5.10.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-aop/3.0.5.RELEASE/spring-aop-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-asm/3.0.5.RELEASE/spring-asm-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-beans/3.0.5.RELEASE/spring-beans-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-context/3.0.5.RELEASE/spring-context-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-context-support/3.0.5.RELEASE/spring-context-support-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-core/3.0.5.RELEASE/spring-core-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-expression/3.0.5.RELEASE/spring-expression-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-jdbc/3.0.5.RELEASE/spring-jdbc-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-orm/3.0.5.RELEASE/spring-orm-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-tx/3.0.5.RELEASE/spring-tx-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-web/3.0.5.RELEASE/spring-web-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/spring-webmvc/3.0.5.RELEASE/spring-webmvc-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-aspects/1.0.0.BUILD-SNAPSHOT/spring-data-commons-aspects-1.0.0.BUILD-SNAPSHOT.jar:/Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-core/1.0.0.BUILD-SNAPSHOT/spring-data-commons-core-1.0.0.BUILD-SNAPSHOT.jar:/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-document-core/target/spring-data-document-core-1.0.0.BUILD-SNAPSHOT.jar:/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb/target/spring-data-mongodb-1.0.0.BUILD-SNAPSHOT.jar:/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/target/classes +-aspectpath +/Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar:/Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-aspects/1.0.0.BUILD-SNAPSHOT/spring-data-commons-aspects-1.0.0.BUILD-SNAPSHOT.jar +-d +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/target/classes +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/DocumentEntity.java +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoDocumentBacking.aj +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java +---- Full Classpath --- +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsfd.jar(missing) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar(30961599 bytes) +/System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar(42463 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/ui.jar(989361 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/laf.jar(missing) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/sunrsasign.jar(missing) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsse.jar(320697 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jce.jar(88256 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/charsets.jar(3551766 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar(35548 bytes) +/Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-aspects/1.0.0.BUILD-SNAPSHOT/spring-data-commons-aspects-1.0.0.BUILD-SNAPSHOT.jar(62347 bytes) +/Library/Java/Extensions/RXTXcomm.jar(112185 bytes) +/System/Library/Java/Extensions/AppleScriptEngine.jar(6470 bytes) +/System/Library/Java/Extensions/dns_sd.jar(17780 bytes) +/System/Library/Java/Extensions/j3daudio.jar(1223487 bytes) +/System/Library/Java/Extensions/j3dcore.jar(1157342 bytes) +/System/Library/Java/Extensions/j3dutils.jar(685292 bytes) +/System/Library/Java/Extensions/jai_codec.jar(275486 bytes) +/System/Library/Java/Extensions/jai_core.jar(1544537 bytes) +/System/Library/Java/Extensions/mlibwrapper_jai.jar(41239 bytes) +/System/Library/Java/Extensions/MRJToolkit.jar(12849 bytes) +/System/Library/Java/Extensions/QTJava.zip(938700 bytes) +/System/Library/Java/Extensions/vecmath.jar(127628 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/apple_provider.jar(48726 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/dnsns.jar(8228 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/localedata.jar(468491 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/sunjce_provider.jar(170239 bytes) +/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/ext/sunpkcs11.jar(231749 bytes) +/Users/olivergierke/.m2/repository/aopalliance/aopalliance/1.0/aopalliance-1.0.jar(4467 bytes) +/Users/olivergierke/.m2/repository/asm/asm/3.1/asm-3.1.jar(43033 bytes) +/Users/olivergierke/.m2/repository/cglib/cglib/2.2/cglib-2.2.jar(278682 bytes) +/Users/olivergierke/.m2/repository/hsqldb/hsqldb/1.8.0.10/hsqldb-1.8.0.10.jar(706710 bytes) +/Users/olivergierke/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar(5848 bytes) +/Users/olivergierke/.m2/repository/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar(52150 bytes) +/Users/olivergierke/.m2/repository/javax/validation/validation-api/1.0.0.GA/validation-api-1.0.0.GA.jar(47433 bytes) +/Users/olivergierke/.m2/repository/junit/junit/4.8.1/junit-4.8.1.jar(237047 bytes) +/Users/olivergierke/.m2/repository/log4j/log4j/1.2.15/log4j-1.2.15.jar(391834 bytes) +/Users/olivergierke/.m2/repository/org/aspectj/aspectjrt/1.6.11.M2/aspectjrt-1.6.11.M2.jar(116222 bytes) +/Users/olivergierke/.m2/repository/org/hibernate/hibernate-entitymanager/3.5.5-Final/hibernate-entitymanager-3.5.5-Final.jar(416039 bytes) +/Users/olivergierke/.m2/repository/org/hibernate/hibernate-validator/4.0.2.GA/hibernate-validator-4.0.2.GA.jar(226653 bytes) +/Users/olivergierke/.m2/repository/org/hibernate/javax/persistence/hibernate-jpa-2.0-api/1.0.0.Final/hibernate-jpa-2.0-api-1.0.0.Final.jar(100884 bytes) +/Users/olivergierke/.m2/repository/org/mockito/mockito-all/1.8.4/mockito-all-1.8.4.jar(1409262 bytes) +/Users/olivergierke/.m2/repository/org/slf4j/jcl-over-slf4j/1.5.10/jcl-over-slf4j-1.5.10.jar(17289 bytes) +/Users/olivergierke/.m2/repository/org/slf4j/slf4j-api/1.5.10/slf4j-api-1.5.10.jar(23659 bytes) +/Users/olivergierke/.m2/repository/org/slf4j/slf4j-log4j12/1.5.10/slf4j-log4j12-1.5.10.jar(9692 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-aop/3.0.5.RELEASE/spring-aop-3.0.5.RELEASE.jar(321190 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-asm/3.0.5.RELEASE/spring-asm-3.0.5.RELEASE.jar(53082 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar(35548 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-beans/3.0.5.RELEASE/spring-beans-3.0.5.RELEASE.jar(555410 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-context/3.0.5.RELEASE/spring-context-3.0.5.RELEASE.jar(668861 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-context-support/3.0.5.RELEASE/spring-context-support-3.0.5.RELEASE.jar(100870 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-core/3.0.5.RELEASE/spring-core-3.0.5.RELEASE.jar(382442 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-expression/3.0.5.RELEASE/spring-expression-3.0.5.RELEASE.jar(169752 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-jdbc/3.0.5.RELEASE/spring-jdbc-3.0.5.RELEASE.jar(385712 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-orm/3.0.5.RELEASE/spring-orm-3.0.5.RELEASE.jar(334327 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-tx/3.0.5.RELEASE/spring-tx-3.0.5.RELEASE.jar(231922 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-web/3.0.5.RELEASE/spring-web-3.0.5.RELEASE.jar(395587 bytes) +/Users/olivergierke/.m2/repository/org/springframework/spring-webmvc/3.0.5.RELEASE/spring-webmvc-3.0.5.RELEASE.jar(418977 bytes) +/Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-aspects/1.0.0.BUILD-SNAPSHOT/spring-data-commons-aspects-1.0.0.BUILD-SNAPSHOT.jar(62347 bytes) +/Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-core/1.0.0.BUILD-SNAPSHOT/spring-data-commons-core-1.0.0.BUILD-SNAPSHOT.jar(148186 bytes) +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-document-core/target/spring-data-document-core-1.0.0.BUILD-SNAPSHOT.jar(62926 bytes) +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb/target/spring-data-mongodb-1.0.0.BUILD-SNAPSHOT.jar(183122 bytes) +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/target/classes(2 entries) +---- Compiler Messages --- +info directory classpath entry does not exist: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsfd.jar +info directory classpath entry does not exist: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/laf.jar +info directory classpath entry does not exist: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/sunrsasign.jar +info Pipelining compilation +info compiling /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoDocumentBacking.aj +info weaver operating in reweavable mode. Need to verify any required types exist. +info woven aspect org.springframework.persistence.document.MongoDocumentBacking (from /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoDocumentBacking.aj) +info compiling /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/DocumentEntity.java +info woven class org.springframework.persistence.document.DocumentEntity (from /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/DocumentEntity.java) +info compiling /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java +abort trouble in: +public class org.springframework.persistence.document.MongoEntityOperations extends org.springframework.persistence.OrderedEntityOperations: + private org.springframework.data.document.mongodb.MongoTemplate mongoTemplate [RuntimeVisibleAnnotations] + private org.springframework.persistence.support.EntityInstantiator entityInstantiator [Signature(Lorg/springframework/persistence/support/EntityInstantiator;)] + private org.springframework.persistence.document.MongoChangeSetPersister changeSetPersister + public void (): + ALOAD_0 // Lorg/springframework/persistence/document/MongoEntityOperations; this (line 16) + INVOKESPECIAL org.springframework.persistence.OrderedEntityOperations. ()V + constructor-execution(void org.springframework.persistence.document.MongoEntityOperations.()) + | RETURN + constructor-execution(void org.springframework.persistence.document.MongoEntityOperations.()) + end public void () + + public void setEntityInstantiator(org.springframework.persistence.support.EntityInstantiator) org.aspectj.weaver.MethodDeclarationLineNumber: 25:1040 +: + method-execution(void org.springframework.persistence.document.MongoEntityOperations.setEntityInstantiator(org.springframework.persistence.support.EntityInstantiator)) + | ALOAD_0 // Lorg/springframework/persistence/document/MongoEntityOperations; this (line 26) + | ALOAD_1 // Lorg/springframework/persistence/support/EntityInstantiator; entityInstantiator + | field-set(org.springframework.persistence.support.EntityInstantiator org.springframework.persistence.document.MongoEntityOperations.entityInstantiator) + | | PUTFIELD org.springframework.persistence.document.MongoEntityOperations.entityInstantiator Lorg/springframework/persistence/support/EntityInstantiator; + | field-set(org.springframework.persistence.support.EntityInstantiator org.springframework.persistence.document.MongoEntityOperations.entityInstantiator) + | RETURN (line 27) + method-execution(void org.springframework.persistence.document.MongoEntityOperations.setEntityInstantiator(org.springframework.persistence.support.EntityInstantiator)) + end public void setEntityInstantiator(org.springframework.persistence.support.EntityInstantiator) + + public void setChangeSetPersister(org.springframework.persistence.document.MongoChangeSetPersister) org.aspectj.weaver.MethodDeclarationLineNumber: 30:1218 +: + method-execution(void org.springframework.persistence.document.MongoEntityOperations.setChangeSetPersister(org.springframework.persistence.document.MongoChangeSetPersister)) + | ALOAD_0 // Lorg/springframework/persistence/document/MongoEntityOperations; this (line 31) + | ALOAD_1 // Lorg/springframework/persistence/document/MongoChangeSetPersister; changeSetPersister + | field-set(org.springframework.persistence.document.MongoChangeSetPersister org.springframework.persistence.document.MongoEntityOperations.changeSetPersister) + | | PUTFIELD org.springframework.persistence.document.MongoEntityOperations.changeSetPersister Lorg/springframework/persistence/document/MongoChangeSetPersister; + | field-set(org.springframework.persistence.document.MongoChangeSetPersister org.springframework.persistence.document.MongoEntityOperations.changeSetPersister) + | RETURN (line 32) + method-execution(void org.springframework.persistence.document.MongoEntityOperations.setChangeSetPersister(org.springframework.persistence.document.MongoChangeSetPersister)) + end public void setChangeSetPersister(org.springframework.persistence.document.MongoChangeSetPersister) + + public boolean cacheInEntity() org.aspectj.weaver.MethodDeclarationLineNumber: 36:1377 +: + method-execution(boolean org.springframework.persistence.document.MongoEntityOperations.cacheInEntity()) + | ICONST_1 (line 37) + | IRETURN + method-execution(boolean org.springframework.persistence.document.MongoEntityOperations.cacheInEntity()) + end public boolean cacheInEntity() + + public org.springframework.persistence.support.ChangeSetBacked findEntity(Class, Object) throws org.springframework.dao.DataAccessException org.aspectj.weaver.MethodDeclarationLineNumber: 41:1459 +: + method-execution(org.springframework.persistence.support.ChangeSetBacked org.springframework.persistence.document.MongoEntityOperations.findEntity(java.lang.Class, java.lang.Object)) + | catch org.springframework.persistence.support.ChangeSetPersister$NotFoundException -> E0 + | | NEW org.springframework.persistence.support.HashMapChangeSet (line 43) + | | DUP + | | INVOKESPECIAL org.springframework.persistence.support.HashMapChangeSet. ()V + | | ASTORE_3 + | | ALOAD_0 // Lorg/springframework/persistence/document/MongoEntityOperations; this (line 44) + | | field-get(org.springframework.persistence.document.MongoChangeSetPersister org.springframework.persistence.document.MongoEntityOperations.changeSetPersister) + | | | GETFIELD org.springframework.persistence.document.MongoEntityOperations.changeSetPersister Lorg/springframework/persistence/document/MongoChangeSetPersister; + | | field-get(org.springframework.persistence.document.MongoChangeSetPersister org.springframework.persistence.document.MongoEntityOperations.changeSetPersister) + | | ALOAD_1 // Ljava/lang/Class; entityClass + | | ALOAD_2 // Ljava/lang/Object; key + | | ALOAD_3 // Lorg/springframework/persistence/support/ChangeSet; cs + | | method-call(void org.springframework.persistence.document.MongoChangeSetPersister.getPersistentState(java.lang.Class, java.lang.Object, org.springframework.persistence.support.ChangeSet)) + | | | INVOKEVIRTUAL org.springframework.persistence.document.MongoChangeSetPersister.getPersistentState (Ljava/lang/Class;Ljava/lang/Object;Lorg/springframework/persistence/support/ChangeSet;)V + | | method-call(void org.springframework.persistence.document.MongoChangeSetPersister.getPersistentState(java.lang.Class, java.lang.Object, org.springframework.persistence.support.ChangeSet)) + | | ALOAD_0 // Lorg/springframework/persistence/document/MongoEntityOperations; this (line 45) + | | GETFIELD org.springframework.persistence.document.MongoEntityOperations.entityInstantiator Lorg/springframework/persistence/support/EntityInstantiator; + | | ALOAD_3 // Lorg/springframework/persistence/support/ChangeSet; cs + | | ALOAD_1 // Ljava/lang/Class; entityClass + | | INVOKEINTERFACE org.springframework.persistence.support.EntityInstantiator.createEntityFromState (Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object; + | | CHECKCAST org.springframework.persistence.support.ChangeSetBacked + | catch org.springframework.persistence.support.ChangeSetPersister$NotFoundException -> E0 + | ARETURN + | E0: POP (line 46) + | ACONST_NULL (line 47) + | ARETURN + method-execution(org.springframework.persistence.support.ChangeSetBacked org.springframework.persistence.document.MongoEntityOperations.findEntity(java.lang.Class, java.lang.Object)) + end public org.springframework.persistence.support.ChangeSetBacked findEntity(Class, Object) throws org.springframework.dao.DataAccessException + + public Object findUniqueKey(org.springframework.persistence.support.ChangeSetBacked) throws org.springframework.dao.DataAccessException org.aspectj.weaver.MethodDeclarationLineNumber: 52:1847 +: + ALOAD_1 // Lorg/springframework/persistence/support/ChangeSetBacked; entity (line 53) + INVOKESTATIC org.springframework.persistence.support.AbstractDeferredUpdateMixinFields.ajc$interMethodDispatch1$org_springframework_persistence_support_AbstractDeferredUpdateMixinFields$org_springframework_persistence_support_ChangeSetBacked$getId (Lorg/springframework/persistence/support/ChangeSetBacked;)Ljava/lang/Object; + ARETURN + end public Object findUniqueKey(org.springframework.persistence.support.ChangeSetBacked) throws org.springframework.dao.DataAccessException + + public boolean isTransactional() org.aspectj.weaver.MethodDeclarationLineNumber: 57:1980 +: + ICONST_0 (line 59) + IRETURN + end public boolean isTransactional() + + public boolean isTransient(org.springframework.persistence.support.ChangeSetBacked) throws org.springframework.dao.DataAccessException org.aspectj.weaver.MethodDeclarationLineNumber: 63:2070 +: + ALOAD_1 // Lorg/springframework/persistence/support/ChangeSetBacked; entity (line 64) + INVOKESTATIC org.springframework.persistence.support.AbstractDeferredUpdateMixinFields.ajc$interMethodDispatch1$org_springframework_persistence_support_AbstractDeferredUpdateMixinFields$org_springframework_persistence_support_ChangeSetBacked$getId (Lorg/springframework/persistence/support/ChangeSetBacked;)Ljava/lang/Object; + IFNONNULL L0 + ICONST_1 + IRETURN + L0: ICONST_0 + IRETURN + end public boolean isTransient(org.springframework.persistence.support.ChangeSetBacked) throws org.springframework.dao.DataAccessException + + public Object makePersistent(Object, org.springframework.persistence.support.ChangeSetBacked, java.lang.reflect.Field, org.springframework.persistence.RelatedEntity) throws org.springframework.dao.DataAccessException org.aspectj.weaver.MethodDeclarationLineNumber: 68:2208 +: + ALOAD_0 // Lorg/springframework/persistence/document/MongoEntityOperations; this (line 69) + GETFIELD org.springframework.persistence.document.MongoEntityOperations.changeSetPersister Lorg/springframework/persistence/document/MongoChangeSetPersister; + ALOAD_2 // Lorg/springframework/persistence/support/ChangeSetBacked; entity + INVOKEVIRTUAL java.lang.Object.getClass ()Ljava/lang/Class; + ALOAD_2 // Lorg/springframework/persistence/support/ChangeSetBacked; entity + INVOKESTATIC org.springframework.persistence.support.AbstractDeferredUpdateMixinFields.ajc$interMethodDispatch1$org_springframework_persistence_support_AbstractDeferredUpdateMixinFields$org_springframework_persistence_support_ChangeSetBacked$getChangeSet (Lorg/springframework/persistence/support/ChangeSetBacked;)Lorg/springframework/persistence/support/ChangeSet; + INVOKEVIRTUAL org.springframework.persistence.document.MongoChangeSetPersister.persistState (Ljava/lang/Class;Lorg/springframework/persistence/support/ChangeSet;)Ljava/lang/Object; + POP + ALOAD_2 // Lorg/springframework/persistence/support/ChangeSetBacked; entity (line 70) + INVOKESTATIC org.springframework.persistence.support.AbstractDeferredUpdateMixinFields.ajc$interMethodDispatch1$org_springframework_persistence_support_AbstractDeferredUpdateMixinFields$org_springframework_persistence_support_ChangeSetBacked$getId (Lorg/springframework/persistence/support/ChangeSetBacked;)Ljava/lang/Object; + ARETURN + end public Object makePersistent(Object, org.springframework.persistence.support.ChangeSetBacked, java.lang.reflect.Field, org.springframework.persistence.RelatedEntity) throws org.springframework.dao.DataAccessException + + public boolean supports(Class, org.springframework.persistence.RelatedEntity) org.aspectj.weaver.MethodDeclarationLineNumber: 74:2463 +: + ALOAD_1 // Ljava/lang/Class; entityClass (line 75) + LDC org.springframework.persistence.document.DocumentEntity + INVOKEVIRTUAL java.lang.Class.isAnnotationPresent (Ljava/lang/Class;)Z + IRETURN + end public boolean supports(Class, org.springframework.persistence.RelatedEntity) + + public volatile boolean isTransient(Object) throws org.springframework.dao.DataAccessException: + ALOAD_0 (line 1) + ALOAD_1 + CHECKCAST org.springframework.persistence.support.ChangeSetBacked + INVOKEVIRTUAL org.springframework.persistence.document.MongoEntityOperations.isTransient (Lorg/springframework/persistence/support/ChangeSetBacked;)Z + IRETURN + end public volatile boolean isTransient(Object) throws org.springframework.dao.DataAccessException + + public volatile Object findEntity(Class, Object) throws org.springframework.dao.DataAccessException: + ALOAD_0 (line 1) + ALOAD_1 + CHECKCAST java.lang.Class + ALOAD_2 + CHECKCAST java.lang.Object + INVOKEVIRTUAL org.springframework.persistence.document.MongoEntityOperations.findEntity (Ljava/lang/Class;Ljava/lang/Object;)Lorg/springframework/persistence/support/ChangeSetBacked; + ARETURN + end public volatile Object findEntity(Class, Object) throws org.springframework.dao.DataAccessException + + public volatile Object makePersistent(Object, Object, java.lang.reflect.Field, org.springframework.persistence.RelatedEntity) throws org.springframework.dao.DataAccessException: + ALOAD_0 (line 1) + ALOAD_1 + ALOAD_2 + CHECKCAST org.springframework.persistence.support.ChangeSetBacked + ALOAD_3 + ALOAD 4 + INVOKEVIRTUAL org.springframework.persistence.document.MongoEntityOperations.makePersistent (Ljava/lang/Object;Lorg/springframework/persistence/support/ChangeSetBacked;Ljava/lang/reflect/Field;Lorg/springframework/persistence/RelatedEntity;)Ljava/lang/Object; + ARETURN + end public volatile Object makePersistent(Object, Object, java.lang.reflect.Field, org.springframework.persistence.RelatedEntity) throws org.springframework.dao.DataAccessException + + public volatile Object findUniqueKey(Object) throws org.springframework.dao.DataAccessException: + ALOAD_0 (line 1) + ALOAD_1 + CHECKCAST org.springframework.persistence.support.ChangeSetBacked + INVOKEVIRTUAL org.springframework.persistence.document.MongoEntityOperations.findUniqueKey (Lorg/springframework/persistence/support/ChangeSetBacked;)Ljava/lang/Object; + ARETURN + end public volatile Object findUniqueKey(Object) throws org.springframework.dao.DataAccessException + +end public class org.springframework.persistence.document.MongoEntityOperations + -- (AbortCompilation) null +null +org.aspectj.org.eclipse.jdt.internal.compiler.problem.AbortCompilation + at org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemHandler.handle(ProblemHandler.java:97) + at org.aspectj.ajdt.internal.compiler.problem.AjProblemReporter.handle(AjProblemReporter.java:308) + at org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemHandler.handle(ProblemHandler.java:154) + at org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter.handle(ProblemReporter.java:1735) + at org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter.isClassPathCorrect(ProblemReporter.java:3531) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.cacheMissingBinaryType(LookupEnvironment.java:189) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.resolve(UnresolvedReferenceBinding.java:52) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.resolveType(BinaryTypeBinding.java:99) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.PackageBinding.getTypeOrPackage(PackageBinding.java:167) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findImport(CompilationUnitScope.java:451) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findSingleImport(CompilationUnitScope.java:505) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.resolveSingleImport(CompilationUnitScope.java:698) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope.getTypeOrPackage(Scope.java:2487) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope.getType(Scope.java:2228) + at org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference.getTypeBinding(SingleTypeReference.java:44) + at org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference.resolveType(TypeReference.java:142) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.resolveTypesFor(SourceTypeBinding.java:1476) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.methodsBase(SourceTypeBinding.java:1185) + at org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding.methods(SourceTypeBinding.java:1757) + at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.fillDeclaredMembers(EclipseSourceType.java:244) + at org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceType.getDeclaredMethods(EclipseSourceType.java:395) + at org.aspectj.weaver.ReferenceType.getDeclaredMethods(ReferenceType.java:770) + at org.aspectj.weaver.ResolvedType.lookupMethod(ResolvedType.java:534) + at org.aspectj.weaver.World.resolve(World.java:632) + at org.aspectj.weaver.MemberImpl.resolve(MemberImpl.java:95) + at org.aspectj.weaver.JoinPointSignatureIterator.addSignaturesUpToFirstDefiningMember(JoinPointSignatureIterator.java:112) + at org.aspectj.weaver.JoinPointSignatureIterator.(JoinPointSignatureIterator.java:49) + at org.aspectj.weaver.MemberImpl.getJoinPointSignatures(MemberImpl.java:515) + at org.aspectj.weaver.patterns.SignaturePattern.matches(SignaturePattern.java:316) + at org.aspectj.weaver.patterns.KindedPointcut.matchInternal(KindedPointcut.java:202) + at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:137) + at org.aspectj.weaver.patterns.AndPointcut.matchInternal(AndPointcut.java:51) + at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:137) + at org.aspectj.weaver.patterns.OrPointcut.matchInternal(OrPointcut.java:50) + at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:137) + at org.aspectj.weaver.patterns.OrPointcut.matchInternal(OrPointcut.java:50) + at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:137) + at org.aspectj.weaver.patterns.OrPointcut.matchInternal(OrPointcut.java:50) + at org.aspectj.weaver.patterns.Pointcut.match(Pointcut.java:137) + at org.aspectj.weaver.ShadowMunger.match(ShadowMunger.java:113) + at org.aspectj.weaver.Advice.match(Advice.java:109) + at org.aspectj.weaver.bcel.BcelAdvice.match(BcelAdvice.java:149) + at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:3116) + at org.aspectj.weaver.bcel.BcelClassWeaver.matchInvokeInstruction(BcelClassWeaver.java:3064) + at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:2765) + at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:2543) + at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:474) + at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:100) + at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1687) + at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1631) + at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1394) + at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1180) + at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:514) + at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.queueForWeaving(AjPipeliningCompilerAdapter.java:447) + at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterProcessing(AjPipeliningCompilerAdapter.java:432) + at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$after$org_aspectj_ajdt_internal_compiler_CompilerAdapter$5$6b855184(CompilerAdapter.aj:98) + at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:652) + at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:392) + at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1021) + at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:268) + at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:181) + at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112) + at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60) + at org.aspectj.tools.ajc.Main.run(Main.java:371) + at org.aspectj.tools.ajc.Main.runMain(Main.java:248) + at org.codehaus.mojo.aspectj.AbstractAjcCompiler.execute(AbstractAjcCompiler.java:360) + at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:107) + at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:195) + at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148) + at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:140) + at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) + at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) + at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) + at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) + at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:316) + at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:153) + at org.apache.maven.cli.MavenCli.execute(MavenCli.java:451) + at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:188) + at org.apache.maven.cli.MavenCli.main(MavenCli.java:134) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) + at java.lang.reflect.Method.invoke(Method.java:597) + at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) + at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) + at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) + at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) + +info woven class org.springframework.persistence.document.MongoEntityOperations (from /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java) +info compiling /Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java +error at (no source information available) +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:1:0::0 The type com.mongodb.DBCollection cannot be resolved. It is indirectly referenced from required .class files +error at (no source information available) +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:1:0::0 The type com.mongodb.DBObject cannot be resolved. It is indirectly referenced from required .class files +error at import com.mongodb.BasicDBObject; + ^^^^^^^^^^^^^^^^^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:3:0::0 The import com.mongodb.BasicDBObject cannot be resolved +error at import com.mongodb.DBCollection; + ^^^^^^^^^^^^^^^^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:4:0::0 The import com.mongodb.DBCollection cannot be resolved +error at import com.mongodb.DBObject; + ^^^^^^^^^^^^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:5:0::0 The import com.mongodb.DBObject cannot be resolved +error at import com.mongodb.MongoException; + ^^^^^^^^^^^^^^^^^^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:6:0::0 The import com.mongodb.MongoException cannot be resolved +error at DBObject q = new BasicDBObject(); +^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:35:0::0 DBObject cannot be resolved to a type +error at DBObject q = new BasicDBObject(); + ^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:35:0::0 BasicDBObject cannot be resolved to a type +error at DBObject dbo = mongoTemplate.getCollection(collection).findOne(q); +^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:38:0::0 DBObject cannot be resolved to a type +error at } catch (MongoException ex) { + ^^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:57:0::0 MongoException cannot be resolved to a type +error at throw new DataAccessResourceFailureException("Can't read from Mongo", ex); + +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:58:0::0 ex cannot be resolved +error at DBCollection dbc = mongoTemplate.getCollection(collection); +^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:90:0::0 DBCollection cannot be resolved to a type +error at DBObject dbo = mapChangeSetToDbObject(cs); +^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:91:0::0 DBObject cannot be resolved to a type +error at DBCollection dbc = mongoTemplate.getCollection(collection); +^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:101:0::0 DBCollection cannot be resolved to a type +error at DBObject dbo = mapChangeSetToDbObject(cs); +^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:102:0::0 DBObject cannot be resolved to a type +error at BasicDBObject dbo = new BasicDBObject(); +^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:113:0::0 BasicDBObject cannot be resolved to a type +error at BasicDBObject dbo = new BasicDBObject(); + ^^^^^^^^ +/Users/olivergierke/Documents/workspace/spring-data-document/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java:113:0::0 BasicDBObject cannot be resolved to a type +warning at /Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar!org/springframework/orm/jpa/aspectj/JpaExceptionTranslatorAspect.class:14::0 advice defined in org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect has not been applied [Xlint:adviceDidNotMatch] +warning at /Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar!org/springframework/scheduling/aspectj/AbstractAsyncExecutionAspect.class:52::0 advice defined in org.springframework.scheduling.aspectj.AbstractAsyncExecutionAspect has not been applied [Xlint:adviceDidNotMatch] +warning at org/springframework/persistence/support/AbstractDeferredUpdateMixinFields.aj:53::0 advice defined in org.springframework.persistence.support.AbstractDeferredUpdateMixinFields has not been applied [Xlint:adviceDidNotMatch] +warning at org/springframework/persistence/support/AbstractDeferredUpdateMixinFields.aj:66::0 advice defined in org.springframework.persistence.support.AbstractDeferredUpdateMixinFields has not been applied [Xlint:adviceDidNotMatch] +warning at org/springframework/persistence/support/AbstractDeferredUpdateMixinFields.aj:111::0 advice defined in org.springframework.persistence.support.AbstractDeferredUpdateMixinFields has not been applied [Xlint:adviceDidNotMatch] +warning at /Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-aspects/1.0.0.BUILD-SNAPSHOT/spring-data-commons-aspects-1.0.0.BUILD-SNAPSHOT.jar!org/springframework/persistence/StoreSpanning.class:61::0 advice defined in org.springframework.persistence.StoreSpanning has not been applied [Xlint:adviceDidNotMatch] +warning at /Users/olivergierke/.m2/repository/org/springframework/data/spring-data-commons-aspects/1.0.0.BUILD-SNAPSHOT/spring-data-commons-aspects-1.0.0.BUILD-SNAPSHOT.jar!org/springframework/persistence/StoreSpanning.class:116::0 advice defined in org.springframework.persistence.StoreSpanning has not been applied [Xlint:adviceDidNotMatch] +warning at org/springframework/mock/staticmock/AnnotationDrivenStaticEntityMockingControl.aj:64::0 advice defined in org.springframework.mock.staticmock.AnnotationDrivenStaticEntityMockingControl has not been applied [Xlint:adviceDidNotMatch] +warning at /Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar!org/springframework/mock/staticmock/AbstractMethodMockingControl.class:160::0 advice defined in org.springframework.mock.staticmock.AbstractMethodMockingControl has not been applied [Xlint:adviceDidNotMatch] +warning at /Users/olivergierke/.m2/repository/org/springframework/spring-aspects/3.0.5.RELEASE/spring-aspects-3.0.5.RELEASE.jar!org/springframework/mock/staticmock/AbstractMethodMockingControl.class:169::0 advice defined in org.springframework.mock.staticmock.AbstractMethodMockingControl has not been applied [Xlint:adviceDidNotMatch] diff --git a/pom.xml.orig b/pom.xml.orig new file mode 100644 index 000000000..9ea80389a --- /dev/null +++ b/pom.xml.orig @@ -0,0 +1,293 @@ + + + 4.0.0 + org.springframework.data + spring-data-document-dist + Spring Data Document Distribution + 1.0.0.BUILD-SNAPSHOT + pom + + spring-data-document-parent + spring-data-document-core + spring-data-mongodb +<<<<<<< Updated upstream + spring-data-mongodb-cross-store + spring-data-mongodb-log4j +======= + +>>>>>>> Stashed changes + spring-data-couchdb + + + + + trisberg + Thomas Risberg + trisberg at vmware.com + SpringSource + http://www.SpringSource.com + + Project Admin + Developer + + -5 + + + mpollack + Mark Pollack + mpollack at vmware.com + SpringSource + http://www.SpringSource.com + + Project Admin + Developer + + -5 + + + ogierke + Oliver Gierke + ogierke at vmware.com + SpringSource + http://www.springsource.com + + Developer + + +1 + + + jbrisbin + Jon Brisbin + jbrisbin at vmware.com + SpringSource + http://www.springsource.com + + Developer + + -6 + + + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0 + + Copyright 2010 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 + + http://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. + + + + + + UTF-8 + + spring-data-document + Spring Data + DATADOC + ${project.version} + snapshot + ${dist.id}-${dist.version} + ${dist.finalName}.zip + target/${dist.fileName} + dist.springframework.org + + + + + + + org.springframework.build.aws + org.springframework.build.aws.maven + 3.1.0.RELEASE + + + + + + maven-compiler-plugin + + 1.6 + 1.6 + + + + + com.agilejava.docbkx + docbkx-maven-plugin + 2.0.7 + + + + generate-html + generate-pdf + + pre-site + + + + + org.docbook + docbook-xml + 4.4 + runtime + + + + index.xml + true + ${project.basedir}/src/docbkx/resources/xsl/fopdf.xsl + css/html.css + false + ${project.basedir}/src/docbkx/resources/xsl/html.xsl + 1 + 1 + + + + + version + ${pom.version} + + + + + + + + + + + + + + + + + + + + + + + maven-javadoc-plugin + 2.5 + + true + true +
Spring Data Graph
+ 1.6 + true + ${project.basedir}/src/main/javadoc + ${project.basedir}/src/main/javadoc/overview.html + ${project.basedir}/src/main/javadoc/spring-javadoc.css + + true + + http://static.springframework.org/spring/docs/3.0.x/javadoc-api + http://java.sun.com/javase/6/docs/api + http://api.mongodb.org/java/2.3 + +
+
+ + maven-assembly-plugin + 2.2-beta-5 + false + + + distribution + + single + + package + + + ${project.basedir}/src/assembly/distribution.xml + + false + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 1.4 + + + upload-dist + deploy + + + + + + + + + run + + + + + + org.springframework.build + org.springframework.build.aws.ant + 3.0.5.RELEASE + + + net.java.dev.jets3t + jets3t + 0.7.2 + + + +
+ + ${dist.finalName} +
+ + + + http://www.springsource.com/spring-data + + static.springframework.org + + scp://static.springframework.org/var/www/domains/springframework.org/static/htdocs/spring-data/data-document/snapshot-site/ + + + + spring-milestone + Spring Milestone Repository + s3://maven.springframework.org/milestone + + + spring-snapshot + Spring Snapshot Repository + s3://maven.springframework.org/snapshot + + + +
diff --git a/spring-data-mongodb/.classpath.orig b/spring-data-mongodb/.classpath.orig new file mode 100644 index 000000000..6143e5592 --- /dev/null +++ b/spring-data-mongodb/.classpath.orig @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java index ac8031e1d..1720e88d1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/MongoTemplate.java @@ -18,8 +18,11 @@ package org.springframework.data.document.mongodb; import static org.springframework.data.document.mongodb.query.Criteria.*; +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -40,8 +43,6 @@ import com.mongodb.util.JSON; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.types.ObjectId; -import org.springframework.beans.ConfigurablePropertyAccessor; -import org.springframework.beans.PropertyAccessorFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; @@ -65,7 +66,6 @@ import org.springframework.data.document.mongodb.query.Query; import org.springframework.data.document.mongodb.query.QueryMapper; import org.springframework.data.document.mongodb.query.Update; import org.springframework.data.mapping.MappingBeanHelper; -import org.springframework.data.mapping.context.MappingContextAware; import org.springframework.data.mapping.model.MappingContext; import org.springframework.data.mapping.model.MappingException; import org.springframework.data.mapping.model.PersistentEntity; @@ -81,7 +81,7 @@ import org.springframework.util.Assert; * @author Mark Pollack * @author Oliver Gierke */ -public class MongoTemplate implements InitializingBean, MongoOperations, ApplicationEventPublisherAware, MappingContextAware { +public class MongoTemplate implements InitializingBean, MongoOperations, ApplicationEventPublisherAware { private static final Log LOGGER = LogFactory.getLog(MongoTemplate.class); @@ -99,10 +99,11 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica */ private WriteResultChecking writeResultChecking = WriteResultChecking.NONE; - private MongoConverter mongoConverter; - private MappingContext mappingContext; + private final MongoConverter mongoConverter; + private final MappingContext> mappingContext; private final Mongo mongo; private final MongoExceptionTranslator exceptionTranslator = new MongoExceptionTranslator(); + private final QueryMapper mapper; private String defaultCollectionName; private String databaseName; @@ -163,27 +164,31 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica this.mongo = mongo; this.databaseName = databaseName; this.writeConcern = writeConcern; + this.mongoConverter = mongoConverter == null ? getDefaultMongoConverter() : mongoConverter; + + if (this.mongoConverter instanceof MappingMongoConverter) { + initializeMappingMongoConverter((MappingMongoConverter) this.mongoConverter); + } + + this.mappingContext = this.mongoConverter.getMappingContext(); + this.mapper = new QueryMapper(this.mongoConverter); + if (writeResultChecking != null) { this.writeResultChecking = writeResultChecking; } - if (mongoConverter == null) { - SimpleMongoConverter smc = new SimpleMongoConverter(); - smc.afterPropertiesSet(); - setMongoConverter(smc); - } else { - setMongoConverter(mongoConverter); - } - //setMongoConverter(mongoConverter == null ? new SimpleMongoConverter() : mongoConverter); + } + + private final MongoConverter getDefaultMongoConverter() { + + SimpleMongoConverter converter = new SimpleMongoConverter(); + converter.afterPropertiesSet(); + return converter; } public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.eventPublisher = applicationEventPublisher; } - public void setMappingContext(MappingContext mappingContext) { - this.mappingContext = mappingContext; - } - /** * Sets the username to use to connect to the Mongo database * @@ -606,30 +611,25 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica * @see org.springframework.data.document.mongodb.MongoOperations#insertList(java.util.List, org.springframework.data.document.mongodb.MongoWriter) */ public void insertList(List listToSave, MongoWriter writer) { - if (null != mappingContext) { - Map> objs = new HashMap>(); - for (Object o : listToSave) { - PersistentEntity entity = mappingContext.getPersistentEntity(o.getClass()); - if (null != entity && entity instanceof MongoPersistentEntity) { - @SuppressWarnings("unchecked") - String coll = ((MongoPersistentEntity) entity).getCollection(); - List objList = objs.get(coll); - if (null == objList) { - objList = new ArrayList(); - objs.put(coll, objList); - } - objList.add(o); - } else { - continue; - } - } - for (Map.Entry> entry : objs.entrySet()) { - insertList(entry.getKey(), entry.getValue()); + Map> objs = new HashMap>(); + + for (Object o : listToSave) { + + MongoPersistentEntity entity = mappingContext.getPersistentEntity(o.getClass()); + String collection = entity == null ? getDefaultCollectionName() : entity.getCollection(); + + List objList = objs.get(collection); + if (null == objList) { + objList = new ArrayList(); + objs.put(collection, objList); } - return; + objList.add(o); + + } + + for (Map.Entry> entry : objs.entrySet()) { + insertList(entry.getKey(), entry.getValue()); } - - insertList(getDefaultCollectionName(), listToSave, writer); } /* (non-Javadoc) @@ -865,22 +865,26 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica } public void remove(Query query, Class targetClass) { + Assert.notNull(query); remove(getEntityCollection(targetClass), query, targetClass); } + + private PersistentEntity getPersistentEntity(Class type) { + return type == null ? null : mappingContext.getPersistentEntity(type); + } public void remove(String collectionName, final Query query, Class targetClass) { if (query == null) { throw new InvalidDataAccessApiUsageException("Query passed in to remove can't be null"); } final DBObject queryObject = query.getQueryObject(); - PersistentEntity entity = getPersistentEntity(targetClass); - final QueryMapper queryMapper = new QueryMapper(queryObject, entity, mongoConverter); + final PersistentEntity entity = getPersistentEntity(targetClass); if (LOGGER.isDebugEnabled()) { LOGGER.debug("remove using query: " + queryObject); } execute(collectionName, new CollectionCallback() { public Void doInCollection(DBCollection collection) throws MongoException, DataAccessException { - DBObject dboq = queryMapper.getMappedObject(); + DBObject dboq = mapper.getMappedObject(queryObject, entity); WriteResult wr = null; if (writeConcern == null) { wr = collection.remove(dboq); @@ -931,14 +935,6 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica return MongoDbUtils.getDB(mongo, databaseName, username, password == null ? null : password.toCharArray()); } - protected PersistentEntity getPersistentEntity(Class targetClass) { - if (null != targetClass && null != mappingContext) { - return mappingContext.getPersistentEntity(targetClass); - } else { - return null; - } - } - protected void maybeEmitEvent(MongoMappingEvent event) { if (null != eventPublisher) { eventPublisher.publishEvent(event); @@ -979,9 +975,10 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica if (readerToUse == null) { readerToUse = this.mongoConverter; } - PersistentEntity entity = getPersistentEntity(targetClass); - QueryMapper queryMapper = new QueryMapper(query, entity, readerToUse); - return execute(new FindOneCallback(queryMapper.getMappedObject(), fields), + PersistentEntity entity = mappingContext.getPersistentEntity(targetClass); + DBObject mappedQuery = mapper.getMappedObject(query, entity); + + return execute(new FindOneCallback(mappedQuery, fields), new ReadDbObjectCallback(readerToUse, targetClass), collectionName); } @@ -1006,12 +1003,11 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica * @return the List of converted objects. */ protected List doFind(String collectionName, DBObject query, DBObject fields, Class targetClass, CursorPreparer preparer) { - PersistentEntity entity = getPersistentEntity(targetClass); - QueryMapper queryMapper = new QueryMapper(query, entity, mongoConverter); + PersistentEntity entity = mappingContext.getPersistentEntity(targetClass); if (LOGGER.isDebugEnabled()) { LOGGER.debug("find using query: " + query + " fields: " + fields + " for class: " + targetClass); } - return executeEach(new FindCallback(queryMapper.getMappedObject(), fields), + return executeEach(new FindCallback(mapper.getMappedObject(query, entity), fields), preparer, new ReadDbObjectCallback(mongoConverter, targetClass), collectionName); @@ -1030,12 +1026,11 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica * @return the List of converted objects. */ protected List doFind(String collectionName, DBObject query, DBObject fields, Class targetClass, MongoReader reader) { - PersistentEntity entity = getPersistentEntity(targetClass); - QueryMapper queryMapper = new QueryMapper(query, entity, reader); if (LOGGER.isDebugEnabled()) { LOGGER.debug("find using query: " + query + " fields: " + fields + " for class: " + targetClass); } - return executeEach(new FindCallback(queryMapper.getMappedObject(), fields), + PersistentEntity entity = mappingContext.getPersistentEntity(targetClass); + return executeEach(new FindCallback(mapper.getMappedObject(query, entity), fields), null, new ReadDbObjectCallback(reader, targetClass), collectionName); @@ -1074,44 +1069,31 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica if (readerToUse == null) { readerToUse = this.mongoConverter; } - PersistentEntity entity = null; - if (null != mappingContext) { - entity = mappingContext.getPersistentEntity(targetClass); - } - QueryMapper queryMapper = new QueryMapper(query, entity, readerToUse); if (LOGGER.isDebugEnabled()) { LOGGER.debug("findAndRemove using query: " + query + " fields: " + fields + " sort: " + sort + " for class: " + targetClass); } - return execute(new FindAndRemoveCallback(queryMapper.getMappedObject(), fields, sort), + PersistentEntity entity = mappingContext.getPersistentEntity(targetClass); + return execute(new FindAndRemoveCallback(mapper.getMappedObject(query, entity), fields, sort), new ReadDbObjectCallback(readerToUse, targetClass), collectionName); } protected Object getIdValue(Object object) { - if (null != mappingContext) { - PersistentEntity entity = mappingContext.getPersistentEntity(object.getClass()); - if (null != entity) { - PersistentProperty idProp = entity.getIdProperty(); - if (null != idProp) { - try { - return MappingBeanHelper.getProperty(object, idProp, Object.class, true); - } catch (IllegalAccessException e) { - throw new MappingException(e.getMessage(), e); - } catch (InvocationTargetException e) { - throw new MappingException(e.getMessage(), e); - } - } - } + + PersistentEntity entity = mappingContext.getPersistentEntity(object.getClass()); + PersistentProperty idProp = entity.getIdProperty(); + + if (idProp == null) { + throw new MappingException("No id property found for object of type " + entity.getType().getName()); } - - ConfigurablePropertyAccessor bw = PropertyAccessorFactory.forDirectFieldAccess(object); - MongoPropertyDescriptor idDescriptor = new MongoPropertyDescriptors(object.getClass()).getIdDescriptor(); - - if (idDescriptor == null) { - return null; + + try { + return MappingBeanHelper.getProperty(object, idProp, Object.class, true); + } catch (IllegalAccessException e) { + throw new MappingException(e.getMessage(), e); + } catch (InvocationTargetException e) { + throw new MappingException(e.getMessage(), e); } - return bw.getPropertyValue(idDescriptor.getName()); - } /** @@ -1126,38 +1108,107 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica return; } - if (null != mappingContext) { - PersistentEntity entity = mappingContext.getPersistentEntity(savedObject.getClass()); - if (null != entity) { - PersistentProperty idProp = entity.getIdProperty(); - if (null != idProp) { - try { - MappingBeanHelper.setProperty(savedObject, idProp, id); - return; - } catch (IllegalAccessException e) { - throw new MappingException(e.getMessage(), e); - } catch (InvocationTargetException e) { - throw new MappingException(e.getMessage(), e); - } - } - } + PersistentProperty idProp = getIdPropertyFor(savedObject.getClass()); + + if (idProp == null) { + return; } + + try { + MappingBeanHelper.setProperty(savedObject, idProp, id); + return; + } catch (IllegalAccessException e) { + throw new MappingException(e.getMessage(), e); + } catch (InvocationTargetException e) { + throw new MappingException(e.getMessage(), e); + } + } - ConfigurablePropertyAccessor bw = PropertyAccessorFactory.forDirectFieldAccess(savedObject); - MongoPropertyDescriptor idDescriptor = new MongoPropertyDescriptors(savedObject.getClass()).getIdDescriptor(); + private PersistentProperty getIdPropertyFor(Class type) { + return mappingContext.getPersistentEntity(type).getIdProperty(); + } - if (idDescriptor == null) { + /** + * Substitutes the id key if it is found in he query. Any 'id' keys will be replaced with '_id' and the value converted + * to an ObjectId if possible. This conversion should match the way that the id fields are converted during read + * operations. + * + * @param query + * @param targetClass + * @param reader + */ + protected void substituteMappedIdIfNecessary(DBObject query, Class targetClass, MongoReader reader) { + MongoConverter converter = null; + if (reader instanceof SimpleMongoConverter) { + converter = (MongoConverter) reader; + } + else if (reader instanceof MappingMongoConverter) { + converter = (MappingMongoConverter) reader; + } + else { return; } - - if (bw.getPropertyValue(idDescriptor.getName()) == null) { - Object target = null; - if (id instanceof ObjectId) { - target = this.mongoConverter.convertObjectId((ObjectId) id, idDescriptor.getPropertyType()); - } else { - target = id; + String idKey = null; + if (query.containsField("id")) { + idKey = "id"; + } + if (query.containsField("_id")) { + idKey = "_id"; + } + if (idKey == null) { + // no ids in this query + return; + } + MongoPropertyDescriptor descriptor; + try { + MongoPropertyDescriptor mpd = new MongoPropertyDescriptor(new PropertyDescriptor(idKey, targetClass), targetClass); + descriptor = mpd; + } catch (IntrospectionException e) { + // no property descriptor for this key - try the other + try { + String theOtherIdKey = "id".equals(idKey) ? "_id" : "id"; + MongoPropertyDescriptor mpd2 = new MongoPropertyDescriptor(new PropertyDescriptor(theOtherIdKey, targetClass), targetClass); + descriptor = mpd2; + } catch (IntrospectionException e2) { + // no property descriptor for this key either - bail + return; + } + } + if (descriptor.isIdProperty() && descriptor.isOfIdType()) { + Object value = query.get(idKey); + if (value instanceof DBObject) { + DBObject dbo = (DBObject) value; + if (dbo.containsField("$in")) { + List ids = new ArrayList(); + int count = 0; + for (Object o : (Object[])dbo.get("$in")) { + count++; + ObjectId newValue = convertIdValue(converter, o); + if (newValue != null) { + ids.add(newValue); + } + } + if (ids.size() > 0 && ids.size() != count) { + throw new InvalidDataAccessApiUsageException("Inconsistent set of id values provided " + + Arrays.asList((Object[])dbo.get("$in"))); + } + if (ids.size() > 0) { + dbo.removeField("$in"); + dbo.put("$in", ids.toArray()); + } + } + query.removeField(idKey); + query.put(MongoPropertyDescriptor.ID_KEY, value); + } + else { + ObjectId newValue = convertIdValue(converter, value); + query.removeField(idKey); + if (newValue != null) { + query.put(MongoPropertyDescriptor.ID_KEY, newValue); + } else { + query.put(MongoPropertyDescriptor.ID_KEY, value); + } } - bw.setPropertyValue(idDescriptor.getName(), target); } } @@ -1190,18 +1241,14 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica return null; } - private String getEntityCollection(Class clazz) { - if (null != mappingContext) { - PersistentEntity entity = mappingContext.getPersistentEntity(clazz); - if (entity == null) { - entity = mappingContext.addPersistentEntity(clazz); - } - if (null != entity && entity instanceof MongoPersistentEntity) { - return ((MongoPersistentEntity) entity).getCollection(); - } - } - // Otherwise, return the default for this template. - return getRequiredDefaultCollectionName(); + private String getEntityCollection(Class clazz) { + + if (clazz == null) { + return getDefaultCollectionName(); + } + + MongoPersistentEntity entity = mappingContext.getPersistentEntity(clazz); + return entity.getCollection(); } /** @@ -1394,13 +1441,6 @@ public class MongoTemplate implements InitializingBean, MongoOperations, Applica } } - public void setMongoConverter(MongoConverter converter) { - this.mongoConverter = converter; - if (null != converter && converter instanceof MappingMongoConverter) { - initializeMappingMongoConverter((MappingMongoConverter) mongoConverter); - } - } - public void setWriteResultChecking(WriteResultChecking resultChecking) { this.writeResultChecking = resultChecking; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java index 3ee5bcd71..4307c6f6b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/config/AbstractMongoConfiguration.java @@ -29,8 +29,6 @@ import org.springframework.data.document.mongodb.convert.MappingMongoConverter; import org.springframework.data.document.mongodb.mapping.Document; import org.springframework.data.document.mongodb.mapping.MongoMappingContext; import org.springframework.data.document.mongodb.mapping.MongoPersistentEntityIndexCreator; -import org.springframework.data.document.mongodb.mapping.event.LoggingEventListener; -import org.springframework.data.document.mongodb.mapping.event.MongoMappingEvent; import org.springframework.data.mapping.context.MappingContextAwareBeanPostProcessor; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; @@ -47,7 +45,7 @@ public abstract class AbstractMongoConfiguration { @Bean public abstract MongoTemplate mongoTemplate() throws Exception; - public String getMappingBasePackage() { + public String getMappingBasePackage() { return ""; } @@ -64,7 +62,7 @@ public abstract class AbstractMongoConfiguration { Set> initialEntitySet = new HashSet>(); for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { initialEntitySet.add(ClassUtils.forName(candidate.getBeanClassName(), mappingContext.getClass().getClassLoader())); - } + } mappingContext.setInitialEntitySet(initialEntitySet); } return mappingContext; @@ -80,7 +78,7 @@ public abstract class AbstractMongoConfiguration { /** * Hook that allows post-processing after the MappingMongoConverter has been - * successfully created. + * successfully created. * @param converter */ protected void afterMappingMongoConverterCreation(MappingMongoConverter converter) { @@ -94,7 +92,7 @@ public abstract class AbstractMongoConfiguration { } @Bean MongoPersistentEntityIndexCreator mongoPersistentEntityIndexCreator() throws Exception { - MongoPersistentEntityIndexCreator indexCreator = new MongoPersistentEntityIndexCreator(mongoMappingContext(), mongoTemplate() ); + MongoPersistentEntityIndexCreator indexCreator = new MongoPersistentEntityIndexCreator(mongoMappingContext(), mongoTemplate() ); return indexCreator; } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java index f672d0684..4a3ecac2a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MappingMongoConverter.java @@ -43,7 +43,6 @@ import org.apache.commons.logging.LogFactory; import org.bson.types.ObjectId; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.expression.BeanFactoryResolver; @@ -54,6 +53,7 @@ import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.converter.GenericConverter.ConvertiblePair; import org.springframework.core.convert.support.ConversionServiceFactory; import org.springframework.core.convert.support.GenericConversionService; +import org.springframework.data.document.mongodb.mapping.BasicMongoPersistentEntity; import org.springframework.data.mapping.AssociationHandler; import org.springframework.data.mapping.MappingBeanHelper; import org.springframework.data.mapping.PropertyHandler; @@ -85,7 +85,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext protected final GenericConversionService conversionService = ConversionServiceFactory.createDefaultConversionService(); protected final Set customTypeMapping = new HashSet(); - protected final MappingContext mappingContext; + protected final MappingContext> mappingContext; protected SpelExpressionParser spelExpressionParser = new SpelExpressionParser(); protected ApplicationContext applicationContext; protected boolean useFieldAccessOnly = true; @@ -97,7 +97,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext * * @param mappingContext */ - public MappingMongoConverter(MappingContext mappingContext) { + public MappingMongoConverter(MappingContext> mappingContext) { this.mappingContext = mappingContext; this.conversionService.removeConvertible(Object.class, String.class); } @@ -146,22 +146,14 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext return null; } - public MappingContext getMappingContext() { + public MappingContext> getMappingContext() { return mappingContext; } - public Mongo getMongo() { - return mongo; - } - public void setMongo(Mongo mongo) { this.mongo = mongo; } - public String getDefaultDatabase() { - return defaultDatabase; - } - public void setDefaultDatabase(String defaultDatabase) { this.defaultDatabase = defaultDatabase; } @@ -216,9 +208,9 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext } // Retrieve persistent entity info - PersistentEntity persistentEntity = mappingContext.getPersistentEntity(clazz); + PersistentEntity persistentEntity = (PersistentEntity) mappingContext.getPersistentEntity(clazz); if (persistentEntity == null) { - persistentEntity = mappingContext.addPersistentEntity(clazz); + throw new MappingException("No mapping metadata found for " + clazz.getName()); } return read(persistentEntity, dbo); @@ -283,7 +275,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext return; } - Object obj = getValueInternal(prop, dbo, spelCtx, prop.getValueAnnotation()); + Object obj = getValueInternal(prop, dbo, spelCtx, prop.getSpelExpression()); try { MappingBeanHelper.setProperty(instance, prop, obj, useFieldAccessOnly); } catch (IllegalAccessException e) { @@ -298,7 +290,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext entity.doWithAssociations(new AssociationHandler() { public void doWithAssociation(Association association) { PersistentProperty inverseProp = association.getInverse(); - Object obj = getValueInternal(inverseProp, dbo, spelCtx, inverseProp.getValueAnnotation()); + Object obj = getValueInternal(inverseProp, dbo, spelCtx, inverseProp.getSpelExpression()); try { MappingBeanHelper.setProperty(instance, inverseProp, obj); } catch (IllegalAccessException e) { @@ -336,12 +328,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext } if (null == entity) { - // Must not have explictly added this entity yet - entity = mappingContext.addPersistentEntity(obj.getClass()); - if (null == entity) { - // We can't map this entity for some reason - throw new MappingException("Unable to map entity " + obj); - } + throw new MappingException("No mapping metadata found for entity of type " + obj.getClass().getName()); } // Write the ID @@ -455,7 +442,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext if (null != dbref) { DBRef dbRef = createDBRef(propObjItem, dbref); dbList.add(dbRef); - } else if (type.isArray() && MappingBeanHelper.isSimpleType(type.getComponentType())) { + } else if (type.isArray() && MappingBeanHelper.isSimpleType(prop.getComponentType())) { dbList.add(propObjItem); } else if (propObjItem instanceof List) { List propObjColl = (List) propObjItem; @@ -478,7 +465,7 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext dbList.add(propObjItem); } else { BasicDBObject propDbObj = new BasicDBObject(); - write(propObjItem, propDbObj, mappingContext.getPersistentEntity(prop.getTypeInformation())); + write(propObjItem, propDbObj, mappingContext.getPersistentEntity(prop.getComponentType())); dbList.add(propDbObj); } } @@ -576,14 +563,14 @@ public class MappingMongoConverter implements MongoConverter, ApplicationContext } @SuppressWarnings({"unchecked"}) - protected Object getValueInternal(PersistentProperty prop, DBObject dbo, StandardEvaluationContext ctx, Value spelExpr) { + protected Object getValueInternal(PersistentProperty prop, DBObject dbo, StandardEvaluationContext ctx, String spelExpr) { String name = prop.getName(); Class propertyType = prop.getType(); Object o; if (null != spelExpr) { - Expression x = spelExpressionParser.parseExpression(spelExpr.value()); + Expression x = spelExpressionParser.parseExpression(spelExpr); o = x.getValue(ctx); } else { Object dbObj = dbo.get(name); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MongoConverter.java index 47daa9a46..93ad33810 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/MongoConverter.java @@ -18,6 +18,7 @@ package org.springframework.data.document.mongodb.convert; import org.bson.types.ObjectId; import org.springframework.data.document.mongodb.MongoReader; import org.springframework.data.document.mongodb.MongoWriter; +import org.springframework.data.mapping.model.MappingContext; public interface MongoConverter extends MongoWriter, MongoReader { @@ -40,4 +41,6 @@ public interface MongoConverter extends MongoWriter, MongoReader * @return */ public ObjectId convertObjectId(Object id); + + MappingContext getMappingContext(); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/SimpleMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/SimpleMongoConverter.java index 1dea81ef3..f66d7b3db 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/SimpleMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/convert/SimpleMongoConverter.java @@ -40,6 +40,9 @@ import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.support.ConversionServiceFactory; import org.springframework.core.convert.support.GenericConversionService; import org.springframework.data.document.mongodb.MongoPropertyDescriptors.MongoPropertyDescriptor; +import org.springframework.data.document.mongodb.mapping.MongoPersistentEntity; +import org.springframework.data.document.mongodb.mapping.SimpleMongoMappingContext; +import org.springframework.data.mapping.model.MappingContext; import org.springframework.util.Assert; import org.springframework.util.comparator.CompoundComparator; @@ -107,6 +110,7 @@ public class SimpleMongoConverter implements MongoConverter, InitializingBean { } private final GenericConversionService conversionService; + private final MappingContext> mappingContext; /** * Creates a {@link SimpleMongoConverter}. @@ -114,6 +118,14 @@ public class SimpleMongoConverter implements MongoConverter, InitializingBean { public SimpleMongoConverter() { this.conversionService = ConversionServiceFactory.createDefaultConversionService(); this.conversionService.removeConvertible(Object.class, String.class); + this.mappingContext = new SimpleMongoMappingContext(); + } + + /* (non-Javadoc) + * @see org.springframework.data.document.mongodb.convert.MongoConverter#getMappingContext() + */ + public MappingContext> getMappingContext() { + return mappingContext; } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/BasicMongoPersistentEntity.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/BasicMongoPersistentEntity.java new file mode 100644 index 000000000..0e14204d2 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/BasicMongoPersistentEntity.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2011 by the original author(s). + * + * 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 + * + * http://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.document.mongodb.mapping; + +import org.springframework.data.mapping.BasicPersistentEntity; +import org.springframework.data.mapping.model.MappingException; +import org.springframework.data.mapping.model.PersistentEntity; +import org.springframework.data.util.TypeInformation; +import org.springframework.util.StringUtils; + + +/** + * Mongo specific {@link PersistentEntity} implementation that adds Mongo specific meta-data such as the collection name + * and the like. + * + * @author Jon Brisbin + * @author Oliver Gierke + */ +public class BasicMongoPersistentEntity extends BasicPersistentEntity implements MongoPersistentEntity { + + private final String collection; + private final boolean isRootEntity; + + /** + * Creates a new {@link BasicMongoPersistentEntity} with the given {@link TypeInformation}. Will + * default the collection name to the entities simple type name. + * + * @param typeInformation + */ + public BasicMongoPersistentEntity(TypeInformation typeInformation) { + + super(typeInformation); + + Class rawType = typeInformation.getType(); + String fallback = rawType.getSimpleName().toLowerCase(); + + if (rawType.isAnnotationPresent(Document.class)) { + Document d = rawType.getAnnotation(Document.class); + this.collection = StringUtils.hasText(d.collection()) ? d.collection() : fallback; + this.isRootEntity = true; + } else { + this.collection = fallback; + this.isRootEntity = false; + } + } + + /** + * Returns the collection the entity should be stored in. + * + * @return + */ + public String getCollection() { + return collection; + } + + /* (non-Javadoc) + * @see org.springframework.data.mapping.BasicPersistentEntity#verify() + */ + @Override + public void verify() { + if (isRootEntity && idProperty == null) { + throw new MappingException(String.format("Root entity %s has to have an id property!", type.getName())); + } + } +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java index 4954aebae..3f41c9d0e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoMappingContext.java @@ -18,23 +18,18 @@ package org.springframework.data.document.mongodb.mapping; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; -import java.util.Collection; import java.util.Set; import org.bson.types.CodeWScope; import org.bson.types.ObjectId; -import org.springframework.data.mapping.BasicMappingContext; -import org.springframework.data.mapping.BasicPersistentEntity; -import org.springframework.data.mapping.BasicPersistentProperty; +import org.springframework.data.mapping.AbstractMappingContext; import org.springframework.data.mapping.MappingBeanHelper; -import org.springframework.data.mapping.model.MappingConfigurationException; -import org.springframework.data.mapping.model.MappingContext; import org.springframework.data.util.TypeInformation; /** * @author Jon Brisbin */ -public class MongoMappingContext extends BasicMappingContext { +public class MongoMappingContext extends AbstractMappingContext, MongoPersistentProperty> { public MongoMappingContext() { augmentSimpleTypes(); @@ -50,32 +45,16 @@ public class MongoMappingContext extends BasicMappingContext { } @Override - public boolean isAssociation(Field field, PropertyDescriptor descriptor) throws MappingConfigurationException { - if (field.isAnnotationPresent(DBRef.class)) { - return true; - } - return super.isAssociation(field, descriptor); + public MongoPersistentProperty createPersistentProperty(Field field, PropertyDescriptor descriptor, BasicMongoPersistentEntity owner) { + return new MongoPersistentProperty(field, descriptor, owner); } - + /* (non-Javadoc) - * @see org.springframework.data.mapping.BasicMappingContext#getPersistentEntities() + * @see org.springframework.data.mapping.BasicMappingContext#createPersistentEntity(org.springframework.data.util.TypeInformation, org.springframework.data.mapping.model.MappingContext) */ @Override - @SuppressWarnings("unchecked") - public Collection> getPersistentEntities() { - return (Collection>) super.getPersistentEntities(); - } - - @Override - public BasicPersistentProperty createPersistentProperty(Field field, PropertyDescriptor descriptor, - TypeInformation information) throws MappingConfigurationException { - return new MongoPersistentProperty(field, descriptor, information); + @SuppressWarnings("rawtypes") + protected BasicMongoPersistentEntity createPersistentEntity(TypeInformation typeInformation) { + return new BasicMongoPersistentEntity(typeInformation); } - - @Override - public BasicPersistentEntity createPersistentEntity(TypeInformation typeInformation, MappingContext mappingContext) - throws MappingConfigurationException { - return new MongoPersistentEntity(mappingContext, typeInformation); - } - } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntity.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntity.java index 4fba0adb0..5cc0e7e14 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntity.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntity.java @@ -1,69 +1,12 @@ -/* - * Copyright (c) 2011 by the original author(s). - * - * 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 - * - * http://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.document.mongodb.mapping; -import org.springframework.data.mapping.BasicPersistentEntity; -import org.springframework.data.mapping.model.MappingContext; import org.springframework.data.mapping.model.PersistentEntity; -import org.springframework.data.util.TypeInformation; /** - * Mongo specific {@link PersistentEntity} implementation that adds Mongo specific meta-data such as the collection name - * and the like. * - * @author Jon Brisbin * @author Oliver Gierke */ -public class MongoPersistentEntity extends BasicPersistentEntity { - - protected String collection; - - /** - * Creates a new {@link MongoPersistentEntity} with the given {@link MappingContext} and {@link TypeInformation}. Will - * default the collection name to the entities simple type name. - * - * @param mappingContext - * @param typeInformation - */ - public MongoPersistentEntity(MappingContext mappingContext, TypeInformation typeInformation) { - super(mappingContext, typeInformation); - this.collection = typeInformation.getType().getSimpleName().toLowerCase(); - if (typeInformation.getType().isAnnotationPresent(Document.class)) { - Document d = typeInformation.getType().getAnnotation(Document.class); - if (!"".equals(d.collection())) { - this.collection = d.collection(); - } - } - } - - /** - * Returns the collection the entity should be stored in. - * - * @return - */ - public String getCollection() { - if (null == collection) { - this.collection = type.getSimpleName().toLowerCase(); - } - return collection; - } - +public interface MongoPersistentEntity extends PersistentEntity { - public void setCollection(String collection) { - this.collection = collection; - } + String getCollection(); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java index fae0358db..e714068fd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/MongoPersistentEntityIndexCreator.java @@ -43,7 +43,7 @@ import org.springframework.data.mapping.model.PersistentProperty; import org.springframework.util.Assert; /** - * Component that inspects {@link MongoPersistentEntity} instances contained in the given {@link MongoMappingContext} + * Component that inspects {@link BasicMongoPersistentEntity} instances contained in the given {@link MongoMappingContext} * for indexing metadata and ensures the indexes to be available. * * @author Jon Brisbin @@ -81,15 +81,6 @@ public class MongoPersistentEntityIndexCreator implements ApplicationListener> SUPPORTED_ID_TYPES = new HashSet>(); private static final Set SUPPORTED_ID_PROPERTY_NAMES = new HashSet(); @@ -54,8 +53,16 @@ public class MongoPersistentProperty extends BasicPersistentProperty { * @param owningTypeInformation */ public MongoPersistentProperty(Field field, - PropertyDescriptor propertyDescriptor, TypeInformation owningTypeInformation) { - super(field, propertyDescriptor, owningTypeInformation); + PropertyDescriptor propertyDescriptor, MongoPersistentEntity owner) { + super(field, propertyDescriptor, owner); + } + + /* (non-Javadoc) + * @see org.springframework.data.mapping.FooBasicPersistentProperty#isAssociation() + */ + @Override + public boolean isAssociation() { + return field.isAnnotationPresent(DBRef.class) || super.isAssociation(); } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/SimpleMongoMappingContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/SimpleMongoMappingContext.java new file mode 100644 index 000000000..ae387dfc5 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/mapping/SimpleMongoMappingContext.java @@ -0,0 +1,75 @@ +package org.springframework.data.document.mongodb.mapping; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; + +import org.springframework.data.mapping.AbstractMappingContext; +import org.springframework.data.mapping.BasicPersistentEntity; +import org.springframework.data.mapping.AbstractPersistentProperty; +import org.springframework.data.util.TypeInformation; + +/** + * + * @author Oliver Gierke + */ +public class SimpleMongoMappingContext extends AbstractMappingContext, SimpleMongoMappingContext.SimplePersistentProperty> { + + /* (non-Javadoc) + * @see org.springframework.data.mapping.BasicMappingContext#createPersistentEntity(org.springframework.data.util.TypeInformation) + */ + @Override + @SuppressWarnings("rawtypes") + protected SimpleMongoPersistentEntity createPersistentEntity(TypeInformation typeInformation) { + return new SimpleMongoPersistentEntity(typeInformation); + } + + /* (non-Javadoc) + * @see org.springframework.data.mapping.BasicMappingContext#createPersistentProperty(java.lang.reflect.Field, java.beans.PropertyDescriptor, org.springframework.data.util.TypeInformation, org.springframework.data.mapping.BasicPersistentEntity) + */ + @Override + protected SimplePersistentProperty createPersistentProperty(Field field, PropertyDescriptor descriptor, SimpleMongoPersistentEntity owner) { + return new SimplePersistentProperty(field, descriptor, owner); + } + + static class SimplePersistentProperty extends AbstractPersistentProperty { + + private static final List ID_FIELD_NAMES = Arrays.asList("id", "_id"); + + /** + * Creates a new {@link SimplePersistentProperty}. + * + * @param field + * @param propertyDescriptor + * @param information + */ + public SimplePersistentProperty(Field field, PropertyDescriptor propertyDescriptor, SimpleMongoPersistentEntity owner) { + super(field, propertyDescriptor, owner); + } + + /* (non-Javadoc) + * @see org.springframework.data.mapping.BasicPersistentProperty#isIdProperty() + */ + public boolean isIdProperty() { + return ID_FIELD_NAMES.contains(field.getName()); + } + } + + static class SimpleMongoPersistentEntity extends BasicPersistentEntity implements MongoPersistentEntity { + + /** + * @param information + */ + public SimpleMongoPersistentEntity(TypeInformation information) { + super(information); + } + + /* (non-Javadoc) + * @see org.springframework.data.document.mongodb.mapping.MongoPersistentEntity#getCollection() + */ + public String getCollection() { + return type.getSimpleName(); + } + } +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryMapper.java index a687e53af..d1cb62af1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/QueryMapper.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.springframework.data.document.mongodb.query; import java.util.ArrayList; @@ -23,30 +22,41 @@ import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.bson.types.ObjectId; import org.springframework.core.convert.ConversionFailedException; -import org.springframework.data.document.mongodb.MongoReader; import org.springframework.data.document.mongodb.convert.MongoConverter; import org.springframework.data.mapping.model.PersistentEntity; +import org.springframework.util.Assert; /** * A helper class to encapsulate any modifications of a Query object before it gets submitted to the database. * * @author Jon Brisbin + * @author Oliver Gierke */ -public class QueryMapper { +public class QueryMapper { - final private DBObject query; - final private PersistentEntity entity; - final private MongoReader reader; + private final MongoConverter converter; - public QueryMapper(DBObject query, PersistentEntity entity, MongoReader reader) { - this.query = query; - this.entity = entity; - this.reader = (MongoReader) reader; + /** + * Creates a new {@link QueryMapper} with the given {@link MongoConverter}. + * + * @param converter + */ + public QueryMapper(MongoConverter converter) { + Assert.notNull(converter); + this.converter = converter; } - public DBObject getMappedObject() { + /** + * Replaces the property keys used in the given {@link DBObject} with the appropriate keys by using the + * {@link PersistentEntity} metadata. + * + * @param query + * @param entity + * @return + */ + public DBObject getMappedObject(DBObject query, PersistentEntity entity) { String idKey = null; - if (null != entity && null != entity.getIdProperty()) { + if (null != entity && entity.getIdProperty() != null) { idKey = entity.getIdProperty().getName(); } else if (query.containsField("id")) { idKey = "id"; @@ -63,8 +73,8 @@ public class QueryMapper { if ("$in".equals(key)) { List ids = new ArrayList(); for (Object id : (Object[]) ((DBObject) value).get("$in")) { - if (null != reader && !(id instanceof ObjectId)) { - ObjectId oid = ((MongoConverter) reader).convertObjectId(id); + if (null != converter && !(id instanceof ObjectId)) { + ObjectId oid = converter.convertObjectId(id); ids.add(oid); } else { ids.add(id); @@ -72,9 +82,9 @@ public class QueryMapper { } newDbo.put("$in", ids.toArray(new ObjectId[ids.size()])); } - } else if (null != reader) { + } else if (null != converter) { try { - value = ((MongoConverter) reader).convertObjectId(value); + value = converter.convertObjectId(value); } catch (ConversionFailedException ignored) { } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/ConvertingParameterAccessor.java index 0b9cbe7cb..259c97b3b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/ConvertingParameterAccessor.java @@ -15,7 +15,9 @@ */ package org.springframework.data.document.mongodb.repository; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; @@ -89,7 +91,7 @@ public class ConvertingParameterAccessor implements ParameterAccessor { DBObject result = new BasicDBObject(); writer.write(value.getClass().isEnum() ? new EnumValueHolder((Enum) value) : new ValueHolder(value), result); - return result.get("value"); + return ((DBObject) result.get("value")).get("value"); } /** @@ -146,15 +148,15 @@ public class ConvertingParameterAccessor implements ParameterAccessor { */ private static class ValueHolder { - private Object value; + private Map value = new HashMap(); public ValueHolder(Object value) { - this.value = value; + this.value.put("value", value); } @SuppressWarnings("unused") - public Object getValue() { + public Map getValue() { return value; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MappingMongoEntityInformation.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MappingMongoEntityInformation.java index f74e33e6e..b5104f765 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MappingMongoEntityInformation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MappingMongoEntityInformation.java @@ -16,13 +16,14 @@ package org.springframework.data.document.mongodb.repository; import java.io.Serializable; +import org.springframework.data.document.mongodb.mapping.BasicMongoPersistentEntity; import org.springframework.data.document.mongodb.mapping.MongoPersistentEntity; import org.springframework.data.mapping.MappingBeanHelper; import org.springframework.data.mapping.model.PersistentProperty; import org.springframework.data.repository.support.AbstractEntityInformation; /** - * {@link MongoEntityInformation} implementation using a {@link MongoPersistentEntity} instance to lookup the necessary + * {@link MongoEntityInformation} implementation using a {@link BasicMongoPersistentEntity} instance to lookup the necessary * information. * * @author Oliver Gierke @@ -77,6 +78,6 @@ public class MappingMongoEntityInformation extends A * @see org.springframework.data.document.mongodb.repository.MongoEntityInformation#getIdAttribute() */ public String getIdAttribute() { - return "_id"; + return entityMetadata.getIdProperty().getName(); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryBean.java index cd1a54f8e..9fba28980 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryBean.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryBean.java @@ -30,7 +30,6 @@ import org.springframework.data.document.mongodb.query.Index; import org.springframework.data.document.mongodb.query.Order; import org.springframework.data.domain.Sort; import org.springframework.data.mapping.model.MappingContext; -import org.springframework.data.mapping.model.PersistentEntity; import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.data.repository.query.QueryLookupStrategy.Key; import org.springframework.data.repository.query.RepositoryQuery; @@ -52,7 +51,7 @@ public class MongoRepositoryFactoryBean, S, ID RepositoryFactoryBeanSupport { private MongoTemplate template; - private MappingContext mappingContext; + private MappingContext> mappingContext; /** * Configures the {@link MongoTemplate} to be used. @@ -69,7 +68,7 @@ public class MongoRepositoryFactoryBean, S, ID * * @param mappingContext the mappingContext to set */ - public void setMappingContext(MappingContext mappingContext) { + public void setMappingContext(MappingContext> mappingContext) { this.mappingContext = mappingContext; } @@ -100,6 +99,7 @@ public class MongoRepositoryFactoryBean, S, ID super.afterPropertiesSet(); Assert.notNull(template, "MongoTemplate must not be null!"); + Assert.notNull(mappingContext, "MappingContext must not be null!"); } /** @@ -118,9 +118,10 @@ public class MongoRepositoryFactoryBean, S, ID * @param template must not be {@literal null} * @param mappingContext */ - public MongoRepositoryFactory(MongoTemplate template, MappingContext mappingContext) { + public MongoRepositoryFactory(MongoTemplate template, MappingContext> mappingContext) { Assert.notNull(template); + Assert.notNull(mappingContext); this.template = template; this.entityInformationCreator = new EntityInformationCreator(mappingContext); } @@ -241,22 +242,17 @@ public class MongoRepositoryFactoryBean, S, ID */ static class EntityInformationCreator { - private final MappingContext mappingContext; + private final MappingContext> mappingContext; - public EntityInformationCreator(MappingContext mappingContext) { + public EntityInformationCreator(MappingContext> mappingContext) { + Assert.notNull(mappingContext); this.mappingContext = mappingContext; } + @SuppressWarnings("unchecked") public MongoEntityInformation getEntityInformation(Class domainClass) { - if (null == mappingContext) { - return new SimpleMongoEntityInformation(domainClass); - } - - PersistentEntity persistentEntity = mappingContext.getPersistentEntity(domainClass); - if (persistentEntity == null) { - persistentEntity = mappingContext.addPersistentEntity(domainClass); - } - return new MappingMongoEntityInformation((MongoPersistentEntity) persistentEntity); + MongoPersistentEntity persistentEntity = (MongoPersistentEntity) mappingContext.getPersistentEntity(domainClass); + return new MappingMongoEntityInformation(persistentEntity); } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformation.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformation.java deleted file mode 100644 index 5c12a3c65..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformation.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2011 by the original author(s). - * - * 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 - * - * http://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.document.mongodb.repository; - -import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; - -import org.springframework.data.repository.support.AbstractEntityInformation; -import org.springframework.util.ReflectionUtils; -import org.springframework.util.StringUtils; - - -/** - * Expects the domain class to contain a field with a name out of the following - * {@value #FIELD_NAMES}. - * - * @author Oliver Gierke - */ -class SimpleMongoEntityInformation extends AbstractEntityInformation implements MongoEntityInformation { - - private static final List FIELD_NAMES = Arrays.asList("ID", "id", "_id"); - private Field field; - - - /** - * Creates a new {@link SimpleMongoEntityInformation}. - * - * @param domainClass - */ - public SimpleMongoEntityInformation(Class domainClass) { - - super(domainClass); - - for (String name : FIELD_NAMES) { - - Field candidate = ReflectionUtils.findField(domainClass, name); - - if (candidate != null) { - ReflectionUtils.makeAccessible(candidate); - this.field = candidate; - break; - } - } - - if (this.field == null) { - throw new IllegalArgumentException(String.format( - "Given domain class %s does not contain an id property!", - domainClass.getName())); - } - } - - - /* (non-Javadoc) - * @see org.springframework.data.document.mongodb.repository.MongoEntityInformation#getCollectionName() - */ - public String getCollectionName() { - - return StringUtils.uncapitalize(getJavaType().getSimpleName()); - } - - - /* (non-Javadoc) - * @see org.springframework.data.document.mongodb.repository.MongoEntityInformation#getIdAttribute() - */ - public String getIdAttribute() { - - return "_id"; - } - - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.IdAware#getId(java.lang.Object - * ) - */ - @SuppressWarnings("unchecked") - public ID getId(Object entity) { - - return (ID) ReflectionUtils.getField(field, entity); - } - - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.EntityInformation#getIdType() - */ - @SuppressWarnings("unchecked") - public Class getIdType() { - - return (Class) field.getType(); - } -} \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoOperationsUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoOperationsUnitTests.java index 9eb26cf5e..5ef4c9b87 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoOperationsUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoOperationsUnitTests.java @@ -32,6 +32,8 @@ import org.springframework.dao.DataAccessException; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.springframework.data.document.mongodb.convert.MongoConverter; +import org.springframework.data.mapping.model.MappingContext; +import org.springframework.data.mapping.model.PersistentEntity; /** * Abstract base class for unit tests to specify behaviour we expect from {@link MongoOperations}. Subclasses return @@ -75,6 +77,10 @@ public abstract class MongoOperationsUnitTests { public ObjectId convertObjectId(Object id) { return null; } + + public MappingContext> getMappingContext() { + return null; + } }; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java index 520005153..66402e72e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java @@ -19,12 +19,13 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.springframework.data.document.mongodb.query.Criteria.where; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.Mongo; -import com.mongodb.WriteConcern; import org.bson.types.ObjectId; import org.junit.Before; import org.junit.Rule; @@ -60,13 +61,14 @@ public class MongoTemplateTests { public ExpectedException thrown = ExpectedException.none(); @Autowired - public void setMongo(Mongo mongo) { + @SuppressWarnings("unchecked") + public void setMongo(Mongo mongo) throws Exception { MongoMappingContext mappingContext = new MongoMappingContext(); - mappingContext.addPersistentEntity(PersonWith_idPropertyOfTypeObjectId.class); - mappingContext.addPersistentEntity(PersonWith_idPropertyOfTypeString.class); - mappingContext.addPersistentEntity(PersonWithIdPropertyOfTypeObjectId.class); - mappingContext.addPersistentEntity(PersonWithIdPropertyOfTypeString.class); + mappingContext.setInitialEntitySet(new HashSet>(Arrays.asList(PersonWith_idPropertyOfTypeObjectId.class, + PersonWith_idPropertyOfTypeString.class, PersonWithIdPropertyOfTypeObjectId.class, + PersonWithIdPropertyOfTypeString.class))); + mappingContext.afterPropertiesSet(); MappingMongoConverter converter = new MappingMongoConverter(mappingContext); converter.afterPropertiesSet(); @@ -97,7 +99,7 @@ public class MongoTemplateTests { public void updateFailure() throws Exception { MongoTemplate mongoTemplate = new MongoTemplate(template.getDb().getMongo(), "test", "people"); - mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION); + mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION); Person person = new Person("Oliver2"); person.setAge(25); @@ -274,6 +276,8 @@ public class MongoTemplateTests { @Test public void testUsingAnInQuery() throws Exception { + + template.remove(new Query(), PersonWithIdPropertyOfTypeObjectId.class); PersonWithIdPropertyOfTypeObjectId p1 = new PersonWithIdPropertyOfTypeObjectId(); p1.setFirstName("Sven"); @@ -315,7 +319,7 @@ public class MongoTemplateTests { PersonWithIdPropertyOfTypeObjectId found1 = template.findOne(q1, PersonWithIdPropertyOfTypeObjectId.class); assertThat(found1, notNullValue()); Query _q = new Query(Criteria.where("_id").is(p1.getId())); - template.remove(_q); + template.remove(_q, PersonWithIdPropertyOfTypeObjectId.class); PersonWithIdPropertyOfTypeObjectId notFound1 = template.findOne(q1, PersonWithIdPropertyOfTypeObjectId.class); assertThat(notFound1, nullValue()); @@ -327,7 +331,7 @@ public class MongoTemplateTests { Query q2 = new Query(Criteria.where("id").is(p2.getId())); PersonWithIdPropertyOfTypeObjectId found2 = template.findOne(q2, PersonWithIdPropertyOfTypeObjectId.class); assertThat(found2, notNullValue()); - template.remove(q2); + template.remove(q2, PersonWithIdPropertyOfTypeObjectId.class); PersonWithIdPropertyOfTypeObjectId notFound2 = template.findOne(q2, PersonWithIdPropertyOfTypeObjectId.class); assertThat(notFound2, nullValue()); } @@ -345,7 +349,7 @@ public class MongoTemplateTests { private void testAddingToList(MongoTemplate template) { PersonWithAList p = new PersonWithAList(); p.setFirstName("Sven"); - p.setAge(22); + p.setAge(22); template.insert(p); Query q1 = new Query(Criteria.where("id").is(p.getId())); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/analytics/MvcAnalyticsTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/analytics/MvcAnalyticsTests.java index 31ee8f24d..77381dcd4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/analytics/MvcAnalyticsTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/analytics/MvcAnalyticsTests.java @@ -206,7 +206,7 @@ public class MvcAnalyticsTests { private void createAndStoreMvcEvent(int dataSize, int p1) { for (int i = 0; i < dataSize; i++) { MvcEvent event = generateEvent(p1); - mongoTemplate.save(event); + mongoTemplate.save("mvc", event); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/convert/CustomConvertersUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/convert/CustomConvertersUnitTests.java index 4e95c2e6f..e341ffa67 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/convert/CustomConvertersUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/convert/CustomConvertersUnitTests.java @@ -1,21 +1,42 @@ +/* + * Copyright (c) 2011 by the original author(s). + * + * 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 + * + * http://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.document.mongodb.convert; import static org.mockito.Mockito.*; import java.util.Arrays; +import java.util.HashSet; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.core.convert.converter.Converter; +import org.springframework.data.annotation.Id; import org.springframework.data.document.mongodb.mapping.MongoMappingContext; import org.springframework.data.document.mongodb.mapping.MongoPersistentEntity; + import com.mongodb.BasicDBObject; import com.mongodb.DBObject; /** + * Test case to verify correct usage of custom {@link Converter} implementations to be used. * + * @see DATADOC-101 * @author Oliver Gierke */ @RunWith(MockitoJUnitRunner.class) @@ -34,11 +55,11 @@ public class CustomConvertersUnitTests { @Before @SuppressWarnings("unchecked") - public void setUp() { + public void setUp() throws Exception { context = new MongoMappingContext(); - context.addPersistentEntity(Foo.class); - context.addPersistentEntity(Bar.class); + context.setInitialEntitySet(new HashSet>(Arrays.asList(Foo.class, Bar.class))); + context.afterPropertiesSet(); when(barToDBObjectConverter.convert(any(Bar.class))).thenReturn(new BasicDBObject()); when(dbObjectToBarConverter.convert(any(DBObject.class))).thenReturn(new Bar()); @@ -82,10 +103,14 @@ public class CustomConvertersUnitTests { } public static class Foo { + @Id + public String id; public Bar bar; } public static class Bar { + @Id + public String id; public String foo; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/Address.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/Address.java index eb6cb685b..a1d030667 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/Address.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/Address.java @@ -21,6 +21,7 @@ package org.springframework.data.document.mongodb.mapping; */ public class Address { + private String id; private String[] lines; private String city; private String provinceOrState; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/GenericMappingTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/GenericMappingTests.java index 23f331425..a8de7ed4c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/GenericMappingTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/GenericMappingTests.java @@ -19,6 +19,7 @@ package org.springframework.data.document.mongodb.mapping; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import java.util.Collections; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.junit.Before; @@ -27,7 +28,6 @@ import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.data.document.mongodb.convert.MappingMongoConverter; import org.springframework.data.document.mongodb.convert.MongoConverter; -import org.springframework.data.mapping.BasicMappingContext; /** * Unit tests for testing the mapping works with generic types. @@ -37,13 +37,15 @@ import org.springframework.data.mapping.BasicMappingContext; @RunWith(MockitoJUnitRunner.class) public class GenericMappingTests { - BasicMappingContext context; + MongoMappingContext context; MongoConverter converter; @Before - public void setUp() { - context = new BasicMappingContext(); - context.addPersistentEntity(StringWrapper.class); + public void setUp() throws Exception { + context = new MongoMappingContext(); + context.setInitialEntitySet(Collections.singleton(StringWrapper.class)); + context.afterPropertiesSet(); + converter = new MappingMongoConverter(context); } @@ -54,8 +56,6 @@ public class GenericMappingTests { wrapper.container = new Container(); wrapper.container.content = "Foo!"; - context.addPersistentEntity(StringWrapper.class); - DBObject dbObject = new BasicDBObject(); converter.write(wrapper, dbObject); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java index f714b9d99..83b43115c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingMongoConverterUnitTests.java @@ -29,7 +29,6 @@ import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.core.convert.converter.Converter; import org.springframework.data.document.mongodb.convert.MappingMongoConverter; -import org.springframework.data.mapping.BasicMappingContext; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; @@ -42,11 +41,11 @@ import com.mongodb.DBObject; public class MappingMongoConverterUnitTests { MappingMongoConverter converter; - BasicMappingContext mappingContext; + MongoMappingContext mappingContext; @Before public void setUp() { - mappingContext = new BasicMappingContext(); + mappingContext = new MongoMappingContext(); converter = new MappingMongoConverter(mappingContext); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java index 6e88d3f13..e0588e5f3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/MappingTests.java @@ -89,8 +89,6 @@ public class MappingTests { @Test public void testPersonPojo() throws Exception { - // POJOs aren't auto-detected, have to add manually - mappingContext.addPersistentEntity(PersonPojo.class); LOGGER.info("about to create new personpojo"); PersonPojo p = new PersonPojo(12345, "Person", "Pojo"); @@ -106,8 +104,6 @@ public class MappingTests { @Test public void testPersonWithCustomIdName() { - // POJOs aren't auto-detected, have to add manually - mappingContext.addPersistentEntity(PersonCustomIdName.class); PersonCustomIdName p = new PersonCustomIdName(123456, "Custom Id", null); template.insert(p); @@ -123,7 +119,6 @@ public class MappingTests { assertThat(result2.size(), is(1)); assertNotNull(result2.get(0).getLastName()); assertThat(result2.get(0).getLastName(), is("LastName")); - } @Test diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection1.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection1.java index 0bde08634..96b6437d8 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection1.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection1.java @@ -16,12 +16,17 @@ package org.springframework.data.document.mongodb.mapping; +import org.springframework.data.annotation.Id; + /** * @author Jon Brisbin */ @Document(collection = "person1") public class PersonCustomCollection1 extends BasePerson{ + @Id + private String id; + public PersonCustomCollection1(Integer ssn, String firstName, String lastName) { super(ssn, firstName, lastName); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection2.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection2.java index 8dcfe6cc0..78a27fc16 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection2.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonCustomCollection2.java @@ -16,12 +16,17 @@ package org.springframework.data.document.mongodb.mapping; +import org.springframework.data.annotation.Id; + /** * @author Jon Brisbin */ @Document(collection = "person2") public class PersonCustomCollection2 extends BasePerson { + @Id + private String id; + public PersonCustomCollection2(Integer ssn, String firstName, String lastName) { super(ssn, firstName, lastName); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonMultiDimArrays.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonMultiDimArrays.java index 68cd3d6a8..cd2b770c9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonMultiDimArrays.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/PersonMultiDimArrays.java @@ -16,11 +16,16 @@ package org.springframework.data.document.mongodb.mapping; +import org.springframework.data.annotation.Id; + /** * @author Jon Brisbin */ +@Document public class PersonMultiDimArrays extends BasePerson { + @Id + private String id; private String[][] grid; public PersonMultiDimArrays(Integer ssn, String firstName, String lastName, String[][] grid) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/SimpleMappingContextUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/SimpleMappingContextUnitTests.java new file mode 100644 index 000000000..444402294 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/mapping/SimpleMappingContextUnitTests.java @@ -0,0 +1,30 @@ +package org.springframework.data.document.mongodb.mapping; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.data.document.mongodb.mapping.SimpleMongoMappingContext.SimpleMongoPersistentEntity; +import org.springframework.data.mapping.model.PersistentProperty; + +/** + * + * @author Oliver Gierke + */ +public class SimpleMappingContextUnitTests { + + @Test + public void testname() { + SimpleMongoMappingContext context = new SimpleMongoMappingContext(); + SimpleMongoPersistentEntity entity = context.getPersistentEntity(Person.class); + + assertThat(entity.getPersistentProperties().isEmpty(), is(false)); + + PersistentProperty idProperty = entity.getIdProperty(); + assertThat(idProperty.getName(), is("id")); + } + + static class Person { + String id; + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryMapperUnitTests.java new file mode 100644 index 000000000..d9b1a42be --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/query/QueryMapperUnitTests.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2011 by the original author(s). + * + * 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 + * + * http://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.document.mongodb.query; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import org.bson.types.ObjectId; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.data.document.mongodb.convert.MongoConverter; +import org.springframework.data.mapping.model.PersistentEntity; +import org.springframework.data.mapping.model.PersistentProperty; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; + +/** + * Unit tests for {@link QueryMapper}. + * + * @author Oliver Gierke + */ +@RunWith(MockitoJUnitRunner.class) +public class QueryMapperUnitTests { + + QueryMapper mapper; + + @Mock + MongoConverter converter; + @Mock + PersistentEntity entity; + @Mock + PersistentProperty property; + + @Before + public void setUp() { + when(entity.getIdProperty()).thenReturn(property); + when(converter.convertObjectId(any())).thenReturn(new ObjectId()); + mapper = new QueryMapper(converter); + } + + @Test + public void translatesIdPropertyIntoIdKey() { + + DBObject query = new BasicDBObject("foo", "value"); + + when(property.getName()).thenReturn("foo"); + + DBObject result = mapper.getMappedObject(query, entity); + assertThat(result.get("_id"), is(notNullValue())); + assertThat(result.get("foo"), is(nullValue())); + } + + @Test + public void convertsStringIntoObjectId() { + + DBObject query = new BasicDBObject("_id", new ObjectId().toString()); + DBObject result = mapper.getMappedObject(query, null); + assertThat(result.get("_id"), is(ObjectId.class)); + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoQueryCreatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoQueryCreatorUnitTests.java index 01cd00de9..ffa3c5cdf 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoQueryCreatorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoQueryCreatorUnitTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.document.mongodb.repository; +import static org.mockito.Mockito.*; import static org.springframework.data.document.mongodb.repository.StubParameterAccessor.getAccessor; import java.lang.reflect.Method; @@ -24,11 +25,16 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; +import org.mockito.stubbing.Answer; import org.springframework.data.document.mongodb.Person; import org.springframework.data.document.mongodb.convert.MongoConverter; import org.springframework.data.repository.query.parser.PartTree; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; + /** * Unit test for {@link MongoQueryCreator}. @@ -53,6 +59,14 @@ public class MongoQueryCreatorUnitTests { findByFirstnameAndFriend = Sample.class.getMethod("findByFirstnameAndFriend", String.class, Person.class); + + doAnswer(new Answer() { + public Void answer(InvocationOnMock invocation) throws Throwable { + DBObject dbObject = (DBObject) invocation.getArguments()[1]; + dbObject.put("value", new BasicDBObject("value", "value")); + return null; + } + }).when(converter).write(any(), any(DBObject.class)); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryUnitTests.java index a9bd73597..03fb12438 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryUnitTests.java @@ -41,9 +41,11 @@ public class MongoRepositoryFactoryUnitTests { MongoTemplate template; @Mock - MappingContext mappingContext; + MappingContext> mappingContext; + @Mock - MongoPersistentEntity entity; + @SuppressWarnings("rawtypes") + MongoPersistentEntity entity; @Test(expected = IllegalArgumentException.class) @@ -53,6 +55,7 @@ public class MongoRepositoryFactoryUnitTests { } @Test + @SuppressWarnings("unchecked") public void usesMappingMongoEntityInformationIfMappingContextSet() { when(mappingContext.getPersistentEntity(Person.class)).thenReturn(entity); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformationUnitTests.java deleted file mode 100644 index da18dff8a..000000000 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/SimpleMongoEntityInformationUnitTests.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2002-2010 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 - * - * http://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.document.mongodb.repository; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -import org.junit.Test; - - -/** - * Unit test for {@link SimpleMongoEntityInformation}. - * - * @author Oliver Gierke - */ -public class SimpleMongoEntityInformationUnitTests { - - @Test - public void findsIdField() throws Exception { - - SimpleMongoEntityInformation isNewAware = - new SimpleMongoEntityInformation(Person.class); - - Person person = new Person(); - assertThat(isNewAware.isNew(person), is(true)); - person.id = 1L; - assertThat(isNewAware.isNew(person), is(false)); - } - - - @Test(expected = IllegalArgumentException.class) - public void rejectsClassIfNoIdField() throws Exception { - - new SimpleMongoEntityInformation(InvalidPerson.class); - } - - class Person { - - Long id; - } - - class InvalidPerson { - - Long foo; - } -} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/StringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/StringBasedMongoQueryUnitTests.java index 39df99531..847300576 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/StringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/StringBasedMongoQueryUnitTests.java @@ -45,6 +45,9 @@ public class StringBasedMongoQueryUnitTests { MongoTemplate template; @Mock RepositoryMetadata metadata; + @Mock + EntityInformationCreator creator; + MongoConverter converter = new SimpleMongoConverter(); @Before @@ -56,7 +59,7 @@ public class StringBasedMongoQueryUnitTests { public void testname() throws Exception { Method method = SampleRepository.class.getMethod("findByLastname", String.class); - MongoQueryMethod queryMethod = new MongoQueryMethod(method, metadata, new EntityInformationCreator(null)); + MongoQueryMethod queryMethod = new MongoQueryMethod(method, metadata, creator); StringBasedMongoQuery mongoQuery = new StringBasedMongoQuery(queryMethod, template); ConvertingParameterAccessor accesor = StubParameterAccessor.getAccessor(converter, "Matthews"); diff --git a/spring-data-mongodb/src/test/resources/infrastructure.xml b/spring-data-mongodb/src/test/resources/infrastructure.xml index 38f275753..9c4ddf130 100644 --- a/spring-data-mongodb/src/test/resources/infrastructure.xml +++ b/spring-data-mongodb/src/test/resources/infrastructure.xml @@ -11,8 +11,8 @@ - - + + diff --git a/src/main/resources/changelog.txt b/src/main/resources/changelog.txt index 95a378ae3..89bd916e4 100644 --- a/src/main/resources/changelog.txt +++ b/src/main/resources/changelog.txt @@ -5,7 +5,7 @@ Changes in version 1.0.0.RC1 MongoDB ------------------------------------------------- General -* +* Introducted MappingContext implementatio for SimpleMongoConverter (DATADOC-109) Changes in version 1.0.0.M2 MongoDB (2011-04-09) ------------------------------------------------