From 24394b4f1d9be1ca8c787e33465781edecfbbe9b Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 12 May 2011 11:21:17 +0200 Subject: [PATCH] DATACMNS-29 - Extracted Repository marker interface from CrudRepository. This change allows creating repository proxies without exposing CRUD methods at the same time. This essentially enables query-method-only repository interfaces. --- .../data/repository/CrudRepository.java | 114 ++++++++++++++++++ .../PagingAndSortingRepository.java | 5 +- .../data/repository/Repository.java | 102 ---------------- .../support/DomainClassConverter.java | 16 +-- .../support/DomainClassPropertyEditor.java | 14 +-- .../DomainClassPropertyEditorRegistrar.java | 14 +-- ...DefaultRepositoryInformationUnitTests.java | 6 +- .../DefaultRepositoryMetadataUnitTests.java | 10 +- .../DomainClassConverterUnitTests.java | 4 +- ...ClassPropertyEditorRegistrarUnitTests.java | 4 +- .../DomainClassPropertyEditorUnitTests.java | 4 +- 11 files changed, 153 insertions(+), 140 deletions(-) create mode 100644 spring-data-commons-core/src/main/java/org/springframework/data/repository/CrudRepository.java diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/CrudRepository.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/CrudRepository.java new file mode 100644 index 000000000..35b503fdb --- /dev/null +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/CrudRepository.java @@ -0,0 +1,114 @@ +/* + * Copyright 2008-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.repository; + +import java.io.Serializable; + + +/** + * Interface for generic CRUD operations on a repository for a specific type. + * + * @author Oliver Gierke + * @author Eberhard Wolff + */ +@NoRepositoryBean +public interface CrudRepository extends Repository { + + /** + * Saves a given entity. Use the returned instance for further operations as + * the save operation might have changed the entity instance completely. + * + * @param entity + * @return the saved entity + */ + T save(T entity); + + + /** + * Saves all given entities. + * + * @param entities + * @return + */ + Iterable save(Iterable entities); + + + /** + * Retrives an entity by its primary key. + * + * @param id + * @return the entity with the given primary key or {@code null} if none + * found + * @throws IllegalArgumentException if primaryKey is {@code null} + */ + T findOne(ID id); + + + /** + * Returns whether an entity with the given id exists. + * + * @param id + * @return true if an entity with the given id exists, alse otherwise + * @throws IllegalArgumentException if primaryKey is {@code null} + */ + boolean exists(ID id); + + + /** + * Returns all instances of the type. + * + * @return all entities + */ + Iterable findAll(); + + + /** + * Returns the number of entities available. + * + * @return the number of entities + */ + long count(); + + + /** + * Deletes the entity with the given id. + * + * @param id + */ + void delete(ID id); + + + /** + * Deletes a given entity. + * + * @param entity + */ + void delete(T entity); + + + /** + * Deletes the given entities. + * + * @param entities + */ + void delete(Iterable entities); + + + /** + * Deletes all entities managed by the repository. + */ + void deleteAll(); +} diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/PagingAndSortingRepository.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/PagingAndSortingRepository.java index 3bbbefab1..bd760101f 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/PagingAndSortingRepository.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/PagingAndSortingRepository.java @@ -23,7 +23,7 @@ import org.springframework.data.domain.Sort; /** - * Extension of {@link Repository} to provide additional methods to retrieve + * Extension of {@link CrudRepository} to provide additional methods to retrieve * entities using the pagination and sorting abstraction. * * @author Oliver Gierke @@ -31,8 +31,9 @@ import org.springframework.data.domain.Sort; * @see Pageable * @see Page */ +@NoRepositoryBean public interface PagingAndSortingRepository extends - Repository { + CrudRepository { /** * Returns all entities sorted by the given options. diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/Repository.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/Repository.java index b679fec05..cdb2ad294 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/Repository.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/Repository.java @@ -1,113 +1,11 @@ -/* - * Copyright 2008-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.repository; import java.io.Serializable; - /** - * Interface for generic CRUD operations on a repository for a specific type. * * @author Oliver Gierke - * @author Eberhard Wolff */ public interface Repository { - /** - * Saves a given entity. Use the returned instance for further operations as - * the save operation might have changed the entity instance completely. - * - * @param entity - * @return the saved entity - */ - T save(T entity); - - - /** - * Saves all given entities. - * - * @param entities - * @return - */ - Iterable save(Iterable entities); - - - /** - * Retrives an entity by its primary key. - * - * @param id - * @return the entity with the given primary key or {@code null} if none - * found - * @throws IllegalArgumentException if primaryKey is {@code null} - */ - T findOne(ID id); - - - /** - * Returns whether an entity with the given id exists. - * - * @param id - * @return true if an entity with the given id exists, alse otherwise - * @throws IllegalArgumentException if primaryKey is {@code null} - */ - boolean exists(ID id); - - - /** - * Returns all instances of the type. - * - * @return all entities - */ - Iterable findAll(); - - - /** - * Returns the number of entities available. - * - * @return the number of entities - */ - long count(); - - - /** - * Deletes the entity with the given id. - * - * @param id - */ - void delete(ID id); - - - /** - * Deletes a given entity. - * - * @param entity - */ - void delete(T entity); - - - /** - * Deletes the given entities. - * - * @param entities - */ - void delete(Iterable entities); - - - /** - * Deletes all entities managed by the repository. - */ - void deleteAll(); } diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java index 31c233dce..3599bf571 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java @@ -28,23 +28,23 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.ConditionalGenericConverter; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; /** * {@link org.springframework.core.convert.converter.Converter} to convert - * arbitrary input into domain classes managed by Spring Data {@link Repository} + * arbitrary input into domain classes managed by Spring Data {@link CrudRepository} * s. The implementation uses a {@link ConversionService} in turn to convert the * source type into the domain class' id type which is then converted into a - * domain class object by using a {@link Repository}. + * domain class object by using a {@link CrudRepository}. * * @author Oliver Gierke */ public class DomainClassConverter implements ConditionalGenericConverter, ApplicationContextAware { - private final Map, Repository> repositories = - new HashMap, Repository>(); + private final Map, CrudRepository> repositories = + new HashMap, CrudRepository>(); private final ConversionService service; @@ -86,7 +86,7 @@ public class DomainClassConverter implements ConditionalGenericConverter, EntityInformation info = getRepositoryForDomainType(targetType.getType()); - Repository repository = repositories.get(info); + CrudRepository repository = repositories.get(info); Serializable id = service.convert(source, info.getIdType()); return repository.findOne(id); } @@ -146,9 +146,9 @@ public class DomainClassConverter implements ConditionalGenericConverter, EntityInformation metadata = entry.getEntityInformation(); - Class> objectType = + Class> objectType = entry.getRepositoryInterface(); - Repository repository = + CrudRepository repository = BeanFactoryUtils.beanOfType(context, objectType); this.repositories.put(metadata, repository); diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditor.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditor.java index 7e4a5befa..f88224a61 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditor.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditor.java @@ -21,35 +21,35 @@ import java.io.Serializable; import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.SimpleTypeConverter; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** * Generic {@link PropertyEditor} to map entities handled by a - * {@link Repository} to their id's and vice versa. + * {@link CrudRepository} to their id's and vice versa. * * @author Oliver Gierke */ public class DomainClassPropertyEditor extends PropertyEditorSupport { - private final Repository repository; + private final CrudRepository repository; private final EntityInformation information; private final PropertyEditorRegistry registry; /** * Creates a new {@link DomainClassPropertyEditor} for the given - * {@link Repository}. + * {@link CrudRepository}, {@link EntityInformation} and {@link PropertyEditorRegistry}. * * @param repository + * @param information * @param registry */ - public DomainClassPropertyEditor(Repository repository, - EntityInformation information, - PropertyEditorRegistry registry) { + public DomainClassPropertyEditor(CrudRepository repository, EntityInformation information, + PropertyEditorRegistry registry) { Assert.notNull(repository); Assert.notNull(registry); diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrar.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrar.java index 031520fe4..7e3ca9beb 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrar.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrar.java @@ -26,7 +26,7 @@ import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; /** @@ -56,8 +56,8 @@ import org.springframework.data.repository.Repository; public class DomainClassPropertyEditorRegistrar implements PropertyEditorRegistrar, ApplicationContextAware { - private final Map, Repository> repositories = - new HashMap, Repository>(); + private final Map, CrudRepository> repositories = + new HashMap, CrudRepository>(); /* @@ -69,11 +69,11 @@ public class DomainClassPropertyEditorRegistrar implements */ public void registerCustomEditors(PropertyEditorRegistry registry) { - for (Entry, Repository> entry : repositories + for (Entry, CrudRepository> entry : repositories .entrySet()) { EntityInformation metadata = entry.getKey(); - Repository repository = entry.getValue(); + CrudRepository repository = entry.getValue(); DomainClassPropertyEditor editor = new DomainClassPropertyEditor( @@ -102,9 +102,9 @@ public class DomainClassPropertyEditorRegistrar implements EntityInformation metadata = information.getEntityInformation(); - Class> objectType = + Class> objectType = information.getRepositoryInterface(); - Repository repository = + CrudRepository repository = BeanFactoryUtils.beanOfType(context, objectType); this.repositories.put(metadata, repository); diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryInformationUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryInformationUnitTests.java index 5d922eb47..cf28d2e18 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryInformationUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryInformationUnitTests.java @@ -6,7 +6,7 @@ import static org.junit.Assert.*; import java.lang.reflect.Method; import org.junit.Test; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.support.DefaultRepositoryMetadataUnitTests.DummyGenericRepositorySupport; /** @@ -35,12 +35,12 @@ public class DefaultRepositoryInformationUnitTests { Method method = FooDao.class.getMethod("findOne", Long.class); RepositoryMetadata metadata = new DefaultRepositoryMetadata(FooDao.class); - DefaultRepositoryInformation information = new DefaultRepositoryInformation(metadata, Repository.class); + DefaultRepositoryInformation information = new DefaultRepositoryInformation(metadata, CrudRepository.class); assertThat(information.getBaseClassMethodFor(method), is(method)); } - private static interface FooDao extends Repository { + private static interface FooDao extends CrudRepository { // Redeclared method User findOne(Integer primaryKey); diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryMetadataUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryMetadataUnitTests.java index 69564615c..49c99a47d 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryMetadataUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DefaultRepositoryMetadataUnitTests.java @@ -22,7 +22,7 @@ import java.io.Serializable; import org.junit.Test; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.util.ClassUtils; @@ -86,7 +86,7 @@ public class DefaultRepositoryMetadataUnitTests { } } - static interface UserRepository extends Repository { + static interface UserRepository extends CrudRepository { } @@ -117,12 +117,12 @@ public class DefaultRepositoryMetadataUnitTests { } static interface UserCustomExtendedRepository extends - Repository { + CrudRepository { } static abstract class DummyGenericRepositorySupport - implements Repository { + implements CrudRepository { public T findOne(ID id) { @@ -139,7 +139,7 @@ public class DefaultRepositoryMetadataUnitTests { } static interface GenericEntityRepository extends - Repository, Long> { + CrudRepository, Long> { } } diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java index 5e02e72cf..b6ee1d139 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java @@ -35,7 +35,7 @@ import org.mockito.runners.MockitoJUnitRunner; import org.springframework.context.ApplicationContext; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; /** @@ -186,7 +186,7 @@ public class DomainClassConverterUnitTests { } - private static interface UserRepository extends Repository { + private static interface UserRepository extends CrudRepository { } } diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrarUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrarUnitTests.java index ed3de9a6f..3fe64bb64 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrarUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorRegistrarUnitTests.java @@ -33,7 +33,7 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.beans.PropertyEditorRegistry; import org.springframework.context.ApplicationContext; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; /** @@ -121,7 +121,7 @@ public class DomainClassPropertyEditorRegistrarUnitTests { } - private static interface EntityRepository extends Repository { + private static interface EntityRepository extends CrudRepository { } diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorUnitTests.java index 7dc6abe85..54d5340b1 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassPropertyEditorUnitTests.java @@ -28,7 +28,7 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.beans.PropertyEditorRegistry; import org.springframework.data.domain.Persistable; -import org.springframework.data.repository.Repository; +import org.springframework.data.repository.CrudRepository; /** @@ -173,7 +173,7 @@ public class DomainClassPropertyEditorUnitTests { * * @author Oliver Gierke */ - private static interface UserRepository extends Repository { + private static interface UserRepository extends CrudRepository { } }