Skip to content
This repository has been archived by the owner on Jun 25, 2024. It is now read-only.

Commit

Permalink
PR review changes QUES-36
Browse files Browse the repository at this point in the history
Moved test utilities + deps to commons-testing project
Got rid of unhelpful marker interfaces
Add some testing (unit + integration) for SpringBootConfigStorage
  • Loading branch information
symposion committed Nov 10, 2020
1 parent 7d3eedb commit 6a952a7
Show file tree
Hide file tree
Showing 17 changed files with 283 additions and 133 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.pkb.common.config;

public abstract class AbstractMutableConfigStorage extends AbstractBaseConfigStorage {

@Override
public void setValue(String key, String value) {
if (!MUTABLE_CONFIG_KEY.equals(key)) {
setValueInternal(key, value);
}
}

abstract void setValueInternal(String key, String value);

}
5 changes: 3 additions & 2 deletions config/src/main/java/com/pkb/common/config/ConfigStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ public interface ConfigStorage {

Long getLong(String key, long defaultValue);

boolean isMutableConfigEnabled();
default boolean isMutableConfigEnabled() {
return getBoolean(MUTABLE_CONFIG_KEY, false);
}

void setValue(String key, String value);

OverrideRemovalResult removeOverrideAtKey(String key);

void reset();

ImmutableConfigStorage getImmutableConfig();
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static ConfigStorage getConfigStorage() {
}


public static ConfigStorage getConfigStorage(ImmutableConfigStorage baseStorage) {
public static ConfigStorage getConfigStorage(ConfigStorage baseStorage) {
if (baseStorage.isMutableConfigEnabled()) {
return new MutableRawConfigStorage(baseStorage);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.pkb.common.config;

import java.util.HashMap;
import java.util.Map;

import static java.util.Collections.emptyMap;
import static java.util.Collections.unmodifiableMap;

public final class ImmutableRawConfigStorage extends AbstractBaseConfigStorage implements ImmutableConfigStorage {
import java.util.HashMap;
import java.util.Map;

public final class ImmutableRawConfigStorage extends AbstractBaseConfigStorage {

public static final ImmutableRawConfigStorage EMPTY = new ImmutableRawConfigStorage(emptyMap());

Expand Down Expand Up @@ -36,4 +36,19 @@ public String getString(String key, String defaultValue) {
return storage.getOrDefault(key, defaultValue);
}

@Override
public void setValue(String key, String value) {
//No-op
}

@Override
public OverrideRemovalResult removeOverrideAtKey(String key) {
return OverrideRemovalResult.NO_OP_AS_CONFIG_IS_IMMUTABLE;
}

@Override
public void reset() {
//No-op
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import java.util.Map;
import java.util.function.Supplier;

public final class MutableRawConfigStorage extends AbstractBaseConfigStorage implements MutableConfigStorage {
public final class MutableRawConfigStorage extends AbstractMutableConfigStorage {

private final Map<String, String> overrideMap = new HashMap<>();
private final ImmutableConfigStorage configStorage;
private final ConfigStorage configStorage;

MutableRawConfigStorage(ImmutableConfigStorage configStorage) {
MutableRawConfigStorage(ConfigStorage configStorage) {
this.configStorage = configStorage;
}

Expand All @@ -24,10 +24,8 @@ public String getString(String key, String defaultValue) {
}

@Override
public void setValue(String key, String value) {
if (!MUTABLE_CONFIG_KEY.equals(key)) {
overrideMap.put(key, value);
}
void setValueInternal(String key, String value) {
overrideMap.put(key, value);
}

@Override
Expand All @@ -45,15 +43,15 @@ public void reset() {
overrideMap.clear();
}

@Override
public ImmutableConfigStorage getImmutableConfig() {
return configStorage;
}

private String getOverriddenOrOriginalValue(String key, Supplier<String> originalSupplier) {
if (overrideMap.containsKey(key)) {
return overrideMap.get(key);
}
return originalSupplier.get();
}

@Override
public boolean isMutableConfigEnabled() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import static com.github.karsaig.approvalcrest.jupiter.MatcherAssert.assertThrows;
import static com.github.karsaig.approvalcrest.jupiter.matcher.Matchers.sameJsonAsApproved;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.HashMap;
Expand Down Expand Up @@ -197,9 +196,4 @@ public void removingNonExistentKey() {
assertEquals(OverrideRemovalResult.NO_OP_AS_CONFIG_IS_IMMUTABLE, removalResult);
}

@Test
void getImmutableConfigReturnsSelf() {
ConfigStorage configStorage = underTest.getImmutableConfig();
assertThat(configStorage, sameInstance(underTest));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import static com.github.karsaig.approvalcrest.jupiter.MatcherAssert.assertThrows;
import static com.github.karsaig.approvalcrest.jupiter.matcher.Matchers.sameJsonAsApproved;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.HashMap;
Expand Down Expand Up @@ -195,11 +194,6 @@ void mutableConfigCannotBeOverridden() {
assertThat(underTest.isMutableConfigEnabled(), is(true));
}

@Test
void getImmutableConfigReturnsOriginalImmutableConfig() {
ConfigStorage configStorage = underTest.getImmutableConfig();
assertThat(configStorage, sameInstance(immutableRawConfigStorage));
}

@DisplayName("getInt returns original value without override")
@Test
Expand Down
14 changes: 10 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
<commons.testing.version>20-789c720-63866</commons.testing.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<hibernate-core.version>5.3.15.Final</hibernate-core.version>
<spring.boot.version>2.3.5.RELEASE</spring.boot.version>
</properties>

<modules>
Expand Down Expand Up @@ -254,17 +255,22 @@
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
Expand Down
47 changes: 33 additions & 14 deletions spring-boot-infrastructure/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,22 @@
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>compile</scope>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</exclusion>
</exclusions>
<artifactId>spring-cloud-starter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>compile</scope>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<dependency>
<groupId>com.pkb.pkbcommon</groupId>
Expand All @@ -44,6 +39,30 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.github.karsaig</groupId>
<artifactId>approvalcrest-junit-jupiter</artifactId>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package com.pkb.common.config;

import java.util.Optional;

import javax.annotation.ParametersAreNonnullByDefault;

import org.springframework.aop.scope.ScopedProxyUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.Scope;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;

import javax.annotation.ParametersAreNonnullByDefault;
import java.util.Optional;

/**
* This post-processor works around a bug/limitation of Spring Boot/Spring Cloud whereby
* beans discovered by the @EnableConfigurationProperties or @ConfigurationPropertiesScan annotations
Expand All @@ -31,13 +32,17 @@
@ParametersAreNonnullByDefault
public class ConfigurationPropertiesScopingPostProcessor implements BeanDefinitionRegistryPostProcessor {

private static final String SCOPE_ANNOTATION = Scope.class.getName();

@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
for (String name : registry.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = registry.getBeanDefinition(name);
if (beanDefinition.getClass().getName().equals("org.springframework.boot.context.properties.ConfigurationPropertiesValueObjectBeanDefinition")) {
GenericBeanDefinition gbd = (GenericBeanDefinition) beanDefinition;
Optional<AnnotationAttributes> annAttrs = Optional.ofNullable(AnnotationAttributes.fromMap(AnnotationMetadata.introspect(gbd.getBeanClass()).getAnnotationAttributes(Scope.class.getName(), false)));
Optional<AnnotationAttributes> annAttrs = Optional
.ofNullable(AnnotationAttributes.fromMap(AnnotationMetadata.introspect(gbd.getBeanClass()).getAnnotationAttributes(
SCOPE_ANNOTATION, false)));
ScopedProxyMode scopedProxyMode = annAttrs.map(attrs -> attrs.<ScopedProxyMode>getEnum("proxyMode")).orElse(ScopedProxyMode.NO);
gbd.setScope(annAttrs.map(attrs -> attrs.getString("value")).orElse(gbd.getScope()));
if (scopedProxyMode == ScopedProxyMode.NO) {
Expand Down
Loading

0 comments on commit 6a952a7

Please sign in to comment.