This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch oal-v2 in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit c5a1c58e606e35542192846517a9c7f04b8c6721 Author: Wu Sheng <[email protected]> AuthorDate: Tue Feb 10 15:22:37 2026 +0800 Write generated sources to proper package directories for IDE navigation Update OALSourceGenerationTest to write generated source files to directories matching their Java package declarations, enabling proper IDE navigation: - Metrics: org/apache/skywalking/oap/server/core/source/oal/rt/metrics/ - Builders: org/apache/skywalking/oap/server/core/source/oal/rt/metrics/builder/ - Dispatchers: org/apache/skywalking/oap/server/core/source/oal/rt/dispatcher/ This change does not affect test functionality - the same FreeMarker templates are used for both source generation and bytecode generation, ensuring 100% consistency. The package paths are now derived from OALDefine to ensure they always match the generated source's package declarations. Co-Authored-By: Claude Opus 4.5 <[email protected]> --- .../oal/v2/generator/OALSourceGenerationTest.java | 72 ++++++++++++++++------ 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/v2/generator/OALSourceGenerationTest.java b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/v2/generator/OALSourceGenerationTest.java index 12472bd779..af6bfe6db5 100644 --- a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/v2/generator/OALSourceGenerationTest.java +++ b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/v2/generator/OALSourceGenerationTest.java @@ -55,12 +55,14 @@ import static org.junit.jupiter.api.Assertions.assertTrue; * <p>The generated sources use the exact same FreeMarker templates as the bytecode generator, * ensuring 100% consistency between source files and runtime-generated classes. * - * <p>Output directory: target/generated-test-sources/oal/ - * <ul> - * <li>metrics/ - Generated metrics classes</li> - * <li>builders/ - Generated builder classes</li> - * <li>dispatchers/ - Generated dispatcher classes</li> - * </ul> + * <p>Output directory structure follows Java package conventions for IDE navigation: + * <pre> + * target/generated-test-sources/oal/ + * └── org/apache/skywalking/oap/server/core/source/oal/rt/ + * ├── metrics/ - Generated metrics classes (*.java) + * │ └── builder/ - Generated builder classes (*.java) + * └── dispatcher/ - Generated dispatcher classes (*.java) + * </pre> */ @Slf4j public class OALSourceGenerationTest { @@ -83,11 +85,6 @@ public class OALSourceGenerationTest { @BeforeAll public static void setup() throws IOException { - // Create output directory: target/generated-test-sources/oal - Files.createDirectories(getOutputDirectory().resolve("metrics")); - Files.createDirectories(getOutputDirectory().resolve("builders")); - Files.createDirectories(getOutputDirectory().resolve("dispatchers")); - // Initialize scopes and decorators initializeScopes(); } @@ -96,6 +93,15 @@ public class OALSourceGenerationTest { return Path.of(OUTPUT_PATH); } + /** + * Convert a package name to a directory path. + * Example: "org.apache.skywalking.oap.server.core.source.oal.rt.metrics" + * -> "org/apache/skywalking/oap/server/core/source/oal/rt/metrics" + */ + private static Path packageToPath(String packageName) { + return Path.of(packageName.replace('.', '/')); + } + private static void initializeScopes() { DefaultScopeDefine.Listener listener = new DefaultScopeDefine.Listener(); @@ -293,8 +299,14 @@ public class OALSourceGenerationTest { log.info("Generated source size: {} chars", source.length()); log.info("Generated bytecode size: {} bytes", bytecode.length); - // Write the test source file for inspection - Path testOutput = getOutputDirectory().resolve("metrics/ServiceRespTimeMetrics.java"); + // Write the test source file for inspection (in correct package path) + String metricsPackage = define.getDynamicMetricsClassPackage(); + if (metricsPackage.endsWith(".")) { + metricsPackage = metricsPackage.substring(0, metricsPackage.length() - 1); + } + Path metricsDir = getOutputDirectory().resolve(packageToPath(metricsPackage)); + Files.createDirectories(metricsDir); + Path testOutput = metricsDir.resolve("ServiceRespTimeMetrics.java"); Files.writeString(testOutput, source); log.info("Test source written to: {}", testOutput); } @@ -331,24 +343,46 @@ public class OALSourceGenerationTest { ctx.getMetrics().add(model); } - // Generate metrics sources + // Metrics package: org.apache.skywalking.oap.server.core.source.oal.rt.metrics + String metricsPackage = define.getDynamicMetricsClassPackage(); + if (metricsPackage.endsWith(".")) { + metricsPackage = metricsPackage.substring(0, metricsPackage.length() - 1); + } + Path metricsDir = getOutputDirectory().resolve(packageToPath(metricsPackage)); + Files.createDirectories(metricsDir); + + // Builder package: org.apache.skywalking.oap.server.core.source.oal.rt.metrics.builder + String builderPackage = define.getDynamicMetricsBuilderClassPackage(); + if (builderPackage.endsWith(".")) { + builderPackage = builderPackage.substring(0, builderPackage.length() - 1); + } + Path builderDir = getOutputDirectory().resolve(packageToPath(builderPackage)); + Files.createDirectories(builderDir); + for (CodeGenModel model : models) { String source = sourceGen.generateMetricsSource(model); - Path filePath = getOutputDirectory().resolve("metrics/" + model.getMetricsName() + "Metrics.java"); + Path filePath = metricsDir.resolve(model.getMetricsName() + "Metrics.java"); Files.writeString(filePath, source, StandardCharsets.UTF_8); result.filesWritten++; - // Generate builder source + // Generate builder source (different package from metrics) String builderSource = sourceGen.generateMetricsBuilderSource(model); - Path builderPath = getOutputDirectory().resolve("builders/" + model.getMetricsName() + "MetricsBuilder.java"); + Path builderPath = builderDir.resolve(model.getMetricsName() + "MetricsBuilder.java"); Files.writeString(builderPath, builderSource, StandardCharsets.UTF_8); result.filesWritten++; } - // Generate dispatcher sources + // Dispatcher package: org.apache.skywalking.oap.server.core.source.oal.rt.dispatcher + String dispatcherPackage = define.getDynamicDispatcherClassPackage(); + if (dispatcherPackage.endsWith(".")) { + dispatcherPackage = dispatcherPackage.substring(0, dispatcherPackage.length() - 1); + } + Path dispatcherDir = getOutputDirectory().resolve(packageToPath(dispatcherPackage)); + Files.createDirectories(dispatcherDir); + for (OALClassGeneratorV2.DispatcherContextV2 ctx : dispatcherContexts.values()) { String source = sourceGen.generateDispatcherSource(ctx); - Path filePath = getOutputDirectory().resolve("dispatchers/" + ctx.getSourceName() + "Dispatcher.java"); + Path filePath = dispatcherDir.resolve(ctx.getSourceName() + "Dispatcher.java"); Files.writeString(filePath, source, StandardCharsets.UTF_8); result.filesWritten++; }
