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
*