From f0eaf862cf55f1b56f384471e574222a2704a2ca Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Mon, 27 Mar 2017 10:35:07 +0200 Subject: [PATCH] DATAJDBC-109 - Adapt to API changes in Spring Data Commons. Original pull request: #5. --- .../mapping/context/JdbcMappingContext.java | 12 +++-- .../model/BasicJdbcPersistentProperty.java | 12 ++--- .../mapping/model/JdbcPersistentEntity.java | 2 +- .../data/jdbc/repository/EntityRowMapper.java | 45 ++++++++++++------- .../jdbc/repository/SimpleJdbcRepository.java | 33 ++++++++------ .../BasicJdbcPersistentEntityInformation.java | 5 ++- .../JdbcPersistentEntityInformation.java | 3 +- .../support/JdbcRepositoryFactory.java | 8 +++- .../EventPublishingEntityRowMapperTest.java | 3 +- ...epositoryIdGenerationIntegrationTests.java | 16 ++++--- .../JdbcRepositoryIntegrationTests.java | 15 ++++--- .../SimpleJdbcRepositoryEventsUnitTests.java | 2 +- 12 files changed, 91 insertions(+), 65 deletions(-) diff --git a/src/main/java/org/springframework/data/jdbc/mapping/context/JdbcMappingContext.java b/src/main/java/org/springframework/data/jdbc/mapping/context/JdbcMappingContext.java index a2cb02078..469a0eeb6 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/context/JdbcMappingContext.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/context/JdbcMappingContext.java @@ -15,13 +15,11 @@ */ package org.springframework.data.jdbc.mapping.context; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; - import org.springframework.data.jdbc.mapping.model.BasicJdbcPersistentProperty; import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntity; import org.springframework.data.jdbc.mapping.model.JdbcPersistentProperty; import org.springframework.data.mapping.context.AbstractMappingContext; +import org.springframework.data.mapping.model.Property; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.util.TypeInformation; @@ -38,11 +36,11 @@ public class JdbcMappingContext extends AbstractMappingContext owner, // SimpleTypeHolder simpleTypeHolder // ) { - return new BasicJdbcPersistentProperty(field, descriptor, owner, simpleTypeHolder); + return new BasicJdbcPersistentProperty(property, owner, simpleTypeHolder); } + } diff --git a/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java b/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java index a5edb0d00..64f6126ec 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/model/BasicJdbcPersistentProperty.java @@ -15,12 +15,10 @@ */ package org.springframework.data.jdbc.mapping.model; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; - import org.springframework.data.mapping.Association; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.model.AnnotationBasedPersistentProperty; +import org.springframework.data.mapping.model.Property; import org.springframework.data.mapping.model.SimpleTypeHolder; /** @@ -35,18 +33,16 @@ public class BasicJdbcPersistentProperty extends AnnotationBasedPersistentProper /** * Creates a new {@link AnnotationBasedPersistentProperty}. * - * @param field must not be {@literal null}. - * @param propertyDescriptor can be {@literal null}. + * @param property must not be {@literal null}. * @param owner must not be {@literal null}. * @param simpleTypeHolder */ public BasicJdbcPersistentProperty( // - Field field, // - PropertyDescriptor propertyDescriptor, // + Property property, // PersistentEntity owner, // SimpleTypeHolder simpleTypeHolder // ) { - super(field, propertyDescriptor, owner, simpleTypeHolder); + super(property, owner, simpleTypeHolder); } @Override diff --git a/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntity.java b/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntity.java index f635ac443..3102cfde2 100644 --- a/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntity.java +++ b/src/main/java/org/springframework/data/jdbc/mapping/model/JdbcPersistentEntity.java @@ -40,6 +40,6 @@ public class JdbcPersistentEntity extends BasicPersistentEntity implements RowMapper { private T createInstance(ResultSet rs) { - return instantiator.createInstance(entity, new ParameterValueProvider() { - - @Override - public T getParameterValue(PreferredConstructor.Parameter parameter) { - - try { - return conversions.convert(rs.getObject(parameter.getName()), parameter.getType().getType()); - } catch (SQLException e) { - - throw new MappingException( // - String.format("Couldn't read column %s from ResultSet.", parameter.getName()) // - ); - } - } - }); + return instantiator.createInstance(entity, new ResultSetParameterValueProvider(rs)); } private void setProperty(ResultSet rs, T t, PersistentProperty property) { @@ -83,9 +70,33 @@ class EntityRowMapper implements RowMapper { try { Object converted = conversions.convert(rs.getObject(property.getName()), property.getType()); - entity.getPropertyAccessor(t).setProperty(property, converted); + entity.getPropertyAccessor(t).setProperty(property, Optional.of(converted)); } catch (Exception e) { throw new RuntimeException(String.format("Couldn't set property %s.", property.getName()), e); } } + + private class ResultSetParameterValueProvider implements ParameterValueProvider { + + private final ResultSet rs; + + ResultSetParameterValueProvider(ResultSet rs) { + this.rs = rs; + } + + @Override + public Optional getParameterValue(Parameter parameter) { + + return parameter.getName().map(name -> { + try { + return conversions.convert(rs.getObject(name), parameter.getType().getType()); + } catch (SQLException e) { + + throw new MappingException( // + String.format("Couldn't read column %s from ResultSet.", name) // + ); + } + }); + } + } } diff --git a/src/main/java/org/springframework/data/jdbc/repository/SimpleJdbcRepository.java b/src/main/java/org/springframework/data/jdbc/repository/SimpleJdbcRepository.java index 92c27aca7..e6109ceab 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/SimpleJdbcRepository.java +++ b/src/main/java/org/springframework/data/jdbc/repository/SimpleJdbcRepository.java @@ -106,9 +106,10 @@ public class SimpleJdbcRepository implements CrudRep } @Override - public T findOne(ID id) { + public Optional findOne(ID id) { - return operations.queryForObject(sql.getFindOne(), new MapSqlParameterSource("id", id), entityRowMapper); + return Optional + .ofNullable(operations.queryForObject(sql.getFindOne(), new MapSqlParameterSource("id", id), entityRowMapper)); } @Override @@ -139,14 +140,15 @@ public class SimpleJdbcRepository implements CrudRep @Override public void delete(T instance) { - doDelete(new Specified(entityInformation.getId(instance)), Optional.of(instance)); + doDelete(new Specified(entityInformation.getId(instance).orElse(null)), Optional.of(instance)); } @Override public void delete(Iterable entities) { List idList = StreamSupport.stream(entities.spliterator(), false) // - .map(entityInformation::getId) // + .map(e -> entityInformation.getId(e) + .orElseThrow(() -> new IllegalArgumentException(String.format("Can't obtain id for %s", e)))) // .collect(Collectors.toList()); MapSqlParameterSource sqlParameterSource = new MapSqlParameterSource("ids", idList); @@ -164,8 +166,8 @@ public class SimpleJdbcRepository implements CrudRep this.persistentEntity.doWithProperties((PropertyHandler) property -> { - Object value = persistentEntity.getPropertyAccessor(instance).getProperty(property); - parameters.put(property.getColumnName(), value); + Optional value = persistentEntity.getPropertyAccessor(instance).getProperty(property); + parameters.put(property.getColumnName(), value.orElse(null)); }); return parameters; @@ -178,7 +180,7 @@ public class SimpleJdbcRepository implements CrudRep KeyHolder holder = new GeneratedKeyHolder(); Map propertyMap = getPropertyMap(instance); - propertyMap.put(persistentEntity.getIdColumn(), getIdValueOrNull(instance)); + propertyMap.put(persistentEntity.getRequiredIdProperty().getColumnName(), getIdValueOrNull(instance)); operations.update(sql.getInsert(), new MapSqlParameterSource(propertyMap), holder); setIdFromJdbc(instance, holder); @@ -192,14 +194,17 @@ public class SimpleJdbcRepository implements CrudRep private ID getIdValueOrNull(S instance) { - ID idValue = entityInformation.getId(instance); - return isIdPropertySimpleTypeAndValueZero(idValue) ? null : idValue; + Optional idValue = entityInformation.getId(instance); + return isIdPropertySimpleTypeAndValueZero(idValue) ? null : idValue.get(); } - private boolean isIdPropertySimpleTypeAndValueZero(ID idValue) { + private boolean isIdPropertySimpleTypeAndValueZero(Optional idValue) { - return (persistentEntity.getIdProperty().getType() == int.class && idValue.equals(0)) - || (persistentEntity.getIdProperty().getType() == long.class && idValue.equals(0L)); + Optional idProperty = persistentEntity.getIdProperty(); + return !idValue.isPresent() // + || !idProperty.isPresent() // + || (((Optional) idProperty).get().getType() == int.class && idValue.equals(0)) // + || (((Optional) idProperty).get().getType() == long.class && idValue.equals(0L)); } private void setIdFromJdbc(S instance, KeyHolder holder) { @@ -209,9 +214,9 @@ public class SimpleJdbcRepository implements CrudRep Object idValueFromJdbc = getIdFromHolder(holder); if (idValueFromJdbc != null) { - Class targetType = persistentEntity.getIdProperty().getType(); + Class targetType = persistentEntity.getRequiredIdProperty().getType(); Object converted = convert(idValueFromJdbc, targetType); - entityInformation.setId(instance, converted); + entityInformation.setId(instance, Optional.of(converted)); } } catch (NonTransientDataAccessException e) { diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/BasicJdbcPersistentEntityInformation.java b/src/main/java/org/springframework/data/jdbc/repository/support/BasicJdbcPersistentEntityInformation.java index ea22fccae..041788867 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/BasicJdbcPersistentEntityInformation.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/BasicJdbcPersistentEntityInformation.java @@ -16,6 +16,7 @@ package org.springframework.data.jdbc.repository.support; import java.io.Serializable; +import java.util.Optional; import org.springframework.data.jdbc.mapping.model.JdbcPersistentEntity; import org.springframework.data.repository.core.support.PersistentEntityInformation; @@ -36,7 +37,7 @@ public class BasicJdbcPersistentEntityInformation ex } @Override - public void setId(T instance, Object value) { - persistentEntity.getPropertyAccessor(instance).setProperty(persistentEntity.getIdProperty(), value); + public void setId(T instance, Optional value) { + persistentEntity.getPropertyAccessor(instance).setProperty(persistentEntity.getRequiredIdProperty(), value); } } diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcPersistentEntityInformation.java b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcPersistentEntityInformation.java index 53df278c9..62227faf5 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcPersistentEntityInformation.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcPersistentEntityInformation.java @@ -16,6 +16,7 @@ package org.springframework.data.jdbc.repository.support; import java.io.Serializable; +import java.util.Optional; import org.springframework.data.repository.core.EntityInformation; @@ -25,5 +26,5 @@ import org.springframework.data.repository.core.EntityInformation; */ public interface JdbcPersistentEntityInformation extends EntityInformation { - void setId(T instance, Object value); + void setId(T instance, Optional value); } diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java index 2b92c3317..5a9c75661 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java @@ -43,13 +43,17 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { @SuppressWarnings("unchecked") @Override public EntityInformation getEntityInformation(Class aClass) { - return new BasicJdbcPersistentEntityInformation<>((JdbcPersistentEntity) context.getPersistentEntity(aClass)); + + return context.getPersistentEntity(aClass) + .map(e -> new BasicJdbcPersistentEntityInformation((JdbcPersistentEntity) e)).orElseGet(null); } @Override protected Object getTargetRepository(RepositoryInformation repositoryInformation) { - JdbcPersistentEntity persistentEntity = context.getPersistentEntity(repositoryInformation.getDomainType()); + JdbcPersistentEntity persistentEntity = context // + .getPersistentEntity(repositoryInformation.getDomainType()) // + .orElseThrow(() -> new IllegalArgumentException("%s does not represent a persistent entity")); // return new SimpleJdbcRepository<>(persistentEntity, jdbcOperations, publisher); } diff --git a/src/test/java/org/springframework/data/jdbc/repository/EventPublishingEntityRowMapperTest.java b/src/test/java/org/springframework/data/jdbc/repository/EventPublishingEntityRowMapperTest.java index ff4ea75a1..3f521eb90 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/EventPublishingEntityRowMapperTest.java +++ b/src/test/java/org/springframework/data/jdbc/repository/EventPublishingEntityRowMapperTest.java @@ -6,6 +6,7 @@ import lombok.Data; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Optional; import org.junit.Test; import org.springframework.context.ApplicationEventPublisher; @@ -27,7 +28,7 @@ public class EventPublishingEntityRowMapperTest { public void eventGetsPublishedAfterInstantiation() throws SQLException { when(rowMapperDelegate.mapRow(any(ResultSet.class), anyInt())).thenReturn(new DummyEntity(1L)); - when(entityInformation.getId(any())).thenReturn(1L); + when(entityInformation.getId(any())).thenReturn(Optional.of(1L)); EventPublishingEntityRowMapper rowMapper = new EventPublishingEntityRowMapper<>( // rowMapperDelegate, // diff --git a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java index 70e272276..1d289b777 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java @@ -21,6 +21,8 @@ import static org.mockito.Mockito.*; import lombok.Data; +import java.util.Optional; + import javax.sql.DataSource; import org.junit.ClassRule; @@ -64,10 +66,11 @@ public class JdbcRepositoryIdGenerationIntegrationTests { assertThat(entity.getId()).isNotNull(); - ReadOnlyIdEntity reloadedEntity = readOnlyIdrepository.findOne(entity.getId()); + Optional reloadedEntity = readOnlyIdrepository.findOne(entity.getId()); - assertEquals(entity.getId(), reloadedEntity.getId()); - assertEquals(entity.getName(), reloadedEntity.getName()); + assertTrue(reloadedEntity.isPresent()); + assertEquals(entity.getId(), reloadedEntity.get().getId()); + assertEquals(entity.getName(), reloadedEntity.get().getName()); } @Test // DATAJDBC-98 @@ -80,10 +83,11 @@ public class JdbcRepositoryIdGenerationIntegrationTests { assertThat(entity.getId()).isNotNull(); assertThat(entity.getId()).isNotEqualTo(0L); - PrimitiveIdEntity reloadedEntity = primitiveIdRepository.findOne(entity.getId()); + Optional reloadedEntity = primitiveIdRepository.findOne(entity.getId()); - assertEquals(entity.getId(), reloadedEntity.getId()); - assertEquals(entity.getName(), reloadedEntity.getName()); + assertTrue(reloadedEntity.isPresent()); + assertEquals(entity.getId(), reloadedEntity.get().getId()); + assertEquals(entity.getName(), reloadedEntity.get().getName()); } private interface ReadOnlyIdEntityRepository extends CrudRepository {} diff --git a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java index e8141c94f..611310c65 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java @@ -22,6 +22,8 @@ import static org.mockito.Mockito.*; import lombok.Data; +import java.util.Optional; + import javax.sql.DataSource; import org.junit.ClassRule; @@ -96,10 +98,12 @@ public class JdbcRepositoryIntegrationTests { entity = repository.save(entity); - DummyEntity reloadedEntity = repository.findOne(entity.getIdProp()); + Optional reloadedEntity = repository.findOne(entity.getIdProp()); + + assertTrue(reloadedEntity.isPresent()); - assertEquals(entity.getIdProp(), reloadedEntity.getIdProp()); - assertEquals(entity.getName(), reloadedEntity.getName()); + assertEquals(entity.getIdProp(), reloadedEntity.get().getIdProp()); + assertEquals(entity.getName(), reloadedEntity.get().getName()); } @Test // DATAJDBC-97 @@ -221,9 +225,10 @@ public class JdbcRepositoryIntegrationTests { entity = repository.save(entity); - DummyEntity reloaded = repository.findOne(entity.getIdProp()); + Optional reloaded = repository.findOne(entity.getIdProp()); - assertThat(reloaded.getName()).isEqualTo(entity.getName()); + assertTrue(reloaded.isPresent()); + assertThat(reloaded.get().getName()).isEqualTo(entity.getName()); } @Test // DATAJDBC-98 diff --git a/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java b/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java index fa3398534..e5accf7ba 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/SimpleJdbcRepositoryEventsUnitTests.java @@ -53,7 +53,7 @@ public class SimpleJdbcRepositoryEventsUnitTests { HashMap keys = new HashMap<>(); keys.put("id", 4711L); - KeyHolder keyHolder = invocation.getArgumentAt(2, KeyHolder.class); + KeyHolder keyHolder = invocation.getArgument(2); keyHolder.getKeyList().add(keys); return 1;