Skip to content

Commit ef090ef

Browse files
authored
Fix for issue helidon-io#1070. Use a set instead of a list to collect injection point configuration to avoid adding duplicate producers for inherited fields. (helidon-io#1074)
Signed-off-by: Santiago Pericas-Geertsen <santiago.pericasgeertsen@oracle.com>
1 parent fef197b commit ef090ef

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

microprofile/config/config-cdi/src/main/java/io/helidon/microprofile/config/cdi/ConfigCdiExtension.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.lang.reflect.Type;
3030
import java.util.Arrays;
3131
import java.util.Collections;
32+
import java.util.HashSet;
3233
import java.util.LinkedList;
3334
import java.util.List;
3435
import java.util.Map;
@@ -85,7 +86,7 @@ public class ConfigCdiExtension implements Extension {
8586
private static final Logger LOGGER = Logger.getLogger(ConfigCdiExtension.class.getName());
8687
private static final Logger VALUE_LOGGER = Logger.getLogger(ConfigCdiExtension.class.getName() + ".VALUES");
8788

88-
private final List<IpConfig> ipConfigs = new LinkedList<>();
89+
private final Set<IpConfig> ipConfigs = new HashSet<>();
8990

9091
/**
9192
* Constructor invoked by CDI container.
@@ -380,6 +381,19 @@ private IpConfig(ConfigQualifier qualifier, Type type) {
380381
this.qualifier = qualifier;
381382
this.type = type;
382383
}
384+
385+
@Override
386+
public boolean equals(Object o) {
387+
if (this == o) return true;
388+
if (o == null || getClass() != o.getClass()) return false;
389+
IpConfig ipConfig = (IpConfig) o;
390+
return Objects.equals(qualifier, ipConfig.qualifier) && Objects.equals(type, ipConfig.type);
391+
}
392+
393+
@Override
394+
public int hashCode() {
395+
return Objects.hash(qualifier, type);
396+
}
383397
}
384398

385399
/**

microprofile/config/config-cdi/src/test/java/io/helidon/microprofile/config/cdi/MpConfigInjectionTest.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,25 @@
2020
import javax.enterprise.inject.se.SeContainer;
2121
import javax.enterprise.inject.se.SeContainerInitializer;
2222
import javax.enterprise.inject.spi.CDI;
23+
import javax.enterprise.util.AnnotationLiteral;
2324
import javax.inject.Inject;
25+
import javax.inject.Qualifier;
26+
import java.lang.annotation.Retention;
27+
import java.lang.annotation.Target;
2428

2529
import io.helidon.config.test.infra.RestoreSystemPropertiesExt;
2630
import io.helidon.microprofile.config.Converters.Ctor;
2731
import io.helidon.microprofile.config.Converters.Of;
2832
import io.helidon.microprofile.config.Converters.Parse;
2933
import io.helidon.microprofile.config.Converters.ValueOf;
30-
3134
import org.eclipse.microprofile.config.inject.ConfigProperty;
3235
import org.junit.jupiter.api.AfterAll;
3336
import org.junit.jupiter.api.BeforeAll;
3437
import org.junit.jupiter.api.Test;
3538
import org.junit.jupiter.api.extension.ExtendWith;
3639

40+
import static java.lang.annotation.ElementType.TYPE;
41+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
3742
import static org.hamcrest.MatcherAssert.assertThat;
3843
import static org.hamcrest.Matchers.is;
3944
import static org.hamcrest.Matchers.notNullValue;
@@ -81,6 +86,21 @@ public void testImplicitConversion() {
8186
);
8287
}
8388

89+
@Test
90+
public void testImplicitConversionSubclass() {
91+
92+
Bean bean = CDI.current().select(SubBean.class,
93+
new AnnotationLiteral<Specific>() {
94+
}).get();
95+
96+
assertAll("Implicit conversion injection",
97+
() -> assertThat("of", bean.of, is(Of.of("of"))),
98+
() -> assertThat("valueOf", bean.valueOf, is(ValueOf.valueOf("valueOf"))),
99+
() -> assertThat("parse", bean.parse, is(Parse.parse("parse"))),
100+
() -> assertThat("ctor", bean.ctor, is(new Ctor("ctor")))
101+
);
102+
}
103+
84104
@Dependent
85105
public static class Bean {
86106

@@ -100,4 +120,15 @@ public static class Bean {
100120
@ConfigProperty(name = "inject.ctor")
101121
public Ctor ctor;
102122
}
123+
124+
@Qualifier
125+
@Retention(RUNTIME)
126+
@Target(TYPE)
127+
public @interface Specific {
128+
}
129+
130+
@Dependent
131+
@Specific
132+
public static class SubBean extends Bean {
133+
}
103134
}

0 commit comments

Comments
 (0)