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 1b6ff8c1b..f4260b2f7 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 @@ -19,6 +19,7 @@ import java.io.Serializable; import java.lang.reflect.Method; import org.springframework.data.document.mongodb.MongoOperations; +import org.springframework.data.document.mongodb.MongoPropertyDescriptors.MongoPropertyDescriptor; import org.springframework.data.repository.Repository; import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.data.repository.query.QueryLookupStrategy.Key; @@ -27,7 +28,9 @@ import org.springframework.data.repository.query.RepositoryQuery; import org.springframework.data.repository.support.RepositoryFactoryBeanSupport; import org.springframework.data.repository.support.RepositoryFactorySupport; import org.springframework.data.repository.support.RepositorySupport; +import org.springframework.data.repository.util.ClassUtils; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; /** @@ -36,7 +39,7 @@ import org.springframework.util.Assert; * @author Oliver Gierke */ public class MongoRepositoryFactoryBean extends - RepositoryFactoryBeanSupport> { + RepositoryFactoryBeanSupport> { private MongoOperations operations; @@ -62,7 +65,7 @@ public class MongoRepositoryFactoryBean extends @Override protected RepositoryFactorySupport createRepositoryFactory() { - return new MongoRepositoryFactory(); + return new MongoRepositoryFactory(operations); } @@ -85,9 +88,22 @@ public class MongoRepositoryFactoryBean extends * * @author Oliver Gierke */ - private class MongoRepositoryFactory extends RepositoryFactorySupport { + public static class MongoRepositoryFactory extends RepositoryFactorySupport { + + private final MongoOperations operations; + + /** + * Creates a new {@link MongoRepositoryFactory} fwith the given {@link MongoOperations}. + * + * @param operations + */ + public MongoRepositoryFactory(MongoOperations operations) { + + this.operations = operations; + } - @Override + + @Override protected RepositorySupport getTargetRepository( Class domainClass, Class repositoryInterface) { @@ -121,5 +137,20 @@ public class MongoRepositoryFactoryBean extends return new MongoQuery(new QueryMethod(method), operations); } } + + /* (non-Javadoc) + * @see org.springframework.data.repository.support.RepositoryFactorySupport#validate(java.lang.Class, java.lang.Object) + */ + @Override + protected void validate(Class> repositoryInterface, Object customImplementation) { + + Class idClass = ClassUtils.getIdClass(repositoryInterface); + if (!MongoPropertyDescriptor.SUPPORTED_ID_CLASSES.contains(idClass)) { + throw new IllegalArgumentException(String.format("Unsupported id class! Only %s are supported!", + StringUtils.collectionToCommaDelimitedString(MongoPropertyDescriptor.SUPPORTED_ID_CLASSES))); + } + + super.validate(repositoryInterface, customImplementation); + } } } 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 31401d3f9..5223ffcb3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2010-2011 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. @@ -104,12 +104,8 @@ public class SimpleMongoRepository extends * ) */ public T findById(ID id) { - - List result = - operations.query(operations.getDefaultCollectionName(), - QueryBuilder.start("_id").get(), getDomainClass()); - - return result.isEmpty() ? null : result.get(0); + + return operations.find(getDomainClass(), id); } 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 3759cd31b..1ef25b649 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 @@ -69,6 +69,10 @@ public abstract class MongoOperationsUnitTests { public T convertObjectId(ObjectId id, Class targetType) { return null; } + + public ObjectId convertObjectId(Object id) { + 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 new file mode 100644 index 000000000..3990f9376 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/MongoTemplateTests.java @@ -0,0 +1,54 @@ +/* + * Copyright 2011 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; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Integration test for {@link MongoTemplate}. + * + * @author Oliver Gierke + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:infrastructure.xml") +public class MongoTemplateTests { + + @Autowired + MongoTemplate template; + + @Before + public void setUp() { + template.dropCollection(template.getDefaultCollectionName()); + } + + @Test + public void insertsSimpleEntityCorrectly() throws Exception { + + Person person = new Person("Oliver"); + template.insert(person); + + Person reference = template.find(Person.class, person.getId()); + assertThat(reference, is(person)); + } +} 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 08c948978..c1021e301 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 @@ -40,6 +40,12 @@ public abstract class AbstractPersonRepositoryIntegrationTests { repository.save(Arrays.asList(dave, carter, boyd, stefan, leroi)); } + + @Test + public void findsPersonById() throws Exception { + + assertThat(repository.findById(dave.getId()), is(dave)); + } @Test public void findsPersonsByLastname() throws Exception { 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 new file mode 100644 index 000000000..04aa68696 --- /dev/null +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/MongoRepositoryFactoryUnitTests.java @@ -0,0 +1,46 @@ +/* + * Copyright 2011 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 org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.data.document.mongodb.MongoOperations; +import org.springframework.data.document.mongodb.User; +import org.springframework.data.document.mongodb.repository.MongoRepositoryFactoryBean.MongoRepositoryFactory; + +/** + * Unit test for {@link MongoRepositoryFactory}. + * + * @author Oliver Gierke + */ +@RunWith(MockitoJUnitRunner.class) +public class MongoRepositoryFactoryUnitTests { + + @Mock + MongoOperations operations; + + @Test(expected = IllegalArgumentException.class) + public void rejectsInvalidIdType() throws Exception { + MongoRepositoryFactory factory = new MongoRepositoryFactory(operations); + factory.getRepository(SampleRepository.class); + } + + private interface SampleRepository extends MongoRepository { + + } +} diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java index 43013d32d..aa8c1e371 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java @@ -26,7 +26,7 @@ import org.springframework.data.domain.Pageable; * * @author Oliver Gierke */ -public interface PersonRepository extends MongoRepository { +public interface PersonRepository extends MongoRepository { /** * Returns all {@link Person}s with the given lastname. diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/infrastructure.xml b/spring-data-mongodb/src/test/resources/infrastructure.xml similarity index 73% rename from spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/infrastructure.xml rename to spring-data-mongodb/src/test/resources/infrastructure.xml index c34a0a5f8..0e0d85184 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/infrastructure.xml +++ b/spring-data-mongodb/src/test/resources/infrastructure.xml @@ -3,13 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> + + + + + - - - - - - + diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/PersonRepositoryIntegrationTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/PersonRepositoryIntegrationTests-context.xml index 782f61b92..6ed419707 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/PersonRepositoryIntegrationTests-context.xml +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/PersonRepositoryIntegrationTests-context.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - + diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml index 6df1f15c5..5e4048ebf 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/document/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml @@ -7,7 +7,7 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.0.xsd"> - +