// 1. Task to generate the source code
task generateSpringVisualizer {
def outputDir = file("${buildDir}/generated/sources/visualizer/java/com/yourpackage")
def outputFile = file("${outputDir}/SpringVisualizer.java")
outputs.file(outputFile)
doLast {
outputDir.mkdirs()
outputFile.text = """
package com.yourpackage;
import org.springframework.context.;
import org.springframework.beans.factory.config.;
import java.io.FileWriter;
import java.util.*;
public class SpringVisualizer implements ApplicationContextAware, SmartLifecycle {
private ConfigurableApplicationContext context;
private boolean running = false;
private static final java.util.concurrent.atomic.AtomicBoolean runOnce = new java.util.concurrent.atomic.AtomicBoolean(false);
@Override public void setApplicationContext(ApplicationContext ctx) { this.context = (ConfigurableApplicationContext) ctx; }
@Override public void start() {
if (!runOnce.compareAndSet(false, true)) return;
try {
StringBuilder dot = new StringBuilder("digraph G {\\n rankdir=LR; nodesep=0.5; ranksep=2.0;\\n");
dot.append(" node [shape=none, fontname=\\"Arial\\", fontsize=10];\\n");
ConfigurableListableBeanFactory factory = context.getBeanFactory();
for (String name : factory.getBeanDefinitionNames()) {
if (name.startsWith("org.springframework")) continue;
// Using FIXEDSIZE to prevent the 'overflow' from your previous logs
dot.append(" \\"").append(name).append("\\" [label=<<TABLE BORDER=\\"1\\" CELLBORDER=\\"0\\" CELLSPACING=\\"0\\" CELLPADDING=\\"4\\">");
dot.append("<TR><TD BGCOLOR=\\"#A0A0A0\\" FIXEDSIZE=\\"TRUE\\" WIDTH=\\"250\\" HEIGHT=\\"25\\"><B>").append(name).append("</B></TD></TR>");
dot.append("</TABLE>>];\\n");
// Arrows: Check both directions for full connectivity
Set<String> deps = new HashSet<>();
deps.addAll(Arrays.asList(factory.getDependenciesForBean(name)));
deps.addAll(Arrays.asList(factory.getDependentBeans(name)));
for (String dep : deps) {
if (!dep.startsWith("org.springframework")) {
dot.append(" \\"").append(name).append("\\" -> \\"").append(dep).append("\\";\\n");
}
}
}
dot.append("}\\n");
java.io.File out = new java.io.File("build/spring-beans.dot");
try (FileWriter fw = new FileWriter(out)) { fw.write(dot.toString()); }
} catch (Exception e) { e.printStackTrace(); }
this.running = true;
}
@Override public void stop() { this.running = false; }
@Override public boolean isRunning() { return this.running; }
@Override public int getPhase() { return Integer.MAX_VALUE; }
@Override public boolean isAutoStartup() { return true; }
@Override public void stop(Runnable c) { stop(); c.run(); }
}
"""
}
}
// 2. The Conditional Injector
task injectVisualizerToXML {
doLast {
// Check if the compiled class actually exists in the build folder
def classFile = file("${buildDir}/classes/java/main/com/yourpackage/SpringVisualizer.class")
if (classFile.exists()) {
// Target specific XML based on your path
def xmlPath = "src/main.config/quantum/cash/US/qa/cash_riobridge/spring-qas.xml"
def xmlFile = file(xmlPath)
if (xmlFile.exists()) {
def content = xmlFile.text
if (!content.contains("id=\"springVisualizer\"")) {
println ">>> Class found. Injecting Visualizer into ${xmlFile.name}"
def beanDef = ' <bean id="springVisualizer" class="com.yourpackage.SpringVisualizer" lazy-init="false" />'
xmlFile.text = content.replace("</beans>", "${beanDef}\n</beans>")
}
}
} else {
println ">>> SpringVisualizer.class NOT found. Skipping XML injection to avoid crash."
}
}
}
// 3. Automated Cleanup (so you don't commit the injection)
task cleanupXMLInjection {
doLast {
def xmlPath = "src/main.config/quantum/cash/US/qa/cash_riobridge/spring-qas.xml"
def xmlFile = file(xmlPath)
if (xmlFile.exists()) {
xmlFile.text = xmlFile.text.replaceAll(/.id="springVisualizer".\n/, "")
println ">>> XML cleaned."
}
}
}
// 4. Hook everything into the lifecycle
sourceSets.main.java.srcDir "${buildDir}/generated/sources/visualizer/java"
compileJava.dependsOn generateSpringVisualizer
// Trigger injection before run, cleanup after
tasks.named("cash_riobridge") {
dependsOn injectVisualizerToXML
finalizedBy cleanupXMLInjection
}
Top comments (0)