From b8f9876ea6c792d445cfde726a57b264f5d3e6fc Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 4 May 2017 17:57:57 +0200 Subject: [PATCH] DATACASS-282 - Polishing. Encapsulate fields in BasicCassandraMappingContext, BasicCassandraPersistentEntity, BasicCassandraPersistentProperty, and refactor to immutable fields where possible. --- .../mapping/BasicCassandraMappingContext.java | 30 +++++++++---------- .../BasicCassandraPersistentEntity.java | 14 ++++----- .../BasicCassandraPersistentProperty.java | 20 ++++--------- ...BasicCassandraMappingContextUnitTests.java | 4 +-- ...sicCassandraPersistentEntityUnitTests.java | 13 +++++--- 5 files changed, 39 insertions(+), 42 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java index 8ef2c186d..42792a0cc 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContext.java @@ -69,26 +69,26 @@ public class BasicCassandraMappingContext extends AbstractMappingContext, CassandraPersistentProperty> implements CassandraMappingContext, ApplicationContextAware { - protected ApplicationContext context; - - protected CassandraPersistentEntityMetadataVerifier verifier = new CompositeCassandraPersistentEntityMetadataVerifier(); - - protected ClassLoader beanClassLoader; - - protected Mapping mapping = new Mapping(); - - // useful caches - protected Map, CassandraPersistentEntity> entitiesByType = new HashMap<>(); - protected Map>> entitySetsByTableName = new HashMap<>(); - - protected Set> primaryKeyEntities = new HashSet<>(); - protected Set> userDefinedTypes = new HashSet<>(); - protected Set> tableEntities = new HashSet<>(); + private CassandraPersistentEntityMetadataVerifier verifier = new CompositeCassandraPersistentEntityMetadataVerifier(); private CustomConversions customConversions; + private Mapping mapping = new Mapping(); + private UserTypeResolver userTypeResolver; + private ApplicationContext context; + + private ClassLoader beanClassLoader; + + // useful caches + private final Map, CassandraPersistentEntity> entitiesByType = new HashMap<>(); + private final Map>> entitySetsByTableName = new HashMap<>(); + + private final Set> primaryKeyEntities = new HashSet<>(); + private final Set> userDefinedTypes = new HashSet<>(); + private final Set> tableEntities = new HashSet<>(); + /** * Create a new {@link BasicCassandraMappingContext}. */ diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntity.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntity.java index 26c6b3bdb..b6481ca0d 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntity.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntity.java @@ -52,22 +52,22 @@ import com.datastax.driver.core.UserType; public class BasicCassandraPersistentEntity extends BasicPersistentEntity implements CassandraPersistentEntity, ApplicationContextAware { - protected static final CassandraPersistentEntityMetadataVerifier DEFAULT_VERIFIER = new CompositeCassandraPersistentEntityMetadataVerifier(); + private static final CassandraPersistentEntityMetadataVerifier DEFAULT_VERIFIER = new CompositeCassandraPersistentEntityMetadataVerifier(); private static final Optional> PROPERTY_COMPARATOR = Optional .of(CassandraPersistentPropertyComparator.INSTANCE); - protected ApplicationContext context; + private CassandraPersistentEntityMetadataVerifier verifier = DEFAULT_VERIFIER; - protected Optional forceQuote = Optional.empty(); + private CassandraMappingContext mappingContext; - protected CassandraMappingContext mappingContext; + private ApplicationContext context; - protected CassandraPersistentEntityMetadataVerifier verifier = DEFAULT_VERIFIER; + private StandardEvaluationContext spelContext; - protected Optional tableName = Optional.empty(); + private Optional forceQuote = Optional.empty(); - protected StandardEvaluationContext spelContext; + private Optional tableName = Optional.empty(); /** * Create a new {@link BasicCassandraPersistentEntity} given {@link TypeInformation}. diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java index 4d92a2c8d..cf46f13ad 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentProperty.java @@ -63,26 +63,19 @@ import com.datastax.driver.core.UserType; public class BasicCassandraPersistentProperty extends AnnotationBasedPersistentProperty implements CassandraPersistentProperty, ApplicationContextAware { - protected ApplicationContext context; + private final UserTypeResolver userTypeResolver; + + private StandardEvaluationContext spelContext; /** * Whether this property has been explicitly instructed to force quote column names. */ - protected Boolean forceQuote; + private Boolean forceQuote; /** * An unmodifiable list of this property's column names. */ - protected List columnNames; - - /** - * An unmodifiable list of this property's explicitly set column names. - */ - protected List explicitColumnNames; - - protected StandardEvaluationContext spelContext; - - private final UserTypeResolver userTypeResolver; + private List columnNames; /** * Create a new {@link BasicCassandraPersistentProperty}. @@ -125,7 +118,6 @@ public class BasicCassandraPersistentProperty extends AnnotationBasedPersistentP Assert.notNull(context, "ApplicationContext must not be null"); - this.context = context; spelContext = new StandardEvaluationContext(); spelContext.addPropertyAccessor(new BeanFactoryAccessor()); spelContext.setBeanResolver(new BeanFactoryResolver(context)); @@ -459,7 +451,7 @@ public class BasicCassandraPersistentProperty extends AnnotationBasedPersistentP getName(), getOwner().getType().getName(), this.columnNames.size(), this.columnNames.size() == 1 ? "" : "s", columnNames.size())); - this.columnNames = this.explicitColumnNames = Collections.unmodifiableList(new ArrayList<>(columnNames)); + this.columnNames = Collections.unmodifiableList(new ArrayList<>(columnNames)); } /* (non-Javadoc) diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContextUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContextUnitTests.java index a61fa3821..5cb48e98b 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContextUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraMappingContextUnitTests.java @@ -403,7 +403,7 @@ public class BasicCassandraMappingContextUnitTests { @Test // DATACASS-172 public void usesTypeShouldReportTypeUsageInMappedUdt() { - final UserType myTypeMock = mock(UserType.class, "mappedudt"); + UserType myTypeMock = mock(UserType.class, "mappedudt"); when(myTypeMock.getTypeName()).thenReturn("mappedudt"); mappingContext.setUserTypeResolver(typeName -> myTypeMock); @@ -416,7 +416,7 @@ public class BasicCassandraMappingContextUnitTests { @Test // DATACASS-172 public void usesTypeShouldReportTypeUsageInColumn() { - final UserType myTypeMock = mock(UserType.class, "mappedudt"); + UserType myTypeMock = mock(UserType.class, "mappedudt"); when(myTypeMock.getTypeName()).thenReturn("mappedudt"); mappingContext.setUserTypeResolver(typeName -> myTypeMock); diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntityUnitTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntityUnitTests.java index 6fbd72526..cf80ddbcc 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntityUnitTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/mapping/BasicCassandraPersistentEntityUnitTests.java @@ -29,6 +29,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.DirectFieldAccessor; import org.springframework.cassandra.core.cql.CqlIdentifier; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AliasFor; @@ -82,16 +83,19 @@ public class BasicCassandraPersistentEntityUnitTests { @Test public void setForceQuoteCallsSetTableName() { + BasicCassandraPersistentEntity entitySpy = spy( new BasicCassandraPersistentEntity<>(ClassTypeInformation.from(Message.class))); + DirectFieldAccessor dfa = new DirectFieldAccessor(entitySpy); + entitySpy.setTableName(CqlIdentifier.cqlId("Messages", false)); - assertThat(entitySpy.forceQuote).isNotPresent(); + assertThat((Optional) dfa.getPropertyValue("forceQuote")).isNotPresent(); entitySpy.setForceQuote(true); - assertThat(entitySpy.forceQuote).contains(true); + assertThat((Optional) dfa.getPropertyValue("forceQuote")).contains(true); verify(entitySpy, times(2)).setTableName(isA(CqlIdentifier.class)); } @@ -101,10 +105,11 @@ public class BasicCassandraPersistentEntityUnitTests { BasicCassandraPersistentEntity entitySpy = spy( new BasicCassandraPersistentEntity<>(ClassTypeInformation.from(Message.class))); - entitySpy.forceQuote = Optional.of(true); + DirectFieldAccessor dfa = new DirectFieldAccessor(entitySpy); + dfa.setPropertyValue("forceQuote", Optional.of(true)); entitySpy.setForceQuote(true); - assertThat(entitySpy.forceQuote).contains(true); + assertThat((Optional) dfa.getPropertyValue("forceQuote")).contains(true); verify(entitySpy, never()).setTableName(isA(CqlIdentifier.class)); }