From 81b04de2227593cc29c75fb95cff7bd45a708bbb Mon Sep 17 00:00:00 2001 From: Eric Bottard Date: Thu, 26 Nov 2015 14:19:31 +0100 Subject: [PATCH] Expose configuration metadata groups --- .../ModuleConfigurationMetadataResolver.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/spring-cloud-stream-configuration-metadata/src/main/java/org/springframework/cloud/stream/configuration/metadata/ModuleConfigurationMetadataResolver.java b/spring-cloud-stream-configuration-metadata/src/main/java/org/springframework/cloud/stream/configuration/metadata/ModuleConfigurationMetadataResolver.java index a8e0a3f34..70a0dc83b 100644 --- a/spring-cloud-stream-configuration-metadata/src/main/java/org/springframework/cloud/stream/configuration/metadata/ModuleConfigurationMetadataResolver.java +++ b/spring-cloud-stream-configuration-metadata/src/main/java/org/springframework/cloud/stream/configuration/metadata/ModuleConfigurationMetadataResolver.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.springframework.boot.configurationmetadata.ConfigurationMetadataGroup; import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; import org.springframework.boot.configurationmetadata.ConfigurationMetadataRepositoryJsonBuilder; import org.springframework.boot.loader.archive.Archive; @@ -44,6 +45,46 @@ public class ModuleConfigurationMetadataResolver { JarFile.registerUrlProtocolHandler(); } + /** + * Return metadata about configuration properties (as groups) that are documented via + * + * Spring Boot configuration metadata and visible in a module. + * + * @param module a Spring Cloud Stream module; typically a Boot uberjar, + * but directories are supported as well + */ + public List listPropertyGroups(Resource module) { + List result = new ArrayList<>(); + ClassLoader classLoader = null; + try { + File moduleFile = module.getFile(); + Archive archive = moduleFile.isDirectory() ? new ExplodedArchive(moduleFile) : new JarFileArchive(moduleFile); + classLoader = createClassLoader(archive); + ConfigurationMetadataRepositoryJsonBuilder builder = ConfigurationMetadataRepositoryJsonBuilder.create(); + ResourcePatternResolver moduleResourceLoader = new PathMatchingResourcePatternResolver(classLoader); + for (Resource r : moduleResourceLoader.getResources("classpath*:/META-INF/*spring-configuration-metadata.json")) { + builder.withJsonResource(r.getInputStream()); + } + for (ConfigurationMetadataGroup group : builder.build().getAllGroups().values()) { + result.add(group); + } + } + catch (Exception e) { + throw new RuntimeException("Exception trying to list configuration properties for module " + module, e); + } + finally { + if (classLoader instanceof Closeable) { + try { + ((Closeable) classLoader).close(); + } + catch (IOException e) { + // ignore + } + } + } + return result; + } + /** * Return metadata about configuration properties that are documented via *