Skip to content

Commit 6f54ea8

Browse files
committed
Add profile option to annotation
1 parent 27b77af commit 6f54ea8

File tree

7 files changed

+122
-16
lines changed

7 files changed

+122
-16
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=1.0.3
1+
version=1.0.4-SNAPSHOT

src/main/java/com/spring/loader/S3PropertiesLocation.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@
77
import java.lang.annotation.Target;
88

99
import org.springframework.context.annotation.Import;
10+
import org.springframework.core.annotation.AliasFor;
1011

1112
/**
1213
* Allow the auto configuration of the {@link S3PropertyPlaceholderConfigurer} bean.
1314
*
1415
* @author Eric Dallo
1516
* @since 1.0.3
16-
* @see S3PropertiesLocationConfiguration
17+
* @see S3PropertiesLocationRegistrar
1718
*/
1819
@Target(ElementType.TYPE)
1920
@Retention(RetentionPolicy.RUNTIME)
20-
@Import({S3ResourseLoaderConfiguration.class, S3PropertiesLocationConfiguration.class})
21+
@Import({S3ResourseLoaderConfiguration.class, S3PropertiesLocationRegistrar.class})
2122
@Documented
2223
public @interface S3PropertiesLocation {
2324

@@ -26,6 +27,16 @@
2627
*
2728
* @return the path of aws s3 properties, e.g. my-bucket/my-folder/app.properties
2829
*/
29-
String[] value();
30+
@AliasFor("path")
31+
String[] value() default {};
3032

33+
@AliasFor("value")
34+
String[] path() default {};
35+
36+
/**
37+
* The profiles to load the properties in aws s3.
38+
*
39+
* @return the profile name e.g. "prod"
40+
*/
41+
String[] profiles() default {};
3142
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.spring.loader;
22

3-
import org.springframework.beans.MutablePropertyValues;
3+
import static java.lang.Character.toLowerCase;
4+
45
import org.springframework.beans.factory.config.BeanDefinition;
56
import org.springframework.beans.factory.config.RuntimeBeanReference;
67
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
78
import org.springframework.beans.factory.support.RootBeanDefinition;
9+
import org.springframework.context.EnvironmentAware;
810
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
911
import org.springframework.core.annotation.AnnotationAttributes;
12+
import org.springframework.core.env.Environment;
1013
import org.springframework.core.type.AnnotationMetadata;
1114

1215
/**
@@ -18,22 +21,33 @@
1821
* @see S3PropertiesLocation
1922
* @see S3PropertyPlaceholderConfigurer
2023
*/
21-
class S3PropertiesLocationConfiguration implements ImportBeanDefinitionRegistrar {
24+
class S3PropertiesLocationRegistrar implements EnvironmentAware, ImportBeanDefinitionRegistrar {
2225

26+
private Environment environment;
27+
2328
@Override
2429
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
25-
BeanDefinition bd = new RootBeanDefinition(S3PropertyPlaceholderConfigurer.class);
26-
2730
AnnotationAttributes attributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(S3PropertiesLocation.class.getName()));
28-
String[] locations = attributes.getStringArray("value");
31+
String[] profiles = attributes.getStringArray("profiles");
2932

30-
MutablePropertyValues properties = bd.getPropertyValues();
33+
if (profiles.length > 0 && !environment.acceptsProfiles(profiles)) {
34+
return;
35+
}
3136

32-
properties.addPropertyValue("s3ResourceLoader", new RuntimeBeanReference("s3ResourceLoader"));
37+
String[] locations = attributes.getStringArray("value");
3338

34-
properties.add("s3Locations", locations);
39+
BeanDefinition bd = new RootBeanDefinition(S3PropertyPlaceholderConfigurer.class);
40+
41+
bd.getPropertyValues().addPropertyValue("s3ResourceLoader", new RuntimeBeanReference("s3ResourceLoader"));
42+
bd.getPropertyValues().add("s3Locations", locations);
3543

36-
registry.registerBeanDefinition("s3PropertyPlaceholderConfigurer", bd);
44+
String beanName = S3PropertyPlaceholderConfigurer.class.getSimpleName();
45+
registry.registerBeanDefinition(toLowerCase(beanName.charAt(0)) + beanName.substring(1), bd);
46+
}
47+
48+
@Override
49+
public void setEnvironment(Environment environment) {
50+
this.environment = environment;
3751
}
3852

3953
}

