DEV Community

Query Filter
Query Filter

Posted on

bridge125


Enter fullscreen mode Exit fullscreen mode

// 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(); }
Enter fullscreen mode Exit fullscreen mode

}
"""
}
}

// 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."
    }
}
Enter fullscreen mode Exit fullscreen mode

}

// 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)