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++;
         }

Reply via email to