From bdd2ae3ed3b108c37acf30e9be3fd44c36f89ac9 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 26 May 2020 13:45:03 +0200 Subject: [PATCH] Migrated the configprops parsing to Java due to constant issues with Groovy versions --- docs/pom.xml | 194 +----------------- .../cloud/internal/Main.groovy | 112 ---------- .../springframework/cloud/internal/Main.java | 135 ++++++++++++ 3 files changed, 137 insertions(+), 304 deletions(-) delete mode 100644 docs/src/main/groovy/org/springframework/cloud/internal/Main.groovy create mode 100644 docs/src/main/java/org/springframework/cloud/internal/Main.java diff --git a/docs/pom.xml b/docs/pom.xml index 8095c903..45bca305 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -17,10 +17,6 @@ 2.1.x,2.2.x ${basedir}/.. - 1.8.1 - 2.5.10 - - ${groovy.version} none ${project.basedir}/src/main/ @@ -40,143 +36,10 @@ compile - org.codehaus.groovy - groovy-all - ${groovy.version} - pom - - - org.codehaus.groovy - groovy - ${groovy.version} + com.fasterxml.jackson.core + jackson-databind compile - - org.codehaus.groovy - groovy-xml - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-datetime - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-nio - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-json - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-jsr223 - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-macro - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-sql - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-swing - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-cli-picocli - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-ant - ${groovy.version} - compile - - - - org.codehaus.groovy - groovy-console - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-docgenerator - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-groovydoc - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-groovysh - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-jmx - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-servlet - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-templates - ${groovy.version} - compile - - - org.codehaus.groovy - groovy-test - ${groovy.version} - test - - - org.codehaus.groovy - groovy-test-junit5 - ${groovy.version} - test - - - org.codehaus.groovy - groovy-testng - ${groovy.version} - test - org.springframework.boot spring-boot-starter-test @@ -184,60 +47,7 @@ - - - src/main - - groovy/**/*.* - - - - - org.codehaus.mojo - build-helper-maven-plugin - ${build-helper-maven-plugin.version} - - - add-source - generate-sources - - add-source - - - - src/main/groovy - - - - - - - org.codehaus.gmavenplus - gmavenplus-plugin - ${gmavenplus-plugin.version} - - - - compile - addSources - generateStubs - generateTestStubs - groovydoc-jar - - - - - - org.codehaus.groovy - groovy-all - - ${groovy.version} - runtime - pom - - - maven-deploy-plugin 2.8.2 diff --git a/docs/src/main/groovy/org/springframework/cloud/internal/Main.groovy b/docs/src/main/groovy/org/springframework/cloud/internal/Main.groovy deleted file mode 100644 index 7b07ffb4..00000000 --- a/docs/src/main/groovy/org/springframework/cloud/internal/Main.groovy +++ /dev/null @@ -1,112 +0,0 @@ -package org.springframework.cloud.internal - -import java.util.regex.Pattern - -import groovy.json.JsonSlurper -import groovy.transform.CompileStatic - -import org.springframework.core.io.Resource -import org.springframework.core.io.support.PathMatchingResourcePatternResolver - -/** - * @author Marcin Grzejszczak - */ -class Main { - - @CompileStatic - static void main(String... args) { - String outputFile = args[0] - String inclusionPattern = args.length > 1 ? args[1] : ".*" - File parent = new File(outputFile).parentFile - if (!parent.exists()) { - println "No parent directory [${parent.toString()}] found. Won't generate the configuration properties file" - return - } - new Generator().generate(outputFile, inclusionPattern) - } - - static class Generator { - void generate(String outputFile, String inclusionPattern) { - println "Parsing all configuration metadata" - Resource[] resources = getResources() - println "Found [${resources.length}] configuration metadata jsons" - TreeSet names = new TreeSet() - def descriptions = [:] - int count = 0 - int matchingPropertyCount = 0 - int propertyCount = 0 - Pattern pattern = Pattern.compile(inclusionPattern) - resources.each { Resource resource -> - if (resourceNameContainsPattern(resource)) { - count++ - def slurper = new JsonSlurper() - slurper.parseText(resource.inputStream.text).properties.each { val -> - propertyCount++ - if (!pattern.matcher(val.name).matches()) { - return - } - matchingPropertyCount++ - names.add val.name - descriptions[val.name] = new ConfigValue(val.name, val.description, val.defaultValue) - } - } - } - println "Found [${count}] Cloud projects configuration metadata jsons. [${matchingPropertyCount}/${propertyCount}] were matching the pattern [${inclusionPattern}]" - println "Successfully built the description table" - if (names.empty) { - println("Will not update the table, since no configuration properties were found!") - return - } - new File(outputFile).text = """\ -|=== -|Name | Default | Description - -${names.collect { it -> return descriptions[it] }.join("\n")} - -|=== -""" - println "Successfully stored the output file" - } - - protected boolean resourceNameContainsPattern(Resource resource) { - try { - return resource.getURL().toString().contains("cloud") - } - catch (Exception e) { - println("Exception [${e}] for resource [${resource}] occurred while trying to retrieve its URL") - return false - } - } - - protected Resource[] getResources() { - return new PathMatchingResourcePatternResolver() - .getResources("classpath*:/META-INF/spring-configuration-metadata.json") - } - - } - - - @CompileStatic - static class ConfigValue { - String name - String description - Object defaultValue - - ConfigValue() {} - - ConfigValue(String name, String description, Object defaultValue) { - this.name = name - this.description = escapedValue(description) - this.defaultValue = escapedValue(defaultValue) - } - - private String escapedValue(Object value) { - return value != null ? - value.toString().replaceAll('\\|', '\\\\|') : '' - } - - String toString() { - "|${name} | ${defaultValue} | ${description}" - } - } -} diff --git a/docs/src/main/java/org/springframework/cloud/internal/Main.java b/docs/src/main/java/org/springframework/cloud/internal/Main.java new file mode 100644 index 00000000..bbbad590 --- /dev/null +++ b/docs/src/main/java/org/springframework/cloud/internal/Main.java @@ -0,0 +1,135 @@ +package org.springframework.cloud.internal; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.util.StreamUtils; + +/** + * @author Marcin Grzejszczak + */ +public class Main { + + static void main(String... args) { + String outputFile = args[0]; + String inclusionPattern = args.length > 1 ? args[1] : ".*"; + File parent = new File(outputFile).getParentFile(); + if (!parent.exists()) { + System.out.println("No parent directory [" + parent.toString() + + "] found. Will not generate the configuration properties file"); + return; + } + new Generator().generate(outputFile, inclusionPattern); + } + + static class Generator { + + void generate(String outputFile, String inclusionPattern) { + try { + System.out.println("Parsing all configuration metadata"); + Resource[] resources = getResources(); + System.out.println("Found [" + resources.length + "] configuration metadata jsons"); + TreeSet names = new TreeSet<>(); + Map descriptions = new HashMap<>(); + final AtomicInteger count = new AtomicInteger(); + final AtomicInteger matchingPropertyCount = new AtomicInteger(); + final AtomicInteger propertyCount = new AtomicInteger(); + Pattern pattern = Pattern.compile(inclusionPattern); + for (Resource resource : resources) { + if (resourceNameContainsPattern(resource)) { + count.incrementAndGet(); + byte[] bytes = StreamUtils.copyToByteArray(resource.getInputStream()); + Map response = new ObjectMapper().readValue(bytes, HashMap.class); + List> properties = (List>) response.get("properties"); + properties.forEach(val -> { + propertyCount.incrementAndGet(); + String name = (String) val.get("name"); + if (!pattern.matcher(name).matches()) { + return; + } + String description = (String) val.get("description"); + String defaultValue = (String) val.get("defaultValue"); + matchingPropertyCount.incrementAndGet(); + names.add(name); + descriptions.put(name, new ConfigValue(name, description, defaultValue)); + }); + } + } + System.out.println( + "Found [" + count + "] Cloud projects configuration metadata jsons. [" + matchingPropertyCount + + "/" + propertyCount + "] were matching the pattern [" + inclusionPattern + "]"); + System.out.println("Successfully built the description table"); + if (names.isEmpty()) { + System.out.println("Will not update the table, since no configuration properties were found!"); + return; + } + Files.write(new File(outputFile).toPath(), + ("|===\n\n" + + "|Name | Default | Description\n" + names.stream() + .map(it -> descriptions.get(it).toString()).collect(Collectors.joining("\n")) + + "\n\n" + "|===").getBytes()); + System.out.println("Successfully stored the output file"); + } + catch (IOException e) { + throw new IllegalStateException(e); + } + } + + protected boolean resourceNameContainsPattern(Resource resource) { + try { + return resource.getURL().toString().contains("cloud"); + } + catch (Exception e) { + System.out.println("Exception [" + e + "] for resource [" + resource + + "] occurred while trying to retrieve its URL"); + return false; + } + } + + protected Resource[] getResources() throws IOException { + return new PathMatchingResourcePatternResolver() + .getResources("classpath*:/META-INF/spring-configuration-metadata.json"); + } + + } + + static class ConfigValue { + + public String name; + + public String description; + + public Object defaultValue; + + ConfigValue() { + } + + ConfigValue(String name, String description, Object defaultValue) { + this.name = name; + this.description = escapedValue(description); + this.defaultValue = escapedValue(defaultValue); + } + + private String escapedValue(Object value) { + return value != null ? value.toString().replaceAll("\\|", "\\\\|") : ""; + } + + public String toString() { + return "|" + name + " | " + defaultValue + " | " + description; + } + + } + +}