src/main/java/com/spring/loader/S3ResourceLoader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.amazonaws.services.s3.AmazonS3;
99
import com.amazonaws.services.s3.model.S3Object;
1010
import com.spring.loader.exception.InvalidS3LocationException;
11+
import com.spring.loader.exception.S3ResourceException;
1112

1213
/**
1314
* Get {@link Resource} for the given aws s3 location.

src/main/java/com/spring/loader/exception/InvalidS3LocationException.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.spring.loader.exception;
22

3-
import com.spring.loader.S3ResourceException;
4-
53
public class InvalidS3LocationException extends S3ResourceException {
64
private static final long serialVersionUID = 2057112790586228669L;
75

src/main/java/com/spring/loader/S3ResourceException.java renamed to src/main/java/com/spring/loader/exception/S3ResourceException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.spring.loader;
1+
package com.spring.loader.exception;
22

33
public class S3ResourceException extends RuntimeException {
44
private static final long serialVersionUID = 8310280589629514933L;
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.spring.loader;
2+
3+
import static org.mockito.Mockito.never;
4+
import static org.mockito.Mockito.verify;
5+
import static org.mockito.Mockito.when;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
import org.junit.runner.RunWith;
13+
import org.mockito.Mock;
14+
import org.mockito.Mockito;
15+
import org.mockito.runners.MockitoJUnitRunner;
16+
import org.springframework.beans.factory.config.BeanDefinition;
17+
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
18+
import org.springframework.core.env.Environment;
19+
import org.springframework.core.type.AnnotationMetadata;
20+
21+
@RunWith(MockitoJUnitRunner.class)
22+
public class S3PropertiesLocationRegistrarTest {
23+
24+
private S3PropertiesLocationRegistrar subject;
25+
26+
private Map<String, Object> attributes;
27+
28+
@Mock
29+
private Environment environment;
30+
@Mock
31+
private AnnotationMetadata importingClassMetadata;
32+
@Mock
33+
private BeanDefinitionRegistry registry;
34+
35+
@Before
36+
public void setup() {
37+
subject = new S3PropertiesLocationRegistrar();
38+
subject.setEnvironment(environment);
39+
40+
attributes = new HashMap<>();
41+
attributes.put("path", new String[] { "my-bucket/my.properties" });
42+
attributes.put("value", new String[] { "my-bucket/my.properties" });
43+
44+
when(importingClassMetadata.getAnnotationAttributes(S3PropertiesLocation.class.getName())).thenReturn(attributes);
45+
}
46+
47+
@Test
48+
public void shouldLoadPropertiesWhenThereisNoProfiles() {
49+
attributes.put("profiles", new String[] {});
50+
51+
subject.registerBeanDefinitions(importingClassMetadata, registry);
52+
53+
verify(registry).registerBeanDefinition(Mockito.anyString(), Mockito.any(BeanDefinition.class));
54+
}
55+
56+
@Test
57+
public void shouldLoadPropertiesWhenThereisProfilesActive() {
58+
String[] profiles = new String[] { "prod" };
59+
60+
attributes.put("profiles", profiles);
61+
62+
when(environment.acceptsProfiles(profiles)).thenReturn(true);
63+
64+
subject.registerBeanDefinitions(importingClassMetadata, registry);
65+
66+
verify(registry).registerBeanDefinition(Mockito.anyString(), Mockito.any(BeanDefinition.class));
67+
}
68+
69+
@Test
70+
public void shouldNotLoadPropertiesWhenThereisNoProfilesActive() {
71+
String[] profiles = new String[] { "prod" };
72+
73+
attributes.put("profiles", profiles);
74+
75+
when(environment.acceptsProfiles(profiles)).thenReturn(false);
76+
77+
subject.registerBeanDefinitions(importingClassMetadata, registry);
78+
79+
verify(registry, never()).registerBeanDefinition(Mockito.anyString(), Mockito.any(BeanDefinition.class));
80+
}
81+
82+
}

0 commit comments

Comments
 (0)