Add Spring LDAP component definitions (#13984)

Register spring-ldap as component 179 and LDAP as component 180.
Map the Spring LDAP client component to the LDAP server component and
cover the catalog definitions with tests.
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 3bfcb36..300f678 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -259,6 +259,8 @@
 * Add `ThreadPolicy.ioBound(N)` to `library-batch-queue`, for queues whose consumers spend most of their time blocked. Such a queue runs its drain loops on virtual threads where the runtime provides them (JDK 25+) and falls back to N platform threads otherwise; the count, and therefore concurrency, batching, back-pressure, drop semantics and per-partition ordering, are identical on both paths. Shutdown latency is the one exception: the platform scheduler drops drain tasks parked on their idle backoff, while the virtual-thread adapter sleeps inside the submitted task and cannot, so an `ioBound` queue should keep `maxIdleMs` within `shutdownTimeoutMs`. There is deliberately no CPU-proportional form: virtual threads are not preemptive, so CPU-bound work would hold its carrier and starve the shared carrier pool, and L1/L2/TopN stay on `cpuCores`/`fixed`. Also fixes `BatchQueue.shutdown()`, which ran its final drain on the caller's thread while drain loops could still be inside `consume()`, invoking a handler concurrently and breaking the single-drain-thread invariant workers such as `MetricsAggregateWorker` rely on: it now cancels the periodic rebalance task, waits for in-flight consumers (`shutdownTimeoutMs`, default 500ms per queue), and serialises its final dispatch behind a read/write dispatch lock so the guarantee holds even when that wait times out or is interrupted. Drain loops hold the read lock for the whole cycle — the running recheck, the partition dequeue, the idle notification and the dispatch — because `onIdle()` touches the same worker state as `consume()` and an unlocked dequeue would let shutdown dispatch a newer batch ahead of one a task already holds. Concurrent shutdown callers await the winner's completion rather than returning early. A consumer is never interrupted mid-batch.
 
 #### OAP Server
+* Add component IDs for the Spring LDAP Java agent plugin (`spring-ldap`: 179) and LDAP server (`LDAP`: 180),
+  including their server mapping.
 * Fix LAL's `segmentId` and `spanId` extractor statements, which the grammar accepted and the parser never implemented. `LALParser.g4` declares `traceIdStatement`, `segmentIdStatement` and `spanIdStatement`, and the codegen already carried `setSegmentId`/`setSpanId` in its setter table, but `LALScriptParser.visitExtractorStatement` had a branch for only the first of the three. The remaining alternatives fell through to a line that assumed whatever was left had to be an `ifStatement`, so a rule writing `segmentId ...` failed at boot with a `NullPointerException` naming `IfStatementContext` — for a rule line containing no `if`. Both statements now work, and an unhandled extractor statement reports its own rule line instead of throwing. Existing log records are unaffected: `LogBuilder` copies trace id, segment id and span id straight from the log's metadata, and only skips that copy when a rule has set them — which no shipped rule did, which is why the gap went unnoticed. Dedicated execution tests now cover reading all three fields from `log.traceContext.*` and writing all three from an extractor.
 * Remove dead code from the DSL subsystem and correct the shared kernel's own documentation. Deleted `DslContentHash` (a byte-identical, zero-caller twin of the live `ContentHash`), the unused `oal-rt` metrics-function registry, `LogAnalyzerFactory`, `LALCodegenHelper.METADATA_GETTER_ALIASES` (a permanently empty map whose reader branch could never execute — the DSL-name-to-getter mismatch it existed for no longer exists, since `LogMetadata.TraceContext` names the field `traceSegmentId` directly), and three unreferenced members. Three kernel classes carried javadoc asserting consumers that do not exist — `DSLClassLoaderManager` claimed the MAL and LAL compile paths reach for its singleton, `LogDataDebugDump` claimed core renders through it, and `DslContentHash` instructed the reader to consolidate toward the dead copy; a false rationale in a shared kernel is an instruction to the next contributor, so those are now what the call sites actually support. `OALDebug`, `OALDebugRecorder` and `DebugHolderProvider` now record why they sit in core while MAL's and LAL's equivalents do not: `dsl-debugging` declares no `oal-rt` dependency, so they cannot move.
 * Unify source attribution for every generated DSL class, so a stack frame from OAL, MAL, LAL or Hierarchy code leads back to the rule that produced it.
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/ComponentLibraryCatalogFileTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/ComponentLibraryCatalogFileTest.java
index e53ccea..d8098f3 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/ComponentLibraryCatalogFileTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/ComponentLibraryCatalogFileTest.java
@@ -29,6 +29,10 @@
         Assertions.assertEquals(7, service.getServerIdBasedOnComponent(30));
         Assertions.assertEquals(21, service.getServerIdBasedOnComponent(21));
         Assertions.assertEquals("Redis", service.getServerNameBasedOnComponent(30));
+        Assertions.assertEquals(179, service.getComponentId("spring-ldap"));
+        Assertions.assertEquals(180, service.getComponentId("LDAP"));
+        Assertions.assertEquals(180, service.getServerIdBasedOnComponent(179));
+        Assertions.assertEquals("LDAP", service.getServerNameBasedOnComponent(179));
     }
 
     /**
diff --git a/oap-server/server-core/src/test/resources/component-libraries.yml b/oap-server/server-core/src/test/resources/component-libraries.yml
index 79e0d39..921438c 100755
--- a/oap-server/server-core/src/test/resources/component-libraries.yml
+++ b/oap-server/server-core/src/test/resources/component-libraries.yml
@@ -476,6 +476,12 @@
   id: 142
   languages: ebpf, mesh
   priority: 12
+spring-ldap:
+  id: 179
+  languages: Java
+LDAP:
+  id: 180
+  languages: Java
 
 # .NET/.NET Core components
 # [3000, 4000) for C#/.NET only
@@ -761,3 +767,4 @@
   Impala-jdbc-driver: Impala
   eventmesh-producer: EventMesh
   eventmesh-consumer: EventMesh
+  spring-ldap: LDAP
diff --git a/oap-server/server-starter/src/main/resources/component-libraries.yml b/oap-server/server-starter/src/main/resources/component-libraries.yml
index 6342527..065635d 100644
--- a/oap-server/server-starter/src/main/resources/component-libraries.yml
+++ b/oap-server/server-starter/src/main/resources/component-libraries.yml
@@ -587,6 +587,12 @@
 spring-ai:
   id: 178
   languages: Java
+spring-ldap:
+  id: 179
+  languages: Java
+LDAP:
+  id: 180
+  languages: Java
 
 # .NET/.NET Core components
 # [3000, 4000) for C#/.NET only
@@ -943,4 +949,5 @@
   spring-ai-huggingface: GenAI
   spring-ai-minimax: GenAI
   spring-ai-ollama: GenAI
-  spring-ai-zhipu-ai: GenAI
\ No newline at end of file
+  spring-ai-zhipu-ai: GenAI
+  spring-ldap: LDAP