From bf7c9663cf7d3ecfa353238247af8dc6c6d00d58 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 7 Sep 2011 16:20:26 +0200 Subject: [PATCH] DATADOC-274, DATADOC-276 - Split up repository package to be consistent with Spring Data JPA. Introduced dedicated config, query and support packages. Updated Sonargraph architecture description introducing subsystems for repository layer. --- .../Spring Data MongoDB.sonargraph | 26 +- spring-data-mongodb/pom.xml | 2 +- ...andler.java => MongoNamespaceHandler.java} | 3 +- .../MongoPersistentEntityIndexCreator.java | 9 +- .../MongoRepositoryFactoryBean.java | 355 ------------------ .../config/MongoRepositoryConfigParser.java | 4 +- .../SimpleMongoRepositoryConfiguration.java | 4 +- .../{ => query}/AbstractMongoQuery.java | 4 +- .../ConvertingParameterAccessor.java | 2 +- .../query/EntityInformationCreator.java | 48 +++ .../{ => query}/MongoEntityInformation.java | 2 +- .../{ => query}/MongoParameterAccessor.java | 2 +- .../{ => query}/MongoParameters.java | 3 +- .../MongoParametersParameterAccessor.java | 2 +- .../{ => query}/MongoQueryCreator.java | 4 +- .../{ => query}/MongoQueryMethod.java | 10 +- .../{ => query}/PartTreeMongoQuery.java | 2 +- .../repository/{ => query}/QueryUtils.java | 4 +- .../{ => query}/StringBasedMongoQuery.java | 2 +- .../DefaultEntityInformationCreator.java | 65 ++++ .../IndexEnsuringQueryCreationListener.java | 102 +++++ .../MappingMongoEntityInformation.java | 3 +- .../MongoAnnotationProcessor.java | 8 +- .../support/MongoRepositoryFactory.java | 156 ++++++++ .../support/MongoRepositoryFactoryBean.java | 99 +++++ .../QueryDslMongoRepository.java | 3 +- .../QuerydslRepositorySupport.java | 2 +- .../{ => support}/SimpleMongoRepository.java | 4 +- .../main/resources/META-INF/spring.handlers | 2 +- ...tractPersonRepositoryIntegrationTests.java | 3 +- .../data/mongodb/repository/Contact.java | 2 +- ...appingMongoEntityInformationUnitTests.java | 4 +- ...oParametersParameterAccessorUnitTests.java | 7 +- .../{ => query}/MongoParametersUnitTests.java | 6 +- .../MongoQueryCreatorUnitTests.java | 8 +- .../MongoQueryMethodUnitTests.java | 9 +- .../StringBasedMongoQueryUnitTests.java | 11 +- .../{ => query}/StubParameterAccessor.java | 5 +- .../MongoRepositoryFactoryBeanUnitTests.java | 5 +- .../MongoRepositoryFactoryUnitTests.java | 8 +- .../QuerydslRepositorySupportUnitTests.java | 4 +- ...rsonRepositoryIntegrationTests-context.xml | 2 +- 42 files changed, 580 insertions(+), 426 deletions(-) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/{MongoRepositoryNamespaceHandler.java => MongoNamespaceHandler.java} (89%) delete mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBean.java rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/{ => repository}/config/MongoRepositoryConfigParser.java (92%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/{ => repository}/config/SimpleMongoRepositoryConfiguration.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/AbstractMongoQuery.java (98%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/ConvertingParameterAccessor.java (98%) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/EntityInformationCreator.java rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/MongoEntityInformation.java (95%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/MongoParameterAccessor.java (95%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/MongoParameters.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/MongoParametersParameterAccessor.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/MongoQueryCreator.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/MongoQueryMethod.java (93%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/PartTreeMongoQuery.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/QueryUtils.java (95%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => query}/StringBasedMongoQuery.java (98%) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/DefaultEntityInformationCreator.java create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/IndexEnsuringQueryCreationListener.java rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => support}/MappingMongoEntityInformation.java (95%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => support}/MongoAnnotationProcessor.java (92%) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => support}/QueryDslMongoRepository.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => support}/QuerydslRepositorySupport.java (97%) rename spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/{ => support}/SimpleMongoRepository.java (96%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/MappingMongoEntityInformationUnitTests.java (89%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/MongoParametersParameterAccessorUnitTests.java (89%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/MongoParametersUnitTests.java (92%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/MongoQueryCreatorUnitTests.java (94%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/MongoQueryMethodUnitTests.java (93%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/StringBasedMongoQueryUnitTests.java (92%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => query}/StubParameterAccessor.java (92%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => support}/MongoRepositoryFactoryBeanUnitTests.java (92%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => support}/MongoRepositoryFactoryUnitTests.java (89%) rename spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/{ => support}/QuerydslRepositorySupportUnitTests.java (91%) diff --git a/spring-data-mongodb/Spring Data MongoDB.sonargraph b/spring-data-mongodb/Spring Data MongoDB.sonargraph index 160d46cf5..5ced1252a 100644 --- a/spring-data-mongodb/Spring Data MongoDB.sonargraph +++ b/spring-data-mongodb/Spring Data MongoDB.sonargraph @@ -7,7 +7,7 @@ - + @@ -17,6 +17,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index cb8f38ee8..1e68510d5 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -148,7 +148,7 @@ target/generated-test-sources - org.springframework.data.mongodb.repository.MongoAnnotationProcessor + org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoRepositoryNamespaceHandler.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoNamespaceHandler.java similarity index 89% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoRepositoryNamespaceHandler.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoNamespaceHandler.java index 643ee23ab..4eb27dee5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoRepositoryNamespaceHandler.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoNamespaceHandler.java @@ -16,13 +16,14 @@ package org.springframework.data.mongodb.config; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; +import org.springframework.data.mongodb.repository.config.MongoRepositoryConfigParser; /** * {@link org.springframework.beans.factory.xml.NamespaceHandler} for Mongo DB based repositories. * * @author Oliver Gierke */ -public class MongoRepositoryNamespaceHandler extends NamespaceHandlerSupport { +public class MongoNamespaceHandler extends NamespaceHandlerSupport { /* * (non-Javadoc) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexCreator.java index 3400eef99..3bd717888 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexCreator.java @@ -17,14 +17,9 @@ package org.springframework.data.mongodb.core.index; import java.lang.reflect.Field; -import java.util.Collections; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import com.mongodb.BasicDBObject; -import com.mongodb.DBObject; -import com.mongodb.util.JSON; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationListener; @@ -38,6 +33,10 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.util.JSON; + /** * Component that inspects {@link BasicMongoPersistentEntity} instances contained in the given * {@link MongoMappingContext} for indexing metadata and ensures the indexes to be available. diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBean.java deleted file mode 100644 index 8385b9f73..000000000 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBean.java +++ /dev/null @@ -1,355 +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.mongodb.repository; - -import static org.springframework.data.querydsl.QueryDslUtils.*; - -import java.io.Serializable; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.data.domain.Sort; -import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.mongodb.core.MongoOperations; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.index.Index; -import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; -import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; -import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; -import org.springframework.data.mongodb.core.query.Order; -import org.springframework.data.querydsl.QueryDslPredicateExecutor; -import org.springframework.data.repository.Repository; -import org.springframework.data.repository.core.NamedQueries; -import org.springframework.data.repository.core.RepositoryMetadata; -import org.springframework.data.repository.core.support.QueryCreationListener; -import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport; -import org.springframework.data.repository.core.support.RepositoryFactorySupport; -import org.springframework.data.repository.query.QueryLookupStrategy; -import org.springframework.data.repository.query.RepositoryQuery; -import org.springframework.data.repository.query.QueryLookupStrategy.Key; -import org.springframework.data.repository.query.parser.Part; -import org.springframework.data.repository.query.parser.Part.Type; -import org.springframework.data.repository.query.parser.PartTree; -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * {@link org.springframework.beans.factory.FactoryBean} to create {@link MongoRepository} instances. - * - * @author Oliver Gierke - */ -public class MongoRepositoryFactoryBean, S, ID extends Serializable> extends - RepositoryFactoryBeanSupport { - - private MongoTemplate template; - private boolean createIndexesForQueryMethods = false; - - /** - * Configures the {@link MongoTemplate} to be used. - * - * @param template the template to set - */ - public void setTemplate(MongoTemplate template) { - - this.template = template; - } - - /** - * Configures whether to automatically create indexes for the properties referenced in a query method. - * - * @param createIndexesForQueryMethods the createIndexesForQueryMethods to set - */ - public void setCreateIndexesForQueryMethods(boolean createIndexesForQueryMethods) { - this.createIndexesForQueryMethods = createIndexesForQueryMethods; - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.RepositoryFactoryBeanSupport - * #createRepositoryFactory() - */ - @Override - protected final RepositoryFactorySupport createRepositoryFactory() { - - RepositoryFactorySupport factory = getFactoryInstance(template); - - if (createIndexesForQueryMethods) { - factory.addQueryCreationListener(new IndexEnsuringQueryCreationListener(template)); - } - - return factory; - } - - /** - * Creates and initializes a {@link RepositoryFactorySupport} instance. - * - * @param template - * @return - */ - protected RepositoryFactorySupport getFactoryInstance(MongoTemplate template) { - return new MongoRepositoryFactory(template); - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.RepositoryFactoryBeanSupport - * #afterPropertiesSet() - */ - @Override - public void afterPropertiesSet() { - - super.afterPropertiesSet(); - Assert.notNull(template, "MongoTemplate must not be null!"); - } - - /** - * Repository to create {@link MongoRepository} instances. - * - * @author Oliver Gierke - */ - public static class MongoRepositoryFactory extends RepositoryFactorySupport { - - private final MongoTemplate template; - private final EntityInformationCreator entityInformationCreator; - - /** - * Creates a new {@link MongoRepositoryFactory} with the given {@link MongoTemplate} and {@link MappingContext}. - * - * @param template must not be {@literal null} - * @param mappingContext - */ - public MongoRepositoryFactory(MongoTemplate template) { - - Assert.notNull(template); - this.template = template; - this.entityInformationCreator = new EntityInformationCreator(template.getConverter().getMappingContext()); - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.RepositoryFactorySupport - * #getRepositoryBaseClass() - */ - @Override - protected Class getRepositoryBaseClass(RepositoryMetadata metadata) { - - return isQueryDslRepository(metadata.getRepositoryInterface()) ? QueryDslMongoRepository.class - : SimpleMongoRepository.class; - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.RepositoryFactorySupport - * #getTargetRepository - * (org.springframework.data.repository.support.RepositoryMetadata) - */ - @Override - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected Object getTargetRepository(RepositoryMetadata metadata) { - - Class repositoryInterface = metadata.getRepositoryInterface(); - MongoEntityInformation entityInformation = getEntityInformation(metadata.getDomainClass()); - - if (isQueryDslRepository(repositoryInterface)) { - return new QueryDslMongoRepository(entityInformation, template); - } else { - return new SimpleMongoRepository(entityInformation, template); - } - } - - private static boolean isQueryDslRepository(Class repositoryInterface) { - - return QUERY_DSL_PRESENT && QueryDslPredicateExecutor.class.isAssignableFrom(repositoryInterface); - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.RepositoryFactorySupport - * #getQueryLookupStrategy - * (org.springframework.data.repository.query.QueryLookupStrategy.Key) - */ - @Override - protected QueryLookupStrategy getQueryLookupStrategy(Key key) { - - return new MongoQueryLookupStrategy(); - } - - /** - * {@link QueryLookupStrategy} to create {@link PartTreeMongoQuery} instances. - * - * @author Oliver Gierke - */ - private class MongoQueryLookupStrategy implements QueryLookupStrategy { - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.query.QueryLookupStrategy - * #resolveQuery(java.lang.reflect.Method, java.lang.Class) - */ - public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, NamedQueries namedQueries) { - - MongoQueryMethod queryMethod = new MongoQueryMethod(method, metadata, entityInformationCreator); - String namedQueryName = queryMethod.getNamedQueryName(); - - if (namedQueries.hasQuery(namedQueryName)) { - String namedQuery = namedQueries.getQuery(namedQueryName); - return new StringBasedMongoQuery(namedQuery, queryMethod, template); - } else if (queryMethod.hasAnnotatedQuery()) { - return new StringBasedMongoQuery(queryMethod, template); - } else { - return new PartTreeMongoQuery(queryMethod, template); - } - } - } - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.support.RepositoryFactorySupport#validate(org.springframework.data.repository.support.RepositoryMetadata) - */ - @Override - protected void validate(RepositoryMetadata metadata) { - - Class idClass = metadata.getIdClass(); - if (!MongoSimpleTypes.SUPPORTED_ID_CLASSES.contains(idClass)) { - throw new IllegalArgumentException(String.format("Unsupported id class! Only %s are supported!", - StringUtils.collectionToCommaDelimitedString(MongoSimpleTypes.SUPPORTED_ID_CLASSES))); - } - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.RepositoryFactorySupport - * #getEntityInformation(java.lang.Class) - */ - @Override - public MongoEntityInformation getEntityInformation(Class domainClass) { - - return entityInformationCreator.getEntityInformation(domainClass); - } - } - - /** - * Simple wrapper to to create {@link MongoEntityInformation} instances based on a {@link MappingContext}. - * - * @author Oliver Gierke - */ - static class EntityInformationCreator { - - private final MappingContext, MongoPersistentProperty> mappingContext; - - public EntityInformationCreator( - MappingContext, MongoPersistentProperty> mappingContext) { - Assert.notNull(mappingContext); - this.mappingContext = mappingContext; - } - - public MongoEntityInformation getEntityInformation(Class domainClass) { - return getEntityInformation(domainClass, null); - } - - @SuppressWarnings("unchecked") - public MongoEntityInformation getEntityInformation(Class domainClass, - Class collectionClass) { - MongoPersistentEntity persistentEntity = (MongoPersistentEntity) mappingContext - .getPersistentEntity(domainClass); - String customCollectionName = collectionClass == null ? null : mappingContext - .getPersistentEntity(collectionClass).getCollection(); - return new MappingMongoEntityInformation(persistentEntity, customCollectionName); - } - } - - /** - * {@link QueryCreationListener} inspecting {@link PartTreeMongoQuery}s and creating an index for the properties it - * refers to. - * - * @author Oliver Gierke - */ - static class IndexEnsuringQueryCreationListener implements QueryCreationListener { - - private static final Set GEOSPATIAL_TYPES = new HashSet(Arrays.asList(Type.NEAR, Type.WITHIN)); - private static final Log LOG = LogFactory.getLog(IndexEnsuringQueryCreationListener.class); - private final MongoOperations operations; - - public IndexEnsuringQueryCreationListener(MongoOperations operations) { - - this.operations = operations; - } - - /* - * (non-Javadoc) - * - * @see - * org.springframework.data.repository.support.QueryCreationListener - * #onCreation(org.springframework.data.repository - * .query.RepositoryQuery) - */ - public void onCreation(PartTreeMongoQuery query) { - - PartTree tree = query.getTree(); - Index index = new Index(); - index.named(query.getQueryMethod().getName()); - Sort sort = tree.getSort(); - - for (Part part : tree.getParts()) { - if (GEOSPATIAL_TYPES.contains(part.getType())) { - return; - } - String property = part.getProperty().toDotPath(); - Order order = toOrder(sort, property); - index.on(property, order); - } - - // Add fixed sorting criteria to index - if (sort != null) { - for (Sort.Order order : sort) { - index.on(order.getProperty(), QueryUtils.toOrder(order)); - } - } - - MongoEntityInformation metadata = query.getQueryMethod().getEntityInformation(); - operations.ensureIndex(index, metadata.getCollectionName()); - LOG.debug(String.format("Created %s!", index)); - } - - private static Order toOrder(Sort sort, String property) { - - if (sort == null) { - return Order.DESCENDING; - } - - org.springframework.data.domain.Sort.Order order = sort.getOrderFor(property); - return order == null ? Order.DESCENDING : order.isAscending() ? Order.ASCENDING : Order.DESCENDING; - } - } -} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoRepositoryConfigParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigParser.java similarity index 92% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoRepositoryConfigParser.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigParser.java index b4679f667..b3e28bad5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoRepositoryConfigParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/MongoRepositoryConfigParser.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.config; +package org.springframework.data.mongodb.repository.config; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.data.mongodb.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration; +import org.springframework.data.mongodb.repository.config.SimpleMongoRepositoryConfiguration.MongoRepositoryConfiguration; import org.springframework.data.repository.config.AbstractRepositoryConfigDefinitionParser; import org.w3c.dom.Element; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/SimpleMongoRepositoryConfiguration.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/SimpleMongoRepositoryConfiguration.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/SimpleMongoRepositoryConfiguration.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/SimpleMongoRepositoryConfiguration.java index 73df4fd2e..7fe5af2ce 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/SimpleMongoRepositoryConfiguration.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/config/SimpleMongoRepositoryConfiguration.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.config; +package org.springframework.data.mongodb.repository.config; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean; +import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean; import org.springframework.data.repository.config.AutomaticRepositoryConfigInformation; import org.springframework.data.repository.config.ManualRepositoryConfigInformation; import org.springframework.data.repository.config.RepositoryConfig; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/AbstractMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java similarity index 98% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/AbstractMongoQuery.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java index 7cc335075..614ab2d38 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/AbstractMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; -import static org.springframework.data.mongodb.repository.QueryUtils.*; +import static org.springframework.data.mongodb.repository.query.QueryUtils.*; import java.util.List; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java similarity index 98% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/ConvertingParameterAccessor.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java index 326ae4418..d039f68b0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import java.util.Iterator; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/EntityInformationCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/EntityInformationCreator.java new file mode 100644 index 000000000..af305dd8e --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/EntityInformationCreator.java @@ -0,0 +1,48 @@ +/* + * 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.mongodb.repository.query; + +import java.io.Serializable; + + +/** + * Interface for components being able to provide {@link EntityInformationCreator} for a given {@link Class}. + * + * @author Oliver Gierke + */ +public interface EntityInformationCreator { + + /** + * Returns a {@link MongoEntityInformation} for the given domain class. + * + * @param domainClass the domain class to create the {@link MongoEntityInformation} for, must not be {@literal null}. + * @return + */ + MongoEntityInformation getEntityInformation(Class domainClass); + + /** + * Returns a {@link MongoEntityInformation} for the given domain class and class to retrieve the collection to query + * against from. + * + * @param domainClass the domain class to create the {@link MongoEntityInformation} for, must not be {@literal null}. + * @param collectionClass the class to derive the collection from queries to retrieve the domain classes from shall be + * ran against, must not be {@literal null}. + * @return + */ + MongoEntityInformation getEntityInformation(Class domainClass, + Class collectionClass); + +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoEntityInformation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoEntityInformation.java similarity index 95% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoEntityInformation.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoEntityInformation.java index e47ce2226..a68896c03 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoEntityInformation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoEntityInformation.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import java.io.Serializable; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java similarity index 95% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParameterAccessor.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java index 25404cd1c..d7e5d2afa 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameterAccessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Point; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParameters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParameters.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java index 3921c9325..51526fc46 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParameters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParameters.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import java.lang.reflect.Method; import java.util.Arrays; @@ -22,6 +22,7 @@ import java.util.List; import org.springframework.core.MethodParameter; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Point; +import org.springframework.data.mongodb.repository.Near; import org.springframework.data.repository.query.Parameter; import org.springframework.data.repository.query.Parameters; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParametersParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParametersParameterAccessor.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java index 7502d123c..bbbebe76f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoParametersParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Point; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoQueryCreator.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java index d018d491b..5b36e0e6d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryCreator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.springframework.data.mongodb.core.query.Criteria.*; @@ -29,7 +29,7 @@ import org.springframework.data.mongodb.core.geo.Point; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.CriteriaDefinition; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.data.mongodb.repository.ConvertingParameterAccessor.PotentiallyConvertingIterator; +import org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor.PotentiallyConvertingIterator; import org.springframework.data.repository.query.ParametersParameterAccessor; import org.springframework.data.repository.query.parser.AbstractQueryCreator; import org.springframework.data.repository.query.parser.Part; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java similarity index 93% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoQueryMethod.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 50e4b6494..257216663 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import java.lang.reflect.Method; import java.util.Arrays; @@ -23,7 +23,7 @@ import org.springframework.core.annotation.AnnotationUtils; import org.springframework.data.mongodb.core.geo.GeoPage; import org.springframework.data.mongodb.core.geo.GeoResult; import org.springframework.data.mongodb.core.geo.GeoResults; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.EntityInformationCreator; +import org.springframework.data.mongodb.repository.Query; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.query.Parameters; import org.springframework.data.repository.query.QueryMethod; @@ -39,7 +39,7 @@ import org.springframework.util.StringUtils; * * @author Oliver Gierke */ -class MongoQueryMethod extends QueryMethod { +public class MongoQueryMethod extends QueryMethod { @SuppressWarnings("unchecked") private static final List> GEO_NEAR_RESULTS = Arrays @@ -55,7 +55,7 @@ class MongoQueryMethod extends QueryMethod { */ public MongoQueryMethod(Method method, RepositoryMetadata metadata, EntityInformationCreator entityInformationCreator) { super(method, metadata); - Assert.notNull(entityInformationCreator, "EntityInformationCreator must not be null!"); + Assert.notNull(entityInformationCreator, "DefaultEntityInformationCreator must not be null!"); this.method = method; this.entityInformation = entityInformationCreator.getEntityInformation(ClassUtils.getReturnedDomainClass(method), getDomainClass()); @@ -75,7 +75,7 @@ class MongoQueryMethod extends QueryMethod { * * @return */ - boolean hasAnnotatedQuery() { + public boolean hasAnnotatedQuery() { return getAnnotatedQuery() != null; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/PartTreeMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/PartTreeMongoQuery.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java index d3df7c147..159b53518 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/PartTreeMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Query; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QueryUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java similarity index 95% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QueryUtils.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java index f76860aee..febd36774 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QueryUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/QueryUtils.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import com.mongodb.DBCursor; import org.springframework.data.domain.Pageable; @@ -26,7 +26,7 @@ import org.springframework.data.mongodb.core.query.Query; * * @author Oliver Gierke */ -abstract class QueryUtils { +public abstract class QueryUtils { private QueryUtils() { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/StringBasedMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java similarity index 98% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/StringBasedMongoQuery.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java index 8127125f5..b56012af8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/StringBasedMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/DefaultEntityInformationCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/DefaultEntityInformationCreator.java new file mode 100644 index 000000000..547c045ca --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/DefaultEntityInformationCreator.java @@ -0,0 +1,65 @@ +/* + * 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.mongodb.repository.support; + +import java.io.Serializable; + +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; +import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; +import org.springframework.data.mongodb.repository.query.EntityInformationCreator; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; +import org.springframework.util.Assert; + +/** + * Simple {@link EntityInformationCreator} to to create {@link MongoEntityInformation} instances based on a {@link MappingContext}. + * + * @author Oliver Gierke + */ +public class DefaultEntityInformationCreator implements EntityInformationCreator { + + private final MappingContext, MongoPersistentProperty> mappingContext; + + public DefaultEntityInformationCreator( + MappingContext, MongoPersistentProperty> mappingContext) { + Assert.notNull(mappingContext); + this.mappingContext = mappingContext; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.repository.support.EntityInformationCreator#getEntityInformation(java.lang.Class) + */ + public MongoEntityInformation getEntityInformation(Class domainClass) { + return getEntityInformation(domainClass, null); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.mongodb.repository.support.EntityInformationCreator#getEntityInformation(java.lang.Class, java.lang.Class) + */ + @SuppressWarnings("unchecked") + public MongoEntityInformation getEntityInformation(Class domainClass, + Class collectionClass) { + + MongoPersistentEntity persistentEntity = (MongoPersistentEntity) mappingContext + .getPersistentEntity(domainClass); + String customCollectionName = collectionClass == null ? null : mappingContext.getPersistentEntity(collectionClass) + .getCollection(); + + return new MappingMongoEntityInformation(persistentEntity, customCollectionName); + } +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/IndexEnsuringQueryCreationListener.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/IndexEnsuringQueryCreationListener.java new file mode 100644 index 000000000..6fbe90673 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/IndexEnsuringQueryCreationListener.java @@ -0,0 +1,102 @@ +/* + * 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.mongodb.repository.support; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.index.Index; +import org.springframework.data.mongodb.core.query.Order; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; +import org.springframework.data.mongodb.repository.query.PartTreeMongoQuery; +import org.springframework.data.mongodb.repository.query.QueryUtils; +import org.springframework.data.repository.core.support.QueryCreationListener; +import org.springframework.data.repository.query.parser.Part; +import org.springframework.data.repository.query.parser.Part.Type; +import org.springframework.data.repository.query.parser.PartTree; +import org.springframework.util.Assert; + +/** + * {@link QueryCreationListener} inspecting {@link PartTreeMongoQuery}s and creating an index for the properties it + * refers to. + * + * @author Oliver Gierke + */ +class IndexEnsuringQueryCreationListener implements QueryCreationListener { + + private static final Set GEOSPATIAL_TYPES = new HashSet(Arrays.asList(Type.NEAR, Type.WITHIN)); + private static final Log LOG = LogFactory.getLog(IndexEnsuringQueryCreationListener.class); + + private final MongoOperations operations; + + /** + * Creates a new {@link IndexEnsuringQueryCreationListener} using the given {@link MongoOperations}. + * + * @param operations must not be {@literal null}. + */ + public IndexEnsuringQueryCreationListener(MongoOperations operations) { + + Assert.notNull(operations); + this.operations = operations; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.support.QueryCreationListener#onCreation(org.springframework.data.repository.query.RepositoryQuery) + */ + public void onCreation(PartTreeMongoQuery query) { + + PartTree tree = query.getTree(); + Index index = new Index(); + index.named(query.getQueryMethod().getName()); + Sort sort = tree.getSort(); + + for (Part part : tree.getParts()) { + if (GEOSPATIAL_TYPES.contains(part.getType())) { + return; + } + String property = part.getProperty().toDotPath(); + Order order = toOrder(sort, property); + index.on(property, order); + } + + // Add fixed sorting criteria to index + if (sort != null) { + for (Sort.Order order : sort) { + index.on(order.getProperty(), QueryUtils.toOrder(order)); + } + } + + MongoEntityInformation metadata = query.getQueryMethod().getEntityInformation(); + operations.ensureIndex(index, metadata.getCollectionName()); + LOG.debug(String.format("Created %s!", index)); + } + + private static Order toOrder(Sort sort, String property) { + + if (sort == null) { + return Order.DESCENDING; + } + + org.springframework.data.domain.Sort.Order order = sort.getOrderFor(property); + return order == null ? Order.DESCENDING : order.isAscending() ? Order.ASCENDING : Order.DESCENDING; + } +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MappingMongoEntityInformation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MappingMongoEntityInformation.java similarity index 95% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MappingMongoEntityInformation.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MappingMongoEntityInformation.java index 55571bd3a..879579464 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MappingMongoEntityInformation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MappingMongoEntityInformation.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import java.io.Serializable; import org.springframework.data.mapping.model.BeanWrapper; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.data.repository.core.support.AbstractEntityInformation; /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoAnnotationProcessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoAnnotationProcessor.java similarity index 92% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoAnnotationProcessor.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoAnnotationProcessor.java index a002fcb4f..2b66bbb56 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/MongoAnnotationProcessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoAnnotationProcessor.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; -import java.lang.annotation.Annotation; import java.util.Collections; import java.util.Set; @@ -38,16 +37,15 @@ import com.mysema.query.apt.DefaultConfiguration; import com.mysema.query.apt.Processor; /** - * Annotation processor to create Querydsl query types for QueryDsl annoated classes + * Annotation processor to create Querydsl query types for QueryDsl annoated classes. * * @author Oliver Gierke */ +@SuppressWarnings("restriction") @SupportedAnnotationTypes({ "com.mysema.query.annotations.*", "org.springframework.data.mongodb.core.mapping.*" }) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class MongoAnnotationProcessor extends AbstractProcessor { - private Class entities, entity, embedded, skip; - @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java new file mode 100644 index 000000000..df18bd9fa --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactory.java @@ -0,0 +1,156 @@ +/* + * 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. + * 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.mongodb.repository.support; + +import static org.springframework.data.querydsl.QueryDslUtils.*; + +import java.io.Serializable; +import java.lang.reflect.Method; + +import org.springframework.data.mapping.context.MappingContext; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.query.EntityInformationCreator; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; +import org.springframework.data.mongodb.repository.query.MongoQueryMethod; +import org.springframework.data.mongodb.repository.query.PartTreeMongoQuery; +import org.springframework.data.mongodb.repository.query.StringBasedMongoQuery; +import org.springframework.data.querydsl.QueryDslPredicateExecutor; +import org.springframework.data.repository.core.NamedQueries; +import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.data.repository.query.QueryLookupStrategy; +import org.springframework.data.repository.query.QueryLookupStrategy.Key; +import org.springframework.data.repository.query.RepositoryQuery; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +/** + * Factory to create {@link MongoRepository} instances. + * + * @author Oliver Gierke + */ +public class MongoRepositoryFactory extends RepositoryFactorySupport { + + private final MongoTemplate template; + private final EntityInformationCreator entityInformationCreator; + + /** + * Creates a new {@link MongoRepositoryFactory} with the given {@link MongoTemplate} and {@link MappingContext}. + * + * @param template must not be {@literal null} + * @param mappingContext + */ + public MongoRepositoryFactory(MongoTemplate template) { + + Assert.notNull(template); + this.template = template; + this.entityInformationCreator = new DefaultEntityInformationCreator(template.getConverter().getMappingContext()); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getRepositoryBaseClass(org.springframework.data.repository.core.RepositoryMetadata) + */ + @Override + protected Class getRepositoryBaseClass(RepositoryMetadata metadata) { + return isQueryDslRepository(metadata.getRepositoryInterface()) ? QueryDslMongoRepository.class + : SimpleMongoRepository.class; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getTargetRepository(org.springframework.data.repository.core.RepositoryMetadata) + */ + @Override + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected Object getTargetRepository(RepositoryMetadata metadata) { + + Class repositoryInterface = metadata.getRepositoryInterface(); + MongoEntityInformation entityInformation = getEntityInformation(metadata.getDomainClass()); + + if (isQueryDslRepository(repositoryInterface)) { + return new QueryDslMongoRepository(entityInformation, template); + } else { + return new SimpleMongoRepository(entityInformation, template); + } + } + + private static boolean isQueryDslRepository(Class repositoryInterface) { + + return QUERY_DSL_PRESENT && QueryDslPredicateExecutor.class.isAssignableFrom(repositoryInterface); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getQueryLookupStrategy(org.springframework.data.repository.query.QueryLookupStrategy.Key) + */ + @Override + protected QueryLookupStrategy getQueryLookupStrategy(Key key) { + return new MongoQueryLookupStrategy(); + } + + /** + * {@link QueryLookupStrategy} to create {@link PartTreeMongoQuery} instances. + * + * @author Oliver Gierke + */ + private class MongoQueryLookupStrategy implements QueryLookupStrategy { + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.query.QueryLookupStrategy#resolveQuery(java.lang.reflect.Method, org.springframework.data.repository.core.RepositoryMetadata, org.springframework.data.repository.core.NamedQueries) + */ + public RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, NamedQueries namedQueries) { + + MongoQueryMethod queryMethod = new MongoQueryMethod(method, metadata, entityInformationCreator); + String namedQueryName = queryMethod.getNamedQueryName(); + + if (namedQueries.hasQuery(namedQueryName)) { + String namedQuery = namedQueries.getQuery(namedQueryName); + return new StringBasedMongoQuery(namedQuery, queryMethod, template); + } else if (queryMethod.hasAnnotatedQuery()) { + return new StringBasedMongoQuery(queryMethod, template); + } else { + return new PartTreeMongoQuery(queryMethod, template); + } + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.support.RepositoryFactorySupport#validate(org.springframework.data.repository.support.RepositoryMetadata) + */ + @Override + protected void validate(RepositoryMetadata metadata) { + + Class idClass = metadata.getIdClass(); + if (!MongoSimpleTypes.SUPPORTED_ID_CLASSES.contains(idClass)) { + throw new IllegalArgumentException(String.format("Unsupported id class! Only %s are supported!", + StringUtils.collectionToCommaDelimitedString(MongoSimpleTypes.SUPPORTED_ID_CLASSES))); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.repository.core.support.RepositoryFactorySupport#getEntityInformation(java.lang.Class) + */ + @Override + public MongoEntityInformation getEntityInformation(Class domainClass) { + return entityInformationCreator.getEntityInformation(domainClass); + } +} \ No newline at end of file diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java new file mode 100644 index 000000000..44f157534 --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBean.java @@ -0,0 +1,99 @@ +/* + * 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. + * 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.mongodb.repository.support; + +import java.io.Serializable; + +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.util.Assert; + +/** + * {@link org.springframework.beans.factory.FactoryBean} to create {@link MongoRepository} instances. + * + * @author Oliver Gierke + */ +public class MongoRepositoryFactoryBean, S, ID extends Serializable> extends + RepositoryFactoryBeanSupport { + + private MongoTemplate template; + private boolean createIndexesForQueryMethods = false; + + /** + * Configures the {@link MongoTemplate} to be used. + * + * @param template the template to set + */ + public void setTemplate(MongoTemplate template) { + + this.template = template; + } + + /** + * Configures whether to automatically create indexes for the properties referenced in a query method. + * + * @param createIndexesForQueryMethods the createIndexesForQueryMethods to set + */ + public void setCreateIndexesForQueryMethods(boolean createIndexesForQueryMethods) { + this.createIndexesForQueryMethods = createIndexesForQueryMethods; + } + + /* + * (non-Javadoc) + * + * @see + * org.springframework.data.repository.support.RepositoryFactoryBeanSupport + * #createRepositoryFactory() + */ + @Override + protected final RepositoryFactorySupport createRepositoryFactory() { + + RepositoryFactorySupport factory = getFactoryInstance(template); + + if (createIndexesForQueryMethods) { + factory.addQueryCreationListener(new IndexEnsuringQueryCreationListener(template)); + } + + return factory; + } + + /** + * Creates and initializes a {@link RepositoryFactorySupport} instance. + * + * @param template + * @return + */ + protected RepositoryFactorySupport getFactoryInstance(MongoTemplate template) { + return new MongoRepositoryFactory(template); + } + + /* + * (non-Javadoc) + * + * @see + * org.springframework.data.repository.support.RepositoryFactoryBeanSupport + * #afterPropertiesSet() + */ + @Override + public void afterPropertiesSet() { + + super.afterPropertiesSet(); + Assert.notNull(template, "MongoTemplate must not be null!"); + } +} diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QueryDslMongoRepository.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java index ee604efb3..d5b87d9e8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import java.io.Serializable; import java.util.List; @@ -25,6 +25,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Order; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.data.querydsl.EntityPathResolver; import org.springframework.data.querydsl.QueryDslPredicateExecutor; import org.springframework.data.querydsl.SimpleEntityPathResolver; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QuerydslRepositorySupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java similarity index 97% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QuerydslRepositorySupport.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java index 10e04ab86..31812b718 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/QuerydslRepositorySupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupport.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import org.apache.commons.collections15.Transformer; import org.springframework.data.mapping.context.MappingContext; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/SimpleMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java similarity index 96% rename from spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/SimpleMongoRepository.java rename to spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java index 013ba0e11..bc8c13e55 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/SimpleMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SimpleMongoRepository.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import static org.springframework.data.mongodb.core.query.Criteria.*; @@ -30,6 +30,8 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; +import org.springframework.data.mongodb.repository.query.QueryUtils; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.util.Assert; diff --git a/spring-data-mongodb/src/main/resources/META-INF/spring.handlers b/spring-data-mongodb/src/main/resources/META-INF/spring.handlers index 82d98c9ac..5ec862c17 100644 --- a/spring-data-mongodb/src/main/resources/META-INF/spring.handlers +++ b/spring-data-mongodb/src/main/resources/META-INF/spring.handlers @@ -1 +1 @@ -http\://www.springframework.org/schema/data/mongo=org.springframework.data.mongodb.config.MongoRepositoryNamespaceHandler +http\://www.springframework.org/schema/data/mongo=org.springframework.data.mongodb.config.MongoNamespaceHandler diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index 855dcf174..ec45e65fe 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -13,8 +13,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; -import org.springframework.data.mongodb.repository.QPerson; -import org.springframework.data.mongodb.repository.Person.Sex; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; @@ -25,6 +23,7 @@ import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.GeoResults; import org.springframework.data.mongodb.core.geo.Metrics; import org.springframework.data.mongodb.core.geo.Point; +import org.springframework.data.mongodb.repository.Person.Sex; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Contact.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Contact.java index acbdf4a1f..ec8c98045 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Contact.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Contact.java @@ -25,7 +25,7 @@ import org.springframework.data.mongodb.core.mapping.Document; * @author Oliver Gierke */ @Document -abstract class Contact { +public abstract class Contact { @Id protected final String id; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MappingMongoEntityInformationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MappingMongoEntityInformationUnitTests.java similarity index 89% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MappingMongoEntityInformationUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MappingMongoEntityInformationUnitTests.java index 0e3e4430f..32fcf5c33 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MappingMongoEntityInformationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MappingMongoEntityInformationUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @@ -25,6 +25,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; +import org.springframework.data.mongodb.repository.Person; +import org.springframework.data.mongodb.repository.support.MappingMongoEntityInformation; /** * Unit tests for {@link MappingMongoEntityInformation}. diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoParametersParameterAccessorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java similarity index 89% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoParametersParameterAccessorUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java index 10fdb7729..831f0110d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoParametersParameterAccessorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersParameterAccessorUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @@ -26,7 +26,8 @@ import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Metrics; import org.springframework.data.mongodb.core.geo.Point; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.EntityInformationCreator; +import org.springframework.data.mongodb.repository.Person; +import org.springframework.data.mongodb.repository.support.DefaultEntityInformationCreator; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; @@ -41,7 +42,7 @@ public class MongoParametersParameterAccessorUnitTests { private static final Distance DISTANCE = new Distance(2.5, Metrics.KILOMETERS); private static final RepositoryMetadata metadata = new DefaultRepositoryMetadata(PersonRepository.class); private static final MongoMappingContext context = new MongoMappingContext(); - private static final EntityInformationCreator creator = new EntityInformationCreator(context); + private static final EntityInformationCreator creator = new DefaultEntityInformationCreator(context); @Test public void returnsNullForDistanceIfNoneAvailable() throws NoSuchMethodException, SecurityException { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoParametersUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java similarity index 92% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoParametersUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java index 11bc176a5..12cbf17e6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoParametersUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoParametersUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @@ -28,6 +28,10 @@ import org.mockito.runners.MockitoJUnitRunner; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.GeoResults; import org.springframework.data.mongodb.core.geo.Point; +import org.springframework.data.mongodb.repository.Near; +import org.springframework.data.mongodb.repository.Person; +import org.springframework.data.mongodb.repository.query.MongoParameters; +import org.springframework.data.mongodb.repository.query.MongoQueryMethod; import org.springframework.data.repository.query.Parameter; /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoQueryCreatorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java similarity index 94% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoQueryCreatorUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java index 395043699..402dc84bb 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoQueryCreatorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryCreatorUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @@ -21,7 +21,7 @@ import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import static org.springframework.data.mongodb.core.query.Criteria.*; import static org.springframework.data.mongodb.core.query.Query.*; -import static org.springframework.data.mongodb.repository.StubParameterAccessor.*; +import static org.springframework.data.mongodb.repository.query.StubParameterAccessor.*; import java.lang.reflect.Method; import java.util.List; @@ -42,7 +42,7 @@ import org.springframework.data.mongodb.core.geo.Point; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.EntityInformationCreator; +import org.springframework.data.mongodb.repository.support.DefaultEntityInformationCreator; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; import org.springframework.data.repository.query.parser.PartTree; @@ -139,7 +139,7 @@ public class MongoQueryCreatorUnitTests { Method method = PersonRepository.class.getMethod("findByLocationNearAndFirstname", Point.class, Distance.class, String.class); MongoQueryMethod queryMethod = new MongoQueryMethod(method, new DefaultRepositoryMetadata(PersonRepository.class), - new EntityInformationCreator(new MongoMappingContext())); + new DefaultEntityInformationCreator(new MongoMappingContext())); MongoParameterAccessor accessor = new MongoParametersParameterAccessor(queryMethod, new Object[] { point, distance, "Dave" }); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoQueryMethodUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java similarity index 93% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoQueryMethodUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java index 8fcd765bf..570615ddc 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoQueryMethodUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/MongoQueryMethodUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; @@ -32,7 +32,10 @@ import org.springframework.data.mongodb.core.geo.GeoResult; import org.springframework.data.mongodb.core.geo.GeoResults; import org.springframework.data.mongodb.core.geo.Point; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.EntityInformationCreator; +import org.springframework.data.mongodb.repository.Address; +import org.springframework.data.mongodb.repository.Contact; +import org.springframework.data.mongodb.repository.Person; +import org.springframework.data.mongodb.repository.support.DefaultEntityInformationCreator; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.support.DefaultRepositoryMetadata; @@ -48,7 +51,7 @@ public class MongoQueryMethodUnitTests { @Before public void setUp() { MongoMappingContext context = new MongoMappingContext(); - creator = new MongoRepositoryFactoryBean.EntityInformationCreator(context); + creator = new DefaultEntityInformationCreator(context); } @Test diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/StringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java similarity index 92% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/StringBasedMongoQueryUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java index 5eb6c18cd..d4fe78643 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/StringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; @@ -33,11 +33,12 @@ import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.BasicQuery; -import org.springframework.data.mongodb.repository.ConvertingParameterAccessor; -import org.springframework.data.mongodb.repository.MongoQueryMethod; +import org.springframework.data.mongodb.repository.Address; +import org.springframework.data.mongodb.repository.Person; import org.springframework.data.mongodb.repository.Query; -import org.springframework.data.mongodb.repository.StringBasedMongoQuery; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.EntityInformationCreator; +import org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor; +import org.springframework.data.mongodb.repository.query.MongoQueryMethod; +import org.springframework.data.mongodb.repository.query.StringBasedMongoQuery; import org.springframework.data.repository.core.RepositoryMetadata; import com.mongodb.BasicDBObject; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/StubParameterAccessor.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java similarity index 92% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/StubParameterAccessor.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java index 09562c488..c3984a055 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/StubParameterAccessor.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StubParameterAccessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.query; import java.util.Arrays; import java.util.Iterator; @@ -23,7 +23,8 @@ import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.convert.MongoWriter; import org.springframework.data.mongodb.core.geo.Distance; import org.springframework.data.mongodb.core.geo.Point; -import org.springframework.data.mongodb.repository.ConvertingParameterAccessor; +import org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor; +import org.springframework.data.mongodb.repository.query.MongoParameterAccessor; import org.springframework.data.repository.query.ParameterAccessor; /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBeanUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java similarity index 92% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBeanUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java index d782575cb..f415f3b86 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryBeanUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryBeanUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import static org.mockito.Mockito.*; import static org.junit.Assert.*; @@ -28,8 +28,7 @@ import org.mockito.runners.MockitoJUnitRunner; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.IndexEnsuringQueryCreationListener; +import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean; import org.springframework.data.repository.core.support.QueryCreationListener; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.test.util.ReflectionTestUtils; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java similarity index 89% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java index a80be0d25..fd757c9ed 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/MongoRepositoryFactoryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/MongoRepositoryFactoryUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -30,10 +30,10 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; -import org.springframework.data.mongodb.repository.MappingMongoEntityInformation; -import org.springframework.data.mongodb.repository.MongoEntityInformation; import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.data.mongodb.repository.MongoRepositoryFactoryBean.MongoRepositoryFactory; +import org.springframework.data.mongodb.repository.Person; +import org.springframework.data.mongodb.repository.query.MongoEntityInformation; +import org.springframework.data.mongodb.repository.support.MappingMongoEntityInformation; /** * Unit test for {@link MongoRepositoryFactory}. diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/QuerydslRepositorySupportUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportUnitTests.java similarity index 91% rename from spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/QuerydslRepositorySupportUnitTests.java rename to spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportUnitTests.java index e85fcb518..551693594 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/QuerydslRepositorySupportUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/QuerydslRepositorySupportUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.mongodb.repository; +package org.springframework.data.mongodb.repository.support; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @@ -24,6 +24,8 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.repository.Person; +import org.springframework.data.mongodb.repository.QPerson; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml index 894ab57f5..33c48ce36 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/PersonRepositoryIntegrationTests-context.xml @@ -16,7 +16,7 @@ - +