ExtensionApiController.java
package com.taxonomy.shared.controller;
import com.taxonomy.shared.extension.ExtensionDescriptor;
import com.taxonomy.shared.extension.ExtensionKind;
import com.taxonomy.shared.extension.runtime.ExtensionRegistry;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Locale;
/** Read-only REST API exposing extension descriptors, never implementation types. */
@RestController
@RequestMapping("/api/extensions")
@Tag(name = "Extensions")
public class ExtensionApiController {
private final ExtensionRegistry extensionRegistry;
public ExtensionApiController(ExtensionRegistry extensionRegistry) {
this.extensionRegistry = extensionRegistry;
}
@Operation(
summary = "List all registered extensions",
description = "Returns descriptor metadata for every registered internal extension point.",
tags = {"Extensions"})
@ApiResponse(responseCode = "200", description = "List of extension descriptors")
@GetMapping
public ResponseEntity<List<ExtensionDescriptor>> listAll() {
return ResponseEntity.ok(extensionRegistry.listAll());
}
@Operation(
summary = "List extensions by kind",
description = "Returns descriptor metadata for the specified extension kind.",
tags = {"Extensions"})
@ApiResponse(responseCode = "200", description = "List of extension descriptors")
@ApiResponse(responseCode = "404", description = "Unknown extension kind")
@GetMapping("/{kind}")
public ResponseEntity<List<ExtensionDescriptor>> listByKind(
@Parameter(description = "Extension kind, e.g. EXPORT_FORMAT")
@PathVariable String kind) {
try {
ExtensionKind extensionKind =
ExtensionKind.valueOf(kind.trim().toUpperCase(Locale.ROOT));
return ResponseEntity.ok(extensionRegistry.listByKind(extensionKind));
} catch (IllegalArgumentException e) {
return ResponseEntity.notFound().build();
}
}
}