Thanks Mark to have pointed out @ConfigProperty can be put on a TYPE so we can use it to handle prefixes in our proxies

git-svn-id: https://svn.apache.org/repos/asf/geronimo/components/config/trunk@1832036 13f79535-47bb-0310-9956-ffa450edef68
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 0c18f7a..8f0d7ee 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
@@ -16,6 +16,7 @@
  */
 package org.apache.geronimo.config.cdi;
 
+import static java.util.Optional.ofNullable;
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
@@ -44,9 +45,13 @@
 
     ConfigurationHandler(final Config config, final Class<?> api) {
         this.config = config;
+
+        final String prefix = ofNullable(api.getAnnotation(ConfigProperty.class))
+                .map(ConfigProperty::name)
+                .orElse("");
         this.methodMetas = Stream.of(api.getMethods())
             .filter(m -> m.isAnnotationPresent(ConfigProperty.class))
-            .collect(toMap(identity(), MethodMeta::new));
+            .collect(toMap(identity(), e -> new MethodMeta(e, prefix)));
     }
 
     @Override
@@ -75,7 +80,7 @@
 
         private final boolean optional;
 
-        private MethodMeta(final Method m) {
+        private MethodMeta(final Method m, final String prefix) {
             final ConfigProperty annotation = m.getAnnotation(ConfigProperty.class);
             optional = Optional.class == m.getReturnType();
             final Type type = optional ?
@@ -109,7 +114,7 @@
                 throw new IllegalArgumentException("Unsupported type: " + type);
             }
 
-            key = annotation.name().isEmpty() ? m.getDeclaringClass().getName() + "." + m.getName() : annotation.name();
+            key = prefix + (annotation.name().isEmpty() ? m.getDeclaringClass().getName() + "." + m.getName() : annotation.name());
             final boolean hasDefault = !annotation.defaultValue().equals(ConfigProperty.UNCONFIGURED_VALUE);
             if (lookupType == long.class || lookupType == Long.class) {
                 defaultValue = hasDefault ? Long.parseLong(annotation.defaultValue()) : 0L;
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 7dc7f00..2e1b34a 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
@@ -39,12 +39,13 @@
 
     @Deployment
     public static WebArchive deploy() {
+        System.setProperty("prefix.val", "yes");
         System.setProperty(LIST_KEY, "a,b,1");
         System.setProperty(SOME_KEY, "yeah");
         System.setProperty(SOME_OTHER_KEY, "123");
         JavaArchive testJar = ShrinkWrap
                 .create(JavaArchive.class, "PoxyTest.jar")
-                .addClasses(ProxyTest.class, SomeProxy.class)
+                .addClasses(ProxyTest.class, SomeProxy.class, PrefixedSomeProxy.class)
                 .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
 
         return ShrinkWrap
@@ -53,6 +54,9 @@
     }
 
     @Inject
+    private PrefixedSomeProxy prefixed;
+
+    @Inject
     private SomeProxy proxy;
 
     @Test
@@ -65,6 +69,17 @@
         assertEquals(proxy.listDefaults(), asList(1, 2, 1));
     }
 
+    @Test
+    public void prefix() {
+        assertEquals(prefixed.val(), "yes");
+    }
+
+    @ConfigProperty(name = "prefix.")
+    public interface PrefixedSomeProxy {
+        @ConfigProperty(name = "val")
+        String val();
+    }
+
     public interface SomeProxy {
         @ConfigProperty
         int key2();