Files
Stirling-PDF/src/main/java/stirling/software/SPDF/controller/api/QueueStatusController.java
T
2025-05-26 00:03:19 +01:00

221 lines
8.1 KiB
Java

package stirling.software.SPDF.controller.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.UnoServerManager;
import stirling.software.SPDF.config.UnoServerManager.ServerInstance;
import stirling.software.SPDF.utils.ConversionTask;
import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.ProcessExecutor.Processes;
/** Controller for checking status of process queues */
@RestController
@RequestMapping("/api/v1/queue")
@Slf4j
public class QueueStatusController {
@Autowired(required = false)
private UnoServerManager unoServerManager;
/**
* Get the status of all process queues
*
* @return Map of queue statuses by process type
*/
@GetMapping("/status")
public ResponseEntity<Map<String, QueueStatus>> getAllQueueStatuses() {
Map<String, QueueStatus> statuses = new HashMap<>();
// Add statuses for all ProcessExecutor process types
for (Processes processType : Processes.values()) {
ProcessExecutor executor = ProcessExecutor.getInstance(processType);
QueueStatus status = new QueueStatus();
status.setProcessType(processType.name());
status.setActiveCount(executor.getActiveTaskCount());
status.setQueuedCount(executor.getQueueLength());
statuses.put(processType.name(), status);
}
// Add UnoServer status if available
if (unoServerManager != null) {
QueueStatus status = new QueueStatus();
status.setProcessType("UNOSERVER");
// Get active tasks from UnoServerManager
Map<String, ConversionTask> activeTasks = unoServerManager.getActiveTasks();
status.setActiveCount(activeTasks.size());
status.setQueuedCount(0); // UnoServer tasks are immediately processed
statuses.put("UNOSERVER", status);
}
return ResponseEntity.ok(statuses);
}
/**
* Get the status of a specific process queue
*
* @param processType The process type
* @return Queue status for the specified process
*/
@GetMapping("/status/{processType}")
public ResponseEntity<QueueStatus> getQueueStatus(@PathVariable String processType) {
try {
Processes process = Processes.valueOf(processType.toUpperCase());
ProcessExecutor executor = ProcessExecutor.getInstance(process);
QueueStatus status = new QueueStatus();
status.setProcessType(process.name());
status.setActiveCount(executor.getActiveTaskCount());
status.setQueuedCount(executor.getQueueLength());
return ResponseEntity.ok(status);
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().build();
}
}
/**
* Get status of a specific task
*
* @param taskId The task ID
* @return Task status or 404 if not found
*/
@GetMapping("/task/{taskId}")
public ResponseEntity<TaskInfo> getTaskStatus(@PathVariable String taskId) {
// Try to find the task in any process executor
for (Processes processType : Processes.values()) {
ProcessExecutor executor = ProcessExecutor.getInstance(processType);
ConversionTask task = executor.getTask(taskId);
if (task != null) {
return ResponseEntity.ok(convertToTaskInfo(task));
}
}
// Check UnoServer tasks if available
if (unoServerManager != null && taskId.startsWith("office-")) {
Map<String, ConversionTask> unoTasks = unoServerManager.getActiveTasks();
ConversionTask task = unoTasks.get(taskId);
if (task != null) {
// Calculate queue position for UnoServer tasks
if (task.getStatus() == ConversionTask.TaskStatus.QUEUED) {
int queuePosition = 0;
for (ConversionTask otherTask : unoTasks.values()) {
if (otherTask.getStatus() == ConversionTask.TaskStatus.QUEUED
&& otherTask.getCreatedTime().isBefore(task.getCreatedTime())) {
queuePosition++;
}
}
// Set queue position
task.setQueuePosition(queuePosition + 1);
}
return ResponseEntity.ok(convertToTaskInfo(task));
}
}
return ResponseEntity.notFound().build();
}
/**
* Get queue status for a specific client ID
*
* @param clientId The client-generated ID for the task
* @return Queue status with position for the specific client task
*/
@GetMapping("/status/client/{clientId}")
public ResponseEntity<Map<String, QueueStatus>> getQueueStatusForClient(@PathVariable String clientId) {
Map<String, QueueStatus> result = new HashMap<>();
boolean foundMatch = false;
// Check each process type for the client ID
for (Processes processType : Processes.values()) {
ProcessExecutor executor = ProcessExecutor.getInstance(processType);
List<ConversionTask> queuedTasks = executor.getQueuedTasks();
// Find the position of the client's task in this queue
for (ConversionTask task : queuedTasks) {
// If we find a match for this client's task
if (task.getId().equals(clientId)) {
QueueStatus status = new QueueStatus();
status.setProcessType(processType.name());
status.setActiveCount(executor.getActiveTaskCount());
status.setQueuedCount(task.getQueuePosition());
result.put(processType.name(), status);
foundMatch = true;
break; // Exit loop once found - we only need one match
}
}
if (foundMatch) break; // Exit process type loop if we've found the task
}
// If no matching task found in process executors, check UnoServer
if (!foundMatch && unoServerManager != null) {
Map<String, ConversionTask> unoTasks = unoServerManager.getActiveTasks();
ConversionTask task = unoTasks.get(clientId);
if (task != null) {
QueueStatus status = new QueueStatus();
status.setProcessType("UNOSERVER");
status.setActiveCount(unoTasks.size());
status.setQueuedCount(0); // UnoServer tasks are immediately processed
result.put("UNOSERVER", status);
}
}
return ResponseEntity.ok(result);
}
/** Convert a ConversionTask to TaskInfo DTO */
private TaskInfo convertToTaskInfo(ConversionTask task) {
TaskInfo info = new TaskInfo();
info.setId(task.getId());
info.setStatus(task.getStatus().name());
info.setQueuePosition(task.getQueuePosition());
return info;
}
/** DTO for queue status */
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class QueueStatus {
private String processType;
private int activeCount;
private int queuedCount;
}
/** DTO for task information */
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TaskInfo {
private String id;
private String status;
private int queuePosition;
}
}