GERONIMO-6759 Support for MicroProfile Config 1.4

Signed-off-by: Raymond Augé <rotty3000@apache.org>
diff --git a/impl/pom.xml b/impl/pom.xml
index 7f38c64..e33f1f3 100644
--- a/impl/pom.xml
+++ b/impl/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.geronimo.config</groupId>
         <artifactId>geronimo-config</artifactId>
-        <version>1.2.3-SNAPSHOT</version>
+        <version>1.3.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>geronimo-config-impl</artifactId>
diff --git a/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigInjectionBean.java b/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigInjectionBean.java
index 996166e..5f8a919 100644
--- a/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigInjectionBean.java
+++ b/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigInjectionBean.java
@@ -113,7 +113,7 @@
         final ConfigProperty configProperty = annotated.getAnnotation(ConfigProperty.class);
         final String key = getConfigKey(ip, configProperty);
         final String defaultValue = configProperty.defaultValue();
-        final boolean canBeNull = ConfigProperty.NULL_VALUE.equals(defaultValue);
+        final boolean canBeNull = ConfigProperty.UNCONFIGURED_VALUE.equals(defaultValue);
         return toInstance(
                 annotated.getBaseType(),
                 key,
diff --git a/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigurationHandler.java b/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigurationHandler.java
index 87db4f2..3435255 100644
--- a/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigurationHandler.java
+++ b/impl/src/main/java/org/apache/geronimo/config/cdi/ConfigurationHandler.java
@@ -120,7 +120,7 @@
             key = prefix + (annotation.name().isEmpty() ? m.getDeclaringClass().getName() + "." + m.getName() : annotation.name());
 
             final String defaultValue = annotation.defaultValue();
-            final boolean canBeNull = ConfigProperty.NULL_VALUE.equals(defaultValue);
+            final boolean canBeNull = ConfigProperty.UNCONFIGURED_VALUE.equals(defaultValue);
             final boolean hasDefault = !ConfigProperty.UNCONFIGURED_VALUE.equals(defaultValue) && !canBeNull;
 
             if (hasDefault) {
diff --git a/impl/src/test/java/org/apache/geronimo/config/test/internal/DefaultNullValueTest.java b/impl/src/test/java/org/apache/geronimo/config/test/internal/DefaultNullValueTest.java
index 494ca28..0d2d4da 100644
--- a/impl/src/test/java/org/apache/geronimo/config/test/internal/DefaultNullValueTest.java
+++ b/impl/src/test/java/org/apache/geronimo/config/test/internal/DefaultNullValueTest.java
@@ -32,9 +32,8 @@
 import java.net.URL;
 import java.time.Duration;
 import java.util.List;
+import java.util.Optional;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 
 /**
@@ -63,187 +62,113 @@
         assertNull(injected.getClassNullValue());
         assertNull(injected.getDoubleNullValue());
         assertNull(injected.getDurationNullValue());
-
-        assertFalse(injected.isPrimitiveBooleanNullValue());
-        assertEquals(0, injected.getPrimitiveLongNullValue());
-        assertEquals(0, injected.getPrimitiveIntegerNullValue());
-        assertEquals(0, injected.getPrimitiveShortNullValue());
-        assertEquals(0, injected.getPrimitiveByteNullValue());
-        assertEquals(0.0F, injected.getPrimitiveFloatNullValue());
-        assertEquals(0.0D, injected.getPrimitiveDoubleNullValue());
-        assertEquals('\u0000', injected.getPrimitiveCharacterNullValue());
-
     }
 
     @ApplicationScoped
     public static class Injected {
 
         @Inject
-        @ConfigProperty(name = "boolean.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Boolean booleanNullValue;
+        @ConfigProperty(name = "boolean.nullvalue.default")
+        private Optional<Boolean> booleanNullValue;
 
         @Inject
-        @ConfigProperty(name = "boolean.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private boolean primitiveBooleanNullValue;
+        @ConfigProperty(name = "string.nullvalue.default")
+        private Optional<String> stringNullValue;
 
         @Inject
-        @ConfigProperty(name = "string.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private String stringNullValue;
+        @ConfigProperty(name = "long.nullvalue.default")
+        private Optional<Long> longNullValue;
 
         @Inject
-        @ConfigProperty(name = "long.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Long longNullValue;
+        @ConfigProperty(name = "integer.nullvalue.default")
+        private Optional<Integer> integerNullValue;
 
         @Inject
-        @ConfigProperty(name = "long.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private long primitiveLongNullValue;
+        @ConfigProperty(name = "float.nullvalue.default")
+        private Optional<Float> floatNullValue;
 
         @Inject
-        @ConfigProperty(name = "integer.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Integer integerNullValue;
+        @ConfigProperty(name = "double.nullvalue.default")
+        private Optional<Double> doubleNullValue;
 
         @Inject
-        @ConfigProperty(name = "integer.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private int primitiveIntegerNullValue;
+        @ConfigProperty(name = "character.nullvalue.default")
+        private Optional<Character> characterNullValue;
 
         @Inject
-        @ConfigProperty(name = "float.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Float floatNullValue;
+        @ConfigProperty(name = "short.nullvalue.default")
+        private Optional<Short> shortNullValue;
 
         @Inject
-        @ConfigProperty(name = "float.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private float primitiveFloatNullValue;
+        @ConfigProperty(name = "byte.nullvalue.default")
+        private Optional<Byte> byteNullValue;
 
         @Inject
-        @ConfigProperty(name = "double.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Double doubleNullValue;
+        @ConfigProperty(name = "list.nullvalue.default")
+        private Optional<List<String>> listNullValue;
 
         @Inject
-        @ConfigProperty(name = "double.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private double primitiveDoubleNullValue;
+        @ConfigProperty(name = "class.nullvalue.default")
+        private Optional<Class> classNullValue;
 
         @Inject
-        @ConfigProperty(name = "character.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Character characterNullValue;
+        @ConfigProperty(name = "url.nullvalue.default")
+        private Optional<URL> urlNullValue;
 
         @Inject
-        @ConfigProperty(name = "character.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private char primitiveCharacterNullValue;
-
-        @Inject
-        @ConfigProperty(name = "short.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Short shortNullValue;
-
-        @Inject
-        @ConfigProperty(name = "short.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private short primitiveShortNullValue;
-
-        @Inject
-        @ConfigProperty(name = "byte.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Byte byteNullValue;
-
-        @Inject
-        @ConfigProperty(name = "byte.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private byte primitiveByteNullValue;
-
-        @Inject
-        @ConfigProperty(name = "list.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private List<String> listNullValue;
-
-        @Inject
-        @ConfigProperty(name = "class.nullvalue.default", defaultValue =  ConfigProperty.NULL_VALUE)
-        private Class classNullValue;
-
-        @Inject
-        @ConfigProperty(name = "url.nullvalue.default", defaultValue =  ConfigProperty.NULL_VALUE)
-        private URL urlNullValue;
-
-        @Inject
-        @ConfigProperty(name = "duration.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
-        private Duration durationNullValue;
+        @ConfigProperty(name = "duration.nullvalue.default")
+        private Optional<Duration> durationNullValue;
 
         public Boolean getBooleanNullValue() {
-            return booleanNullValue;
-        }
-
-        public boolean isPrimitiveBooleanNullValue() {
-            return primitiveBooleanNullValue;
+            return booleanNullValue.orElse(null);
         }
 
         public String getStringNullValue() {
-            return stringNullValue;
+            return stringNullValue.orElse(null);
         }
 
         public Long getLongNullValue() {
-            return longNullValue;
-        }
-
-        public long getPrimitiveLongNullValue() {
-            return primitiveLongNullValue;
+            return longNullValue.orElse(null);
         }
 
         public Integer getIntegerNullValue() {
-            return integerNullValue;
-        }
-
-        public int getPrimitiveIntegerNullValue() {
-            return primitiveIntegerNullValue;
+            return integerNullValue.orElse(null);
         }
 
         public Float getFloatNullValue() {
-            return floatNullValue;
-        }
-
-        public float getPrimitiveFloatNullValue() {
-            return primitiveFloatNullValue;
+            return floatNullValue.orElse(null);
         }
 
         public Double getDoubleNullValue() {
-            return doubleNullValue;
-        }
-
-        public double getPrimitiveDoubleNullValue() {
-            return primitiveDoubleNullValue;
+            return doubleNullValue.orElse(null);
         }
 
         public Character getCharacterNullValue() {
-            return characterNullValue;
-        }
-
-        public char getPrimitiveCharacterNullValue() {
-            return primitiveCharacterNullValue;
+            return characterNullValue.orElse(null);
         }
 
         public Short getShortNullValue() {
-            return shortNullValue;
-        }
-
-        public short getPrimitiveShortNullValue() {
-            return primitiveShortNullValue;
+            return shortNullValue.orElse(null);
         }
 
         public Byte getByteNullValue() {
-            return byteNullValue;
-        }
-
-        public byte getPrimitiveByteNullValue() {
-            return primitiveByteNullValue;
+            return byteNullValue.orElse(null);
         }
 
         public List<String> getListNullValue() {
-            return listNullValue;
+            return listNullValue.orElse(null);
         }
 
         public Class getClassNullValue() {
-            return classNullValue;
+            return classNullValue.orElse(null);
         }
 
         public URL getUrlNullValue() {
-            return urlNullValue;
+            return urlNullValue.orElse(null);
         }
 
         public Duration getDurationNullValue() {
-            return durationNullValue;
+            return durationNullValue.orElse(null);
         }
     }
 }
diff --git a/impl/src/test/java/org/apache/geronimo/config/test/internal/ProxyTest.java b/impl/src/test/java/org/apache/geronimo/config/test/internal/ProxyTest.java
index c8ea581..5f53cbf 100644
--- a/impl/src/test/java/org/apache/geronimo/config/test/internal/ProxyTest.java
+++ b/impl/src/test/java/org/apache/geronimo/config/test/internal/ProxyTest.java
@@ -129,67 +129,67 @@
         @ConfigProperty(defaultValue = "1,2,1")
         Collection<Integer> listDefaults();
 
-        @ConfigProperty(name = "boolean.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "boolean.nullvalue.default")
         Boolean booleanNullValue();
 
-        @ConfigProperty(name = "boolean.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "boolean.nullvalue.default")
         boolean primitiveBooleanNullValue();
 
-        @ConfigProperty(name = "string.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "string.nullvalue.default")
         String stringNullValue();
 
-        @ConfigProperty(name = "long.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "long.nullvalue.default")
         Long longNullValue();
 
-        @ConfigProperty(name = "long.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "long.nullvalue.default")
         long primitiveLongNullValue();
 
-        @ConfigProperty(name = "integer.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "integer.nullvalue.default")
         Integer integerNullValue();
 
-        @ConfigProperty(name = "integer.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "integer.nullvalue.default")
         int primitiveIntegerNullValue();
 
-        @ConfigProperty(name = "float.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "float.nullvalue.default")
         Float floatNullValue();
 
-        @ConfigProperty(name = "float.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "float.nullvalue.default")
         float primitiveFloatNullValue();
 
-        @ConfigProperty(name = "double.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "double.nullvalue.default")
         Double doubleNullValue();
 
-        @ConfigProperty(name = "double.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "double.nullvalue.default")
         double primitiveDoubleNullValue();
 
-        @ConfigProperty(name = "character.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "character.nullvalue.default")
         Character characterNullValue();
 
-        @ConfigProperty(name = "character.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "character.nullvalue.default")
         char primitiveCharacterNullValue();
 
-        @ConfigProperty(name = "short.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "short.nullvalue.default")
         Short shortNullValue();
 
-        @ConfigProperty(name = "short.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "short.nullvalue.default")
         short primitiveShortNullValue();
 
-        @ConfigProperty(name = "byte.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "byte.nullvalue.default")
         Byte byteNullValue();
 
-        @ConfigProperty(name = "byte.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "byte.nullvalue.default")
         byte primitiveByteNullValue();
 
-        @ConfigProperty(name = "list.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "list.nullvalue.default")
         List<String> listNullValue();
 
-        @ConfigProperty(name = "class.nullvalue.default", defaultValue =  ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "class.nullvalue.default")
         Class classNullValue();
 
-        @ConfigProperty(name = "url.nullvalue.default", defaultValue =  ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "url.nullvalue.default")
         URL urlNullValue();
 
-        @ConfigProperty(name = "duration.nullvalue.default", defaultValue = ConfigProperty.NULL_VALUE)
+        @ConfigProperty(name = "duration.nullvalue.default")
         Duration durationNullValue();
     }
 }
diff --git a/pom.xml b/pom.xml
index 5b58e73..7312462 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.apache.geronimo.config</groupId>
     <artifactId>geronimo-config</artifactId>
-    <version>1.2.3-SNAPSHOT</version>
+    <version>1.3.0-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>Geronimo Microprofile Configuration</name>
 
@@ -51,7 +51,7 @@
     <properties>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
-        <microprofile-config.version>1.4-RC2</microprofile-config.version>
+        <microprofile-config.version>1.4</microprofile-config.version>
         <arquillian.version>1.1.14.Final</arquillian.version>
         <arquillian-weld-embedded.version>2.0.0.Final</arquillian-weld-embedded.version>
         <bnd.version>5.0.1</bnd.version>