From 0ad895d6d4428073514a4ef64572578762a3a591 Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Tue, 8 Mar 2011 23:28:25 -0500 Subject: [PATCH 1/5] DATADOC-48 added cross-store support for Mongo->JPA relationships --- .../document/MongoChangeSetPersister.java | 4 +- .../document/MongoEntityOperations.java | 31 +++++++-- .../persistence/CrossStoreMongoTests.java | 67 ++++++++++++++++--- .../persistence/document/test/Account.java | 15 ++++- .../META-INF/spring/applicationContext.xml | 31 +++++++++ 5 files changed, 132 insertions(+), 16 deletions(-) diff --git a/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java b/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java index e36f94a85..a46d456c9 100644 --- a/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java +++ b/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoChangeSetPersister.java @@ -53,10 +53,10 @@ public class MongoChangeSetPersister implements ChangeSetPersister { // System.err.println("Mongo persisted property [" + propertyName + "] :: " + propertyKey + " = " + dbo.get(propertyKey)); if (propertyKey.startsWith("_")) { // Id or class - changeSet.set(propertyName, dbo.get(propertyKey)); + changeSet.set(propertyKey, dbo.get(propertyKey)); } else { //throw new IllegalStateException("Unknown property [" + propertyName + "] found in MongoDB store"); - changeSet.set(propertyName, dbo.get(propertyKey)); + changeSet.set(propertyKey, dbo.get(propertyKey)); } } } catch (MongoException ex) { diff --git a/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java b/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java index c812358da..7e09692d7 100644 --- a/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java +++ b/spring-data-mongodb-cross-store/src/main/java/org/springframework/persistence/document/MongoEntityOperations.java @@ -4,28 +4,51 @@ import java.lang.reflect.Field; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; +import org.springframework.data.document.mongodb.MongoTemplate; import org.springframework.persistence.OrderedEntityOperations; import org.springframework.persistence.RelatedEntity; +import org.springframework.persistence.support.ChangeSet; import org.springframework.persistence.support.ChangeSetBacked; +import org.springframework.persistence.support.ChangeSetPersister.NotFoundException; +import org.springframework.persistence.support.EntityInstantiator; +import org.springframework.persistence.support.HashMapChangeSet; import com.mongodb.DB; public class MongoEntityOperations extends OrderedEntityOperations { @Autowired - private DB mongoDb; + private MongoTemplate mongoTemplate; - @Autowired + private EntityInstantiator entityInstantiator; + private MongoChangeSetPersister changeSetPersister; + public void setEntityInstantiator(EntityInstantiator entityInstantiator) { + this.entityInstantiator = entityInstantiator; + } + + @Autowired + public void setChangeSetPersister(MongoChangeSetPersister changeSetPersister) { + this.changeSetPersister = changeSetPersister; + } + + @Override public boolean cacheInEntity() { return true; } @Override - public ChangeSetBacked findEntity(Class entityClass, Object pk) throws DataAccessException { - throw new UnsupportedOperationException(); + public ChangeSetBacked findEntity(Class entityClass, Object key) throws DataAccessException { + try { + ChangeSet cs = new HashMapChangeSet(); + changeSetPersister.getPersistentState(entityClass, key, cs); + return entityInstantiator.createEntityFromState(cs, entityClass); + } + catch (NotFoundException ex) { + return null; + } } @Override diff --git a/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java b/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java index 8de689735..fb95f51d1 100644 --- a/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java +++ b/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java @@ -1,10 +1,14 @@ package org.springframework.data.document.persistence; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.document.mongodb.MongoTemplate; +import org.springframework.persistence.document.test.Account; import org.springframework.persistence.document.test.MongoPerson; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; @@ -13,6 +17,7 @@ import org.springframework.test.context.transaction.BeforeTransaction; import org.springframework.transaction.annotation.Transactional; import com.mongodb.DBCollection; +import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; @@ -26,12 +31,21 @@ public class CrossStoreMongoTests { @Autowired private MongoTemplate mongoTemplate; + + private EntityManager entityManager; + + private String colName = MongoPerson.class.getSimpleName().toLowerCase(); + + + @PersistenceContext + public void setEntityManager(EntityManager entityManager) { + this.entityManager = entityManager; + } - @BeforeTransaction - public void setUp() { - DBCollection col = this.mongoTemplate.getCollection(MongoPerson.class.getSimpleName().toLowerCase()); + private void clearData() { + DBCollection col = this.mongoTemplate.getCollection(colName); if (col != null) { - this.mongoTemplate.dropCollection(MongoPerson.class.getName()); + this.mongoTemplate.dropCollection(colName); } } @@ -39,6 +53,7 @@ public class CrossStoreMongoTests { @Transactional @Rollback(false) public void testUserConstructor() { + clearData(); int age = 33; MongoPerson p = new MongoPerson("Thomas", age); Assert.assertEquals(age, p.getAge()); @@ -49,14 +64,48 @@ public class CrossStoreMongoTests { @Test @Transactional public void testInstantiatedFinder() throws MongoException { - String key = MongoPerson.class.getSimpleName().toLowerCase(); - DBCollection col = this.mongoTemplate.getCollection(key); + DBCollection col = this.mongoTemplate.getCollection(colName); DBObject dbo = col.findOne(); - Object id1 = dbo.get("_id"); - MongoPerson found = MongoPerson.findPerson(id1); + Object _id = dbo.get("_id"); + MongoPerson found = MongoPerson.findPerson(_id); Assert.assertNotNull(found); - Assert.assertEquals(id1, found.getId()); + Assert.assertEquals(_id, found.getId()); System.out.println("Loaded MongoPerson data: " + found); } + @Test + @Transactional + @Rollback(false) + public void testCreateJpaEntity() { + clearData(); + Account a = new Account(); + a.setName("My Account"); + a.setFriendlyName("My Test Acct."); + a.setBalance(123.45F); + a.setId(2L); + MongoPerson p = new MongoPerson("Jack", 22); + entityManager.persist(a); + p.setAccount(a); + } + + @Test + @Transactional + public void testReadJpaEntity() { + DBCollection col = this.mongoTemplate.getCollection(colName); + DBCursor dbc = col.find(); + Object _id = null; + for (DBObject dbo : dbc) { + System.out.println(dbo); + if ("Jack".equals(dbo.get("name"))) { + _id = dbo.get("_id"); + break; + } + } + System.out.println(_id); + MongoPerson found = MongoPerson.findPerson(_id); + System.out.println(found); + if (found != null) + System.out.println(found.getAccount()); + } + } diff --git a/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Account.java b/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Account.java index f73a6586e..56b340bcf 100644 --- a/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Account.java +++ b/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Account.java @@ -16,6 +16,14 @@ public class Account { private String whatever; + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + public String getName() { return name; } @@ -47,6 +55,11 @@ public class Account { public void setWhatever(String whatever) { this.whatever = whatever; } - + + @Override + public String toString() { + return "Account [id=" + id + ", name=" + name + ", balance=" + balance + + ", friendlyName=" + friendlyName + "]"; + } } diff --git a/spring-data-mongodb-cross-store/src/test/resources/META-INF/spring/applicationContext.xml b/spring-data-mongodb-cross-store/src/test/resources/META-INF/spring/applicationContext.xml index bffad856c..8b359c8b8 100644 --- a/spring-data-mongodb-cross-store/src/test/resources/META-INF/spring/applicationContext.xml +++ b/spring-data-mongodb-cross-store/src/test/resources/META-INF/spring/applicationContext.xml @@ -16,6 +16,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 60f9b05760bd66c36f6e13f635509165c265beac Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Wed, 9 Mar 2011 16:29:12 -0500 Subject: [PATCH 2/5] DATADOC-48 added additional tests for cross-store --- spring-data-document-core/.classpath | 28 ++++--- .../.settings/org.eclipse.jdt.core.prefs | 18 ++--- ....eclipse.wst.common.project.facet.core.xml | 10 +-- .../persistence/CrossStoreMongoTests.java | 43 +++++++++-- .../persistence/document/test/Person.java | 76 +++++++++++++++++++ .../persistence/document/test/Resume.java | 33 ++++++++ spring-data-mongodb/.classpath | 6 +- .../.settings/org.eclipse.jdt.core.prefs | 18 ++--- ....eclipse.wst.common.project.facet.core.xml | 10 +-- 9 files changed, 193 insertions(+), 49 deletions(-) create mode 100644 spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Person.java create mode 100644 spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Resume.java diff --git a/spring-data-document-core/.classpath b/spring-data-document-core/.classpath index 6019b8317..1da667f53 100644 --- a/spring-data-document-core/.classpath +++ b/spring-data-document-core/.classpath @@ -1,12 +1,16 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/spring-data-document-core/.settings/org.eclipse.jdt.core.prefs b/spring-data-document-core/.settings/org.eclipse.jdt.core.prefs index 41cf44aec..aa62685f0 100644 --- a/spring-data-document-core/.settings/org.eclipse.jdt.core.prefs +++ b/spring-data-document-core/.settings/org.eclipse.jdt.core.prefs @@ -1,9 +1,9 @@ -#Thu Oct 14 10:28:37 EDT 2010 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 +#Wed Mar 09 13:51:17 EST 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/spring-data-document-core/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-data-document-core/.settings/org.eclipse.wst.common.project.facet.core.xml index f66a2079b..5c9bd7532 100644 --- a/spring-data-document-core/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/spring-data-document-core/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,5 +1,5 @@ - - - - - + + + + + diff --git a/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java b/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java index fb95f51d1..137ea7eaf 100644 --- a/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java +++ b/spring-data-mongodb-cross-store/src/test/java/org/springframework/data/document/persistence/CrossStoreMongoTests.java @@ -10,10 +10,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.document.mongodb.MongoTemplate; import org.springframework.persistence.document.test.Account; import org.springframework.persistence.document.test.MongoPerson; +import org.springframework.persistence.document.test.Person; +import org.springframework.persistence.document.test.Resume; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.transaction.BeforeTransaction; import org.springframework.transaction.annotation.Transactional; import com.mongodb.DBCollection; @@ -42,10 +43,10 @@ public class CrossStoreMongoTests { this.entityManager = entityManager; } - private void clearData() { - DBCollection col = this.mongoTemplate.getCollection(colName); + private void clearData(String collectionName) { + DBCollection col = this.mongoTemplate.getCollection(collectionName); if (col != null) { - this.mongoTemplate.dropCollection(colName); + this.mongoTemplate.dropCollection(collectionName); } } @@ -53,7 +54,7 @@ public class CrossStoreMongoTests { @Transactional @Rollback(false) public void testUserConstructor() { - clearData(); + clearData(colName); int age = 33; MongoPerson p = new MongoPerson("Thomas", age); Assert.assertEquals(age, p.getAge()); @@ -76,8 +77,8 @@ public class CrossStoreMongoTests { @Test @Transactional @Rollback(false) - public void testCreateJpaEntity() { - clearData(); + public void testCreateMongoToJpaEntityRelationship() { + clearData(colName); Account a = new Account(); a.setName("My Account"); a.setFriendlyName("My Test Acct."); @@ -90,7 +91,7 @@ public class CrossStoreMongoTests { @Test @Transactional - public void testReadJpaEntity() { + public void testReadMongoToJpaEntityRelationship() { DBCollection col = this.mongoTemplate.getCollection(colName); DBCursor dbc = col.find(); Object _id = null; @@ -108,4 +109,30 @@ public class CrossStoreMongoTests { System.out.println(found.getAccount()); } + @Test + @Transactional + @Rollback(false) + public void testCreateJpaToMongoEntityRelationship() { + clearData("resume"); + Person p = new Person("Thomas", 20); + Resume r = new Resume(); + r.addEducation("Skanstulls High School, 1975"); + r.addEducation("Univ. of Stockholm, 1980"); + r.addJob("DiMark, DBA, 1990-2000"); + r.addJob("VMware, Developer, 2007-"); + p.setResume(r); + p.setId(1L); + entityManager.persist(p); + } + + @Test + @Transactional + public void testReadJpaToMongoEntityRelationship() { + Person found = entityManager.find(Person.class, 1L); + System.out.println(found); +// TODO: This part isn't working yet - there is no reference to the Momgo _id stored in the db +// if (found != null) +// System.out.println(found.getResume()); + } + } diff --git a/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Person.java b/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Person.java new file mode 100644 index 000000000..070fa11e3 --- /dev/null +++ b/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Person.java @@ -0,0 +1,76 @@ +package org.springframework.persistence.document.test; + +import javax.persistence.Entity; +import javax.persistence.Id; + +import org.springframework.persistence.RelatedEntity; + +@Entity +public class Person { + + @Id Long id; + + private String name; + + private int age; + + private java.util.Date birthDate; + +// @Document // need to decide what the annotation here should be + @RelatedEntity + public Resume resume; + + public Person() { + } + + public Person(String name, int age) { + this.name = name; + this.age = age; + this.birthDate = new java.util.Date(); + } + + public void birthday() { + ++age; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public java.util.Date getBirthDate() { + return birthDate; + } + + public void setBirthDate(java.util.Date birthDate) { + this.birthDate = birthDate; + } + + public Resume getResume() { + return resume; + } + + public void setResume(Resume resume) { + this.resume = resume; + } + +} diff --git a/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Resume.java b/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Resume.java new file mode 100644 index 000000000..dc751afb4 --- /dev/null +++ b/spring-data-mongodb-cross-store/src/test/java/org/springframework/persistence/document/test/Resume.java @@ -0,0 +1,33 @@ +package org.springframework.persistence.document.test; + +import org.springframework.persistence.document.DocumentEntity; + +@DocumentEntity +public class Resume { + + private String education = ""; + + private String jobs = ""; + + public String getEducation() { + return education; + } + + public void addEducation(String education) { + this.education = this.education + (this.education.length() > 0 ? "; " : "") + education; + } + + public String getJobs() { + return jobs; + } + + public void addJob(String job) { + this.jobs = this.jobs + (this.jobs.length() > 0 ? "; " : "") + job; + } + + @Override + public String toString() { + return "Resume [education=" + education + ", jobs=" + jobs + "]"; + } + +} diff --git a/spring-data-mongodb/.classpath b/spring-data-mongodb/.classpath index 201f4e3fc..40f8440e7 100644 --- a/spring-data-mongodb/.classpath +++ b/spring-data-mongodb/.classpath @@ -4,12 +4,16 @@ - + + + + + diff --git a/spring-data-mongodb/.settings/org.eclipse.jdt.core.prefs b/spring-data-mongodb/.settings/org.eclipse.jdt.core.prefs index cdc6b1939..b3ef56f5a 100644 --- a/spring-data-mongodb/.settings/org.eclipse.jdt.core.prefs +++ b/spring-data-mongodb/.settings/org.eclipse.jdt.core.prefs @@ -1,9 +1,9 @@ -#Thu Oct 14 10:28:36 EDT 2010 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 +#Wed Mar 09 13:51:37 EST 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/spring-data-mongodb/.settings/org.eclipse.wst.common.project.facet.core.xml b/spring-data-mongodb/.settings/org.eclipse.wst.common.project.facet.core.xml index f66a2079b..5c9bd7532 100644 --- a/spring-data-mongodb/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/spring-data-mongodb/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,5 +1,5 @@ - - - - - + + + + + From 68635687d1766ec5bc5782ac98ff5b7bc3b2fab2 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 11 Mar 2011 16:32:21 +0100 Subject: [PATCH 3/5] DATAJPA-19 - Adapted generics and metadata changes made in core. --- .../repository/AbstractMongoQuery.java | 4 +- .../repository/MongoEntityInformation.java | 32 ++++++++++++++-- .../mongodb/repository/MongoQueryMethod.java | 4 +- .../MongoRepositoryFactoryBean.java | 38 ++++++++++++++----- .../repository/PartTreeMongoQuery.java | 2 +- .../repository/SimpleMongoRepository.java | 4 +- .../MongoEntityMetadataUnitTests.java | 6 +-- spring-data-mongodb/template.mf | 1 + 8 files changed, 68 insertions(+), 23 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/AbstractMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/AbstractMongoQuery.java index 617f538ba..51ff7bb73 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/AbstractMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/AbstractMongoQuery.java @@ -100,7 +100,7 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { protected List readCollection(Query query) { - MongoEntityInformation metadata = method.getEntityMetadata(); + MongoEntityInformation metadata = method.getEntityInformation(); String collectionName = metadata.getCollectionName(); return template.find(collectionName, query, metadata.getJavaType()); @@ -155,7 +155,7 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { @SuppressWarnings({ "rawtypes", "unchecked" }) Object execute(Query query) { - MongoEntityInformation metadata = method.getEntityMetadata(); + MongoEntityInformation metadata = method.getEntityInformation(); int count = getCollectionCursor(metadata.getCollectionName(), query.getQueryObject()).count(); List result = template.find(metadata.getCollectionName(), applyPagination(query, pageable), diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoEntityInformation.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoEntityInformation.java index 1ace73e3e..f84c5b3eb 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoEntityInformation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoEntityInformation.java @@ -15,6 +15,7 @@ */ package org.springframework.data.document.mongodb.repository; +import java.io.Serializable; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; @@ -30,7 +31,7 @@ import org.springframework.util.StringUtils; * * @author Oliver Gierke */ -class MongoEntityInformation extends AbstractEntityInformation { +class MongoEntityInformation extends AbstractEntityInformation { private static final List FIELD_NAMES = Arrays.asList("ID", "id", "_id"); private Field field; @@ -64,11 +65,22 @@ class MongoEntityInformation extends AbstractEntityInformation } + /** + * Returns the name of the collection the entity shall be persisted to. + * + * @return + */ public String getCollectionName() { return StringUtils.uncapitalize(getJavaType().getSimpleName()); } + + /** + * Returns the attribute that the id will be persisted to. + * + * @return + */ public String getIdAttribute() { return "_id"; @@ -82,8 +94,22 @@ class MongoEntityInformation extends AbstractEntityInformation * org.springframework.data.repository.support.IdAware#getId(java.lang.Object * ) */ - public Object getId(Object entity) { + @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 ReflectionUtils.getField(field, entity); + return (Class) field.getType(); } } \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryMethod.java index 9d6da84b6..54d6f0606 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryMethod.java @@ -31,7 +31,7 @@ import org.springframework.util.StringUtils; class MongoQueryMethod extends QueryMethod { private final Method method; - private final MongoEntityInformation entityInformation; + private final MongoEntityInformation entityInformation; /** * Creates a new {@link MongoQueryMethod} from the given {@link Method}. @@ -82,7 +82,7 @@ class MongoQueryMethod extends QueryMethod { * @see org.springframework.data.repository.query.QueryMethod#getEntityMetadata() */ @Override - public MongoEntityInformation getEntityMetadata() { + public MongoEntityInformation getEntityInformation() { return entityInformation; } 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 ca4be6d09..00cb3d88a 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 @@ -43,7 +43,7 @@ import org.springframework.util.StringUtils; * * @author Oliver Gierke */ -public class MongoRepositoryFactoryBean extends RepositoryFactoryBeanSupport> { +public class MongoRepositoryFactoryBean, S, ID extends Serializable> extends RepositoryFactoryBeanSupport { private MongoTemplate template; @@ -101,14 +101,7 @@ public class MongoRepositoryFactoryBean extends RepositoryFactoryBeanSupport info = new MongoEntityInformation( - (Class) metadata.getDomainClass()); - return new SimpleMongoRepository(info, template); - } + /* * (non-Javadoc) @@ -162,6 +155,31 @@ public class MongoRepositoryFactoryBean extends RepositoryFactoryBeanSupport MongoEntityInformation getEntityInformation( + Class domainClass) { + + return new MongoEntityInformation(domainClass); + } + + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.support.RepositoryFactorySupport#getTargetRepository(org.springframework.data.repository.support.RepositoryMetadata) + */ + @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + protected Object getTargetRepository(RepositoryMetadata metadata) { + + MongoEntityInformation info = getEntityInformation( + metadata.getDomainClass()); + return new SimpleMongoRepository(info, template); + } } /** @@ -199,7 +217,7 @@ public class MongoRepositoryFactoryBean extends RepositoryFactoryBeanSupport metadata = query.getQueryMethod().getEntityMetadata(); + MongoEntityInformation metadata = query.getQueryMethod().getEntityInformation(); operations.ensureIndex(metadata.getCollectionName(), index); LOG.debug(String.format("Created index %s!", index.toString())); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/PartTreeMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/PartTreeMongoQuery.java index 1ea20789e..0ccf0f11f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/PartTreeMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/PartTreeMongoQuery.java @@ -39,7 +39,7 @@ public class PartTreeMongoQuery extends AbstractMongoQuery { public PartTreeMongoQuery(MongoQueryMethod method, MongoTemplate template) { super(method, template); - this.tree = new PartTree(method.getName(), method.getEntityMetadata().getJavaType()); + this.tree = new PartTree(method.getName(), method.getEntityInformation().getJavaType()); } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java index 1d7b07544..813529021 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java @@ -41,7 +41,7 @@ import org.springframework.util.Assert; public class SimpleMongoRepository implements PagingAndSortingRepository { private final MongoTemplate template; - private final MongoEntityInformation entityInformation; + private final MongoEntityInformation entityInformation; /** * Creates a ew {@link SimpleMongoRepository} for the given {@link MongoInformation} and {@link MongoTemplate}. @@ -49,7 +49,7 @@ public class SimpleMongoRepository implements Paging * @param metadata * @param template */ - public SimpleMongoRepository(MongoEntityInformation metadata, MongoTemplate template) { + public SimpleMongoRepository(MongoEntityInformation metadata, MongoTemplate template) { Assert.notNull(template); Assert.notNull(metadata); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoEntityMetadataUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoEntityMetadataUnitTests.java index 7446377ab..9dc06d195 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoEntityMetadataUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoEntityMetadataUnitTests.java @@ -31,8 +31,8 @@ public class MongoEntityMetadataUnitTests { @Test public void findsIdField() throws Exception { - MongoEntityInformation isNewAware = - new MongoEntityInformation(Person.class); + MongoEntityInformation isNewAware = + new MongoEntityInformation(Person.class); Person person = new Person(); assertThat(isNewAware.isNew(person), is(true)); @@ -44,7 +44,7 @@ public class MongoEntityMetadataUnitTests { @Test(expected = IllegalArgumentException.class) public void rejectsClassIfNoIdField() throws Exception { - new MongoEntityInformation(InvalidPerson.class); + new MongoEntityInformation(InvalidPerson.class); } class Person { diff --git a/spring-data-mongodb/template.mf b/spring-data-mongodb/template.mf index 7cc16ff69..c56995113 100644 --- a/spring-data-mongodb/template.mf +++ b/spring-data-mongodb/template.mf @@ -7,6 +7,7 @@ Import-Package: Import-Template: org.springframework.beans.*;version="[3.0.0, 4.0.0)", org.springframework.core.*;version="[3.0.0, 4.0.0)", + org.springframework.context.*;version="[3.0.0, 4.0.0)", org.springframework.dao.*;version="[3.0.0, 4.0.0)", org.springframework.util.*;version="[3.0.0, 4.0.0)", org.springframework.jmx.export.*;version="[3.0.0, 4.0.0)", From f585beffc86740eca8404d96acaeec3eca09953e Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 11 Mar 2011 18:19:45 +0100 Subject: [PATCH 4/5] =?UTF-8?q?DATACMNS-20=20-=20Adapted=20refactoring=20o?= =?UTF-8?q?f=20Repository.findById(=E2=80=A6)=20to=20findOne(=E2=80=A6).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-data-document-core/.classpath | 28 ++++++++----------- .../repository/SimpleMongoRepository.java | 4 +-- ...tractPersonRepositoryIntegrationTests.java | 2 +- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/spring-data-document-core/.classpath b/spring-data-document-core/.classpath index 1da667f53..6019b8317 100644 --- a/spring-data-document-core/.classpath +++ b/spring-data-document-core/.classpath @@ -1,16 +1,12 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java index 813529021..94e6e2008 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java @@ -90,7 +90,7 @@ public class SimpleMongoRepository implements Paging * * @see org.springframework.data.repository.Repository#findById(java.io.Serializable ) */ - public T findById(ID id) { + public T findOne(ID id) { return template.findOne(entityInformation.getCollectionName(), getIdQuery(id), entityInformation.getJavaType()); } @@ -113,7 +113,7 @@ public class SimpleMongoRepository implements Paging */ public boolean exists(ID id) { - return findById(id) != null; + return findOne(id) != null; } /* diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index aafac0e8f..b04b2ebd3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -57,7 +57,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests { @Test public void findsPersonById() throws Exception { - assertThat(repository.findById(dave.getId()), is(dave)); + assertThat(repository.findOne(dave.getId()), is(dave)); } @Test From d824ed7e72d715886a4b290d8a845949a7475d77 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 11 Mar 2011 19:01:05 +0100 Subject: [PATCH 5/5] DATACMNS-21 - Override Repository methods returning Iterable. As the MongoOperations currently only returns Lists anyway we can override the methods returning an Iterable to return List for now. --- .../mongodb/repository/MongoRepository.java | 21 ++++++++++++++++--- .../repository/SimpleMongoRepository.java | 7 +++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepository.java index df832fb30..005e3d10b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoRepository.java @@ -16,16 +16,31 @@ package org.springframework.data.document.mongodb.repository; import java.io.Serializable; +import java.util.List; +import org.springframework.data.domain.Sort; import org.springframework.data.repository.PagingAndSortingRepository; - /** * Mongo specific {@link org.springframework.data.repository.Repository} interface. * * @author Oliver Gierke */ -public interface MongoRepository extends - PagingAndSortingRepository { +public interface MongoRepository extends PagingAndSortingRepository { + + /* + * (non-Javadoc) + * + * @see org.springframework.data.repository.Repository#findAll() + */ + @Override + List findAll(); + /* + * (non-Javadoc) + * + * @see org.springframework.data.repository.PagingAndSortingRepository#findAll(org.springframework.data.domain.Sort) + */ + @Override + List findAll(Sort sort); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java index 94e6e2008..2ba914bb6 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/SimpleMongoRepository.java @@ -30,7 +30,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.util.Assert; /** @@ -38,13 +37,13 @@ import org.springframework.util.Assert; * * @author Oliver Gierke */ -public class SimpleMongoRepository implements PagingAndSortingRepository { +public class SimpleMongoRepository implements MongoRepository { private final MongoTemplate template; private final MongoEntityInformation entityInformation; /** - * Creates a ew {@link SimpleMongoRepository} for the given {@link MongoInformation} and {@link MongoTemplate}. + * Creates a new {@link SimpleMongoRepository} for the given {@link MongoInformation} and {@link MongoTemplate}. * * @param metadata * @param template @@ -73,7 +72,7 @@ public class SimpleMongoRepository implements Paging * * @see org.springframework.data.repository.Repository#save(java.lang.Iterable) */ - public List save(Iterable entities) { + public Iterable save(Iterable entities) { List result = new ArrayList();