init: 2026Technology-Competition initial commit
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-backend</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>ims-api</artifactId>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.ims.api.controller;
|
||||
|
||||
import com.ims.api.dto.system.LogQueryRequest;
|
||||
import com.ims.api.dto.system.LogResponse;
|
||||
import com.ims.api.service.system.LogService;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/logs")
|
||||
public class LogController {
|
||||
|
||||
private final LogService logService;
|
||||
|
||||
public LogController(LogService logService) {
|
||||
this.logService = logService;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<PageResult<LogResponse>> list(@ModelAttribute LogQueryRequest request) {
|
||||
return ApiResponse.success(logService.list(request));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.ims.api.controller;
|
||||
|
||||
import com.ims.api.dto.system.PermissionResponse;
|
||||
import com.ims.api.dto.system.RoleRequest;
|
||||
import com.ims.api.dto.system.RoleResponse;
|
||||
import com.ims.api.service.system.RoleService;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/roles")
|
||||
public class RoleController {
|
||||
|
||||
private final RoleService roleService;
|
||||
|
||||
public RoleController(RoleService roleService) {
|
||||
this.roleService = roleService;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<List<RoleResponse>> list() {
|
||||
return ApiResponse.success(roleService.list());
|
||||
}
|
||||
|
||||
@GetMapping("/permissions")
|
||||
public ApiResponse<List<PermissionResponse>> permissions() {
|
||||
return ApiResponse.success(roleService.permissions());
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
public ApiResponse<RoleResponse> create(@RequestBody @Valid RoleRequest request) {
|
||||
return ApiResponse.success(roleService.create(request));
|
||||
}
|
||||
|
||||
@PutMapping("/{id}")
|
||||
public ApiResponse<RoleResponse> update(@PathVariable Long id, @RequestBody @Valid RoleRequest request) {
|
||||
return ApiResponse.success(roleService.update(id, request));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.ims.api.controller;
|
||||
|
||||
import com.ims.api.dto.system.UserRequest;
|
||||
import com.ims.api.dto.system.UserResponse;
|
||||
import com.ims.api.service.system.UserService;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/users")
|
||||
public class UserController {
|
||||
|
||||
private final UserService userService;
|
||||
|
||||
public UserController(UserService userService) {
|
||||
this.userService = userService;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<PageResult<UserResponse>> list(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize,
|
||||
@RequestParam(required = false) String keyword,
|
||||
@RequestParam(required = false) Long departmentId,
|
||||
@RequestParam(required = false) Boolean isActive) {
|
||||
return ApiResponse.success(userService.list(page, pageSize, keyword, departmentId, isActive));
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
public ApiResponse<UserResponse> create(@RequestBody @Valid UserRequest request) {
|
||||
return ApiResponse.success(userService.create(request));
|
||||
}
|
||||
|
||||
@PutMapping("/{id}")
|
||||
public ApiResponse<UserResponse> update(@PathVariable Long id, @RequestBody @Valid UserRequest request) {
|
||||
return ApiResponse.success(userService.update(id, request));
|
||||
}
|
||||
|
||||
@PutMapping("/{id}/status")
|
||||
public ApiResponse<Void> toggleStatus(@PathVariable Long id, @RequestParam Boolean isActive) {
|
||||
userService.updateStatus(id, isActive);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@GetMapping("/export")
|
||||
public void export(@RequestParam(required = false) String keyword,
|
||||
@RequestParam(required = false) Long departmentId,
|
||||
@RequestParam(required = false) Boolean isActive,
|
||||
HttpServletResponse response) throws IOException {
|
||||
PageResult<UserResponse> result = userService.list(1, 100000, keyword, departmentId, isActive);
|
||||
response.setContentType("text/csv;charset=UTF-8");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=users.csv");
|
||||
response.getWriter().write("\uFEFF");
|
||||
response.getWriter().write("账号,姓名,邮箱,部门,角色,状态,Agent授权\n");
|
||||
for (UserResponse u : result.getItems()) {
|
||||
String roles = u.getRoles() == null ? "" : String.join("|", u.getRoles());
|
||||
response.getWriter().write(String.join(",",
|
||||
csv(u.getUserid()), csv(u.getUsername()), csv(u.getEmail()),
|
||||
csv(u.getDepartmentName()), csv(roles),
|
||||
Boolean.TRUE.equals(u.getIsActive()) ? "正常" : "禁用",
|
||||
Boolean.TRUE.equals(u.getAgentAutoExecute()) ? "是" : "否") + "\n");
|
||||
}
|
||||
response.getWriter().flush();
|
||||
}
|
||||
|
||||
private String csv(String s) {
|
||||
if (s == null) {
|
||||
return "";
|
||||
}
|
||||
return s.contains(",") ? "\"" + s + "\"" : s;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentApprovalRequest {
|
||||
@NotNull
|
||||
private Boolean approved;
|
||||
|
||||
private String comment;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentConfigRequest {
|
||||
private Integer maxSteps;
|
||||
private Boolean autoExecuteHighRisk;
|
||||
private Integer userRateLimit;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentConfigResponse {
|
||||
private Integer maxSteps;
|
||||
private Boolean autoExecuteHighRisk;
|
||||
private Integer userRateLimit;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentExecuteRequest {
|
||||
private Long issueId;
|
||||
|
||||
@NotBlank
|
||||
private String goal;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class AgentExecuteResponse {
|
||||
private Long planId;
|
||||
private String status;
|
||||
private Boolean requiresApproval;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentMemoryRequest {
|
||||
@NotBlank
|
||||
private String issueSummary;
|
||||
|
||||
@NotBlank
|
||||
private String solutionSteps;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class AgentMemoryResponse {
|
||||
private Long id;
|
||||
private String issueSummary;
|
||||
private String solutionSteps;
|
||||
private java.math.BigDecimal effectivenessScore;
|
||||
private LocalDateTime createdAt;
|
||||
private LocalDateTime updatedAt;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class AgentPlanResponse {
|
||||
private Long id;
|
||||
private Long issueId;
|
||||
private String issueNo;
|
||||
private String issueTitle;
|
||||
private String goal;
|
||||
private String planSteps;
|
||||
private String status;
|
||||
private Boolean requiresApproval;
|
||||
private String approvalStatus;
|
||||
private String approvalComment;
|
||||
private String modelProvider;
|
||||
private LocalDateTime createdAt;
|
||||
private LocalDateTime completedAt;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentSuggestFieldsRequest {
|
||||
@NotBlank(message = "标题不能为空")
|
||||
private String title;
|
||||
|
||||
private String description;
|
||||
|
||||
private Long issueId;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.agent;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AgentSuggestRequest {
|
||||
@NotNull
|
||||
private Long issueId;
|
||||
|
||||
@NotBlank
|
||||
private String goal;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.ims.api.dto.ai;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class AiAnalysisRequest {
|
||||
private List<Long> issueIds;
|
||||
private String departmentId;
|
||||
private String status;
|
||||
private String phase;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.ims.api.dto.ai;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class AiAnalysisResponse {
|
||||
private Long id;
|
||||
private Long issueId;
|
||||
private String issueNo;
|
||||
private String issueTitle;
|
||||
private String departmentName;
|
||||
private String category;
|
||||
private String keywords;
|
||||
private String extractedKeywords;
|
||||
private String rootCause;
|
||||
private String suggestion;
|
||||
private String status;
|
||||
private Integer helpfulCount;
|
||||
private String promptTemplateId;
|
||||
private Integer promptVersion;
|
||||
private String modelProvider;
|
||||
private String modelName;
|
||||
private String errorMessage;
|
||||
private LocalDateTime startedAt;
|
||||
private LocalDateTime completedAt;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.ims.api.dto.ai;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AiConfigRequest {
|
||||
private String provider;
|
||||
private String ollamaBaseUrl;
|
||||
private String ollamaChatModel;
|
||||
private String ollamaEmbeddingModel;
|
||||
private Float ollamaTemperature;
|
||||
private Integer ollamaNumPredict;
|
||||
private String deepseekApiKey;
|
||||
private String deepseekModel;
|
||||
private String deepseekEmbeddingModel;
|
||||
private Boolean autoFallbackEnabled;
|
||||
private Integer agentMaxSteps;
|
||||
private Boolean autoExecuteHighRisk;
|
||||
private Integer userRateLimit;
|
||||
private Integer chunkSize;
|
||||
private Integer chunkOverlap;
|
||||
private Long maxUploadSize;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.ims.api.dto.ai;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AiConfigResponse {
|
||||
private String provider;
|
||||
private String ollamaBaseUrl;
|
||||
private String ollamaChatModel;
|
||||
private String ollamaEmbeddingModel;
|
||||
private Float ollamaTemperature;
|
||||
private Integer ollamaNumPredict;
|
||||
private String deepseekModel;
|
||||
private String deepseekEmbeddingModel;
|
||||
private Boolean autoFallbackEnabled;
|
||||
private Integer agentMaxSteps;
|
||||
private Boolean autoExecuteHighRisk;
|
||||
private Integer userRateLimit;
|
||||
private Integer chunkSize;
|
||||
private Integer chunkOverlap;
|
||||
private Long maxUploadSize;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.ims.api.dto.ai;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class AiFeedbackRequest {
|
||||
@NotNull
|
||||
private Boolean isHelpful;
|
||||
|
||||
private String comment;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.auth;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class LoginRequest {
|
||||
@NotBlank(message = "账号不能为空")
|
||||
private String username;
|
||||
|
||||
@NotBlank(message = "密码不能为空")
|
||||
private String password;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.auth;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class LoginResponse {
|
||||
private String accessToken;
|
||||
private String refreshToken;
|
||||
private Long userId;
|
||||
private String username;
|
||||
private String roleName;
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
package com.ims.api.dto.dashboard;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class DashboardStatsResponse {
|
||||
private long pendingCount;
|
||||
private long inProgressCount;
|
||||
private long pendingConfirmCount;
|
||||
private long closedCount;
|
||||
private long todayNewCount;
|
||||
private long monthlyClosedCount;
|
||||
private List<CardInfo> cards;
|
||||
private List<DailyTrend> trend;
|
||||
private List<StatusCount> statusDistribution;
|
||||
private List<Activity> recentActivities;
|
||||
private List<Insight> insights;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class CardInfo {
|
||||
private String key;
|
||||
private long count;
|
||||
private String changeText;
|
||||
private String suggestion;
|
||||
}
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class DailyTrend {
|
||||
private String date;
|
||||
private long newCount;
|
||||
private long resolvedCount;
|
||||
}
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class StatusCount {
|
||||
private String status;
|
||||
private long count;
|
||||
}
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Activity {
|
||||
private String userName;
|
||||
private String action;
|
||||
private String issueNo;
|
||||
private String title;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class Insight {
|
||||
private String type;
|
||||
private String title;
|
||||
private String content;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class AgentValidateResponse {
|
||||
private boolean usable;
|
||||
private String usableReason;
|
||||
private List<ImportSuggestion> suggestions;
|
||||
private String engine;
|
||||
private long elapsedMs;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ImportConfirmRequest {
|
||||
private String fileName;
|
||||
private List<ImportRow> rows;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ImportPreviewResponse {
|
||||
private int total;
|
||||
private int validCount;
|
||||
private int errorCount;
|
||||
private boolean headerValid = true;
|
||||
private List<ImportRow> rows;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ImportRecordQueryRequest {
|
||||
private int page = 1;
|
||||
private int pageSize = 20;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class ImportRecordResponse {
|
||||
private Long id;
|
||||
private String fileName;
|
||||
private Integer totalCount;
|
||||
private Integer successCount;
|
||||
private Integer failCount;
|
||||
private String status;
|
||||
private String errorLog;
|
||||
private String operator;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class ImportRow {
|
||||
private Integer rowNo;
|
||||
private String title;
|
||||
private String docType;
|
||||
private String phase;
|
||||
private String priority;
|
||||
private String deadline;
|
||||
private String reviewDate;
|
||||
private String subProject;
|
||||
private String category;
|
||||
private String impactLevel;
|
||||
private String description;
|
||||
private String assigneeUserid;
|
||||
private String reviewerUserid;
|
||||
private String validatorUserid;
|
||||
private String departmentName;
|
||||
private String status;
|
||||
private List<String> errors;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.imports;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ImportSuggestion {
|
||||
private Integer rowNo;
|
||||
private String field;
|
||||
private String fieldName;
|
||||
private String original;
|
||||
private String suggested;
|
||||
private String reason;
|
||||
private String level;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class AttachmentResponse {
|
||||
private Long id;
|
||||
private String fileName;
|
||||
private Long fileSize;
|
||||
private String mimeType;
|
||||
private String filePath;
|
||||
private String uploadedByName;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class BatchAgentRequest {
|
||||
private List<Long> issueIds;
|
||||
private String goal;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class BatchAssignRequest {
|
||||
private List<Long> issueIds;
|
||||
private Long assigneeId;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class BatchNotifyRequest {
|
||||
private List<Long> issueIds;
|
||||
private String content;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.Data;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class IssueCreateRequest {
|
||||
@NotBlank(message = "指摘标题不能为空")
|
||||
@Size(max = 200, message = "指摘标题长度不能超过 200")
|
||||
private String title;
|
||||
private String description;
|
||||
private String phase;
|
||||
private String subProject;
|
||||
private String category;
|
||||
private String impactLevel;
|
||||
private String impactScope;
|
||||
private String deployment;
|
||||
private String pgmNo;
|
||||
private BigDecimal reviewWorkload;
|
||||
private BigDecimal responseWorkload;
|
||||
private String responseContent;
|
||||
private String ngReason;
|
||||
private LocalDateTime responseCompletedAt;
|
||||
private LocalDateTime confirmAt;
|
||||
private Long assigneeId;
|
||||
private Long departmentId;
|
||||
private Long reviewerId;
|
||||
private Long validatorId;
|
||||
private String priority;
|
||||
private String status;
|
||||
private LocalDateTime deadline;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class IssueListRequest {
|
||||
private String status;
|
||||
private String phase;
|
||||
private String subProject;
|
||||
private String priority;
|
||||
private String impactLevel;
|
||||
private String keyword;
|
||||
private Long assigneeId;
|
||||
private Long departmentId;
|
||||
private LocalDateTime startDate;
|
||||
private LocalDateTime endDate;
|
||||
private int page = 1;
|
||||
private int pageSize = 20;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class IssueResponse {
|
||||
private Long id;
|
||||
private String issueNo;
|
||||
private String title;
|
||||
private String description;
|
||||
private String status;
|
||||
private String priority;
|
||||
private LocalDateTime deadline;
|
||||
private String phase;
|
||||
private String subProject;
|
||||
private String category;
|
||||
private String impactLevel;
|
||||
private String impactScope;
|
||||
private String deployment;
|
||||
private String pgmNo;
|
||||
private BigDecimal reviewWorkload;
|
||||
private BigDecimal responseWorkload;
|
||||
private String responseContent;
|
||||
private String ngReason;
|
||||
private LocalDateTime responseCompletedAt;
|
||||
private LocalDateTime confirmAt;
|
||||
private Long creatorId;
|
||||
private String creatorName;
|
||||
private Long assigneeId;
|
||||
private String assigneeName;
|
||||
private Long departmentId;
|
||||
private String departmentName;
|
||||
private Long reviewerId;
|
||||
private String reviewerName;
|
||||
private Long validatorId;
|
||||
private String validatorName;
|
||||
private String agentStatus;
|
||||
private Long agentLastPlanId;
|
||||
private LocalDateTime createdAt;
|
||||
private LocalDateTime updatedAt;
|
||||
private LocalDateTime closedAt;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class IssueStatusRequest {
|
||||
@NotBlank
|
||||
private String status;
|
||||
private String remark;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.ims.api.dto.issue;
|
||||
|
||||
import lombok.Data;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class IssueUpdateRequest {
|
||||
private String title;
|
||||
private String description;
|
||||
private String status;
|
||||
private String priority;
|
||||
private LocalDateTime deadline;
|
||||
private String phase;
|
||||
private String subProject;
|
||||
private String category;
|
||||
private String impactLevel;
|
||||
private String impactScope;
|
||||
private String deployment;
|
||||
private String pgmNo;
|
||||
private BigDecimal reviewWorkload;
|
||||
private BigDecimal responseWorkload;
|
||||
private String responseContent;
|
||||
private String ngReason;
|
||||
private LocalDateTime responseCompletedAt;
|
||||
private LocalDateTime confirmAt;
|
||||
private Long assigneeId;
|
||||
private Long departmentId;
|
||||
private Long reviewerId;
|
||||
private Long validatorId;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ims.api.dto.knowledge;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class KnowledgeDocResponse {
|
||||
private Long id;
|
||||
private String name;
|
||||
private Long fileSize;
|
||||
private String fileType;
|
||||
private Integer chunkCount;
|
||||
private String status;
|
||||
private String errorMessage;
|
||||
private String uploadedByName;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.knowledge;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class KnowledgeLogQueryRequest {
|
||||
private Long userId;
|
||||
private Long issueId;
|
||||
private LocalDateTime startTime;
|
||||
private LocalDateTime endTime;
|
||||
private int page = 1;
|
||||
private int pageSize = 20;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.knowledge;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class KnowledgeSearchRequest {
|
||||
@NotBlank
|
||||
private String query;
|
||||
|
||||
private Integer topK = 5;
|
||||
private Long issueId;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.dto.knowledge;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class KnowledgeSearchResponse {
|
||||
private Long chunkId;
|
||||
private String content;
|
||||
private String docName;
|
||||
private Double score;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.ims.api.dto.notification;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class NotificationResponse {
|
||||
private Long id;
|
||||
private String title;
|
||||
private String content;
|
||||
private String type;
|
||||
private String link;
|
||||
private Boolean isRead;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class PromptLogResponse {
|
||||
private Long id;
|
||||
private String requestId;
|
||||
private String templateId;
|
||||
private Integer templateVersion;
|
||||
private String renderedPrompt;
|
||||
private Integer executionTimeMs;
|
||||
private String llmModel;
|
||||
private String modelProvider;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class PromptRenderLogResponse {
|
||||
private Long id;
|
||||
private String requestId;
|
||||
private String templateId;
|
||||
private Integer templateVersion;
|
||||
private String renderedPrompt;
|
||||
private String variablesUsed;
|
||||
private Integer tokensInput;
|
||||
private Integer tokensOutput;
|
||||
private Integer executionTimeMs;
|
||||
private String llmModel;
|
||||
private String modelProvider;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PromptStatsResponse {
|
||||
private String templateId;
|
||||
private String name;
|
||||
private String category;
|
||||
private Long useCount;
|
||||
private Double avgExecutionTimeMs;
|
||||
private Integer latestVersion;
|
||||
private Long totalTemplates;
|
||||
private Long activeTemplates;
|
||||
private Long totalVersions;
|
||||
private Long totalRenders;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PromptTemplateRequest {
|
||||
@NotBlank
|
||||
private String templateId;
|
||||
|
||||
@NotBlank
|
||||
private String name;
|
||||
|
||||
@NotBlank
|
||||
private String category;
|
||||
|
||||
@NotBlank
|
||||
private String content;
|
||||
|
||||
private String variables;
|
||||
private String outputSchema;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class PromptTemplateResponse {
|
||||
private Long id;
|
||||
private String templateId;
|
||||
private String name;
|
||||
private String category;
|
||||
private Integer version;
|
||||
private String content;
|
||||
private String variables;
|
||||
private String outputSchema;
|
||||
private Boolean isActive;
|
||||
private Boolean isDefault;
|
||||
private LocalDateTime createdAt;
|
||||
private LocalDateTime updatedAt;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class PromptTestRequest {
|
||||
@NotBlank
|
||||
private String templateId;
|
||||
|
||||
private Map<String, Object> variables;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PromptTestResponse {
|
||||
private String templateId;
|
||||
private Integer templateVersion;
|
||||
private String renderedPrompt;
|
||||
private Integer executionTimeMs;
|
||||
private Integer tokenEstimate;
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.ims.api.dto.prompt;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class PromptVersionResponse {
|
||||
private Long id;
|
||||
private String templateId;
|
||||
private Integer version;
|
||||
private String content;
|
||||
private String changeLog;
|
||||
private String createdBy;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class DepartmentResponse {
|
||||
private Long id;
|
||||
private String name;
|
||||
private Long parentId;
|
||||
private Integer sortOrder;
|
||||
private List<DepartmentResponse> children;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class LogQueryRequest {
|
||||
private String operator;
|
||||
private LocalDateTime startTime;
|
||||
private LocalDateTime endTime;
|
||||
private String actionType;
|
||||
private String resourceType;
|
||||
private String keyword;
|
||||
private String level;
|
||||
private int page = 1;
|
||||
private int pageSize = 20;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class LogResponse {
|
||||
private Long id;
|
||||
private String operator;
|
||||
private String action;
|
||||
private String resource;
|
||||
private String detail;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PermissionResponse {
|
||||
private Long id;
|
||||
private String code;
|
||||
private String name;
|
||||
private String resource;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class RoleRequest {
|
||||
@NotBlank
|
||||
private String name;
|
||||
|
||||
private String description;
|
||||
|
||||
private String dataScope;
|
||||
|
||||
private Boolean agentAutoExecute;
|
||||
|
||||
private List<Long> permissionIds;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class RoleResponse {
|
||||
private Long id;
|
||||
private String name;
|
||||
private String description;
|
||||
private String dataScope;
|
||||
private Boolean agentAutoExecute;
|
||||
private List<Long> permissionIds;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class UserRequest {
|
||||
@NotBlank
|
||||
private String userid;
|
||||
|
||||
@NotBlank
|
||||
private String username;
|
||||
|
||||
private String email;
|
||||
|
||||
private String password;
|
||||
|
||||
private Long departmentId;
|
||||
|
||||
private List<Long> roleIds;
|
||||
|
||||
private Boolean isActive;
|
||||
|
||||
private Boolean agentAutoExecute;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.ims.api.dto.system;
|
||||
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class UserResponse {
|
||||
private Long id;
|
||||
private String userid;
|
||||
private String username;
|
||||
private String email;
|
||||
private Long departmentId;
|
||||
private String departmentName;
|
||||
private Boolean isActive;
|
||||
private Boolean agentAutoExecute;
|
||||
private List<Long> roleIds;
|
||||
private List<String> roles;
|
||||
private LocalDateTime lastLoginAt;
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.api.service.agent;
|
||||
|
||||
import com.ims.api.dto.agent.AgentConfigRequest;
|
||||
import com.ims.api.dto.agent.AgentConfigResponse;
|
||||
|
||||
public interface AgentConfigService {
|
||||
|
||||
AgentConfigResponse getConfig();
|
||||
|
||||
void updateConfig(AgentConfigRequest request);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.ims.api.service.ai;
|
||||
|
||||
public interface ChatService {
|
||||
|
||||
String chat(String systemPrompt, String userPrompt);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.ims.api.service.prompt;
|
||||
|
||||
import com.ims.api.dto.prompt.PromptLogResponse;
|
||||
import com.ims.api.dto.prompt.PromptStatsResponse;
|
||||
import com.ims.api.dto.prompt.PromptTemplateRequest;
|
||||
import com.ims.api.dto.prompt.PromptTemplateResponse;
|
||||
import com.ims.api.dto.prompt.PromptTestRequest;
|
||||
import com.ims.api.dto.prompt.PromptTestResponse;
|
||||
import com.ims.api.dto.prompt.PromptVersionResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface PromptService {
|
||||
|
||||
PageResult<PromptTemplateResponse> list(int page, int pageSize, String category, String keyword);
|
||||
|
||||
PromptTemplateResponse detail(String templateId);
|
||||
|
||||
PromptTemplateResponse create(PromptTemplateRequest request, String operatorUsername);
|
||||
|
||||
PromptTemplateResponse update(String templateId, PromptTemplateRequest request, String operatorUsername);
|
||||
|
||||
void rollback(String templateId, int version, String operatorUsername);
|
||||
|
||||
PromptTestResponse test(PromptTestRequest request, String operatorUsername);
|
||||
|
||||
List<PromptVersionResponse> versions(String templateId);
|
||||
|
||||
PageResult<PromptLogResponse> logs(int page, int pageSize);
|
||||
|
||||
PromptStatsResponse stats();
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.ims.api.service.system;
|
||||
|
||||
import com.ims.api.dto.system.DepartmentResponse;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface DepartmentService {
|
||||
|
||||
List<DepartmentResponse> tree();
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.ims.api.service.system;
|
||||
|
||||
import com.ims.api.dto.imports.AgentValidateResponse;
|
||||
import com.ims.api.dto.imports.ImportConfirmRequest;
|
||||
import com.ims.api.dto.imports.ImportPreviewResponse;
|
||||
import com.ims.api.dto.imports.ImportRecordResponse;
|
||||
import com.ims.api.dto.imports.ImportRow;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ImportService {
|
||||
|
||||
byte[] generateTemplate();
|
||||
|
||||
ImportPreviewResponse preview(MultipartFile file);
|
||||
|
||||
AgentValidateResponse aiValidate(List<ImportRow> rows);
|
||||
|
||||
ImportRecordResponse confirm(ImportConfirmRequest request, String operatorUsername);
|
||||
|
||||
PageResult<ImportRecordResponse> records(int page, int pageSize);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.ims.api.service.system;
|
||||
|
||||
import com.ims.api.dto.system.LogQueryRequest;
|
||||
import com.ims.api.dto.system.LogResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
|
||||
public interface LogService {
|
||||
|
||||
PageResult<LogResponse> list(LogQueryRequest request);
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.ims.api.service.system;
|
||||
|
||||
import com.ims.api.dto.system.PermissionResponse;
|
||||
import com.ims.api.dto.system.RoleRequest;
|
||||
import com.ims.api.dto.system.RoleResponse;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface RoleService {
|
||||
|
||||
List<RoleResponse> list();
|
||||
|
||||
List<PermissionResponse> permissions();
|
||||
|
||||
RoleResponse create(RoleRequest request);
|
||||
|
||||
RoleResponse update(Long id, RoleRequest request);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.ims.api.service.system;
|
||||
|
||||
import com.ims.api.dto.system.UserRequest;
|
||||
import com.ims.api.dto.system.UserResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
|
||||
public interface UserService {
|
||||
|
||||
PageResult<UserResponse> list(int page, int pageSize, String keyword, Long departmentId, Boolean isActive);
|
||||
|
||||
UserResponse create(UserRequest request);
|
||||
|
||||
UserResponse update(Long id, UserRequest request);
|
||||
|
||||
void updateStatus(Long id, Boolean isActive);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-backend</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>ims-common</artifactId>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.ims.common.constant;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum ResultCode {
|
||||
SUCCESS(200, "success"),
|
||||
BAD_REQUEST(400, "bad request"),
|
||||
UNAUTHORIZED(401, "unauthorized"),
|
||||
FORBIDDEN(403, "forbidden"),
|
||||
NOT_FOUND(404, "not found"),
|
||||
INTERNAL_ERROR(500, "internal server error"),
|
||||
BUSINESS_ERROR(1001, "business error");
|
||||
|
||||
private final int code;
|
||||
private final String message;
|
||||
|
||||
ResultCode(int code, String message) {
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.ims.common.dto;
|
||||
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class ApiResponse<T> {
|
||||
private int code;
|
||||
private String message;
|
||||
private T data;
|
||||
private String timestamp;
|
||||
|
||||
public ApiResponse() {
|
||||
this.timestamp = LocalDateTime.now().toString();
|
||||
}
|
||||
|
||||
public static <T> ApiResponse<T> success(T data) {
|
||||
ApiResponse<T> response = new ApiResponse<>();
|
||||
response.setCode(ResultCode.SUCCESS.getCode());
|
||||
response.setMessage(ResultCode.SUCCESS.getMessage());
|
||||
response.setData(data);
|
||||
return response;
|
||||
}
|
||||
|
||||
public static <T> ApiResponse<T> error(int code, String message) {
|
||||
ApiResponse<T> response = new ApiResponse<>();
|
||||
response.setCode(code);
|
||||
response.setMessage(message);
|
||||
return response;
|
||||
}
|
||||
|
||||
public static <T> ApiResponse<T> error(ResultCode resultCode) {
|
||||
return error(resultCode.getCode(), resultCode.getMessage());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.ims.common.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class PageResult<T> {
|
||||
private List<T> items;
|
||||
private long total;
|
||||
private int page;
|
||||
private int pageSize;
|
||||
private int totalPages;
|
||||
|
||||
public PageResult() {
|
||||
this.items = Collections.emptyList();
|
||||
}
|
||||
|
||||
public PageResult(List<T> items, long total, int page, int pageSize) {
|
||||
this.items = items;
|
||||
this.total = total;
|
||||
this.page = page;
|
||||
this.pageSize = pageSize;
|
||||
this.totalPages = pageSize > 0 ? (int) Math.ceil((double) total / pageSize) : 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.ims.common.exception;
|
||||
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class BusinessException extends RuntimeException {
|
||||
private final int code;
|
||||
|
||||
public BusinessException(String message) {
|
||||
super(message);
|
||||
this.code = ResultCode.BUSINESS_ERROR.getCode();
|
||||
}
|
||||
|
||||
public BusinessException(int code, String message) {
|
||||
super(message);
|
||||
this.code = code;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
package com.ims.common.util;
|
||||
|
||||
import io.jsonwebtoken.*;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Date;
|
||||
|
||||
public class JwtUtil {
|
||||
|
||||
private final SecretKey key;
|
||||
private final long accessTokenExpiration;
|
||||
private final long refreshTokenExpiration;
|
||||
|
||||
public JwtUtil(String secret, long accessTokenExpiration, long refreshTokenExpiration) {
|
||||
this.key = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
|
||||
this.accessTokenExpiration = accessTokenExpiration;
|
||||
this.refreshTokenExpiration = refreshTokenExpiration;
|
||||
}
|
||||
|
||||
public String generateAccessToken(Long userId, String username) {
|
||||
return Jwts.builder()
|
||||
.subject(username)
|
||||
.claim("userId", userId)
|
||||
.issuedAt(new Date())
|
||||
.expiration(new Date(System.currentTimeMillis() + accessTokenExpiration))
|
||||
.signWith(key, Jwts.SIG.HS256)
|
||||
.compact();
|
||||
}
|
||||
|
||||
public String generateRefreshToken(Long userId, String username) {
|
||||
return Jwts.builder()
|
||||
.subject(username)
|
||||
.claim("userId", userId)
|
||||
.issuedAt(new Date())
|
||||
.expiration(new Date(System.currentTimeMillis() + refreshTokenExpiration))
|
||||
.signWith(key, Jwts.SIG.HS256)
|
||||
.compact();
|
||||
}
|
||||
|
||||
public Claims parseToken(String token) {
|
||||
return Jwts.parser()
|
||||
.verifyWith(key)
|
||||
.build()
|
||||
.parseSignedClaims(token)
|
||||
.getPayload();
|
||||
}
|
||||
|
||||
public boolean validateToken(String token) {
|
||||
try {
|
||||
parseToken(token);
|
||||
return true;
|
||||
} catch (JwtException | IllegalArgumentException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-backend</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>ims-service</artifactId>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-common</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.flywaydb</groupId>
|
||||
<artifactId>flyway-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.flywaydb</groupId>
|
||||
<artifactId>flyway-database-postgresql</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.minio</groupId>
|
||||
<artifactId>minio</artifactId>
|
||||
<version>8.5.17</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.ai</groupId>
|
||||
<artifactId>spring-ai-ollama</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.ai</groupId>
|
||||
<artifactId>spring-ai-openai</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tika</groupId>
|
||||
<artifactId>tika-core</artifactId>
|
||||
<version>2.9.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tika</groupId>
|
||||
<artifactId>tika-parser-microsoft-module</artifactId>
|
||||
<version>2.9.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
<version>5.2.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.16.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.ims.api.dto.ai.AiConfigRequest;
|
||||
import com.ims.api.dto.agent.AgentConfigRequest;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class AgentConfigService {
|
||||
|
||||
private final AiConfigService aiConfigService;
|
||||
|
||||
public AgentConfigService(AiConfigService aiConfigService) {
|
||||
this.aiConfigService = aiConfigService;
|
||||
}
|
||||
|
||||
public Map<String, Object> getConfig() {
|
||||
com.ims.api.dto.ai.AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
result.put("maxSteps", aiConfigService.getEffectiveMaxSteps());
|
||||
result.put("autoExecuteHighRisk", aiConfigService.getEffectiveAutoExecuteHighRisk());
|
||||
result.put("userRateLimit", aiConfigService.getEffectiveUserRateLimit());
|
||||
result.put("provider", cfg.getProvider());
|
||||
return result;
|
||||
}
|
||||
|
||||
public void updateConfig(AgentConfigRequest request) {
|
||||
AiConfigRequest merged = new AiConfigRequest();
|
||||
merged.setAgentMaxSteps(request.getMaxSteps());
|
||||
merged.setAutoExecuteHighRisk(request.getAutoExecuteHighRisk());
|
||||
merged.setUserRateLimit(request.getUserRateLimit());
|
||||
aiConfigService.updateConfig(merged);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.api.dto.agent.AgentConfigRequest;
|
||||
import com.ims.api.dto.agent.AgentConfigResponse;
|
||||
import com.ims.api.service.agent.AgentConfigService;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Service
|
||||
public class AgentConfigServiceImpl implements AgentConfigService {
|
||||
|
||||
private static final String REDIS_KEY = "agent:config";
|
||||
|
||||
private final StringRedisTemplate redisTemplate;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
@Value("${agent.max-steps:10}")
|
||||
private int defaultMaxSteps;
|
||||
|
||||
@Value("${agent.auto-execute-high-risk:false}")
|
||||
private boolean defaultAutoExecuteHighRisk;
|
||||
|
||||
public AgentConfigServiceImpl(StringRedisTemplate redisTemplate, ObjectMapper objectMapper) {
|
||||
this.redisTemplate = redisTemplate;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgentConfigResponse getConfig() {
|
||||
String json = redisTemplate.opsForValue().get(REDIS_KEY);
|
||||
if (json != null) {
|
||||
try {
|
||||
AgentConfigRequest request = objectMapper.readValue(json, AgentConfigRequest.class);
|
||||
return toResponse(request);
|
||||
} catch (JsonProcessingException ignored) {}
|
||||
}
|
||||
AgentConfigResponse response = new AgentConfigResponse();
|
||||
response.setMaxSteps(defaultMaxSteps);
|
||||
response.setAutoExecuteHighRisk(defaultAutoExecuteHighRisk);
|
||||
response.setUserRateLimit(10);
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateConfig(AgentConfigRequest request) {
|
||||
try {
|
||||
redisTemplate.opsForValue().set(REDIS_KEY, objectMapper.writeValueAsString(request), 24, TimeUnit.HOURS);
|
||||
} catch (JsonProcessingException ignored) {}
|
||||
}
|
||||
|
||||
private AgentConfigResponse toResponse(AgentConfigRequest request) {
|
||||
AgentConfigResponse response = new AgentConfigResponse();
|
||||
response.setMaxSteps(request.getMaxSteps());
|
||||
response.setAutoExecuteHighRisk(request.getAutoExecuteHighRisk());
|
||||
response.setUserRateLimit(request.getUserRateLimit());
|
||||
return response;
|
||||
}
|
||||
}
|
||||
+795
@@ -0,0 +1,795 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.ims.api.dto.ai.AiConfigResponse;
|
||||
import com.ims.api.dto.agent.AgentExecuteResponse;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.agent.tool.Tool;
|
||||
import com.ims.service.agent.tool.ToolRegistry;
|
||||
import com.ims.service.ai.ModelRoutingService;
|
||||
import com.ims.service.ai.PromptFormatter;
|
||||
import com.ims.service.ai.PromptTemplateEngine;
|
||||
import com.ims.service.ai.SystemContextBuilder;
|
||||
import com.ims.service.entity.AgentMemory;
|
||||
import com.ims.service.entity.AgentPlan;
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.PromptTemplate;
|
||||
import com.ims.service.entity.ToolExecution;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import com.ims.service.knowledge.SearchService;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import com.ims.service.repository.AgentPlanRepository;
|
||||
import com.ims.service.repository.AgentMemoryRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.ToolExecutionRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@Service
|
||||
public class AgentOrchestratorService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AgentOrchestratorService.class);
|
||||
private static final String SYS_ROLE_TEMPLATE = "SYS_ROLE_001";
|
||||
private static final String PLAN_TEMPLATE = "PLAN_001";
|
||||
|
||||
private static final String FIELD_SUGGEST_SYSTEM = "你是一个软件质量指摘分析助手。根据用户提供的指摘标题和描述,"
|
||||
+ "从下面的字段枚举值中为每个字段选择最合适的一项,同时结合上下文补全文本与人员字段,仅输出一个JSON对象,不要输出任何其他文字。\n"
|
||||
+ "category: [功能缺陷, UI/UX问题, 性能问题, 安全漏洞, 文档错误]\n"
|
||||
+ "phase: [需求, 设计, 编码, 测试, 部署, 运维]\n"
|
||||
+ "impactLevel: [高, 中, 低]\n"
|
||||
+ "priority: [urgent, high, medium, low]\n"
|
||||
+ "subProject: [用户管理子系统, 权限控制子系统, 数据报表子系统]\n"
|
||||
+ "ngReason: 指摘的NG原因,用简短中文概括\n"
|
||||
+ "impactScope: 影响范围(如:前端适配、数据库查询)\n"
|
||||
+ "deployment: 部署位置或环境\n"
|
||||
+ "pgmNo: 关联PGM编号(如 PGM_AUTH_VIEW_001),无法判断时留空\n"
|
||||
+ "responseContent: 建议的对应内容/整改方案,2-3句话\n"
|
||||
+ "assigneeName, reviewerName, validatorName: 从可选项中选择对应人员姓名,无法确定时留空\n"
|
||||
+ "departmentName: 从可选项中选择归属部门名称,无法确定时留空\n"
|
||||
+ "deadline: 建议的整改截止日期,格式 YYYY-MM-DD,不早于今天\n"
|
||||
+ "输出格式: {\"category\":\"...\",\"phase\":\"...\",\"impactLevel\":\"...\",\"priority\":\"...\",\"subProject\":\"...\","
|
||||
+ "\"ngReason\":\"...\",\"impactScope\":\"...\",\"deployment\":\"...\",\"pgmNo\":\"...\",\"responseContent\":\"...\","
|
||||
+ "\"assigneeName\":\"...\",\"reviewerName\":\"...\",\"validatorName\":\"...\",\"departmentName\":\"...\",\"deadline\":\"YYYY-MM-DD\"}";
|
||||
|
||||
private static final String FIELD_SUGGEST_WITH_CASES_SYSTEM = "你是一个软件质量指摘分析助手。用户提供了指摘标题和描述,"
|
||||
+ "同时附上了知识库检索到的相似案例。请先分析相似案例的处理经验,再结合当前指摘标题和描述,"
|
||||
+ "从下面的字段枚举值中为每个字段选择最合适的一项,同时结合上下文补全文本与人员字段,仅输出一个JSON对象,不要输出任何其他文字。\n"
|
||||
+ "category: [功能缺陷, UI/UX问题, 性能问题, 安全漏洞, 文档错误]\n"
|
||||
+ "phase: [需求, 设计, 编码, 测试, 部署, 运维]\n"
|
||||
+ "impactLevel: [高, 中, 低]\n"
|
||||
+ "priority: [urgent, high, medium, low]\n"
|
||||
+ "subProject: [用户管理子系统, 权限控制子系统, 数据报表子系统]\n"
|
||||
+ "ngReason: 指摘的NG原因,用简短中文概括\n"
|
||||
+ "impactScope: 影响范围(如:前端适配、数据库查询)\n"
|
||||
+ "deployment: 部署位置或环境\n"
|
||||
+ "pgmNo: 关联PGM编号(如 PGM_AUTH_VIEW_001),无法判断时留空\n"
|
||||
+ "responseContent: 建议的对应内容/整改方案,2-3句话\n"
|
||||
+ "assigneeName, reviewerName, validatorName: 从可选项中选择对应人员姓名,无法确定时留空\n"
|
||||
+ "departmentName: 从可选项中选择归属部门名称,无法确定时留空\n"
|
||||
+ "deadline: 建议的整改截止日期,格式 YYYY-MM-DD,不早于今天\n"
|
||||
+ "输出格式: {\"category\":\"...\",\"phase\":\"...\",\"impactLevel\":\"...\",\"priority\":\"...\",\"subProject\":\"...\","
|
||||
+ "\"ngReason\":\"...\",\"impactScope\":\"...\",\"deployment\":\"...\",\"pgmNo\":\"...\",\"responseContent\":\"...\","
|
||||
+ "\"assigneeName\":\"...\",\"reviewerName\":\"...\",\"validatorName\":\"...\",\"departmentName\":\"...\",\"deadline\":\"YYYY-MM-DD\"}";
|
||||
|
||||
private static final Set<String> CATEGORIES = Set.of("功能缺陷", "UI/UX问题", "性能问题", "安全漏洞", "文档错误");
|
||||
private static final Set<String> PHASES = Set.of("需求", "设计", "编码", "测试", "部署", "运维");
|
||||
private static final Set<String> IMPACT_LEVELS = Set.of("高", "中", "低");
|
||||
private static final Set<String> PRIORITIES = Set.of("urgent", "high", "medium", "low");
|
||||
private static final Set<String> SUB_PROJECTS = Set.of("用户管理子系统", "权限控制子系统", "数据报表子系统");
|
||||
|
||||
private final AgentPlanRepository planRepository;
|
||||
private final ToolExecutionRepository toolExecutionRepository;
|
||||
private final IssueRepository issueRepository;
|
||||
private final UserRepository userRepository;
|
||||
private final ToolRegistry toolRegistry;
|
||||
private final PromptTemplateEngine promptEngine;
|
||||
private final ModelRoutingService modelRoutingService;
|
||||
private final SystemContextBuilder systemContextBuilder;
|
||||
private final AiConfigService aiConfigService;
|
||||
private final MemoryService memoryService;
|
||||
private final PromptFormatter promptFormatter;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final StringRedisTemplate redisTemplate;
|
||||
private final TransactionTemplate transactionTemplate;
|
||||
private final SearchService searchService;
|
||||
private final DepartmentRepository departmentRepository;
|
||||
|
||||
private final ExecutorService executor = Executors.newFixedThreadPool(2, r -> {
|
||||
Thread t = new Thread(r, "async-exec-");
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
});
|
||||
|
||||
private final ConcurrentHashMap<Long, SseEmitter> emitters = new ConcurrentHashMap<>();
|
||||
|
||||
public AgentOrchestratorService(AgentPlanRepository planRepository,
|
||||
ToolExecutionRepository toolExecutionRepository,
|
||||
IssueRepository issueRepository,
|
||||
UserRepository userRepository,
|
||||
ToolRegistry toolRegistry,
|
||||
PromptTemplateEngine promptEngine,
|
||||
ModelRoutingService modelRoutingService,
|
||||
SystemContextBuilder systemContextBuilder,
|
||||
AiConfigService aiConfigService,
|
||||
MemoryService memoryService,
|
||||
PromptFormatter promptFormatter,
|
||||
ObjectMapper objectMapper,
|
||||
StringRedisTemplate redisTemplate,
|
||||
TransactionTemplate transactionTemplate,
|
||||
SearchService searchService,
|
||||
DepartmentRepository departmentRepository) {
|
||||
this.planRepository = planRepository;
|
||||
this.toolExecutionRepository = toolExecutionRepository;
|
||||
this.issueRepository = issueRepository;
|
||||
this.userRepository = userRepository;
|
||||
this.toolRegistry = toolRegistry;
|
||||
this.promptEngine = promptEngine;
|
||||
this.modelRoutingService = modelRoutingService;
|
||||
this.systemContextBuilder = systemContextBuilder;
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.memoryService = memoryService;
|
||||
this.promptFormatter = promptFormatter;
|
||||
this.objectMapper = objectMapper;
|
||||
this.redisTemplate = redisTemplate;
|
||||
this.transactionTemplate = transactionTemplate;
|
||||
this.searchService = searchService;
|
||||
this.departmentRepository = departmentRepository;
|
||||
}
|
||||
|
||||
public AgentExecuteResponse execute(Long issueId, String goal, Long userId) {
|
||||
checkRateLimit(userId);
|
||||
Issue issue = null;
|
||||
if (issueId != null) {
|
||||
issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在: " + issueId));
|
||||
}
|
||||
User user = userRepository.findById(userId).orElse(null);
|
||||
|
||||
AgentPlan plan = new AgentPlan();
|
||||
plan.setIssue(issue);
|
||||
plan.setGoal(goal);
|
||||
plan.setPlanSteps("[]");
|
||||
plan.setStatus("pending");
|
||||
plan.setRequiresApproval(false);
|
||||
plan.setModelProvider(modelRoutingService.currentProvider());
|
||||
plan.setCreatedBy(user);
|
||||
planRepository.save(plan);
|
||||
|
||||
executor.execute(() -> {
|
||||
try {
|
||||
transactionTemplate.executeWithoutResult(s -> runPlan(plan.getId(), userId));
|
||||
} catch (Exception e) {
|
||||
log.error("Agent执行失败 planId={}", plan.getId(), e);
|
||||
}
|
||||
});
|
||||
return new AgentExecuteResponse(plan.getId(), "running", false);
|
||||
}
|
||||
|
||||
public Map<String, Object> getStatus(Long planId) {
|
||||
AgentPlan plan = planRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("Agent计划不存在: " + planId));
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
result.put("planId", plan.getId());
|
||||
result.put("issueId", plan.getIssue() != null ? plan.getIssue().getId() : null);
|
||||
result.put("goal", plan.getGoal());
|
||||
result.put("planSteps", plan.getPlanSteps());
|
||||
result.put("status", plan.getStatus());
|
||||
result.put("requiresApproval", plan.getRequiresApproval());
|
||||
result.put("approvalStatus", plan.getApprovalStatus());
|
||||
result.put("approvalComment", plan.getApprovalComment());
|
||||
result.put("modelProvider", plan.getModelProvider());
|
||||
result.put("agentMessage", plan.getAgentMessage());
|
||||
result.put("createdAt", plan.getCreatedAt() == null ? null : plan.getCreatedAt().toString());
|
||||
result.put("completedAt", plan.getCompletedAt() == null ? null : plan.getCompletedAt().toString());
|
||||
|
||||
result.put("systemTemplateId", SYS_ROLE_TEMPLATE);
|
||||
result.put("systemTemplateVersion", templateVersion(SYS_ROLE_TEMPLATE));
|
||||
result.put("planTemplateId", PLAN_TEMPLATE);
|
||||
result.put("planTemplateVersion", templateVersion(PLAN_TEMPLATE));
|
||||
|
||||
List<ToolExecution> executions = toolExecutionRepository.findByPlanId(planId);
|
||||
result.put("toolExecutions", executions.stream().map(this::toolExecutionToMap).toList());
|
||||
return result;
|
||||
}
|
||||
|
||||
public SseEmitter stream(Long planId) {
|
||||
AgentPlan plan = planRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("Agent计划不存在: " + planId));
|
||||
SseEmitter emitter = new SseEmitter(600_000L);
|
||||
emitters.put(planId, emitter);
|
||||
emitter.onCompletion(() -> emitters.remove(planId));
|
||||
emitter.onTimeout(() -> emitters.remove(planId));
|
||||
emitter.onError(e -> emitters.remove(planId));
|
||||
|
||||
sendEvent(planId, Map.of("type", "thought", "content", "已连接执行流,等待 Agent 输出…"));
|
||||
sendPromptAndModelInfo(planId);
|
||||
|
||||
String status = plan.getStatus();
|
||||
if (!"pending".equals(status) && !"running".equals(status)) {
|
||||
String message = plan.getAgentMessage() == null ? "" : plan.getAgentMessage();
|
||||
if (!"awaiting_approval".equals(status)) {
|
||||
sendEvent(planId, Map.of("type", "result", "content", message));
|
||||
}
|
||||
emitter.complete();
|
||||
emitters.remove(planId);
|
||||
}
|
||||
return emitter;
|
||||
}
|
||||
|
||||
private void sendEvent(Long planId, Map<String, Object> event) {
|
||||
SseEmitter emitter = emitters.get(planId);
|
||||
if (emitter == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
emitter.send(SseEmitter.event().name("message").data(event));
|
||||
} catch (IOException | IllegalStateException e) {
|
||||
emitters.remove(planId);
|
||||
emitter.completeWithError(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void completeStream(Long planId) {
|
||||
SseEmitter emitter = emitters.remove(planId);
|
||||
if (emitter != null) {
|
||||
try {
|
||||
emitter.complete();
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
}
|
||||
|
||||
private void sendPromptAndModelInfo(Long planId) {
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
String provider = modelRoutingService.currentProvider();
|
||||
String model = "deepseek".equalsIgnoreCase(provider) ? cfg.getDeepseekModel() : cfg.getOllamaChatModel();
|
||||
|
||||
Map<String, Object> systemPromptInfo = new LinkedHashMap<>();
|
||||
systemPromptInfo.put("type", "prompt_info");
|
||||
systemPromptInfo.put("templateId", SYS_ROLE_TEMPLATE);
|
||||
systemPromptInfo.put("version", templateVersion(SYS_ROLE_TEMPLATE));
|
||||
systemPromptInfo.put("variables", List.of("userGoal", "issueContext", "availableTools"));
|
||||
sendEvent(planId, systemPromptInfo);
|
||||
|
||||
Map<String, Object> planPromptInfo = new LinkedHashMap<>();
|
||||
planPromptInfo.put("type", "prompt_info");
|
||||
planPromptInfo.put("templateId", PLAN_TEMPLATE);
|
||||
planPromptInfo.put("version", templateVersion(PLAN_TEMPLATE));
|
||||
planPromptInfo.put("variables", List.of("userGoal", "issueContext", "similarCases", "availableTools"));
|
||||
sendEvent(planId, planPromptInfo);
|
||||
|
||||
Map<String, Object> modelInfo = new LinkedHashMap<>();
|
||||
modelInfo.put("type", "model_info");
|
||||
modelInfo.put("provider", provider);
|
||||
modelInfo.put("model", model);
|
||||
modelInfo.put("endpoint", cfg.getOllamaBaseUrl());
|
||||
sendEvent(planId, modelInfo);
|
||||
}
|
||||
|
||||
public Map<String, Object> approve(Long planId, String comment, Long userId) {
|
||||
AgentPlan plan = planRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("Agent计划不存在: " + planId));
|
||||
if (!"requested".equals(plan.getApprovalStatus())) {
|
||||
throw new BusinessException("该计划不在待审批状态");
|
||||
}
|
||||
plan.setApprovalStatus("approved");
|
||||
plan.setApprovalComment(comment);
|
||||
|
||||
ToolExecution pending = toolExecutionRepository.findByPlanId(planId).stream()
|
||||
.filter(t -> "pending".equals(t.getStatus()))
|
||||
.findFirst().orElse(null);
|
||||
if (pending != null) {
|
||||
try {
|
||||
Map<String, Object> params = objectMapper.readValue(pending.getInputParams(),
|
||||
new TypeReference<Map<String, Object>>() {});
|
||||
if ("update_issue".equals(pending.getToolName()) && plan.getIssue() != null) {
|
||||
params.put("issue_id", plan.getIssue().getId());
|
||||
}
|
||||
Object output = runTool(plan, pending.getToolName(), params, pending);
|
||||
if ("create_issue".equals(pending.getToolName())) {
|
||||
linkCreatedIssue(plan, output);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("审批后工具执行失败 planId={}", planId, e);
|
||||
pending.setStatus("failed");
|
||||
pending.setOutputResult(e.getMessage());
|
||||
toolExecutionRepository.save(pending);
|
||||
finishPlan(plan, "failed");
|
||||
completeStream(planId);
|
||||
return getStatus(planId);
|
||||
}
|
||||
}
|
||||
finishPlan(plan, "completed");
|
||||
completeStream(planId);
|
||||
return getStatus(planId);
|
||||
}
|
||||
|
||||
public Map<String, Object> reject(Long planId, String comment) {
|
||||
AgentPlan plan = planRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("Agent计划不存在: " + planId));
|
||||
if (!"requested".equals(plan.getApprovalStatus())) {
|
||||
throw new BusinessException("该计划不在待审批状态");
|
||||
}
|
||||
plan.setApprovalStatus("rejected");
|
||||
plan.setApprovalComment(comment);
|
||||
plan.setStatus("rejected");
|
||||
plan.setCompletedAt(LocalDateTime.now());
|
||||
planRepository.save(plan);
|
||||
|
||||
List<ToolExecution> pending = toolExecutionRepository.findByPlanId(planId).stream()
|
||||
.filter(t -> "pending".equals(t.getStatus())).toList();
|
||||
for (ToolExecution t : pending) {
|
||||
t.setStatus("rejected");
|
||||
toolExecutionRepository.save(t);
|
||||
}
|
||||
|
||||
if (plan.getIssue() != null) {
|
||||
issueRepository.findById(plan.getIssue().getId()).ifPresent(issue -> {
|
||||
issue.setAgentStatus("rejected");
|
||||
issue.setAgentLastPlanId(planId);
|
||||
issueRepository.save(issue);
|
||||
});
|
||||
}
|
||||
return getStatus(planId);
|
||||
}
|
||||
|
||||
public String suggest(Long issueId, String goal, Long userId) {
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在: " + issueId));
|
||||
User user = userRepository.findById(userId).orElse(null);
|
||||
Map<String, Object> systemVars = systemContextBuilder.build(user, toolDescriptions());
|
||||
String systemPrompt = promptEngine.render(SYS_ROLE_TEMPLATE, systemVars);
|
||||
String userPrompt = "请基于以下指摘上下文,输出字段修改建议(如标题/描述/工程阶段/优先级/影响度等字段的修改建议),仅输出建议内容,不要调用任何工具。\n\n"
|
||||
+ buildIssueContext(issue) + "\n\n用户诉求: " + goal;
|
||||
ModelRoutingService.CallResult result = modelRoutingService.call(systemPrompt, userPrompt);
|
||||
return result.text();
|
||||
}
|
||||
|
||||
public Map<String, Object> suggestFields(String title, String description) {
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
List<User> users = userRepository.findAll();
|
||||
List<Department> departments = departmentRepository.findAll();
|
||||
String userOptions = users.stream()
|
||||
.map(u -> u.getUsername())
|
||||
.reduce((a, b) -> a + ", " + b).orElse("");
|
||||
String deptOptions = departments.stream()
|
||||
.map(Department::getName)
|
||||
.reduce((a, b) -> a + ", " + b).orElse("");
|
||||
StringBuilder userPrompt = new StringBuilder("指摘标题: ").append(title);
|
||||
if (description != null && !description.isBlank()) {
|
||||
userPrompt.append("\n指摘描述: ").append(description);
|
||||
}
|
||||
userPrompt.append("\n可选人员: ").append(userOptions)
|
||||
.append("\n可选部门: ").append(deptOptions);
|
||||
List<SearchService.SearchResult> similarCases = retrieveSimilarCases(title + (description != null ? " " + description : ""));
|
||||
String system = FIELD_SUGGEST_SYSTEM;
|
||||
if (!similarCases.isEmpty()) {
|
||||
system = FIELD_SUGGEST_WITH_CASES_SYSTEM;
|
||||
userPrompt.append("\n\n知识库相似案例(仅作参考):\n").append(similarCases.stream()
|
||||
.map(c -> String.format("《%s》(相似度 %.2f): %s", c.getDocName(), c.getScore(), c.getContent()))
|
||||
.reduce((a, b) -> a + "\n" + b)
|
||||
.orElse(""));
|
||||
}
|
||||
try {
|
||||
ModelRoutingService.CallResult callResult = modelRoutingService.call(system, userPrompt.toString());
|
||||
ObjectNode json = promptFormatter.extractJsonObject(callResult.text());
|
||||
if (json == null) {
|
||||
return result;
|
||||
}
|
||||
putIfValid(result, json, "category", CATEGORIES);
|
||||
putIfValid(result, json, "phase", PHASES);
|
||||
putIfValid(result, json, "impactLevel", IMPACT_LEVELS);
|
||||
putIfValid(result, json, "priority", PRIORITIES);
|
||||
putIfValid(result, json, "subProject", SUB_PROJECTS);
|
||||
putIfText(result, json, "ngReason", 200);
|
||||
putIfText(result, json, "impactScope", 200);
|
||||
putIfText(result, json, "deployment", 200);
|
||||
putIfText(result, json, "pgmNo", 100);
|
||||
putIfText(result, json, "responseContent", 1000);
|
||||
putIfUser(result, json, "assigneeName", "assigneeId", users);
|
||||
putIfUser(result, json, "reviewerName", "reviewerId", users);
|
||||
putIfUser(result, json, "validatorName", "validatorId", users);
|
||||
putIfDepartment(result, json, "departmentName", "departmentId", departments);
|
||||
putIfDate(result, json, "deadline");
|
||||
} catch (Exception e) {
|
||||
log.warn("字段智能填充失败 title={}", title, e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void putIfText(Map<String, Object> out, ObjectNode node, String key, int maxLen) {
|
||||
JsonNode value = node.get(key);
|
||||
if (value != null && value.isTextual() && !value.asText().isBlank()) {
|
||||
String text = value.asText().trim();
|
||||
out.put(key, text.length() > maxLen ? text.substring(0, maxLen) : text);
|
||||
}
|
||||
}
|
||||
|
||||
private void putIfUser(Map<String, Object> out, ObjectNode node, String nameKey, String idKey, List<User> users) {
|
||||
JsonNode value = node.get(nameKey);
|
||||
if (value == null || !value.isTextual()) {
|
||||
return;
|
||||
}
|
||||
String name = value.asText().trim();
|
||||
users.stream()
|
||||
.filter(u -> u.getUsername().equals(name))
|
||||
.findFirst()
|
||||
.ifPresent(u -> out.put(idKey, u.getId()));
|
||||
}
|
||||
|
||||
private void putIfDepartment(Map<String, Object> out, ObjectNode node, String nameKey, String idKey, List<Department> departments) {
|
||||
JsonNode value = node.get(nameKey);
|
||||
if (value == null || !value.isTextual()) {
|
||||
return;
|
||||
}
|
||||
String name = value.asText().trim();
|
||||
departments.stream()
|
||||
.filter(d -> d.getName().equals(name))
|
||||
.findFirst()
|
||||
.ifPresent(d -> out.put(idKey, d.getId()));
|
||||
}
|
||||
|
||||
private void putIfDate(Map<String, Object> out, ObjectNode node, String key) {
|
||||
JsonNode value = node.get(key);
|
||||
if (value == null || !value.isTextual()) {
|
||||
return;
|
||||
}
|
||||
String text = value.asText().trim();
|
||||
try {
|
||||
LocalDate date = LocalDate.parse(text);
|
||||
if (!date.isBefore(LocalDate.now())) {
|
||||
out.put(key, text);
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
private static final double SIMILARITY_THRESHOLD = 0.0;
|
||||
|
||||
private List<SearchService.SearchResult> retrieveSimilarCases(String query) {
|
||||
try {
|
||||
List<SearchService.SearchResult> hits = searchService.search(query, 3).stream()
|
||||
.filter(r -> r.getScore() >= SIMILARITY_THRESHOLD)
|
||||
.toList();
|
||||
log.info("字段智能填充相似案例检索: query={} hits={}", query, hits.size());
|
||||
return hits;
|
||||
} catch (Exception e) {
|
||||
log.warn("知识库相似案例检索失败,回退直接分析 query={}", query, e);
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
|
||||
private void putIfValid(Map<String, Object> out, ObjectNode node, String key, Set<String> allowed) {
|
||||
JsonNode value = node.get(key);
|
||||
if (value != null && value.isTextual()) {
|
||||
String text = value.asText().trim();
|
||||
if (allowed.contains(text)) {
|
||||
out.put(key, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void runPlan(Long planId, Long userId) {
|
||||
AgentPlan plan = planRepository.findById(planId).orElse(null);
|
||||
if (plan == null) {
|
||||
return;
|
||||
}
|
||||
User user = userRepository.findById(userId).orElse(null);
|
||||
plan.setStatus("running");
|
||||
planRepository.save(plan);
|
||||
sendEvent(planId, Map.of("type", "thought", "content", "正在加载指摘上下文并生成处理方案…"));
|
||||
|
||||
Issue issue = null;
|
||||
if (plan.getIssue() != null) {
|
||||
issue = issueRepository.findById(plan.getIssue().getId()).orElse(null);
|
||||
}
|
||||
if (issue != null) {
|
||||
issue.setAgentStatus("running");
|
||||
issue.setAgentLastPlanId(planId);
|
||||
issueRepository.save(issue);
|
||||
}
|
||||
|
||||
boolean autoExecuteHighRisk = aiConfigService.getEffectiveAutoExecuteHighRisk();
|
||||
String similarCases = buildSimilarCases(issue);
|
||||
List<String> executedSteps = new ArrayList<>();
|
||||
|
||||
try {
|
||||
Map<String, Object> systemVars = systemContextBuilder.build(user, toolDescriptions());
|
||||
String systemPrompt = promptEngine.render(SYS_ROLE_TEMPLATE, systemVars);
|
||||
|
||||
Map<String, Object> planVars = buildPlanVariables(issue, plan.getGoal(),
|
||||
similarCases, executedSteps, 1, 1);
|
||||
String userPrompt = promptEngine.render(PLAN_TEMPLATE, planVars);
|
||||
|
||||
sendPromptAndModelInfo(planId);
|
||||
|
||||
ModelRoutingService.ToolCallResult result = modelRoutingService.callWithTools(systemPrompt, userPrompt);
|
||||
if (result.toolCalls().isEmpty()) {
|
||||
plan.setAgentMessage(result.text());
|
||||
sendEvent(planId, Map.of("type", "result",
|
||||
"content", result.text() == null ? "方案已生成" : result.text()));
|
||||
finishPlan(plan, "completed", executedSteps, issue);
|
||||
completeStream(planId);
|
||||
return;
|
||||
}
|
||||
for (ModelRoutingService.ToolCallInfo info : result.toolCalls()) {
|
||||
String toolName = info.name();
|
||||
Map<String, Object> parameters = parseArguments(info.arguments());
|
||||
boolean isWrite = toolRegistry.isWrite(toolName);
|
||||
if (isWrite && !autoExecuteHighRisk) {
|
||||
sendEvent(planId, Map.of("type", "action", "tool", toolName, "params", parameters, "approval", true));
|
||||
sendEvent(planId, Map.of("type", "observation", "result", "写操作需人工审批,等待审批…"));
|
||||
plan.setRequiresApproval(true);
|
||||
plan.setApprovalStatus("requested");
|
||||
plan.setStatus("awaiting_approval");
|
||||
plan.setPlanSteps(toJson(executedSteps));
|
||||
plan.setAgentMessage("等待人工审批: 调用 " + toolName);
|
||||
planRepository.save(plan);
|
||||
|
||||
ToolExecution pending = createToolExecution(plan, toolName, parameters, "pending");
|
||||
pending.setOutputResult("等待人工审批");
|
||||
toolExecutionRepository.save(pending);
|
||||
|
||||
if (issue != null) {
|
||||
issue.setAgentStatus("awaiting_approval");
|
||||
issueRepository.save(issue);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sendEvent(planId, Map.of("type", "action", "tool", toolName, "params", parameters));
|
||||
Object output = runTool(plan, toolName, parameters, null);
|
||||
sendEvent(planId, Map.of("type", "observation", "result", truncate(toDisplay(output))));
|
||||
executedSteps.add((executedSteps.size() + 1) + ". " + toolName + " → " + truncate(toJson(parameters)));
|
||||
plan.setPlanSteps(toJson(executedSteps));
|
||||
planRepository.save(plan);
|
||||
if ("create_issue".equals(toolName)) {
|
||||
linkCreatedIssue(plan, output);
|
||||
}
|
||||
}
|
||||
plan.setAgentMessage(result.text());
|
||||
sendEvent(planId, Map.of("type", "result",
|
||||
"content", result.text() == null ? "方案已生成" : result.text()));
|
||||
finishPlan(plan, "completed", executedSteps, issue);
|
||||
completeStream(planId);
|
||||
} catch (Exception e) {
|
||||
log.error("Agent执行失败 planId={}", planId, e);
|
||||
sendEvent(planId, Map.of("type", "error", "message", e.getMessage()));
|
||||
plan.setStatus("failed");
|
||||
plan.setAgentMessage(e.getMessage());
|
||||
planRepository.save(plan);
|
||||
if (issue != null) {
|
||||
issue.setAgentStatus("failed");
|
||||
issueRepository.save(issue);
|
||||
}
|
||||
completeStream(planId);
|
||||
}
|
||||
}
|
||||
|
||||
private Object runTool(AgentPlan plan, String toolName, Map<String, Object> parameters, ToolExecution existing) {
|
||||
long start = System.currentTimeMillis();
|
||||
ToolExecution record = existing;
|
||||
if (record == null) {
|
||||
record = createToolExecution(plan, toolName, parameters, "running");
|
||||
} else {
|
||||
record.setStatus("running");
|
||||
}
|
||||
toolExecutionRepository.save(record);
|
||||
try {
|
||||
Tool tool = toolRegistry.get(toolName);
|
||||
Object output = tool.execute(parameters);
|
||||
record.setStatus("success");
|
||||
record.setOutputResult(truncate(toDisplay(output)));
|
||||
record.setExecutionTimeMs(System.currentTimeMillis() - start);
|
||||
toolExecutionRepository.save(record);
|
||||
return output;
|
||||
} catch (Exception e) {
|
||||
record.setStatus("failed");
|
||||
record.setOutputResult(truncate(e.getMessage()));
|
||||
record.setExecutionTimeMs(System.currentTimeMillis() - start);
|
||||
toolExecutionRepository.save(record);
|
||||
throw new BusinessException("工具 " + toolName + " 执行失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private void linkCreatedIssue(AgentPlan plan, Object output) {
|
||||
try {
|
||||
if (output instanceof Map<?, ?> map && map.get("id") instanceof Number number) {
|
||||
issueRepository.findById(number.longValue()).ifPresent(newIssue -> {
|
||||
plan.setIssue(newIssue);
|
||||
planRepository.save(plan);
|
||||
});
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("关联新建指摘到Agent计划失败: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private ToolExecution createToolExecution(AgentPlan plan, String toolName,
|
||||
Map<String, Object> parameters, String status) {
|
||||
ToolExecution record = new ToolExecution();
|
||||
record.setPlan(plan);
|
||||
record.setToolName(toolName);
|
||||
record.setInputParams(toJson(parameters));
|
||||
record.setStatus(status);
|
||||
return record;
|
||||
}
|
||||
|
||||
private void finishPlan(AgentPlan plan, String status) {
|
||||
finishPlan(plan, status, new ArrayList<>(), null);
|
||||
}
|
||||
|
||||
private void finishPlan(AgentPlan plan, String status, List<String> executedSteps, Issue issue) {
|
||||
plan.setStatus(status);
|
||||
plan.setCompletedAt(LocalDateTime.now());
|
||||
if (!executedSteps.isEmpty()) {
|
||||
plan.setPlanSteps(toJson(executedSteps));
|
||||
}
|
||||
planRepository.save(plan);
|
||||
|
||||
saveMemory(plan);
|
||||
if (issue == null) {
|
||||
if (plan.getIssue() != null) {
|
||||
issueRepository.findById(plan.getIssue().getId()).ifPresent(i -> {
|
||||
i.setAgentStatus(status);
|
||||
i.setAgentLastPlanId(plan.getId());
|
||||
issueRepository.save(i);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
issue.setAgentStatus(status);
|
||||
issueRepository.save(issue);
|
||||
}
|
||||
}
|
||||
|
||||
private void saveMemory(AgentPlan plan) {
|
||||
try {
|
||||
String summary = plan.getGoal();
|
||||
String steps = plan.getPlanSteps();
|
||||
AgentMemory memory = memoryService.add(summary, steps);
|
||||
if (memory != null) {
|
||||
log.info("已保存Agent记忆 memoryId={}", memory.getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("保存Agent记忆失败: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> parseArguments(String arguments) {
|
||||
if (arguments == null || arguments.isBlank()) {
|
||||
return new LinkedHashMap<>();
|
||||
}
|
||||
try {
|
||||
return objectMapper.readValue(arguments, new TypeReference<Map<String, Object>>() {});
|
||||
} catch (Exception e) {
|
||||
return new LinkedHashMap<>();
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> buildPlanVariables(Issue issue, String goal, String similarCases,
|
||||
List<String> executedSteps, int step, int maxSteps) {
|
||||
Map<String, Object> vars = new LinkedHashMap<>();
|
||||
vars.put("userGoal", goal);
|
||||
vars.put("issueContext", buildIssueContext(issue));
|
||||
vars.put("similarCases", similarCases);
|
||||
vars.put("availableTools", toolDescriptions());
|
||||
vars.put("executedSteps", executedSteps);
|
||||
vars.put("currentStep", step);
|
||||
vars.put("maxSteps", maxSteps);
|
||||
return vars;
|
||||
}
|
||||
|
||||
private String buildIssueContext(Issue issue) {
|
||||
if (issue == null) {
|
||||
return "(新建指摘场景,指摘尚未创建)";
|
||||
}
|
||||
return "指摘编号: " + issue.getIssueNo() + "\n标题: " + issue.getTitle()
|
||||
+ "\n描述: " + (issue.getDescription() == null ? "" : issue.getDescription())
|
||||
+ "\n状态: " + issue.getStatus() + ", 优先级: " + issue.getPriority()
|
||||
+ "\n阶段: " + (issue.getPhase() == null ? "" : issue.getPhase());
|
||||
}
|
||||
|
||||
private String buildSimilarCases(Issue issue) {
|
||||
if (issue == null) {
|
||||
return "";
|
||||
}
|
||||
try {
|
||||
List<AgentMemory> memories = memoryService.searchSimilar(issue.getTitle(), 3);
|
||||
if (memories.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < memories.size(); i++) {
|
||||
AgentMemory m = memories.get(i);
|
||||
sb.append(i + 1).append(". ").append(m.getIssueSummary())
|
||||
.append(" | 步骤: ").append(m.getSolutionSteps()).append("\n");
|
||||
}
|
||||
return sb.toString();
|
||||
} catch (Exception e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private List<String> toolDescriptions() {
|
||||
List<String> list = new ArrayList<>();
|
||||
toolRegistry.descriptions().forEach((name, desc) -> list.add(name + " - " + desc));
|
||||
return list;
|
||||
}
|
||||
|
||||
private String templateVersion(String templateId) {
|
||||
try {
|
||||
PromptTemplate template = promptEngine.loadActive(templateId);
|
||||
return template.getVersion() == null ? "" : String.valueOf(template.getVersion());
|
||||
} catch (Exception e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private void checkRateLimit(Long userId) {
|
||||
String minuteKey = "agent:limit:" + userId + ":" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"));
|
||||
Long count = redisTemplate.opsForValue().increment(minuteKey);
|
||||
if (count != null && count == 1) {
|
||||
redisTemplate.expire(minuteKey, java.time.Duration.ofSeconds(60));
|
||||
}
|
||||
int limit = aiConfigService.getEffectiveUserRateLimit();
|
||||
if (count != null && count > limit) {
|
||||
throw new BusinessException("Agent执行过于频繁,请稍后再试");
|
||||
}
|
||||
}
|
||||
|
||||
private Map<String, Object> toolExecutionToMap(ToolExecution t) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("id", t.getId());
|
||||
m.put("toolName", t.getToolName());
|
||||
m.put("inputParams", t.getInputParams());
|
||||
m.put("outputResult", t.getOutputResult());
|
||||
m.put("status", t.getStatus());
|
||||
m.put("executionTimeMs", t.getExecutionTimeMs());
|
||||
m.put("createdAt", t.getCreatedAt() == null ? null : t.getCreatedAt().toString());
|
||||
return m;
|
||||
}
|
||||
|
||||
private String toJson(Object value) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(value);
|
||||
} catch (Exception e) {
|
||||
return String.valueOf(value);
|
||||
}
|
||||
}
|
||||
|
||||
private String toDisplay(Object value) {
|
||||
if (value instanceof String) {
|
||||
return (String) value;
|
||||
}
|
||||
return toJson(value);
|
||||
}
|
||||
|
||||
private String truncate(String text) {
|
||||
if (text == null) {
|
||||
return null;
|
||||
}
|
||||
return text.length() > 3000 ? text.substring(0, 3000) : text;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,226 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.AgentPlan;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.ToolExecution;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.knowledge.SearchService;
|
||||
import com.ims.service.notification.NotificationService;
|
||||
import com.ims.service.repository.AgentPlanRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.ToolExecutionRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class AgentService {
|
||||
|
||||
private final AgentPlanRepository agentPlanRepository;
|
||||
private final ToolExecutionRepository toolExecutionRepository;
|
||||
private final IssueRepository issueRepository;
|
||||
private final NotificationService notificationService;
|
||||
private final SearchService searchService;
|
||||
private final OllamaChatService ollamaChatService;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
public AgentService(AgentPlanRepository agentPlanRepository,
|
||||
ToolExecutionRepository toolExecutionRepository,
|
||||
IssueRepository issueRepository,
|
||||
NotificationService notificationService,
|
||||
SearchService searchService,
|
||||
OllamaChatService ollamaChatService,
|
||||
ObjectMapper objectMapper) {
|
||||
this.agentPlanRepository = agentPlanRepository;
|
||||
this.toolExecutionRepository = toolExecutionRepository;
|
||||
this.issueRepository = issueRepository;
|
||||
this.notificationService = notificationService;
|
||||
this.searchService = searchService;
|
||||
this.ollamaChatService = ollamaChatService;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Map<String, Object> execute(Long issueId, String goal, User user) {
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.filter(i -> !Boolean.TRUE.equals(i.getIsDeleted()))
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在"));
|
||||
|
||||
long searchStart = System.currentTimeMillis();
|
||||
List<SearchService.SearchResult> hits;
|
||||
try {
|
||||
hits = searchService.search(goal, 3);
|
||||
} catch (Exception e) {
|
||||
hits = new ArrayList<>();
|
||||
}
|
||||
long searchMs = System.currentTimeMillis() - searchStart;
|
||||
|
||||
String searchOutput = hits.isEmpty()
|
||||
? "知识库暂无匹配的相似案例"
|
||||
: "知识库命中 " + hits.size() + " 条相似案例:" + hits.stream()
|
||||
.map(h -> String.format("《%s》(相似度 %.2f): %s", h.getDocName(), h.getScore(), truncate(h.getContent(), 60)))
|
||||
.reduce((a, b) -> a + ";" + b)
|
||||
.orElse("");
|
||||
|
||||
String planText;
|
||||
long genMs = 0;
|
||||
String genOutput;
|
||||
boolean genOk = true;
|
||||
if (!hits.isEmpty()) {
|
||||
String system = "你是一个指摘管理系统(IMS)的智能助理。根据用户指令和知识库检索到的相似案例,生成具体、可执行的对应方案。" +
|
||||
"请按以下结构输出:\n1. 问题分析\n2. 处理步骤(分点列出)\n3. 验证方式\n语言简洁专业。";
|
||||
String userContent = "知识库相似案例:\n" + hits.stream()
|
||||
.map(h -> "【案例 " + h.getDocName() + "】" + h.getContent())
|
||||
.reduce((a, b) -> a + "\n" + b).orElse("")
|
||||
+ "\n\n用户指令:" + goal;
|
||||
try {
|
||||
long genStart = System.currentTimeMillis();
|
||||
planText = ollamaChatService.chat(system, userContent);
|
||||
genMs = System.currentTimeMillis() - genStart;
|
||||
genOutput = truncate(planText, 300);
|
||||
} catch (Exception e) {
|
||||
genOk = false;
|
||||
planText = "知识库检索完成,但方案生成失败(Ollama 暂不可用),已保留检索到的相似案例供参考。";
|
||||
genOutput = planText;
|
||||
}
|
||||
} else {
|
||||
planText = "知识库未检索到相似案例,建议人工分析后处理。";
|
||||
genOutput = planText;
|
||||
}
|
||||
|
||||
AgentPlan plan = AgentPlan.builder()
|
||||
.issue(issue)
|
||||
.goal(goal)
|
||||
.planSteps(planSteps(planText))
|
||||
.status("pending")
|
||||
.requiresApproval(true)
|
||||
.approvalStatus("pending")
|
||||
.createdBy(user)
|
||||
.modelProvider("ollama/" + ollamaChatService.getModel())
|
||||
.build();
|
||||
plan = agentPlanRepository.save(plan);
|
||||
|
||||
saveTool(plan, "search_knowledge",
|
||||
"{\"query\":\"" + safeJson(goal) + "\"}",
|
||||
searchOutput, searchMs, "success");
|
||||
saveTool(plan, "generate_response",
|
||||
"{\"goal\":\"" + safeJson(goal) + "\"}",
|
||||
genOutput, genMs, genOk ? "success" : "failed");
|
||||
|
||||
issue.setAgentStatus("awaiting_approval");
|
||||
issue.setAgentLastPlanId(plan.getId());
|
||||
issueRepository.save(issue);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("planId", plan.getId());
|
||||
result.put("status", plan.getStatus());
|
||||
result.put("approvalStatus", plan.getApprovalStatus());
|
||||
result.put("requiresApproval", plan.getRequiresApproval());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public Map<String, Object> status(Long planId) {
|
||||
AgentPlan plan = agentPlanRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("计划不存在"));
|
||||
List<ToolExecution> tools = toolExecutionRepository.findByPlanId(planId);
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("planId", plan.getId());
|
||||
map.put("goal", plan.getGoal());
|
||||
map.put("status", plan.getStatus());
|
||||
map.put("approvalStatus", plan.getApprovalStatus());
|
||||
map.put("requiresApproval", plan.getRequiresApproval());
|
||||
map.put("createdAt", plan.getCreatedAt());
|
||||
map.put("tools", tools.stream().map(t -> {
|
||||
Map<String, Object> tm = new HashMap<>();
|
||||
tm.put("toolName", t.getToolName());
|
||||
tm.put("inputParams", t.getInputParams());
|
||||
tm.put("outputResult", t.getOutputResult());
|
||||
tm.put("status", t.getStatus());
|
||||
tm.put("executionTimeMs", t.getExecutionTimeMs());
|
||||
return tm;
|
||||
}).toList());
|
||||
return map;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void approve(Long planId, String comment) {
|
||||
AgentPlan plan = agentPlanRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("计划不存在"));
|
||||
plan.setApprovalStatus("approved");
|
||||
plan.setStatus("completed");
|
||||
plan.setApprovalComment(comment);
|
||||
plan.setCompletedAt(LocalDateTime.now());
|
||||
agentPlanRepository.save(plan);
|
||||
|
||||
Issue issue = plan.getIssue();
|
||||
issue.setAgentStatus("agent_driven");
|
||||
issueRepository.save(issue);
|
||||
if (plan.getCreatedBy() != null) {
|
||||
notificationService.notify(plan.getCreatedBy(), "Agent 指令已批准",
|
||||
"您的 Agent 指令《" + plan.getGoal() + "》已获批准执行。",
|
||||
"agent", "/issues/" + issue.getId(), issue);
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void reject(Long planId, String comment) {
|
||||
AgentPlan plan = agentPlanRepository.findById(planId)
|
||||
.orElseThrow(() -> new BusinessException("计划不存在"));
|
||||
plan.setApprovalStatus("rejected");
|
||||
plan.setStatus("completed");
|
||||
plan.setApprovalComment(comment);
|
||||
plan.setCompletedAt(LocalDateTime.now());
|
||||
agentPlanRepository.save(plan);
|
||||
|
||||
Issue issue = plan.getIssue();
|
||||
issue.setAgentStatus("human_driven");
|
||||
issueRepository.save(issue);
|
||||
if (plan.getCreatedBy() != null) {
|
||||
notificationService.notify(plan.getCreatedBy(), "Agent 指令被驳回",
|
||||
"您的 Agent 指令《" + plan.getGoal() + "》被驳回。" +
|
||||
(comment != null && !comment.isBlank() ? " 原因: " + comment : ""),
|
||||
"agent", "/issues/" + issue.getId(), issue);
|
||||
}
|
||||
}
|
||||
|
||||
private void saveTool(AgentPlan plan, String toolName, String inputParams, String output, long ms, String status) {
|
||||
ToolExecution t = ToolExecution.builder()
|
||||
.plan(plan)
|
||||
.toolName(toolName)
|
||||
.inputParams(inputParams)
|
||||
.outputResult(output)
|
||||
.status(status)
|
||||
.executionTimeMs(ms)
|
||||
.build();
|
||||
toolExecutionRepository.save(t);
|
||||
}
|
||||
|
||||
private String planSteps(String planText) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(List.of(
|
||||
Map.of("step", 1, "action", "解析用户指令", "status", "done"),
|
||||
Map.of("step", 2, "action", "检索知识库相似案例", "status", "done"),
|
||||
Map.of("step", 3, "action", "生成对应方案", "status", "done"),
|
||||
Map.of("step", 4, "action", "方案如下", "status", "done", "detail", truncate(planText, 500))));
|
||||
} catch (Exception e) {
|
||||
return "[]";
|
||||
}
|
||||
}
|
||||
|
||||
private String truncate(String s, int max) {
|
||||
if (s == null) return "";
|
||||
return s.length() <= max ? s : s.substring(0, max) + "...";
|
||||
}
|
||||
|
||||
private String safeJson(String s) {
|
||||
return s == null ? "" : s.replace("\"", "\\\"");
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.ims.service.entity.Permission;
|
||||
import com.ims.service.entity.RolePermission;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.entity.UserRole;
|
||||
import com.ims.service.repository.PermissionRepository;
|
||||
import com.ims.service.repository.RolePermissionRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class AgentToolPermissionService {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final RolePermissionRepository rolePermissionRepository;
|
||||
private final PermissionRepository permissionRepository;
|
||||
|
||||
public AgentToolPermissionService(UserRepository userRepository,
|
||||
UserRoleRepository userRoleRepository,
|
||||
RolePermissionRepository rolePermissionRepository,
|
||||
PermissionRepository permissionRepository) {
|
||||
this.userRepository = userRepository;
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.rolePermissionRepository = rolePermissionRepository;
|
||||
this.permissionRepository = permissionRepository;
|
||||
}
|
||||
|
||||
public boolean canUseTool(String username, String toolName) {
|
||||
if (toolName == null || toolName.isBlank()) {
|
||||
return false;
|
||||
}
|
||||
User user = userRepository.findByUsername(username)
|
||||
.or(() -> userRepository.findByUserid(username))
|
||||
.orElse(null);
|
||||
if (user == null) {
|
||||
return false;
|
||||
}
|
||||
List<Long> roleIds = userRoleRepository.findByUserId(user.getId())
|
||||
.stream().map(UserRole::getRoleId).distinct().toList();
|
||||
if (roleIds.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
List<Long> permissionIds = rolePermissionRepository.findByRoleIdIn(roleIds)
|
||||
.stream().map(RolePermission::getPermissionId).distinct().toList();
|
||||
String code = "TOOL_" + toolName.toUpperCase().replace("-", "_");
|
||||
return permissionRepository.findAllById(permissionIds).stream()
|
||||
.map(Permission::getCode)
|
||||
.anyMatch(code::equals);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.AgentMemory;
|
||||
import com.ims.service.knowledge.DeepSeekEmbeddingService;
|
||||
import com.ims.service.knowledge.SearchService;
|
||||
import com.ims.service.repository.AgentMemoryRepository;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.PersistenceContext;
|
||||
import jakarta.persistence.Query;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class MemoryService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(MemoryService.class);
|
||||
|
||||
private final AgentMemoryRepository memoryRepository;
|
||||
private final DeepSeekEmbeddingService deepSeekEmbeddingService;
|
||||
|
||||
@PersistenceContext
|
||||
private EntityManager entityManager;
|
||||
|
||||
public MemoryService(AgentMemoryRepository memoryRepository,
|
||||
DeepSeekEmbeddingService deepSeekEmbeddingService) {
|
||||
this.memoryRepository = memoryRepository;
|
||||
this.deepSeekEmbeddingService = deepSeekEmbeddingService;
|
||||
}
|
||||
|
||||
public Page<AgentMemory> list(int page, int pageSize) {
|
||||
Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize);
|
||||
return memoryRepository.findAll(pageable);
|
||||
}
|
||||
|
||||
public List<AgentMemory> searchSimilar(String text, int topK) {
|
||||
String vector = embed(text);
|
||||
if (vector == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
try {
|
||||
return memoryRepository.findSimilar(vector, topK);
|
||||
} catch (Exception e) {
|
||||
log.warn("记忆向量检索失败: {}", e.getMessage());
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
public AgentMemory add(String issueSummary, String solutionSteps) {
|
||||
String vector = embed(issueSummary);
|
||||
Query q;
|
||||
if (vector == null) {
|
||||
q = entityManager.createNativeQuery(
|
||||
"INSERT INTO agent_memories (issue_summary, solution_steps, effectiveness_score, created_at, updated_at) " +
|
||||
"VALUES (:summary, CAST(:steps AS jsonb), :score, NOW(), NOW()) RETURNING id")
|
||||
.setParameter("summary", issueSummary)
|
||||
.setParameter("steps", solutionSteps)
|
||||
.setParameter("score", BigDecimal.ZERO);
|
||||
} else {
|
||||
q = entityManager.createNativeQuery(
|
||||
"INSERT INTO agent_memories (issue_summary, solution_steps, effectiveness_score, embedding, created_at, updated_at) " +
|
||||
"VALUES (:summary, CAST(:steps AS jsonb), :score, CAST(:embedding AS vector), NOW(), NOW()) RETURNING id")
|
||||
.setParameter("summary", issueSummary)
|
||||
.setParameter("steps", solutionSteps)
|
||||
.setParameter("score", BigDecimal.ZERO)
|
||||
.setParameter("embedding", vector);
|
||||
}
|
||||
Number id = (Number) q.getSingleResult();
|
||||
return memoryRepository.findById(id.longValue())
|
||||
.orElseThrow(() -> new BusinessException("记忆保存失败: " + id));
|
||||
}
|
||||
|
||||
public void delete(Long id) {
|
||||
if (!memoryRepository.existsById(id)) {
|
||||
throw new BusinessException("记忆不存在: " + id);
|
||||
}
|
||||
memoryRepository.deleteById(id);
|
||||
}
|
||||
|
||||
public AgentMemory update(Long id, String issueSummary, String solutionSteps) {
|
||||
AgentMemory memory = memoryRepository.findById(id)
|
||||
.orElseThrow(() -> new BusinessException("记忆不存在: " + id));
|
||||
memory.setIssueSummary(issueSummary);
|
||||
memory.setSolutionSteps(solutionSteps);
|
||||
return memoryRepository.save(memory);
|
||||
}
|
||||
|
||||
private String embed(String text) {
|
||||
try {
|
||||
List<Float> vector = deepSeekEmbeddingService.embed(text);
|
||||
if (vector == null || vector.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
return SearchService.vectorToPgvectorString(vector);
|
||||
} catch (Exception e) {
|
||||
log.warn("Agent记忆嵌入失败(需配置DeepSeek Key并保证1536维): {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.ims.service.agent;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class OllamaChatService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(OllamaChatService.class);
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
@Value("${ollama.base-url:http://localhost:11434}")
|
||||
private String baseUrl;
|
||||
|
||||
@Value("${ollama.chat.model:llama3.1:8b}")
|
||||
private String model;
|
||||
|
||||
public OllamaChatService(ObjectMapper objectMapper) {
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public String getModel() {
|
||||
return model;
|
||||
}
|
||||
|
||||
public String chat(String system, String user) {
|
||||
String requestBody;
|
||||
try {
|
||||
requestBody = objectMapper.writeValueAsString(Map.of(
|
||||
"model", model,
|
||||
"stream", false,
|
||||
"messages", List.of(
|
||||
Map.of("role", "system", "content", system),
|
||||
Map.of("role", "user", "content", user))));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("构建 Ollama 请求失败: " + e.getMessage(), e);
|
||||
}
|
||||
|
||||
try {
|
||||
HttpURLConnection conn = (HttpURLConnection) URI.create(baseUrl + "/api/chat").toURL().openConnection();
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("Content-Type", "application/json");
|
||||
conn.setDoOutput(true);
|
||||
conn.setConnectTimeout(30000);
|
||||
conn.setReadTimeout(600000);
|
||||
try (OutputStream os = conn.getOutputStream()) {
|
||||
os.write(requestBody.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
String json = new String(conn.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
|
||||
JsonNode root = objectMapper.readTree(json);
|
||||
JsonNode content = root.path("message").path("content");
|
||||
if (content.isMissingNode()) {
|
||||
throw new RuntimeException("Ollama 响应缺少 message.content: " + json);
|
||||
}
|
||||
return content.asText();
|
||||
} catch (Exception e) {
|
||||
log.error("Ollama chat failed", e);
|
||||
throw new RuntimeException("Ollama 调用失败: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.ai.model.function.FunctionCallback;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class AgentFunctionCallbackAdapter implements FunctionCallback {
|
||||
|
||||
private final Tool tool;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
public AgentFunctionCallbackAdapter(Tool tool, ObjectMapper objectMapper) {
|
||||
this.tool = tool;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return tool.name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return tool.description();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInputTypeSchema() {
|
||||
return schemaFor(tool.name());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String call(String functionArguments) {
|
||||
Map<String, Object> parameters = parseArguments(functionArguments);
|
||||
Object output = tool.execute(parameters);
|
||||
return write(output);
|
||||
}
|
||||
|
||||
private Map<String, Object> parseArguments(String arguments) {
|
||||
if (arguments == null || arguments.isBlank()) {
|
||||
return new LinkedHashMap<>();
|
||||
}
|
||||
try {
|
||||
return objectMapper.readValue(arguments, new TypeReference<Map<String, Object>>() {});
|
||||
} catch (Exception e) {
|
||||
return new LinkedHashMap<>();
|
||||
}
|
||||
}
|
||||
|
||||
private String write(Object value) {
|
||||
try {
|
||||
return objectMapper.writeValueAsString(value);
|
||||
} catch (Exception e) {
|
||||
return String.valueOf(value);
|
||||
}
|
||||
}
|
||||
|
||||
private String schemaFor(String name) {
|
||||
return switch (name) {
|
||||
case "create_issue" -> """
|
||||
{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"phase":{"type":"string"},"priority":{"type":"string"},"impact_level":{"type":"string"},"category":{"type":"string"},"assignee_name":{"type":"string"},"department_id":{"type":"number"}},"required":["title"]}
|
||||
""";
|
||||
case "update_issue" -> """
|
||||
{"type":"object","properties":{"issue_id":{"type":"number"},"field":{"type":"string"},"value":{"type":"string"}},"required":["issue_id","field","value"]}
|
||||
""";
|
||||
case "query_issue" -> """
|
||||
{"type":"object","properties":{"issue_id":{"type":"number"}},"required":["issue_id"]}
|
||||
""";
|
||||
case "search_knowledge" -> """
|
||||
{"type":"object","properties":{"query":{"type":"string"},"top_k":{"type":"number"}},"required":["query"]}
|
||||
""";
|
||||
case "notify_overdue" -> """
|
||||
{"type":"object","properties":{"content":{"type":"string"}}}
|
||||
""";
|
||||
case "assign_pending" -> """
|
||||
{"type":"object","properties":{"assignee_name":{"type":"string"}},"required":["assignee_name"]}
|
||||
""";
|
||||
case "weekly_report" -> """
|
||||
{"type":"object","properties":{}}
|
||||
""";
|
||||
case "ai_analysis" -> """
|
||||
{"type":"object","properties":{"issue_id":{"type":"number"}},"required":["issue_id"]}
|
||||
""";
|
||||
default -> "{\"type\":\"object\",\"properties\":{}}";
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.ai.KeywordExtractor;
|
||||
import com.ims.service.ai.ModelRoutingService;
|
||||
import com.ims.service.ai.PromptFormatter;
|
||||
import com.ims.service.ai.PromptTemplateEngine;
|
||||
import com.ims.service.entity.AiAnalysis;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.AiAnalysisRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class AiAnalysisTool implements Tool {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AiAnalysisTool.class);
|
||||
private static final String SYS_ROLE_TEMPLATE = "SYS_ROLE_001";
|
||||
private static final String ANALYSIS_TEMPLATE = "ANALYSIS_ROOT_CAUSE_001";
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
private final AiAnalysisRepository analysisRepository;
|
||||
private final UserRepository userRepository;
|
||||
private final PromptTemplateEngine promptEngine;
|
||||
private final ModelRoutingService modelRoutingService;
|
||||
private final PromptFormatter promptFormatter;
|
||||
private final KeywordExtractor keywordExtractor;
|
||||
private final KnowledgeSearchTool knowledgeSearchTool;
|
||||
|
||||
public AiAnalysisTool(IssueRepository issueRepository,
|
||||
AiAnalysisRepository analysisRepository,
|
||||
UserRepository userRepository,
|
||||
PromptTemplateEngine promptEngine,
|
||||
ModelRoutingService modelRoutingService,
|
||||
PromptFormatter promptFormatter,
|
||||
KeywordExtractor keywordExtractor,
|
||||
KnowledgeSearchTool knowledgeSearchTool) {
|
||||
this.issueRepository = issueRepository;
|
||||
this.analysisRepository = analysisRepository;
|
||||
this.userRepository = userRepository;
|
||||
this.promptEngine = promptEngine;
|
||||
this.modelRoutingService = modelRoutingService;
|
||||
this.promptFormatter = promptFormatter;
|
||||
this.keywordExtractor = keywordExtractor;
|
||||
this.knowledgeSearchTool = knowledgeSearchTool;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "ai_analysis";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "对指定指摘进行AI根因分析(只读),调用LLM分析问题分类、根因和整改建议,参数:issue_id(数字,必填)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
Long issueId = toLong(parameters.get("issue_id"));
|
||||
if (issueId == null) {
|
||||
throw new BusinessException("ai_analysis 缺少参数 issue_id");
|
||||
}
|
||||
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在: " + issueId));
|
||||
|
||||
AiAnalysis analysis = new AiAnalysis();
|
||||
analysis.setIssue(issue);
|
||||
analysis.setStatus("processing");
|
||||
analysis.setPromptTemplateId(ANALYSIS_TEMPLATE);
|
||||
analysis.setStartedAt(LocalDateTime.now());
|
||||
analysis.setExtractedKeywords(keywordExtractor.extract(
|
||||
issue.getTitle(), issue.getDescription(), issue.getCategory(), issue.getPhase()));
|
||||
analysisRepository.save(analysis);
|
||||
|
||||
try {
|
||||
Map<String, Object> systemVars = new LinkedHashMap<>();
|
||||
systemVars.put("userGoal", "进行根因分析");
|
||||
systemVars.put("issueContext", buildIssueContext(issue));
|
||||
systemVars.put("availableTools", List.of());
|
||||
String systemPrompt = promptEngine.render(SYS_ROLE_TEMPLATE, systemVars);
|
||||
|
||||
Map<String, Object> analysisVars = buildAnalysisVariables(issue, analysis.getExtractedKeywords());
|
||||
String userPrompt = promptEngine.render(ANALYSIS_TEMPLATE, analysisVars);
|
||||
|
||||
ModelRoutingService.CallResult result = modelRoutingService.call(systemPrompt, userPrompt);
|
||||
|
||||
ObjectNode json = promptFormatter.extractJsonObject(result.text());
|
||||
if (json == null) {
|
||||
log.warn("AI分析输出解析失败,尝试修复 issueId={}", issueId);
|
||||
json = repairJsonOutput(result.text(), systemPrompt);
|
||||
}
|
||||
if (json == null) {
|
||||
throw new BusinessException("LLM输出无法解析为JSON");
|
||||
}
|
||||
|
||||
String category = text(json, "category");
|
||||
String rootCause = text(json, "rootCause");
|
||||
String suggestion = text(json, "suggestion");
|
||||
if ((category == null || category.isBlank())
|
||||
|| (rootCause == null || rootCause.isBlank())
|
||||
|| (suggestion == null || suggestion.isBlank())) {
|
||||
throw new BusinessException("LLM输出缺少分析内容(category/rootCause/suggestion)");
|
||||
}
|
||||
|
||||
analysis.setCategory(category);
|
||||
analysis.setKeywords(joinArray(json, "keywords"));
|
||||
analysis.setRootCause(rootCause);
|
||||
analysis.setSuggestion(suggestion);
|
||||
analysis.setStatus("completed");
|
||||
analysis.setPromptVersion(1);
|
||||
analysis.setModelProvider(result.provider());
|
||||
analysis.setModelName(result.provider());
|
||||
analysis.setCompletedAt(LocalDateTime.now());
|
||||
analysisRepository.save(analysis);
|
||||
|
||||
issue.setAiAnalysisId(analysis.getId());
|
||||
issueRepository.save(issue);
|
||||
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("analysisId", analysis.getId());
|
||||
map.put("category", category);
|
||||
map.put("keywords", analysis.getKeywords());
|
||||
map.put("rootCause", rootCause);
|
||||
map.put("suggestion", suggestion);
|
||||
map.put("status", "completed");
|
||||
return map;
|
||||
} catch (Exception e) {
|
||||
log.error("AI分析工具执行失败 issueId={}", issueId, e);
|
||||
analysis.setStatus("failed");
|
||||
analysis.setErrorMessage(e.getMessage());
|
||||
analysis.setCompletedAt(LocalDateTime.now());
|
||||
analysisRepository.save(analysis);
|
||||
throw new BusinessException("AI分析失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private String buildIssueContext(Issue issue) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("指摘编号: ").append(issue.getIssueNo()).append("\n");
|
||||
sb.append("标题: ").append(issue.getTitle()).append("\n");
|
||||
if (issue.getDescription() != null) {
|
||||
sb.append("描述: ").append(issue.getDescription()).append("\n");
|
||||
}
|
||||
if (issue.getPhase() != null) {
|
||||
sb.append("工程阶段: ").append(issue.getPhase()).append("\n");
|
||||
}
|
||||
if (issue.getCategory() != null) {
|
||||
sb.append("问题分类: ").append(issue.getCategory()).append("\n");
|
||||
}
|
||||
if (issue.getImpactLevel() != null) {
|
||||
sb.append("影响度: ").append(issue.getImpactLevel()).append("\n");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private Map<String, Object> buildAnalysisVariables(Issue issue, String extractedKeywords) {
|
||||
Map<String, Object> vars = new HashMap<>();
|
||||
vars.put("issueNo", issue.getIssueNo());
|
||||
vars.put("issueTitle", issue.getTitle());
|
||||
vars.put("issueDescription", issue.getDescription() == null ? "" : issue.getDescription());
|
||||
vars.put("issuePhase", issue.getPhase() == null ? "" : issue.getPhase());
|
||||
vars.put("issueCategory", issue.getCategory() == null ? "" : issue.getCategory());
|
||||
vars.put("issueImpactLevel", issue.getImpactLevel() == null ? "" : issue.getImpactLevel());
|
||||
vars.put("issueKeywords", extractedKeywords);
|
||||
vars.put("similarCases", buildKnowledgeContext(issue));
|
||||
return vars;
|
||||
}
|
||||
|
||||
private String buildKnowledgeContext(Issue issue) {
|
||||
try {
|
||||
StringBuilder query = new StringBuilder(issue.getTitle() == null ? "" : issue.getTitle());
|
||||
if (issue.getDescription() != null && !issue.getDescription().isBlank()) {
|
||||
if (query.length() > 0) {
|
||||
query.append(" ");
|
||||
}
|
||||
query.append(issue.getDescription());
|
||||
}
|
||||
if (query.length() == 0) {
|
||||
return "";
|
||||
}
|
||||
List<?> results = (List<?>) knowledgeSearchTool.execute(
|
||||
Map.of("query", query.toString(), "top_k", 5));
|
||||
if (results == null || results.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < results.size(); i++) {
|
||||
Object r = results.get(i);
|
||||
if (r instanceof Map) {
|
||||
Map<?, ?> m = (Map<?, ?>) r;
|
||||
sb.append(i + 1).append(". ")
|
||||
.append(m.get("doc_name")).append(": ")
|
||||
.append(m.get("content")).append("\n");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
} catch (Exception e) {
|
||||
log.warn("知识库检索失败,降级为无相似案例: {}", e.getMessage());
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private ObjectNode repairJsonOutput(String broken, String systemPrompt) {
|
||||
try {
|
||||
String repairPrompt = "以下内容本应是严格的 JSON,但无法解析。"
|
||||
+ "请将修正后的完整 JSON 重新输出,禁止 Markdown 围栏、禁止解释性文字,"
|
||||
+ "直接输出 JSON:\n\n" + broken;
|
||||
ModelRoutingService.CallResult retry = modelRoutingService.call(systemPrompt, repairPrompt);
|
||||
return promptFormatter.extractJsonObject(retry.text());
|
||||
} catch (Exception e) {
|
||||
log.warn("JSON 修复重试失败: {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String text(ObjectNode json, String field) {
|
||||
JsonNode node = get(json, field);
|
||||
if (node == null || node.isNull()) {
|
||||
return null;
|
||||
}
|
||||
return node.isContainerNode() ? node.toString() : node.asText();
|
||||
}
|
||||
|
||||
private String joinArray(ObjectNode json, String field) {
|
||||
JsonNode node = get(json, field);
|
||||
if (node == null || !node.isArray()) {
|
||||
return "";
|
||||
}
|
||||
List<String> items = new ArrayList<>();
|
||||
for (JsonNode n : (com.fasterxml.jackson.databind.node.ArrayNode) node) {
|
||||
items.add(n.asText());
|
||||
}
|
||||
return String.join(",", items);
|
||||
}
|
||||
|
||||
private JsonNode get(ObjectNode json, String field) {
|
||||
JsonNode node = json.get(field);
|
||||
if (node != null) {
|
||||
return node;
|
||||
}
|
||||
for (Map.Entry<String, JsonNode> entry : json.properties()) {
|
||||
if (entry.getKey().equalsIgnoreCase(field)) {
|
||||
return entry.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static Long toLong(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).longValue();
|
||||
}
|
||||
try {
|
||||
return Long.parseLong(String.valueOf(value).trim());
|
||||
} catch (NumberFormatException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.issue.IssueService;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class AssignPendingTool implements Tool {
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
private final IssueService issueService;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public AssignPendingTool(IssueRepository issueRepository,
|
||||
IssueService issueService,
|
||||
UserRepository userRepository) {
|
||||
this.issueRepository = issueRepository;
|
||||
this.issueService = issueService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "assign_pending";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "为待处理指摘分配对应者(写操作,需审批),自动查找所有待处理(open)且未分配对应者的指摘并统一分配,参数:assignee_name(必填,对应者用户名)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
String assigneeName = parameters.get("assignee_name") == null ? "" : String.valueOf(parameters.get("assignee_name"));
|
||||
if (assigneeName.isBlank()) {
|
||||
throw new BusinessException("assign_pending 缺少参数 assignee_name");
|
||||
}
|
||||
User assignee = userRepository.findByUsername(assigneeName)
|
||||
.or(() -> userRepository.findByUserid(assigneeName))
|
||||
.orElse(null);
|
||||
if (assignee == null) {
|
||||
throw new BusinessException("对应者不存在: " + assigneeName);
|
||||
}
|
||||
List<Issue> pending = issueRepository.findByIsDeletedFalseAndStatusAndAssigneeIsNull("open");
|
||||
if (pending.isEmpty()) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("assigned", 0);
|
||||
map.put("message", "当前没有待处理且未分配对应者的指摘。");
|
||||
return map;
|
||||
}
|
||||
List<Long> ids = pending.stream().map(Issue::getId).toList();
|
||||
User operator = userRepository.findByUserid("admin")
|
||||
.or(() -> userRepository.findByUsername("admin")).orElse(null);
|
||||
int count = issueService.batchAssign(ids, assignee.getId(), operator);
|
||||
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("assigned", count);
|
||||
map.put("targetCount", ids.size());
|
||||
map.put("assignee", assigneeName);
|
||||
map.put("message", "已将 " + count + " 条待处理指摘分配给对应者 " + assigneeName);
|
||||
return map;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.api.dto.issue.IssueCreateRequest;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.issue.IssueService;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class IssueCreateTool implements Tool {
|
||||
|
||||
private final IssueService issueService;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public IssueCreateTool(IssueService issueService, UserRepository userRepository) {
|
||||
this.issueService = issueService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "create_issue";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "新建指摘(写操作,需审批),参数:title(必填), description, phase, priority, impact_level, category, assignee_name(对应者姓名), department_id(数字)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
String title = parameters.get("title") == null ? "" : String.valueOf(parameters.get("title"));
|
||||
if (title.isBlank()) {
|
||||
throw new BusinessException("create_issue 缺少参数 title");
|
||||
}
|
||||
|
||||
IssueCreateRequest req = new IssueCreateRequest();
|
||||
req.setTitle(title);
|
||||
req.setDescription(asString(parameters.get("description")));
|
||||
req.setPhase(asString(parameters.get("phase")));
|
||||
req.setPriority(asString(parameters.get("priority")));
|
||||
req.setCategory(asString(parameters.get("category")));
|
||||
req.setImpactLevel(asString(parameters.get("impact_level")));
|
||||
|
||||
String assigneeName = asString(parameters.get("assignee_name"));
|
||||
if (!assigneeName.isBlank()) {
|
||||
userRepository.findByUsername(assigneeName)
|
||||
.or(() -> userRepository.findByUserid(assigneeName))
|
||||
.ifPresent(u -> req.setAssigneeId(u.getId()));
|
||||
}
|
||||
Long departmentId = toLong(parameters.get("department_id"));
|
||||
if (departmentId != null) {
|
||||
req.setDepartmentId(departmentId);
|
||||
}
|
||||
|
||||
User creator = userRepository.findByUserid("admin")
|
||||
.or(() -> userRepository.findByUsername("admin")).orElse(null);
|
||||
var resp = issueService.create(req, creator);
|
||||
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("id", resp.getId());
|
||||
map.put("issue_no", resp.getIssueNo());
|
||||
map.put("title", resp.getTitle());
|
||||
map.put("status", resp.getStatus());
|
||||
map.put("created", true);
|
||||
return map;
|
||||
}
|
||||
|
||||
private String asString(Object value) {
|
||||
return value == null ? "" : String.valueOf(value);
|
||||
}
|
||||
|
||||
private Long toLong(Object value) {
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).longValue();
|
||||
}
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return Long.parseLong(String.valueOf(value));
|
||||
} catch (NumberFormatException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class IssueQueryTool implements Tool {
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
|
||||
public IssueQueryTool(IssueRepository issueRepository) {
|
||||
this.issueRepository = issueRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "query_issue";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "查询指摘详情,参数:issue_id(数字)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
Long issueId = toLong(parameters.get("issue_id"));
|
||||
if (issueId == null) {
|
||||
throw new BusinessException("query_issue 缺少参数 issue_id");
|
||||
}
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在: " + issueId));
|
||||
return toMap(issue);
|
||||
}
|
||||
|
||||
private Map<String, Object> toMap(Issue issue) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("id", issue.getId());
|
||||
map.put("issue_no", issue.getIssueNo());
|
||||
map.put("title", issue.getTitle());
|
||||
map.put("description", issue.getDescription());
|
||||
map.put("status", issue.getStatus());
|
||||
map.put("priority", issue.getPriority());
|
||||
map.put("phase", issue.getPhase());
|
||||
map.put("category", issue.getCategory());
|
||||
map.put("impact_level", issue.getImpactLevel());
|
||||
map.put("sub_project", issue.getSubProject());
|
||||
map.put("pgm_no", issue.getPgmNo());
|
||||
map.put("ng_reason", issue.getNgReason());
|
||||
map.put("response_content", issue.getResponseContent());
|
||||
map.put("agent_status", issue.getAgentStatus());
|
||||
map.put("created_at", issue.getCreatedAt() == null ? null : issue.getCreatedAt().toString());
|
||||
return map;
|
||||
}
|
||||
|
||||
static Long toLong(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).longValue();
|
||||
}
|
||||
try {
|
||||
return Long.parseLong(String.valueOf(value).trim());
|
||||
} catch (NumberFormatException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class IssueUpdateTool implements Tool {
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
|
||||
public IssueUpdateTool(IssueRepository issueRepository) {
|
||||
this.issueRepository = issueRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "update_issue";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "更新指摘字段(写操作,需审批),参数:issue_id(数字), field(字段名), value(值);支持字段:status/priority/phase/title/description/response_content/ng_reason/response_workload/review_workload";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
Long issueId = IssueQueryTool.toLong(parameters.get("issue_id"));
|
||||
if (issueId == null) {
|
||||
throw new BusinessException("update_issue 缺少参数 issue_id");
|
||||
}
|
||||
String field = parameters.get("field") == null ? "" : String.valueOf(parameters.get("field"));
|
||||
if (field.isBlank()) {
|
||||
throw new BusinessException("update_issue 缺少参数 field");
|
||||
}
|
||||
Object value = parameters.get("value");
|
||||
if (value == null) {
|
||||
throw new BusinessException("update_issue 缺少参数 value");
|
||||
}
|
||||
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在: " + issueId));
|
||||
applyField(issue, field, value);
|
||||
issueRepository.save(issue);
|
||||
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("id", issue.getId());
|
||||
map.put("issue_no", issue.getIssueNo());
|
||||
map.put("status", issue.getStatus());
|
||||
map.put("priority", issue.getPriority());
|
||||
map.put("phase", issue.getPhase());
|
||||
map.put("updated", true);
|
||||
return map;
|
||||
}
|
||||
|
||||
private void applyField(Issue issue, String field, Object value) {
|
||||
switch (field) {
|
||||
case "status" -> issue.setStatus(String.valueOf(value));
|
||||
case "priority" -> issue.setPriority(String.valueOf(value));
|
||||
case "phase" -> issue.setPhase(String.valueOf(value));
|
||||
case "title" -> issue.setTitle(String.valueOf(value));
|
||||
case "description" -> issue.setDescription(String.valueOf(value));
|
||||
case "response_content" -> issue.setResponseContent(String.valueOf(value));
|
||||
case "ng_reason" -> issue.setNgReason(String.valueOf(value));
|
||||
case "response_workload" -> issue.setResponseWorkload(toDecimal(value));
|
||||
case "review_workload" -> issue.setReviewWorkload(toDecimal(value));
|
||||
default -> throw new BusinessException("不支持的字段: " + field);
|
||||
}
|
||||
}
|
||||
|
||||
private BigDecimal toDecimal(Object value) {
|
||||
if (value instanceof Number) {
|
||||
return new BigDecimal(value.toString());
|
||||
}
|
||||
try {
|
||||
return new BigDecimal(String.valueOf(value));
|
||||
} catch (NumberFormatException e) {
|
||||
throw new BusinessException("数值字段格式错误: " + value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.service.knowledge.SearchService;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class KnowledgeSearchTool implements Tool {
|
||||
|
||||
private final SearchService searchService;
|
||||
|
||||
public KnowledgeSearchTool(SearchService searchService) {
|
||||
this.searchService = searchService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "search_knowledge";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "检索本地知识库,参数:query(字符串), top_k(可选数字,默认5)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
String query = parameters.get("query") == null ? "" : String.valueOf(parameters.get("query"));
|
||||
if (query.isBlank()) {
|
||||
throw new com.ims.common.exception.BusinessException("search_knowledge 缺少参数 query");
|
||||
}
|
||||
int topK = 5;
|
||||
if (parameters.get("top_k") != null) {
|
||||
topK = Math.max(1, IssueQueryTool.toLong(parameters.get("top_k")).intValue());
|
||||
}
|
||||
List<SearchService.SearchResult> results = searchService.search(query, topK);
|
||||
return results.stream().map(r -> {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("chunk_id", r.getChunkId());
|
||||
m.put("content", r.getContent());
|
||||
m.put("doc_name", r.getDocName());
|
||||
m.put("score", r.getScore());
|
||||
return m;
|
||||
}).toList();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.issue.IssueService;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class NotifyOverdueTool implements Tool {
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
private final IssueService issueService;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public NotifyOverdueTool(IssueRepository issueRepository,
|
||||
IssueService issueService,
|
||||
UserRepository userRepository) {
|
||||
this.issueRepository = issueRepository;
|
||||
this.issueService = issueService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "notify_overdue";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "催办逾期指摘(写操作,需审批),自动查找所有已逾期且未关闭的指摘并向对应者发送催办通知,参数:content(可选,催办内容)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
String content = parameters.get("content") == null ? "" : String.valueOf(parameters.get("content"));
|
||||
List<Issue> overdue = issueRepository.findByIsDeletedFalseAndStatusNotAndDeadlineBefore("closed", LocalDateTime.now());
|
||||
if (overdue.isEmpty()) {
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("notified", 0);
|
||||
map.put("message", "当前没有逾期未关闭的指摘,无需催办。");
|
||||
return map;
|
||||
}
|
||||
List<Long> ids = overdue.stream().map(Issue::getId).toList();
|
||||
User operator = userRepository.findByUserid("admin")
|
||||
.or(() -> userRepository.findByUsername("admin")).orElse(null);
|
||||
int count = issueService.batchNotify(ids, content, operator);
|
||||
|
||||
Map<String, Object> map = new LinkedHashMap<>();
|
||||
map.put("notified", count);
|
||||
map.put("targetCount", ids.size());
|
||||
map.put("message", "已对 " + count + " 条逾期指摘执行催办(已向对应者发送通知)");
|
||||
return map;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface Tool {
|
||||
|
||||
String name();
|
||||
|
||||
String description();
|
||||
|
||||
boolean isWrite();
|
||||
|
||||
Object execute(Map<String, Object> parameters);
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class ToolRegistry {
|
||||
|
||||
private final Map<String, Tool> tools = new LinkedHashMap<>();
|
||||
|
||||
public ToolRegistry(List<Tool> toolList) {
|
||||
for (Tool tool : toolList) {
|
||||
tools.put(tool.name(), tool);
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, String> descriptions() {
|
||||
Map<String, String> result = new LinkedHashMap<>();
|
||||
tools.forEach((name, tool) -> result.put(name, tool.description()));
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<String> names() {
|
||||
return List.copyOf(tools.keySet());
|
||||
}
|
||||
|
||||
public List<Tool> tools() {
|
||||
return List.copyOf(tools.values());
|
||||
}
|
||||
|
||||
public boolean contains(String name) {
|
||||
return tools.containsKey(name);
|
||||
}
|
||||
|
||||
public Tool get(String name) {
|
||||
Tool tool = tools.get(name);
|
||||
if (tool == null) {
|
||||
throw new BusinessException("未知工具: " + name);
|
||||
}
|
||||
return tool;
|
||||
}
|
||||
|
||||
public boolean isWrite(String name) {
|
||||
Tool tool = tools.get(name);
|
||||
return tool != null && tool.isWrite();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
package com.ims.service.agent.tool;
|
||||
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.IssueLog;
|
||||
import com.ims.service.repository.IssueLogRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.DayOfWeek;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class WeeklyReportTool implements Tool {
|
||||
|
||||
private final EntityManager entityManager;
|
||||
private final IssueRepository issueRepository;
|
||||
private final IssueLogRepository issueLogRepository;
|
||||
|
||||
public WeeklyReportTool(EntityManager entityManager,
|
||||
IssueRepository issueRepository,
|
||||
IssueLogRepository issueLogRepository) {
|
||||
this.entityManager = entityManager;
|
||||
this.issueRepository = issueRepository;
|
||||
this.issueLogRepository = issueLogRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String name() {
|
||||
return "weekly_report";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return "生成本周指摘处理统计报告(只读),统计本周新增/关闭/各状态分布/逾期/高优先级数量,参数:无";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWrite() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object execute(Map<String, Object> parameters) {
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDate monday = today.with(DayOfWeek.MONDAY);
|
||||
LocalDateTime weekStart = monday.atStartOfDay();
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
long weekNew = countBySql("select count(*) from issues where is_deleted = false and created_at >= ?1", weekStart);
|
||||
long weekClosed = countBySql("select count(*) from issues where is_deleted = false and closed_at is not null and closed_at >= ?1", weekStart);
|
||||
long overdue = countBySql("select count(*) from issues where is_deleted = false and status <> 'closed' and deadline < ?1", now);
|
||||
long highRisk = countBySql("select count(*) from issues where is_deleted = false and status in ('open','in_progress') and priority in ('urgent','high')");
|
||||
|
||||
Map<String, Long> statusCounts = new LinkedHashMap<>();
|
||||
List<Object[]> rows = entityManager.createNativeQuery(
|
||||
"select status, count(*) from issues where is_deleted = false group by status").getResultList();
|
||||
for (Object[] row : rows) {
|
||||
statusCounts.put((String) row[0], ((Number) row[1]).longValue());
|
||||
}
|
||||
|
||||
List<Issue> recent = issueRepository
|
||||
.findAll(PageRequest.of(0, 5, Sort.by(Sort.Direction.DESC, "createdAt"))).getContent();
|
||||
List<IssueLog> recentLogs = issueLogRepository
|
||||
.findAll(PageRequest.of(0, 5, Sort.by(Sort.Direction.DESC, "createdAt"))).getContent();
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("【本周指摘处理报告】").append(monday.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
|
||||
.append(" ~ ").append(today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))).append("\n");
|
||||
sb.append("一、总量:本周新增 ").append(weekNew).append(" 条,本周关闭 ").append(weekClosed).append(" 条\n");
|
||||
sb.append("二、状态分布:");
|
||||
statusCounts.forEach((k, v) -> sb.append(k).append("=").append(v).append(" "));
|
||||
sb.append("\n");
|
||||
sb.append("三、风险提示:逾期未关闭 ").append(overdue).append(" 条,待处理/进行中 high 及以上优先级 ").append(highRisk).append(" 条\n");
|
||||
sb.append("四、最新新增:");
|
||||
if (recent.isEmpty()) {
|
||||
sb.append("无\n");
|
||||
} else {
|
||||
for (Issue i : recent) {
|
||||
sb.append("\n - ").append(i.getIssueNo()).append(" ").append(i.getTitle())
|
||||
.append(" (").append(i.getStatus()).append(")");
|
||||
}
|
||||
sb.append("\n");
|
||||
}
|
||||
sb.append("五、最近动态:");
|
||||
if (recentLogs.isEmpty()) {
|
||||
sb.append("无\n");
|
||||
} else {
|
||||
for (IssueLog l : recentLogs) {
|
||||
sb.append("\n - ").append(l.getAction());
|
||||
if (l.getIssue() != null) {
|
||||
sb.append(" ").append(l.getIssue().getIssueNo());
|
||||
}
|
||||
if (l.getUser() != null) {
|
||||
sb.append(" by ").append(l.getUser().getUsername());
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
}
|
||||
sb.append("报告生成时间:").append(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private long countBySql(String sql, Object... params) {
|
||||
jakarta.persistence.Query q = entityManager.createNativeQuery(sql);
|
||||
for (int i = 0; i < params.length; i++) {
|
||||
q.setParameter(i + 1, params[i]);
|
||||
}
|
||||
return ((Number) q.getSingleResult()).longValue();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,403 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.ims.api.dto.ai.AiAnalysisRequest;
|
||||
import com.ims.api.dto.ai.AiAnalysisResponse;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.agent.tool.KnowledgeSearchTool;
|
||||
import com.ims.service.entity.AiAnalysis;
|
||||
import com.ims.service.entity.AiFeedback;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.ToolExecution;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.AiAnalysisRepository;
|
||||
import com.ims.service.repository.AiFeedbackRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import com.ims.service.repository.ToolExecutionRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import jakarta.annotation.PostConstruct;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@Service
|
||||
public class AiAnalysisService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AiAnalysisService.class);
|
||||
private static final String SYS_ROLE_TEMPLATE = "SYS_ROLE_001";
|
||||
private static final String ANALYSIS_TEMPLATE = "ANALYSIS_ROOT_CAUSE_001";
|
||||
private static final String ANALYSIS_TOOL_NAME = "ai_analysis";
|
||||
|
||||
private final AiAnalysisRepository analysisRepository;
|
||||
private final AiFeedbackRepository feedbackRepository;
|
||||
private final IssueRepository issueRepository;
|
||||
private final UserRepository userRepository;
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final RoleRepository roleRepository;
|
||||
private final ToolExecutionRepository toolExecutionRepository;
|
||||
private final PromptTemplateEngine promptEngine;
|
||||
private final ModelRoutingService modelRoutingService;
|
||||
private final PromptFormatter promptFormatter;
|
||||
private final AiConfigService aiConfigService;
|
||||
private final SystemContextBuilder systemContextBuilder;
|
||||
private final KeywordExtractor keywordExtractor;
|
||||
private final KnowledgeSearchTool knowledgeSearchTool;
|
||||
|
||||
private final ExecutorService executor = Executors.newFixedThreadPool(1, r -> {
|
||||
Thread t = new Thread(r, "ai-analysis-");
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
});
|
||||
|
||||
public AiAnalysisService(AiAnalysisRepository analysisRepository,
|
||||
AiFeedbackRepository feedbackRepository,
|
||||
IssueRepository issueRepository,
|
||||
UserRepository userRepository,
|
||||
UserRoleRepository userRoleRepository,
|
||||
RoleRepository roleRepository,
|
||||
ToolExecutionRepository toolExecutionRepository,
|
||||
PromptTemplateEngine promptEngine,
|
||||
ModelRoutingService modelRoutingService,
|
||||
PromptFormatter promptFormatter,
|
||||
AiConfigService aiConfigService,
|
||||
SystemContextBuilder systemContextBuilder,
|
||||
KeywordExtractor keywordExtractor,
|
||||
KnowledgeSearchTool knowledgeSearchTool) {
|
||||
this.analysisRepository = analysisRepository;
|
||||
this.feedbackRepository = feedbackRepository;
|
||||
this.issueRepository = issueRepository;
|
||||
this.userRepository = userRepository;
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.roleRepository = roleRepository;
|
||||
this.toolExecutionRepository = toolExecutionRepository;
|
||||
this.promptEngine = promptEngine;
|
||||
this.modelRoutingService = modelRoutingService;
|
||||
this.promptFormatter = promptFormatter;
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.systemContextBuilder = systemContextBuilder;
|
||||
this.keywordExtractor = keywordExtractor;
|
||||
this.knowledgeSearchTool = knowledgeSearchTool;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void resetStaleAnalysis() {
|
||||
try {
|
||||
List<AiAnalysis> stale = analysisRepository.findByStatusIn(
|
||||
List.of("pending", "processing"), PageRequest.of(0, 1000));
|
||||
if (stale.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (AiAnalysis a : stale) {
|
||||
a.setStatus("failed");
|
||||
a.setErrorMessage("服务重启,分析被中断");
|
||||
a.setCompletedAt(LocalDateTime.now());
|
||||
}
|
||||
analysisRepository.saveAll(stale);
|
||||
log.warn("启动时重置遗留分析记录 {} 条为 failed", stale.size());
|
||||
} catch (Exception e) {
|
||||
log.error("重置遗留分析记录失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
public int batchGenerate(AiAnalysisRequest request, Long userId) {
|
||||
List<Long> issueIds = request.getIssueIds();
|
||||
if (issueIds == null || issueIds.isEmpty()) {
|
||||
throw new BusinessException("请选择需要分析的指摘");
|
||||
}
|
||||
for (Long issueId : issueIds) {
|
||||
executor.execute(() -> analyzeOne(issueId, userId));
|
||||
}
|
||||
return issueIds.size();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void analyzeOne(Long issueId, Long userId) {
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在: " + issueId));
|
||||
|
||||
AiAnalysis analysis = new AiAnalysis();
|
||||
analysis.setIssue(issue);
|
||||
analysis.setStatus("processing");
|
||||
analysis.setPromptTemplateId(ANALYSIS_TEMPLATE);
|
||||
analysis.setStartedAt(LocalDateTime.now());
|
||||
analysis.setExtractedKeywords(keywordExtractor.extract(
|
||||
issue.getTitle(), issue.getDescription(), issue.getCategory(), issue.getPhase()));
|
||||
analysisRepository.save(analysis);
|
||||
|
||||
ToolExecution execution = ToolExecution.builder()
|
||||
.toolName(ANALYSIS_TOOL_NAME)
|
||||
.inputParams("{\"issueId\":" + issueId + "}")
|
||||
.status("running")
|
||||
.build();
|
||||
toolExecutionRepository.save(execution);
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
try {
|
||||
User user = userRepository.findWithDepartmentById(userId).orElse(null);
|
||||
Map<String, Object> systemVars = systemContextBuilder.build(user, null);
|
||||
String systemPrompt = promptEngine.render(SYS_ROLE_TEMPLATE, systemVars);
|
||||
|
||||
Map<String, Object> analysisVars = buildAnalysisVariables(issue, analysis.getExtractedKeywords());
|
||||
String userPrompt = promptEngine.render(ANALYSIS_TEMPLATE, analysisVars);
|
||||
|
||||
String provider = modelRoutingService.currentProvider();
|
||||
String modelName = null;
|
||||
ModelRoutingService.CallResult result;
|
||||
try {
|
||||
result = modelRoutingService.call(systemPrompt, userPrompt);
|
||||
} catch (Exception e) {
|
||||
modelName = null;
|
||||
throw e;
|
||||
}
|
||||
modelName = result.provider().equals("deepseek")
|
||||
? aiConfigModelName("deepseek")
|
||||
: aiConfigModelName("ollama");
|
||||
|
||||
ObjectNode json = promptFormatter.extractJsonObject(result.text());
|
||||
if (json == null) {
|
||||
log.warn("AI输出解析失败,尝试修复重试 issueId={}", issueId);
|
||||
json = repairJsonOutput(result.text(), systemPrompt);
|
||||
}
|
||||
if (json == null) {
|
||||
throw new BusinessException("LLM输出无法解析为JSON: " + snippet(result.text()));
|
||||
}
|
||||
|
||||
String category = text(json, "category");
|
||||
String rootCause = text(json, "rootCause");
|
||||
String suggestion = text(json, "suggestion");
|
||||
if ((category == null || category.isBlank())
|
||||
|| (rootCause == null || rootCause.isBlank())
|
||||
|| (suggestion == null || suggestion.isBlank())) {
|
||||
throw new BusinessException("LLM输出缺少分析内容(category/rootCause/suggestion): " + snippet(result.text()));
|
||||
}
|
||||
|
||||
analysis.setCategory(category);
|
||||
analysis.setKeywords(joinArray(json, "keywords"));
|
||||
analysis.setRootCause(rootCause);
|
||||
analysis.setSuggestion(suggestion);
|
||||
analysis.setStatus("completed");
|
||||
analysis.setPromptVersion(1);
|
||||
analysis.setModelProvider(result.provider());
|
||||
analysis.setModelName(modelName);
|
||||
analysis.setCompletedAt(LocalDateTime.now());
|
||||
analysisRepository.save(analysis);
|
||||
|
||||
issue.setAiAnalysisId(analysis.getId());
|
||||
issueRepository.save(issue);
|
||||
|
||||
execution.setStatus("success");
|
||||
execution.setOutputResult("分类: " + (category == null ? "" : category)
|
||||
+ " | 关键词: " + (analysis.getKeywords() == null ? "" : analysis.getKeywords()));
|
||||
execution.setExecutionTimeMs(System.currentTimeMillis() - start);
|
||||
toolExecutionRepository.save(execution);
|
||||
} catch (Exception e) {
|
||||
log.error("AI分析失败 issueId={}", issueId, e);
|
||||
analysis.setStatus("failed");
|
||||
analysis.setErrorMessage(e.getMessage());
|
||||
analysis.setCompletedAt(LocalDateTime.now());
|
||||
analysisRepository.save(analysis);
|
||||
|
||||
execution.setStatus("failed");
|
||||
execution.setOutputResult(snippet(e.getMessage()));
|
||||
execution.setExecutionTimeMs(System.currentTimeMillis() - start);
|
||||
toolExecutionRepository.save(execution);
|
||||
}
|
||||
}
|
||||
|
||||
private ObjectNode repairJsonOutput(String broken, String systemPrompt) {
|
||||
try {
|
||||
String repairPrompt = "以下内容本应是严格的 JSON,但无法解析。"
|
||||
+ "请将修正后的完整 JSON 重新输出,禁止 Markdown 围栏、禁止解释性文字,"
|
||||
+ "直接输出 JSON:\n\n" + broken;
|
||||
ModelRoutingService.CallResult retry = modelRoutingService.call(systemPrompt, repairPrompt);
|
||||
return promptFormatter.extractJsonObject(retry.text());
|
||||
} catch (Exception e) {
|
||||
log.warn("JSON 修复重试失败: {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String aiConfigModelName(String provider) {
|
||||
try {
|
||||
com.ims.api.dto.ai.AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
if ("deepseek".equalsIgnoreCase(provider)) {
|
||||
return cfg.getDeepseekModel();
|
||||
}
|
||||
return cfg.getOllamaChatModel();
|
||||
} catch (Exception ignored) {
|
||||
return provider;
|
||||
}
|
||||
}
|
||||
|
||||
public Page<AiAnalysisResponse> records(Long id, int page, int pageSize, Long issueId, Long departmentId,
|
||||
String status, LocalDate startDate, LocalDate endDate) {
|
||||
Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize);
|
||||
LocalDateTime start = startDate == null ? LocalDateTime.of(1970, 1, 1, 0, 0) : startDate.atStartOfDay();
|
||||
LocalDateTime end = endDate == null ? LocalDateTime.of(2999, 12, 31, 23, 59, 59) : endDate.plusDays(1).atStartOfDay();
|
||||
Page<AiAnalysis> result = analysisRepository.search(id, issueId, departmentId, status, start, end, pageable);
|
||||
return result.map(this::toResponse);
|
||||
}
|
||||
|
||||
public List<AiAnalysisResponse> running() {
|
||||
List<AiAnalysis> list = analysisRepository.findByStatusIn(
|
||||
List.of("pending", "processing"), PageRequest.of(0, 50));
|
||||
return list.stream().map(this::toResponse).toList();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void feedback(Long analysisId, Long userId, Boolean isHelpful, String comment) {
|
||||
AiAnalysis analysis = analysisRepository.findById(analysisId)
|
||||
.orElseThrow(() -> new BusinessException("分析记录不存在: " + analysisId));
|
||||
User user = userRepository.findById(userId)
|
||||
.orElseThrow(() -> new BusinessException("用户不存在: " + userId));
|
||||
|
||||
AiFeedback feedback = AiFeedback.builder()
|
||||
.aiAnalysis(analysis)
|
||||
.user(user)
|
||||
.isHelpful(isHelpful)
|
||||
.comment(comment)
|
||||
.build();
|
||||
feedbackRepository.save(feedback);
|
||||
|
||||
int delta = Boolean.TRUE.equals(isHelpful) ? 1 : -1;
|
||||
int current = analysis.getHelpfulCount() == null ? 0 : analysis.getHelpfulCount();
|
||||
analysis.setHelpfulCount(Math.max(current + delta, 0));
|
||||
analysisRepository.save(analysis);
|
||||
}
|
||||
|
||||
private Map<String, Object> buildAnalysisVariables(Issue issue, String extractedKeywords) {
|
||||
Map<String, Object> vars = new HashMap<>();
|
||||
vars.put("issueNo", issue.getIssueNo());
|
||||
vars.put("issueTitle", issue.getTitle());
|
||||
vars.put("issueDescription", issue.getDescription() == null ? "" : issue.getDescription());
|
||||
vars.put("issuePhase", issue.getPhase() == null ? "" : issue.getPhase());
|
||||
vars.put("issueCategory", issue.getCategory() == null ? "" : issue.getCategory());
|
||||
vars.put("issueImpactLevel", issue.getImpactLevel() == null ? "" : issue.getImpactLevel());
|
||||
vars.put("issueKeywords", extractedKeywords);
|
||||
vars.put("similarCases", buildKnowledgeContext(issue));
|
||||
return vars;
|
||||
}
|
||||
|
||||
private String buildKnowledgeContext(Issue issue) {
|
||||
try {
|
||||
StringBuilder query = new StringBuilder(issue.getTitle() == null ? "" : issue.getTitle());
|
||||
if (issue.getDescription() != null && !issue.getDescription().isBlank()) {
|
||||
if (query.length() > 0) {
|
||||
query.append(" ");
|
||||
}
|
||||
query.append(issue.getDescription());
|
||||
}
|
||||
if (query.length() == 0) {
|
||||
return "";
|
||||
}
|
||||
List<?> results = (List<?>) knowledgeSearchTool.execute(
|
||||
Map.of("query", query.toString(), "top_k", 5));
|
||||
if (results == null || results.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < results.size(); i++) {
|
||||
Object r = results.get(i);
|
||||
if (r instanceof Map) {
|
||||
Map<?, ?> m = (Map<?, ?>) r;
|
||||
sb.append(i + 1).append(". ")
|
||||
.append(m.get("doc_name")).append(": ")
|
||||
.append(m.get("content")).append("\n");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
} catch (Exception e) {
|
||||
log.warn("知识库检索失败,降级为无相似案例: {}", e.getMessage());
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private AiAnalysisResponse toResponse(AiAnalysis a) {
|
||||
AiAnalysisResponse resp = new AiAnalysisResponse();
|
||||
resp.setId(a.getId());
|
||||
resp.setCategory(a.getCategory());
|
||||
resp.setKeywords(a.getKeywords());
|
||||
resp.setExtractedKeywords(a.getExtractedKeywords());
|
||||
resp.setRootCause(a.getRootCause());
|
||||
resp.setSuggestion(a.getSuggestion());
|
||||
resp.setStatus(a.getStatus());
|
||||
resp.setHelpfulCount(a.getHelpfulCount());
|
||||
resp.setPromptTemplateId(a.getPromptTemplateId());
|
||||
resp.setPromptVersion(a.getPromptVersion());
|
||||
resp.setModelProvider(a.getModelProvider());
|
||||
resp.setModelName(a.getModelName());
|
||||
resp.setErrorMessage(a.getErrorMessage());
|
||||
resp.setStartedAt(a.getStartedAt());
|
||||
resp.setCompletedAt(a.getCompletedAt());
|
||||
resp.setCreatedAt(a.getCreatedAt());
|
||||
if (a.getIssue() != null) {
|
||||
resp.setIssueId(a.getIssue().getId());
|
||||
resp.setIssueNo(a.getIssue().getIssueNo());
|
||||
resp.setIssueTitle(a.getIssue().getTitle());
|
||||
if (a.getIssue().getDepartment() != null) {
|
||||
resp.setDepartmentName(a.getIssue().getDepartment().getName());
|
||||
}
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
private String text(ObjectNode json, String field) {
|
||||
JsonNode node = get(json, field);
|
||||
if (node == null || node.isNull()) {
|
||||
return null;
|
||||
}
|
||||
return node.isContainerNode() ? node.toString() : node.asText();
|
||||
}
|
||||
|
||||
private String joinArray(ObjectNode json, String field) {
|
||||
JsonNode node = get(json, field);
|
||||
if (node == null || !node.isArray()) {
|
||||
return "";
|
||||
}
|
||||
List<String> items = new ArrayList<>();
|
||||
for (JsonNode n : (ArrayNode) node) {
|
||||
items.add(n.asText());
|
||||
}
|
||||
return String.join(",", items);
|
||||
}
|
||||
|
||||
private JsonNode get(ObjectNode json, String field) {
|
||||
JsonNode node = json.get(field);
|
||||
if (node != null) {
|
||||
return node;
|
||||
}
|
||||
for (Map.Entry<String, JsonNode> entry : json.properties()) {
|
||||
if (entry.getKey().equalsIgnoreCase(field)) {
|
||||
return entry.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String snippet(String text) {
|
||||
if (text == null) {
|
||||
return "";
|
||||
}
|
||||
return text.length() > 300 ? text.substring(0, 300) + "..." : text;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.ims.api.dto.ai.AiConfigResponse;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import org.springframework.ai.chat.model.ChatModel;
|
||||
import org.springframework.ai.ollama.OllamaChatModel;
|
||||
import org.springframework.ai.ollama.api.OllamaApi;
|
||||
import org.springframework.ai.ollama.api.OllamaOptions;
|
||||
import org.springframework.ai.openai.OpenAiChatModel;
|
||||
import org.springframework.ai.openai.OpenAiChatOptions;
|
||||
import org.springframework.ai.openai.api.OpenAiApi;
|
||||
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.client.RestClient;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
|
||||
@Component
|
||||
public class AiProviderConfig {
|
||||
|
||||
private static final String DEEPSEEK_BASE_URL = "https://api.deepseek.com";
|
||||
private static final int CONNECT_TIMEOUT_MS = 15_000;
|
||||
private static final int READ_TIMEOUT_MS = 900_000;
|
||||
|
||||
private final AiConfigService aiConfigService;
|
||||
|
||||
public AiProviderConfig(AiConfigService aiConfigService) {
|
||||
this.aiConfigService = aiConfigService;
|
||||
}
|
||||
|
||||
public ChatModel buildChatModel(String provider, AiConfigResponse cfg) {
|
||||
if ("deepseek".equalsIgnoreCase(provider)) {
|
||||
return buildDeepseekModel(cfg);
|
||||
}
|
||||
return buildOllamaModel(cfg);
|
||||
}
|
||||
|
||||
public String defaultModelName(String provider, AiConfigResponse cfg) {
|
||||
if ("deepseek".equalsIgnoreCase(provider)) {
|
||||
return cfg.getDeepseekModel();
|
||||
}
|
||||
return cfg.getOllamaChatModel();
|
||||
}
|
||||
|
||||
private ChatModel buildOllamaModel(AiConfigResponse cfg) {
|
||||
String baseUrl = cfg.getOllamaBaseUrl();
|
||||
String model = cfg.getOllamaChatModel();
|
||||
Double temperature = cfg.getOllamaTemperature() != null
|
||||
? cfg.getOllamaTemperature().doubleValue() : 0.3;
|
||||
Integer numPredict = cfg.getOllamaNumPredict() != null ? cfg.getOllamaNumPredict() : 8192;
|
||||
|
||||
OllamaOptions options = OllamaOptions.builder()
|
||||
.model(model)
|
||||
.temperature(temperature)
|
||||
.numPredict(numPredict)
|
||||
.build();
|
||||
return OllamaChatModel.builder()
|
||||
.ollamaApi(new OllamaApi(baseUrl, restClientBuilder(), WebClient.builder()))
|
||||
.defaultOptions(options)
|
||||
.build();
|
||||
}
|
||||
|
||||
private ChatModel buildDeepseekModel(AiConfigResponse cfg) {
|
||||
String apiKey = aiConfigService.getEffectiveApiKey();
|
||||
if (apiKey == null || apiKey.isBlank()) {
|
||||
throw new BusinessException("未配置 DeepSeek API Key");
|
||||
}
|
||||
String model = cfg.getDeepseekModel();
|
||||
OpenAiApi api = new OpenAiApi(DEEPSEEK_BASE_URL, apiKey, restClientBuilder(), WebClient.builder());
|
||||
OpenAiChatOptions options = OpenAiChatOptions.builder()
|
||||
.model(model)
|
||||
.maxCompletionTokens(8192)
|
||||
.build();
|
||||
return new OpenAiChatModel(api, options);
|
||||
}
|
||||
|
||||
private RestClient.Builder restClientBuilder() {
|
||||
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
|
||||
factory.setConnectTimeout(CONNECT_TIMEOUT_MS);
|
||||
factory.setReadTimeout(READ_TIMEOUT_MS);
|
||||
return RestClient.builder().requestFactory(factory);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.api.service.ai.ChatService;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.client.RestClient;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class DeepSeekChatService implements ChatService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(DeepSeekChatService.class);
|
||||
private static final String API_URL = "https://api.deepseek.com/v1/chat/completions";
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
private final AiConfigService aiConfigService;
|
||||
private final RestClient restClient;
|
||||
|
||||
public DeepSeekChatService(ObjectMapper objectMapper, AiConfigService aiConfigService) {
|
||||
this.objectMapper = objectMapper;
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.restClient = RestClient.builder().build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String chat(String systemPrompt, String userPrompt) {
|
||||
String apiKey = aiConfigService.getEffectiveApiKey();
|
||||
if (apiKey == null || apiKey.isBlank()) {
|
||||
throw new IllegalStateException("DeepSeek API key is not configured");
|
||||
}
|
||||
String model = aiConfigService.getConfig().getDeepseekModel();
|
||||
|
||||
Map<String, Object> body = Map.of(
|
||||
"model", model,
|
||||
"messages", List.of(
|
||||
Map.of("role", "system", "content", systemPrompt),
|
||||
Map.of("role", "user", "content", userPrompt)
|
||||
),
|
||||
"stream", false,
|
||||
"temperature", 0.3
|
||||
);
|
||||
|
||||
try {
|
||||
String json = restClient.post()
|
||||
.uri(API_URL)
|
||||
.header("Authorization", "Bearer " + apiKey)
|
||||
.header("Content-Type", "application/json")
|
||||
.body(body)
|
||||
.retrieve()
|
||||
.body(String.class);
|
||||
JsonNode root = objectMapper.readTree(json);
|
||||
JsonNode content = root.path("choices").path(0).path("message").get("content");
|
||||
if (content == null || content.isMissingNode()) {
|
||||
throw new IllegalStateException("DeepSeek chat empty response: " + json);
|
||||
}
|
||||
return content.asText();
|
||||
} catch (Exception e) {
|
||||
log.error("DeepSeek chat failed", e);
|
||||
throw new IllegalStateException("DeepSeek chat failed: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class KeywordExtractor {
|
||||
|
||||
private static final int MAX_KEYWORDS = 4;
|
||||
|
||||
private static final List<String> TERMS = Arrays.asList(
|
||||
"需求", "设计", "编码", "实现", "测试", "验证", "环境", "数据", "接口",
|
||||
"性能", "安全", "流程", "配置", "文档", "依赖", "版本", "部署", "运维",
|
||||
"报错", "崩溃", "超时", "内存", "数据库", "缓存", "并发", "权限",
|
||||
"兼容", "升级", "迁移", "备份", "日志", "异常", "边界", "加载",
|
||||
"响应", "延迟", "质量", "验收", "规范", "标准", "自动化"
|
||||
);
|
||||
|
||||
public String extract(String title, String description, String category, String phase) {
|
||||
String text = (value(title) + " " + value(description) + " " + value(category) + " " + value(phase)).trim();
|
||||
if (text.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
List<String> found = new ArrayList<>();
|
||||
for (String term : TERMS) {
|
||||
if (text.contains(term)) {
|
||||
found.add(term);
|
||||
}
|
||||
}
|
||||
if (found.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
found.sort(Comparator.comparingInt(text::indexOf));
|
||||
if (found.size() > MAX_KEYWORDS) {
|
||||
found = new ArrayList<>(found.subList(0, MAX_KEYWORDS));
|
||||
}
|
||||
return String.join(",", found);
|
||||
}
|
||||
|
||||
private String value(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.ims.api.dto.ai.AiConfigResponse;
|
||||
import com.ims.service.agent.tool.AgentFunctionCallbackAdapter;
|
||||
import com.ims.service.agent.tool.ToolRegistry;
|
||||
import com.ims.service.entity.AiCallLog;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import com.ims.service.repository.AiCallLogRepository;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.ai.chat.messages.AssistantMessage;
|
||||
import org.springframework.ai.chat.messages.SystemMessage;
|
||||
import org.springframework.ai.chat.messages.UserMessage;
|
||||
import org.springframework.ai.chat.model.ChatModel;
|
||||
import org.springframework.ai.chat.model.ChatResponse;
|
||||
import org.springframework.ai.chat.prompt.Prompt;
|
||||
import org.springframework.ai.model.function.FunctionCallback;
|
||||
import org.springframework.ai.ollama.api.OllamaOptions;
|
||||
import org.springframework.ai.openai.OpenAiChatModel;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class ModelRoutingService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(ModelRoutingService.class);
|
||||
|
||||
private final AiProviderConfig aiProviderConfig;
|
||||
private final AiConfigService aiConfigService;
|
||||
private final AiCallLogRepository aiCallLogRepository;
|
||||
private final ToolRegistry toolRegistry;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
private volatile String cachedProvider;
|
||||
private volatile ChatModel cachedChatModel;
|
||||
private volatile String cachedFallbackProvider;
|
||||
private volatile ChatModel cachedFallbackChatModel;
|
||||
|
||||
public ModelRoutingService(AiProviderConfig aiProviderConfig, AiConfigService aiConfigService,
|
||||
AiCallLogRepository aiCallLogRepository,
|
||||
@Lazy ToolRegistry toolRegistry, ObjectMapper objectMapper) {
|
||||
this.aiProviderConfig = aiProviderConfig;
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.aiCallLogRepository = aiCallLogRepository;
|
||||
this.toolRegistry = toolRegistry;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public String currentProvider() {
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
String provider = cfg.getProvider();
|
||||
return provider == null || provider.isBlank() ? "ollama" : provider;
|
||||
}
|
||||
|
||||
public ChatModel chatModel() {
|
||||
String provider = currentProvider();
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
if (cachedProvider == null || !cachedProvider.equals(provider)) {
|
||||
cachedProvider = provider;
|
||||
cachedChatModel = aiProviderConfig.buildChatModel(provider, cfg);
|
||||
log.info("路由切换 ChatModel -> {}", provider);
|
||||
}
|
||||
return cachedChatModel;
|
||||
}
|
||||
|
||||
private ChatModel fallbackChatModel() {
|
||||
String provider = currentProvider();
|
||||
String fallback = "deepseek".equalsIgnoreCase(provider) ? "ollama" : "deepseek";
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
if (cachedFallbackProvider == null || !cachedFallbackProvider.equals(fallback)) {
|
||||
cachedFallbackProvider = fallback;
|
||||
cachedFallbackChatModel = aiProviderConfig.buildChatModel(fallback, cfg);
|
||||
}
|
||||
return cachedFallbackChatModel;
|
||||
}
|
||||
|
||||
public CallResult call(String systemPrompt, String userPrompt) {
|
||||
String provider = currentProvider();
|
||||
try {
|
||||
String text = call(chatModel(), systemPrompt, userPrompt);
|
||||
return new CallResult(provider, text);
|
||||
} catch (Exception primaryError) {
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
boolean fallbackEnabled = cfg.getAutoFallbackEnabled() != null && cfg.getAutoFallbackEnabled();
|
||||
if (!fallbackEnabled) {
|
||||
throw primaryError;
|
||||
}
|
||||
String fallback = "deepseek".equalsIgnoreCase(provider) ? "ollama" : "deepseek";
|
||||
log.warn("主引擎 {} 调用失败,降级到 {}: {}", provider, fallback, primaryError.getMessage());
|
||||
String text = call(fallbackChatModel(), systemPrompt, userPrompt);
|
||||
return new CallResult(fallback, text);
|
||||
}
|
||||
}
|
||||
|
||||
private String call(ChatModel model, String systemPrompt, String userPrompt) {
|
||||
String provider = providerOf(model);
|
||||
long start = System.currentTimeMillis();
|
||||
try {
|
||||
Prompt prompt = new Prompt(new SystemMessage(systemPrompt), new UserMessage(userPrompt));
|
||||
ChatResponse response = model.call(prompt);
|
||||
String text = response.getResult().getOutput().getText();
|
||||
saveLog(provider, modelNameOf(provider), "success",
|
||||
System.currentTimeMillis() - start, snippet(text), null);
|
||||
return text;
|
||||
} catch (Exception e) {
|
||||
saveLog(provider, modelNameOf(provider), "failed",
|
||||
System.currentTimeMillis() - start, null, e.getMessage());
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public ToolCallResult callWithTools(String systemPrompt, String userPrompt) {
|
||||
String provider = currentProvider();
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
long start = System.currentTimeMillis();
|
||||
try {
|
||||
if (!"ollama".equalsIgnoreCase(provider)) {
|
||||
String text = call(chatModel(), systemPrompt, userPrompt);
|
||||
return new ToolCallResult(provider, text, List.of());
|
||||
}
|
||||
List<FunctionCallback> callbacks = new ArrayList<>();
|
||||
for (var tool : toolRegistry.tools()) {
|
||||
callbacks.add(new AgentFunctionCallbackAdapter(tool, objectMapper));
|
||||
}
|
||||
Set<String> names = callbacks.stream().map(FunctionCallback::getName).collect(Collectors.toSet());
|
||||
OllamaOptions options = OllamaOptions.builder()
|
||||
.model(cfg.getOllamaChatModel())
|
||||
.temperature(cfg.getOllamaTemperature() != null ? cfg.getOllamaTemperature().doubleValue() : 0.3)
|
||||
.numPredict(cfg.getOllamaNumPredict() != null ? cfg.getOllamaNumPredict() : 4096)
|
||||
.toolCallbacks(callbacks)
|
||||
.toolNames(names)
|
||||
.internalToolExecutionEnabled(false)
|
||||
.build();
|
||||
Prompt prompt = new Prompt(List.of(new SystemMessage(systemPrompt), new UserMessage(userPrompt)), options);
|
||||
ChatResponse response = chatModel().call(prompt);
|
||||
AssistantMessage message = response.getResult().getOutput();
|
||||
List<ToolCallInfo> infos = new ArrayList<>();
|
||||
if (message.getToolCalls() != null) {
|
||||
for (AssistantMessage.ToolCall tc : message.getToolCalls()) {
|
||||
infos.add(new ToolCallInfo(tc.name(), tc.arguments()));
|
||||
}
|
||||
}
|
||||
String text = message.getText();
|
||||
saveLog(provider, modelNameOf(provider), "success",
|
||||
System.currentTimeMillis() - start, snippet(text), null);
|
||||
return new ToolCallResult(provider, text, infos);
|
||||
} catch (Exception e) {
|
||||
saveLog(provider, modelNameOf(provider), "failed",
|
||||
System.currentTimeMillis() - start, null, e.getMessage());
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
public record ToolCallInfo(String name, String arguments) {
|
||||
}
|
||||
|
||||
public record ToolCallResult(String provider, String text, List<ToolCallInfo> toolCalls) {
|
||||
}
|
||||
|
||||
private String providerOf(ChatModel model) {
|
||||
if (model instanceof OpenAiChatModel) {
|
||||
return "deepseek";
|
||||
}
|
||||
return "ollama";
|
||||
}
|
||||
|
||||
private String modelNameOf(String provider) {
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
return "deepseek".equalsIgnoreCase(provider) ? cfg.getDeepseekModel() : cfg.getOllamaChatModel();
|
||||
}
|
||||
|
||||
private String snippet(String text) {
|
||||
if (text == null) {
|
||||
return null;
|
||||
}
|
||||
return text.length() > 200 ? text.substring(0, 200) : text;
|
||||
}
|
||||
|
||||
private void saveLog(String provider, String model, String status, long latencyMs, String snippet, String error) {
|
||||
try {
|
||||
AiCallLog log = AiCallLog.builder()
|
||||
.provider(provider)
|
||||
.model(model)
|
||||
.status(status)
|
||||
.latencyMs(latencyMs)
|
||||
.responseSnippet(snippet)
|
||||
.errorMessage(error)
|
||||
.build();
|
||||
aiCallLogRepository.save(log);
|
||||
} catch (Exception e) {
|
||||
log.warn("保存 AI 调用日志失败: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public record CallResult(String provider, String text) {
|
||||
}
|
||||
|
||||
public Map<String, Object> test() {
|
||||
String provider = currentProvider();
|
||||
AiConfigResponse cfg = aiConfigService.getConfig();
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
long start = System.currentTimeMillis();
|
||||
try {
|
||||
String text = call(chatModel(), "你是测试助手", "请仅回复两个字:正常");
|
||||
result.put("success", true);
|
||||
result.put("provider", provider);
|
||||
result.put("model", "deepseek".equalsIgnoreCase(provider) ? cfg.getDeepseekModel() : cfg.getOllamaChatModel());
|
||||
result.put("latencyMs", System.currentTimeMillis() - start);
|
||||
result.put("reply", text == null ? "" : (text.length() > 200 ? text.substring(0, 200) : text));
|
||||
} catch (Exception e) {
|
||||
result.put("success", false);
|
||||
result.put("provider", provider);
|
||||
result.put("error", e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.api.service.ai.ChatService;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service("aiChatOllamaService")
|
||||
public class OllamaChatService implements ChatService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(OllamaChatService.class);
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
private final AiConfigService aiConfigService;
|
||||
private final int connectTimeoutMs;
|
||||
private final int readTimeoutMs;
|
||||
|
||||
public OllamaChatService(ObjectMapper objectMapper, AiConfigService aiConfigService,
|
||||
@org.springframework.beans.factory.annotation.Value("${ollama.timeout.connect:10000}") int connectTimeoutMs,
|
||||
@org.springframework.beans.factory.annotation.Value("${ollama.timeout.read:1800000}") int readTimeoutMs) {
|
||||
this.objectMapper = objectMapper;
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.connectTimeoutMs = connectTimeoutMs;
|
||||
this.readTimeoutMs = readTimeoutMs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String chat(String systemPrompt, String userPrompt) {
|
||||
String baseUrl = aiConfigService.getConfig().getOllamaBaseUrl();
|
||||
String model = aiConfigService.getConfig().getOllamaChatModel();
|
||||
if (model == null || model.isBlank()) {
|
||||
throw new IllegalStateException("Ollama chat model is not configured");
|
||||
}
|
||||
|
||||
Map<String, Object> body = Map.of(
|
||||
"model", model,
|
||||
"messages", List.of(
|
||||
Map.of("role", "system", "content", systemPrompt),
|
||||
Map.of("role", "user", "content", userPrompt)
|
||||
),
|
||||
"stream", false,
|
||||
"options", Map.of("temperature", 0.3, "num_predict", 1024)
|
||||
);
|
||||
|
||||
try {
|
||||
String requestBody = objectMapper.writeValueAsString(body);
|
||||
HttpURLConnection conn = (HttpURLConnection) URI.create(baseUrl + "/api/chat").toURL().openConnection();
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("Content-Type", "application/json");
|
||||
conn.setDoOutput(true);
|
||||
conn.setConnectTimeout(connectTimeoutMs);
|
||||
conn.setReadTimeout(readTimeoutMs);
|
||||
|
||||
try (OutputStream os = conn.getOutputStream()) {
|
||||
os.write(requestBody.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
int code = conn.getResponseCode();
|
||||
if (code != 200) {
|
||||
String err = new String(conn.getErrorStream() == null ? new byte[0] : conn.getErrorStream().readAllBytes(), StandardCharsets.UTF_8);
|
||||
throw new IllegalStateException("Ollama chat HTTP " + code + ": " + err);
|
||||
}
|
||||
|
||||
String json = new String(conn.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
|
||||
JsonNode root = objectMapper.readTree(json);
|
||||
JsonNode content = root.path("message").get("content");
|
||||
if (content == null || content.isMissingNode()) {
|
||||
throw new IllegalStateException("Ollama chat empty response: " + json);
|
||||
}
|
||||
return content.asText();
|
||||
} catch (Exception e) {
|
||||
log.error("Ollama chat failed", e);
|
||||
throw new IllegalStateException("Ollama chat failed: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class PromptFormatter {
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
public PromptFormatter(ObjectMapper objectMapper) {
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public ObjectNode extractJsonObject(String output) {
|
||||
if (output == null || output.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
String text = output.trim();
|
||||
if (text.contains("```")) {
|
||||
text = text.replaceAll("```(json)?", "").replaceAll("```", "").trim();
|
||||
}
|
||||
int start = text.indexOf('{');
|
||||
if (start < 0) {
|
||||
return null;
|
||||
}
|
||||
String candidate = extractObject(text, start);
|
||||
if (candidate == null) {
|
||||
return null;
|
||||
}
|
||||
ObjectNode node = tryParse(candidate);
|
||||
if (node != null) {
|
||||
return node;
|
||||
}
|
||||
node = tryParse(escapeNewlinesInStrings(candidate));
|
||||
if (node != null) {
|
||||
return node;
|
||||
}
|
||||
node = tryParse(escapeNewlinesInStrings(candidate) + "}");
|
||||
if (node != null) {
|
||||
return node;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private ObjectNode tryParse(String json) {
|
||||
try {
|
||||
JsonNode node = objectMapper.readTree(json);
|
||||
if (node instanceof ObjectNode) {
|
||||
return (ObjectNode) node;
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String extractObject(String text, int start) {
|
||||
boolean inString = false;
|
||||
boolean escaped = false;
|
||||
int depth = 0;
|
||||
for (int i = start; i < text.length(); i++) {
|
||||
char c = text.charAt(i);
|
||||
if (escaped) {
|
||||
escaped = false;
|
||||
continue;
|
||||
}
|
||||
if (c == '\\') {
|
||||
escaped = true;
|
||||
continue;
|
||||
}
|
||||
if (c == '"') {
|
||||
inString = !inString;
|
||||
continue;
|
||||
}
|
||||
if (!inString) {
|
||||
if (c == '{') {
|
||||
depth++;
|
||||
} else if (c == '}' && --depth == 0) {
|
||||
return text.substring(start, i + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String escapeNewlinesInStrings(String json) {
|
||||
StringBuilder sb = new StringBuilder(json.length());
|
||||
boolean inString = false;
|
||||
boolean escaped = false;
|
||||
for (int i = 0; i < json.length(); i++) {
|
||||
char c = json.charAt(i);
|
||||
if (escaped) {
|
||||
sb.append(c);
|
||||
escaped = false;
|
||||
continue;
|
||||
}
|
||||
if (c == '\\') {
|
||||
sb.append(c);
|
||||
escaped = true;
|
||||
continue;
|
||||
}
|
||||
if (c == '"') {
|
||||
inString = !inString;
|
||||
sb.append(c);
|
||||
continue;
|
||||
}
|
||||
if (inString && (c == '\n' || c == '\r' || c == '\t')) {
|
||||
sb.append("\\n");
|
||||
continue;
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.PromptRenderLog;
|
||||
import com.ims.service.entity.PromptTemplate;
|
||||
import com.ims.service.repository.PromptRenderLogRepository;
|
||||
import com.ims.service.repository.PromptTemplateRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@Service
|
||||
public class PromptTemplateEngine {
|
||||
|
||||
private static final Pattern VAR_PATTERN = Pattern.compile("\\{\\{(\\w+)\\}\\}");
|
||||
|
||||
private final PromptTemplateRepository templateRepository;
|
||||
private final PromptRenderLogRepository renderLogRepository;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
public PromptTemplateEngine(PromptTemplateRepository templateRepository,
|
||||
PromptRenderLogRepository renderLogRepository,
|
||||
ObjectMapper objectMapper) {
|
||||
this.templateRepository = templateRepository;
|
||||
this.renderLogRepository = renderLogRepository;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public PromptTemplate loadActive(String templateId) {
|
||||
return templateRepository.findByTemplateIdAndIsActiveTrue(templateId)
|
||||
.orElseThrow(() -> new BusinessException("Prompt模板不存在或已停用: " + templateId));
|
||||
}
|
||||
|
||||
public String render(String templateId, Map<String, Object> variables) {
|
||||
PromptTemplate template = loadActive(templateId);
|
||||
return render(template, variables);
|
||||
}
|
||||
|
||||
public String render(PromptTemplate template, Map<String, Object> variables) {
|
||||
validateVariables(template, variables);
|
||||
String content = template.getContent();
|
||||
if (variables != null) {
|
||||
for (Map.Entry<String, Object> entry : variables.entrySet()) {
|
||||
String placeholder = "{{" + entry.getKey() + "}}";
|
||||
content = content.replace(placeholder, formatValue(entry.getValue()));
|
||||
}
|
||||
}
|
||||
Matcher matcher = VAR_PATTERN.matcher(content);
|
||||
return matcher.replaceAll("");
|
||||
}
|
||||
|
||||
public String renderAndLog(String templateId, Map<String, Object> variables,
|
||||
String modelProvider, String llmModel) {
|
||||
long start = System.currentTimeMillis();
|
||||
PromptTemplate template = loadActive(templateId);
|
||||
String rendered = render(template, variables);
|
||||
long cost = System.currentTimeMillis() - start;
|
||||
|
||||
PromptRenderLog log = new PromptRenderLog();
|
||||
log.setRequestId(UUID.randomUUID().toString().replace("-", ""));
|
||||
log.setTemplateId(template.getTemplateId());
|
||||
log.setTemplateVersion(template.getVersion());
|
||||
log.setRenderedPrompt(rendered);
|
||||
log.setVariablesUsed(toJson(variables));
|
||||
log.setTokensInput(estimateTokens(rendered));
|
||||
log.setExecutionTimeMs((int) cost);
|
||||
log.setLlmModel(llmModel);
|
||||
log.setModelProvider(modelProvider);
|
||||
renderLogRepository.save(log);
|
||||
return rendered;
|
||||
}
|
||||
|
||||
private void validateVariables(PromptTemplate template, Map<String, Object> variables) {
|
||||
JsonNode requiredVars = parseVariables(template.getVariables());
|
||||
if (requiredVars == null || !requiredVars.isArray()) {
|
||||
return;
|
||||
}
|
||||
for (JsonNode node : requiredVars) {
|
||||
if (node.has("required") && node.get("required").asBoolean()) {
|
||||
String name = node.get("name").asText();
|
||||
Object value = variables == null ? null : variables.get(name);
|
||||
if (value == null || String.valueOf(value).isBlank()) {
|
||||
throw new BusinessException("缺少必需变量: " + name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private JsonNode parseVariables(String variables) {
|
||||
if (variables == null || variables.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return objectMapper.readTree(variables);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String formatValue(Object value) {
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
if (value instanceof String || value instanceof Number || value instanceof Boolean) {
|
||||
return String.valueOf(value);
|
||||
}
|
||||
return toJson(value);
|
||||
}
|
||||
|
||||
private String toJson(Object value) {
|
||||
if (value == null) {
|
||||
return "{}";
|
||||
}
|
||||
try {
|
||||
return objectMapper.writeValueAsString(value);
|
||||
} catch (Exception e) {
|
||||
return String.valueOf(value);
|
||||
}
|
||||
}
|
||||
|
||||
private int estimateTokens(String text) {
|
||||
return text == null ? 0 : (int) Math.ceil(text.length() / 4.0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.ims.api.service.ai.ChatService;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class RoutingChatService implements ChatService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(RoutingChatService.class);
|
||||
|
||||
private final AiConfigService aiConfigService;
|
||||
private final OllamaChatService ollamaChatService;
|
||||
private final DeepSeekChatService deepSeekChatService;
|
||||
|
||||
public RoutingChatService(AiConfigService aiConfigService,
|
||||
OllamaChatService ollamaChatService,
|
||||
DeepSeekChatService deepSeekChatService) {
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.ollamaChatService = ollamaChatService;
|
||||
this.deepSeekChatService = deepSeekChatService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String chat(String systemPrompt, String userPrompt) {
|
||||
String provider = aiConfigService.getConfig().getProvider();
|
||||
boolean fallbackEnabled = Boolean.TRUE.equals(aiConfigService.getConfig().getAutoFallbackEnabled());
|
||||
try {
|
||||
if ("deepseek".equalsIgnoreCase(provider)) {
|
||||
return deepSeekChatService.chat(systemPrompt, userPrompt);
|
||||
}
|
||||
return ollamaChatService.chat(systemPrompt, userPrompt);
|
||||
} catch (Exception e) {
|
||||
if (fallbackEnabled) {
|
||||
try {
|
||||
if ("deepseek".equalsIgnoreCase(provider)) {
|
||||
log.warn("DeepSeek chat failed, fallback to Ollama: {}", e.getMessage());
|
||||
return ollamaChatService.chat(systemPrompt, userPrompt);
|
||||
}
|
||||
log.warn("Ollama chat failed, fallback to DeepSeek: {}", e.getMessage());
|
||||
return deepSeekChatService.chat(systemPrompt, userPrompt);
|
||||
} catch (Exception fe) {
|
||||
log.error("Fallback chat provider also failed", fe);
|
||||
throw new IllegalStateException("AI chat unavailable: " + fe.getMessage(), fe);
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException("AI chat unavailable: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package com.ims.service.ai;
|
||||
|
||||
import com.ims.service.entity.Role;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.entity.UserRole;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class SystemContextBuilder {
|
||||
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final RoleRepository roleRepository;
|
||||
private final ModelRoutingService modelRoutingService;
|
||||
|
||||
public SystemContextBuilder(UserRoleRepository userRoleRepository,
|
||||
RoleRepository roleRepository,
|
||||
ModelRoutingService modelRoutingService) {
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.roleRepository = roleRepository;
|
||||
this.modelRoutingService = modelRoutingService;
|
||||
}
|
||||
|
||||
public Map<String, Object> build(User user, List<String> availableTools) {
|
||||
Map<String, Object> vars = new HashMap<>();
|
||||
if (user != null) {
|
||||
vars.put("currentUserName", user.getUsername());
|
||||
vars.put("currentUserRole", resolveRoleName(user.getId()));
|
||||
vars.put("currentUserDepartment", user.getDepartment() != null ? user.getDepartment().getName() : "");
|
||||
vars.put("agentAutoExecuteEnabled", user.getAgentAutoExecute() != null && user.getAgentAutoExecute());
|
||||
} else {
|
||||
vars.put("currentUserName", "系统");
|
||||
vars.put("currentUserRole", "系统管理员");
|
||||
vars.put("currentUserDepartment", "");
|
||||
vars.put("agentAutoExecuteEnabled", false);
|
||||
}
|
||||
if (availableTools == null || availableTools.isEmpty()) {
|
||||
vars.put("availableTools", "(本任务无需工具)");
|
||||
} else {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (String t : availableTools) {
|
||||
sb.append("- ").append(t).append("\n");
|
||||
}
|
||||
vars.put("availableTools", sb.toString());
|
||||
}
|
||||
vars.put("currentTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
vars.put("modelProvider", modelRoutingService.currentProvider());
|
||||
return vars;
|
||||
}
|
||||
|
||||
private String resolveRoleName(Long userId) {
|
||||
List<UserRole> userRoles = userRoleRepository.findByUserId(userId);
|
||||
if (userRoles.isEmpty()) {
|
||||
return "";
|
||||
}
|
||||
List<String> names = new ArrayList<>();
|
||||
for (UserRole ur : userRoles) {
|
||||
roleRepository.findById(ur.getRoleId()).map(Role::getName).ifPresent(names::add);
|
||||
}
|
||||
return String.join(",", names);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.ims.service.config;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class JacksonConfig {
|
||||
|
||||
@Bean
|
||||
public ObjectMapper objectMapper() {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.registerModule(new JavaTimeModule());
|
||||
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
|
||||
return mapper;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.ims.service.config;
|
||||
|
||||
import com.ims.common.util.JwtUtil;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class JwtConfig {
|
||||
|
||||
@Value("${jwt.secret}")
|
||||
private String secret;
|
||||
|
||||
@Value("${jwt.access-token-expiration}")
|
||||
private long accessTokenExpiration;
|
||||
|
||||
@Value("${jwt.refresh-token-expiration}")
|
||||
private long refreshTokenExpiration;
|
||||
|
||||
@Bean
|
||||
public JwtUtil jwtUtil() {
|
||||
return new JwtUtil(secret, accessTokenExpiration, refreshTokenExpiration);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.ims.service.config;
|
||||
|
||||
import io.minio.MinioClient;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class MinioConfig {
|
||||
|
||||
@Value("${minio.endpoint}")
|
||||
private String endpoint;
|
||||
|
||||
@Value("${minio.access-key}")
|
||||
private String accessKey;
|
||||
|
||||
@Value("${minio.secret-key}")
|
||||
private String secretKey;
|
||||
|
||||
@Bean
|
||||
public MinioClient minioClient() {
|
||||
return MinioClient.builder()
|
||||
.endpoint(endpoint)
|
||||
.credentials(accessKey, secretKey)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.ims.service.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
|
||||
@Configuration
|
||||
public class RedisConfig {
|
||||
|
||||
@Bean
|
||||
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
|
||||
return new StringRedisTemplate(connectionFactory);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.ims.service.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.cors.CorsConfigurationSource;
|
||||
import org.springframework.web.filter.CorsFilter;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig {
|
||||
|
||||
private final CorsConfigurationSource corsConfigurationSource;
|
||||
|
||||
public WebConfig(CorsConfigurationSource corsConfigurationSource) {
|
||||
this.corsConfigurationSource = corsConfigurationSource;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public CorsFilter corsFilter() {
|
||||
return new CorsFilter(corsConfigurationSource);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,206 @@
|
||||
package com.ims.service.dashboard;
|
||||
|
||||
import com.ims.api.dto.dashboard.DashboardStatsResponse;
|
||||
import com.ims.service.entity.IssueLog;
|
||||
import com.ims.service.repository.IssueLogRepository;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class DashboardService {
|
||||
|
||||
private final EntityManager entityManager;
|
||||
private final IssueLogRepository issueLogRepository;
|
||||
|
||||
public DashboardService(EntityManager entityManager, IssueLogRepository issueLogRepository) {
|
||||
this.entityManager = entityManager;
|
||||
this.issueLogRepository = issueLogRepository;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public DashboardStatsResponse stats() {
|
||||
DashboardStatsResponse resp = new DashboardStatsResponse();
|
||||
Map<String, Long> statusCounts = statusCounts();
|
||||
resp.setPendingCount(statusCounts.getOrDefault("open", 0L));
|
||||
resp.setInProgressCount(statusCounts.getOrDefault("in_progress", 0L));
|
||||
resp.setPendingConfirmCount(statusCounts.getOrDefault("pending_confirm", 0L));
|
||||
resp.setClosedCount(statusCounts.getOrDefault("closed", 0L));
|
||||
resp.setTodayNewCount(todayNewCount());
|
||||
resp.setMonthlyClosedCount(monthlyClosedCount());
|
||||
|
||||
List<DashboardStatsResponse.StatusCount> distribution = new ArrayList<>();
|
||||
statusCounts.forEach((k, v) -> distribution.add(new DashboardStatsResponse.StatusCount(k, v)));
|
||||
resp.setStatusDistribution(distribution);
|
||||
|
||||
resp.setTrend(trend7Days());
|
||||
resp.setRecentActivities(recentActivities());
|
||||
resp.setInsights(insights());
|
||||
resp.setCards(buildCards());
|
||||
return resp;
|
||||
}
|
||||
|
||||
private List<DashboardStatsResponse.CardInfo> buildCards() {
|
||||
Map<String, Long> counts = statusCounts();
|
||||
long pending = counts.getOrDefault("open", 0L);
|
||||
long inProgress = counts.getOrDefault("in_progress", 0L);
|
||||
long todayNew = todayNewCount();
|
||||
long monthlyClosed = monthlyClosedCount();
|
||||
|
||||
long overdue = countBySql(
|
||||
"select count(*) from issues where is_deleted = false and status <> 'closed' and deadline < now()");
|
||||
long highRisk = countBySql(
|
||||
"select count(*) from issues where is_deleted = false and status in ('open','in_progress') " +
|
||||
"and priority in ('urgent','high')");
|
||||
|
||||
long yesterdayNew = countCreatedOn(LocalDate.now().minusDays(1));
|
||||
long lastMonthClosed = countClosedInMonth(LocalDate.now().minusMonths(1));
|
||||
|
||||
List<DashboardStatsResponse.CardInfo> cards = new ArrayList<>();
|
||||
cards.add(new DashboardStatsResponse.CardInfo("pendingCount", pending,
|
||||
overdue > 0 ? "其中 " + overdue + " 条已逾期" : "无逾期",
|
||||
overdue > 0 ? "建议启动催办,避免影响工程进度。" : "待处理指摘无逾期,请保持跟进。"));
|
||||
cards.add(new DashboardStatsResponse.CardInfo("inProgressCount", inProgress,
|
||||
highRisk > 0 ? "其中 " + highRisk + " 条 urgent/high" : "暂无高风险",
|
||||
highRisk > 0 ? "高优先级指摘建议优先分配处理。" : "进行中指摘均在正常推进。"));
|
||||
cards.add(new DashboardStatsResponse.CardInfo("monthlyClosedCount", monthlyClosed,
|
||||
lastMonthClosed > 0 ? "较上月" + changeText(monthlyClosed, lastMonthClosed) : "上月无关闭",
|
||||
"本月已关闭 " + monthlyClosed + " 条,处理效率" + (monthlyClosed >= lastMonthClosed ? "较上月提升。" : "较上月下降,建议跟进。")));
|
||||
cards.add(new DashboardStatsResponse.CardInfo("todayNewCount", todayNew,
|
||||
"较昨日" + changeText(todayNew, yesterdayNew),
|
||||
"今日新增 " + todayNew + " 条指摘,请及时确认并分配。"));
|
||||
return cards;
|
||||
}
|
||||
|
||||
private String changeText(long current, long base) {
|
||||
if (base <= 0) {
|
||||
return current > 0 ? " +" + current : " 持平";
|
||||
}
|
||||
long diff = current - base;
|
||||
long pct = Math.round(diff * 100.0 / base);
|
||||
return (diff >= 0 ? " +" : " ") + pct + "%";
|
||||
}
|
||||
|
||||
private long countCreatedOn(LocalDate date) {
|
||||
Object r = entityManager.createQuery(
|
||||
"select count(i) from Issue i where i.createdAt >= :from and i.createdAt < :to and i.isDeleted = false")
|
||||
.setParameter("from", date.atStartOfDay())
|
||||
.setParameter("to", date.plusDays(1).atStartOfDay())
|
||||
.getSingleResult();
|
||||
return ((Number) r).longValue();
|
||||
}
|
||||
|
||||
private long countClosedInMonth(LocalDate month) {
|
||||
Object r = entityManager.createNativeQuery(
|
||||
"select count(*) from issues where is_deleted = false and closed_at is not null " +
|
||||
"and CAST(closed_at AS DATE) >= :from and CAST(closed_at AS DATE) <= :to")
|
||||
.setParameter("from", month.withDayOfMonth(1))
|
||||
.setParameter("to", month.withDayOfMonth(month.lengthOfMonth()))
|
||||
.getSingleResult();
|
||||
return ((Number) r).longValue();
|
||||
}
|
||||
|
||||
private long monthlyClosedCount() {
|
||||
LocalDate today = LocalDate.now();
|
||||
Object r = entityManager.createNativeQuery(
|
||||
"select count(*) from issues where is_deleted = false and closed_at is not null " +
|
||||
"and CAST(closed_at AS DATE) >= :from and CAST(closed_at AS DATE) <= :to")
|
||||
.setParameter("from", today.withDayOfMonth(1))
|
||||
.setParameter("to", today)
|
||||
.getSingleResult();
|
||||
return ((Number) r).longValue();
|
||||
}
|
||||
|
||||
private List<DashboardStatsResponse.Insight> insights() {
|
||||
List<DashboardStatsResponse.Insight> list = new ArrayList<>();
|
||||
long highRisk = countBySql(
|
||||
"select count(*) from issues where is_deleted = false and status in ('open','in_progress') " +
|
||||
"and priority in ('urgent','high')");
|
||||
long overdue = countBySql(
|
||||
"select count(*) from issues where is_deleted = false and status <> 'closed' and deadline < now()");
|
||||
long kbDocs = countBySql(
|
||||
"select count(*) from knowledge_documents where status = 'completed'");
|
||||
list.add(new DashboardStatsResponse.Insight("high-risk", "高风险警报",
|
||||
"进行中有 " + highRisk + " 条 urgent/high 优先级的指摘,建议优先跟进。"));
|
||||
list.add(new DashboardStatsResponse.Insight("reminder", "任务提醒",
|
||||
"有 " + overdue + " 条指摘已逾期未关闭,建议启动自动催办。"));
|
||||
list.add(new DashboardStatsResponse.Insight("suggestion", "自动对应建议",
|
||||
"知识库已收录 " + kbDocs + " 篇案例文档,Agent 可检索相似方案辅助对应。"));
|
||||
return list;
|
||||
}
|
||||
|
||||
private long countBySql(String sql) {
|
||||
Object r = entityManager.createNativeQuery(sql).getSingleResult();
|
||||
return ((Number) r).longValue();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private Map<String, Long> statusCounts() {
|
||||
Map<String, Long> map = new HashMap<>();
|
||||
List<Object[]> rows = entityManager.createNativeQuery(
|
||||
"select status, count(*) from issues where is_deleted = false group by status").getResultList();
|
||||
for (Object[] row : rows) {
|
||||
map.put((String) row[0], ((Number) row[1]).longValue());
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private long todayNewCount() {
|
||||
LocalDateTime start = LocalDate.now().atStartOfDay();
|
||||
Object r = entityManager.createQuery(
|
||||
"select count(i) from Issue i where i.createdAt >= :start and i.isDeleted = false")
|
||||
.setParameter("start", start).getSingleResult();
|
||||
return ((Number) r).longValue();
|
||||
}
|
||||
|
||||
private List<DashboardStatsResponse.DailyTrend> trend7Days() {
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDate from = today.minusDays(6);
|
||||
Map<LocalDate, Long> created = countGroupedByDay("created_at", from);
|
||||
Map<LocalDate, Long> closed = countGroupedByDay("closed_at", from);
|
||||
List<DashboardStatsResponse.DailyTrend> trend = new ArrayList<>();
|
||||
for (int i = 0; i < 7; i++) {
|
||||
LocalDate d = from.plusDays(i);
|
||||
trend.add(new DashboardStatsResponse.DailyTrend(
|
||||
d.toString(), created.getOrDefault(d, 0L), closed.getOrDefault(d, 0L)));
|
||||
}
|
||||
return trend;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private Map<LocalDate, Long> countGroupedByDay(String column, LocalDate from) {
|
||||
Map<LocalDate, Long> map = new HashMap<>();
|
||||
List<Object[]> rows = entityManager.createNativeQuery(
|
||||
"select CAST(" + column + " AS DATE), count(*) from issues where " + column +
|
||||
" >= :from and is_deleted = false group by 1")
|
||||
.setParameter("from", from.atStartOfDay()).getResultList();
|
||||
for (Object[] row : rows) {
|
||||
map.put(((java.sql.Date) row[0]).toLocalDate(), ((Number) row[1]).longValue());
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private List<DashboardStatsResponse.Activity> recentActivities() {
|
||||
List<IssueLog> logs = issueLogRepository
|
||||
.findAll(PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "createdAt"))).getContent();
|
||||
List<DashboardStatsResponse.Activity> list = new ArrayList<>();
|
||||
for (IssueLog l : logs) {
|
||||
list.add(new DashboardStatsResponse.Activity(
|
||||
l.getUser() != null ? l.getUser().getUsername() : "",
|
||||
l.getAction(),
|
||||
l.getIssue() != null && l.getIssue().getIssueNo() != null ? l.getIssue().getIssueNo() : "",
|
||||
l.getIssue() != null && l.getIssue().getTitle() != null ? l.getIssue().getTitle() : "",
|
||||
l.getCreatedAt()));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.JdbcTypeCode;
|
||||
import org.hibernate.type.SqlTypes;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "agent_memories")
|
||||
public class AgentMemory {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "issue_summary", nullable = false, columnDefinition = "TEXT")
|
||||
private String issueSummary;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(name = "solution_steps", nullable = false, columnDefinition = "jsonb")
|
||||
private String solutionSteps;
|
||||
|
||||
@Column(name = "effectiveness_score", precision = 3, scale = 2)
|
||||
private BigDecimal effectivenessScore;
|
||||
|
||||
@Column(columnDefinition = "vector(1536)")
|
||||
private String embedding;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
if (effectivenessScore == null) effectivenessScore = BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.JdbcTypeCode;
|
||||
import org.hibernate.type.SqlTypes;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "agent_plans")
|
||||
public class AgentPlan {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "issue_id", nullable = true)
|
||||
private Issue issue;
|
||||
|
||||
@Column(nullable = false, columnDefinition = "TEXT")
|
||||
private String goal;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(name = "plan_steps", nullable = false, columnDefinition = "jsonb")
|
||||
private String planSteps;
|
||||
|
||||
@Column(length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "requires_approval")
|
||||
private Boolean requiresApproval;
|
||||
|
||||
@Column(name = "approval_status", length = 20)
|
||||
private String approvalStatus;
|
||||
|
||||
@Column(name = "approval_comment", length = 500)
|
||||
private String approvalComment;
|
||||
|
||||
@Column(name = "agent_message", columnDefinition = "TEXT")
|
||||
private String agentMessage;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "created_by")
|
||||
private User createdBy;
|
||||
|
||||
@Column(name = "model_provider", length = 20)
|
||||
private String modelProvider;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "completed_at")
|
||||
private LocalDateTime completedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (status == null) status = "pending";
|
||||
if (requiresApproval == null) requiresApproval = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "ai_analysis")
|
||||
public class AiAnalysis {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "issue_id", nullable = false)
|
||||
private Issue issue;
|
||||
|
||||
@Column(length = 100)
|
||||
private String category;
|
||||
|
||||
@Column(length = 500)
|
||||
private String keywords;
|
||||
|
||||
@Column(name = "extracted_keywords", length = 500)
|
||||
private String extractedKeywords;
|
||||
|
||||
@Column(name = "root_cause", length = 1000)
|
||||
private String rootCause;
|
||||
|
||||
@Column(columnDefinition = "TEXT")
|
||||
private String suggestion;
|
||||
|
||||
@Column(length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "helpful_count")
|
||||
private Integer helpfulCount;
|
||||
|
||||
@Column(name = "prompt_template_id", length = 100)
|
||||
private String promptTemplateId;
|
||||
|
||||
@Column(name = "prompt_version")
|
||||
private Integer promptVersion;
|
||||
|
||||
@Column(name = "model_provider", length = 20)
|
||||
private String modelProvider;
|
||||
|
||||
@Column(name = "model_name", length = 50)
|
||||
private String modelName;
|
||||
|
||||
@Column(name = "error_message", columnDefinition = "TEXT")
|
||||
private String errorMessage;
|
||||
|
||||
@Column(name = "started_at")
|
||||
private LocalDateTime startedAt;
|
||||
|
||||
@Column(name = "completed_at")
|
||||
private LocalDateTime completedAt;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (status == null) status = "pending";
|
||||
if (helpfulCount == null) helpfulCount = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "ai_call_logs")
|
||||
public class AiCallLog {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(length = 20)
|
||||
private String provider;
|
||||
|
||||
@Column(length = 100)
|
||||
private String model;
|
||||
|
||||
@Column(length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "latency_ms")
|
||||
private Long latencyMs;
|
||||
|
||||
@Column(name = "response_snippet", columnDefinition = "TEXT")
|
||||
private String responseSnippet;
|
||||
|
||||
@Column(name = "error_message", columnDefinition = "TEXT")
|
||||
private String errorMessage;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "ai_feedback")
|
||||
public class AiFeedback {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "ai_analysis_id", nullable = false)
|
||||
private AiAnalysis aiAnalysis;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "user_id", nullable = false)
|
||||
private User user;
|
||||
|
||||
@Column(name = "is_helpful", nullable = false)
|
||||
private Boolean isHelpful;
|
||||
|
||||
@Column(length = 500)
|
||||
private String comment;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "attachments")
|
||||
public class Attachment {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "issue_id", nullable = false)
|
||||
private Issue issue;
|
||||
|
||||
@Column(name = "file_name", nullable = false, length = 200)
|
||||
private String fileName;
|
||||
|
||||
@Column(name = "file_path", nullable = false, length = 500)
|
||||
private String filePath;
|
||||
|
||||
@Column(name = "file_size", nullable = false)
|
||||
private Long fileSize;
|
||||
|
||||
@Column(name = "mime_type", length = 100)
|
||||
private String mimeType;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "uploaded_by", nullable = false)
|
||||
private User uploadedBy;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "departments")
|
||||
public class Department {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false, length = 100)
|
||||
private String name;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "parent_id")
|
||||
private Department parent;
|
||||
|
||||
@Column(name = "sort_order")
|
||||
private Integer sortOrder;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "import_records")
|
||||
public class ImportRecord {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "file_name", nullable = false, length = 255)
|
||||
private String fileName;
|
||||
|
||||
@Column(name = "total_count", nullable = false)
|
||||
private Integer totalCount;
|
||||
|
||||
@Column(name = "success_count", nullable = false)
|
||||
private Integer successCount;
|
||||
|
||||
@Column(name = "fail_count", nullable = false)
|
||||
private Integer failCount;
|
||||
|
||||
@Column(nullable = false, length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "error_log", columnDefinition = "TEXT")
|
||||
private String errorLog;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "operator_id")
|
||||
private User operator;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (status == null) status = "success";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "issues")
|
||||
public class Issue {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "issue_no", nullable = false, unique = true, length = 20)
|
||||
private String issueNo;
|
||||
|
||||
@Column(nullable = false, length = 200)
|
||||
private String title;
|
||||
|
||||
@Column(columnDefinition = "TEXT")
|
||||
private String description;
|
||||
|
||||
@Column(nullable = false, length = 30)
|
||||
private String status;
|
||||
|
||||
@Column(nullable = false, length = 10)
|
||||
private String priority;
|
||||
|
||||
private LocalDateTime deadline;
|
||||
|
||||
@Column(name = "review_date")
|
||||
private LocalDateTime reviewDate;
|
||||
|
||||
@Column(length = 50)
|
||||
private String phase;
|
||||
|
||||
@Column(name = "sub_project", length = 100)
|
||||
private String subProject;
|
||||
|
||||
@Column(length = 50)
|
||||
private String category;
|
||||
|
||||
@Column(name = "impact_level", length = 10)
|
||||
private String impactLevel;
|
||||
|
||||
@Column(name = "impact_scope", length = 200)
|
||||
private String impactScope;
|
||||
|
||||
@Column(length = 100)
|
||||
private String deployment;
|
||||
|
||||
@Column(name = "pgm_no", length = 50)
|
||||
private String pgmNo;
|
||||
|
||||
@Column(name = "review_workload", precision = 5, scale = 1)
|
||||
private BigDecimal reviewWorkload;
|
||||
|
||||
@Column(name = "response_workload", precision = 5, scale = 1)
|
||||
private BigDecimal responseWorkload;
|
||||
|
||||
@Column(name = "response_content", columnDefinition = "TEXT")
|
||||
private String responseContent;
|
||||
|
||||
@Column(name = "ng_reason", length = 200)
|
||||
private String ngReason;
|
||||
|
||||
@Column(name = "response_completed_at")
|
||||
private LocalDateTime responseCompletedAt;
|
||||
|
||||
@Column(name = "confirm_at")
|
||||
private LocalDateTime confirmAt;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "creator_id", nullable = false)
|
||||
private User creator;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "assignee_id")
|
||||
private User assignee;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "department_id", nullable = false)
|
||||
private Department department;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "reviewer_id")
|
||||
private User reviewer;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "validator_id")
|
||||
private User validator;
|
||||
|
||||
@Column(name = "ai_analysis_id")
|
||||
private Long aiAnalysisId;
|
||||
|
||||
@Column(name = "agent_last_plan_id")
|
||||
private Long agentLastPlanId;
|
||||
|
||||
@Column(name = "agent_status", length = 20)
|
||||
private String agentStatus;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@Column(name = "closed_at")
|
||||
private LocalDateTime closedAt;
|
||||
|
||||
@Column(name = "is_deleted")
|
||||
private Boolean isDeleted;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
if (status == null) status = "draft";
|
||||
if (priority == null) priority = "medium";
|
||||
if (agentStatus == null) agentStatus = "human_driven";
|
||||
if (isDeleted == null) isDeleted = false;
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "issue_logs")
|
||||
public class IssueLog {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "issue_id", nullable = false)
|
||||
private Issue issue;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "user_id", nullable = false)
|
||||
private User user;
|
||||
|
||||
@Column(nullable = false, length = 30)
|
||||
private String action;
|
||||
|
||||
@Column(name = "from_status", length = 30)
|
||||
private String fromStatus;
|
||||
|
||||
@Column(name = "to_status", length = 30)
|
||||
private String toStatus;
|
||||
|
||||
@Column(length = 500)
|
||||
private String remark;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.JdbcTypeCode;
|
||||
import org.hibernate.type.SqlTypes;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "knowledge_chunks")
|
||||
public class KnowledgeChunk {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "doc_id", nullable = false)
|
||||
private KnowledgeDocument doc;
|
||||
|
||||
@Column(nullable = false, columnDefinition = "TEXT")
|
||||
private String content;
|
||||
|
||||
@Column(nullable = false, columnDefinition = "vector(768)")
|
||||
private String embedding;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(columnDefinition = "jsonb")
|
||||
private String metadata;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "knowledge_documents")
|
||||
public class KnowledgeDocument {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false, length = 255)
|
||||
private String name;
|
||||
|
||||
@Column(name = "file_path", nullable = false, length = 500)
|
||||
private String filePath;
|
||||
|
||||
@Column(name = "file_size", nullable = false)
|
||||
private Long fileSize;
|
||||
|
||||
@Column(name = "file_type", nullable = false, length = 20)
|
||||
private String fileType;
|
||||
|
||||
@Column(name = "chunk_count")
|
||||
private Integer chunkCount;
|
||||
|
||||
@Column(length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "error_message", columnDefinition = "TEXT")
|
||||
private String errorMessage;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "uploaded_by", nullable = false)
|
||||
private User uploadedBy;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
if (status == null) status = "pending";
|
||||
if (chunkCount == null) chunkCount = 0;
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "knowledge_search_logs")
|
||||
public class KnowledgeSearchLog {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "user_id")
|
||||
private User user;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "issue_id")
|
||||
private Issue issue;
|
||||
|
||||
@Column(nullable = false, columnDefinition = "TEXT")
|
||||
private String query;
|
||||
|
||||
@Column(name = "rewritten_query", columnDefinition = "TEXT")
|
||||
private String rewrittenQuery;
|
||||
|
||||
@Column(name = "top_k")
|
||||
private Integer topK;
|
||||
|
||||
@Column(name = "total_matches")
|
||||
private Integer totalMatches;
|
||||
|
||||
@Column(name = "duration_ms")
|
||||
private Integer durationMs;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (topK == null) topK = 5;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "notifications")
|
||||
public class Notification {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "user_id", nullable = false)
|
||||
private User user;
|
||||
|
||||
@Column(nullable = false, length = 200)
|
||||
private String title;
|
||||
|
||||
@Column(nullable = false, length = 1000)
|
||||
private String content;
|
||||
|
||||
@Column(nullable = false, length = 30)
|
||||
private String type;
|
||||
|
||||
@Column(length = 500)
|
||||
private String link;
|
||||
|
||||
@Column(name = "is_read")
|
||||
private Boolean isRead;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "issue_id")
|
||||
private Issue issue;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (isRead == null) isRead = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "permissions")
|
||||
public class Permission {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false, unique = true, length = 100)
|
||||
private String code;
|
||||
|
||||
@Column(nullable = false, length = 100)
|
||||
private String name;
|
||||
|
||||
@Column(nullable = false, length = 50)
|
||||
private String resource;
|
||||
|
||||
@Column(length = 255)
|
||||
private String description;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "phase_rules")
|
||||
public class PhaseRule {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false, length = 100)
|
||||
private String keyword;
|
||||
|
||||
@Column(nullable = false, length = 50)
|
||||
private String phase;
|
||||
|
||||
@Column(name = "match_mode", nullable = false, length = 20)
|
||||
private String matchMode;
|
||||
|
||||
@Column(length = 50)
|
||||
private String source;
|
||||
|
||||
@Column(nullable = false)
|
||||
private Boolean active;
|
||||
|
||||
@Column(name = "sort_order", nullable = false)
|
||||
private Integer sortOrder;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
if (matchMode == null) matchMode = "contains";
|
||||
if (active == null) active = true;
|
||||
if (sortOrder == null) sortOrder = 0;
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.JdbcTypeCode;
|
||||
import org.hibernate.type.SqlTypes;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "prompt_render_logs")
|
||||
public class PromptRenderLog {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "request_id", nullable = false, length = 64)
|
||||
private String requestId;
|
||||
|
||||
@Column(name = "template_id", nullable = false, length = 100)
|
||||
private String templateId;
|
||||
|
||||
@Column(name = "template_version", nullable = false)
|
||||
private Integer templateVersion;
|
||||
|
||||
@Column(name = "rendered_prompt", nullable = false, columnDefinition = "TEXT")
|
||||
private String renderedPrompt;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(name = "variables_used", columnDefinition = "jsonb")
|
||||
private String variablesUsed;
|
||||
|
||||
@Column(name = "tokens_input")
|
||||
private Integer tokensInput;
|
||||
|
||||
@Column(name = "tokens_output")
|
||||
private Integer tokensOutput;
|
||||
|
||||
@Column(name = "execution_time_ms")
|
||||
private Integer executionTimeMs;
|
||||
|
||||
@Column(name = "llm_model", length = 50)
|
||||
private String llmModel;
|
||||
|
||||
@Column(name = "model_provider", length = 20)
|
||||
private String modelProvider;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.JdbcTypeCode;
|
||||
import org.hibernate.type.SqlTypes;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "prompt_templates")
|
||||
public class PromptTemplate {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "template_id", nullable = false, unique = true, length = 100)
|
||||
private String templateId;
|
||||
|
||||
@Column(nullable = false, length = 200)
|
||||
private String name;
|
||||
|
||||
@Column(nullable = false, length = 50)
|
||||
private String category;
|
||||
|
||||
@Column(nullable = false)
|
||||
private Integer version;
|
||||
|
||||
@Column(nullable = false, columnDefinition = "TEXT")
|
||||
private String content;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(columnDefinition = "jsonb")
|
||||
private String variables;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(name = "output_schema", columnDefinition = "jsonb")
|
||||
private String outputSchema;
|
||||
|
||||
@Column(name = "is_active")
|
||||
private Boolean isActive;
|
||||
|
||||
@Column(name = "is_default")
|
||||
private Boolean isDefault;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "created_by")
|
||||
private User createdBy;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
if (version == null) version = 1;
|
||||
if (isActive == null) isActive = true;
|
||||
if (isDefault == null) isDefault = false;
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "prompt_template_versions")
|
||||
public class PromptTemplateVersion {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "template_id", nullable = false, length = 100)
|
||||
private String templateId;
|
||||
|
||||
@Column(nullable = false)
|
||||
private Integer version;
|
||||
|
||||
@Column(nullable = false, columnDefinition = "TEXT")
|
||||
private String content;
|
||||
|
||||
@Column(name = "change_log", length = 500)
|
||||
private String changeLog;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "created_by")
|
||||
private User createdBy;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "roles")
|
||||
public class Role {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false, unique = true, length = 50)
|
||||
private String name;
|
||||
|
||||
@Column(length = 255)
|
||||
private String description;
|
||||
|
||||
@Column(name = "agent_auto_execute")
|
||||
private Boolean agentAutoExecute;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (agentAutoExecute == null) agentAutoExecute = false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "role_permissions")
|
||||
@IdClass(RolePermission.RolePermissionId.class)
|
||||
public class RolePermission {
|
||||
@Id
|
||||
@Column(name = "role_id")
|
||||
private Long roleId;
|
||||
|
||||
@Id
|
||||
@Column(name = "permission_id")
|
||||
private Long permissionId;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class RolePermissionId implements Serializable {
|
||||
private Long roleId;
|
||||
private Long permissionId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "task_executions")
|
||||
public class TaskExecution {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(name = "task_id", nullable = false, unique = true, length = 64)
|
||||
private String taskId;
|
||||
|
||||
@Column(name = "task_type", nullable = false, length = 30)
|
||||
private String taskType;
|
||||
|
||||
@Column(nullable = false, length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "result_url", length = 500)
|
||||
private String resultUrl;
|
||||
|
||||
@Column(name = "error_message", columnDefinition = "TEXT")
|
||||
private String errorMessage;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "created_by", nullable = false)
|
||||
private User createdBy;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "started_at")
|
||||
private LocalDateTime startedAt;
|
||||
|
||||
@Column(name = "completed_at")
|
||||
private LocalDateTime completedAt;
|
||||
|
||||
@Column(name = "retry_count")
|
||||
private Integer retryCount;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (status == null) status = "pending";
|
||||
if (retryCount == null) retryCount = 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import org.hibernate.annotations.JdbcTypeCode;
|
||||
import org.hibernate.type.SqlTypes;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "tool_executions")
|
||||
public class ToolExecution {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "plan_id")
|
||||
private AgentPlan plan;
|
||||
|
||||
@Column(name = "tool_name", nullable = false, length = 50)
|
||||
private String toolName;
|
||||
|
||||
@JdbcTypeCode(SqlTypes.JSON)
|
||||
@Column(name = "input_params", nullable = false, columnDefinition = "jsonb")
|
||||
private String inputParams;
|
||||
|
||||
@Column(name = "output_result", columnDefinition = "TEXT")
|
||||
private String outputResult;
|
||||
|
||||
@Column(length = 20)
|
||||
private String status;
|
||||
|
||||
@Column(name = "execution_time_ms")
|
||||
private Long executionTimeMs;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
if (status == null) status = "success";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "users")
|
||||
public class User {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@Column(nullable = false, unique = true, length = 50)
|
||||
private String userid;
|
||||
|
||||
@Column(nullable = false, unique = true, length = 50)
|
||||
private String username;
|
||||
|
||||
@Column(length = 100)
|
||||
private String email;
|
||||
|
||||
@Column(name = "password_hash", nullable = false, length = 255)
|
||||
private String passwordHash;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name = "department_id", nullable = false)
|
||||
private Department department;
|
||||
|
||||
@Column(name = "is_active")
|
||||
private Boolean isActive;
|
||||
|
||||
@Column(name = "agent_auto_execute")
|
||||
private Boolean agentAutoExecute;
|
||||
|
||||
@Column(name = "last_login_at")
|
||||
private LocalDateTime lastLoginAt;
|
||||
|
||||
@Column(name = "created_at", updatable = false)
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@Column(name = "updated_at")
|
||||
private LocalDateTime updatedAt;
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
createdAt = LocalDateTime.now();
|
||||
updatedAt = LocalDateTime.now();
|
||||
if (isActive == null) isActive = true;
|
||||
if (agentAutoExecute == null) agentAutoExecute = false;
|
||||
}
|
||||
|
||||
@PreUpdate
|
||||
protected void onUpdate() {
|
||||
updatedAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.ims.service.entity;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.*;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@Entity
|
||||
@Table(name = "user_roles")
|
||||
@IdClass(UserRole.UserRoleId.class)
|
||||
public class UserRole {
|
||||
@Id
|
||||
@Column(name = "user_id")
|
||||
private Long userId;
|
||||
|
||||
@Id
|
||||
@Column(name = "role_id")
|
||||
private Long roleId;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class UserRoleId implements Serializable {
|
||||
private Long userId;
|
||||
private Long roleId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package com.ims.service.issue;
|
||||
|
||||
import com.ims.api.dto.issue.AttachmentResponse;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Attachment;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.AttachmentRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import io.minio.GetObjectArgs;
|
||||
import io.minio.MinioClient;
|
||||
import io.minio.PutObjectArgs;
|
||||
import io.minio.RemoveObjectArgs;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
public class AttachmentService {
|
||||
|
||||
private final AttachmentRepository attachmentRepository;
|
||||
private final IssueRepository issueRepository;
|
||||
private final MinioClient minioClient;
|
||||
|
||||
@Value("${minio.bucket}")
|
||||
private String bucket;
|
||||
|
||||
public AttachmentService(AttachmentRepository attachmentRepository,
|
||||
IssueRepository issueRepository,
|
||||
MinioClient minioClient) {
|
||||
this.attachmentRepository = attachmentRepository;
|
||||
this.issueRepository = issueRepository;
|
||||
this.minioClient = minioClient;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public List<AttachmentResponse> listByIssue(Long issueId) {
|
||||
return attachmentRepository.findByIssueId(issueId).stream().map(this::toResponse).toList();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public AttachmentResponse upload(Long issueId, MultipartFile file, User user) {
|
||||
Issue issue = issueRepository.findById(issueId)
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在"));
|
||||
String objectKey = "attachments/" + issueId + "/" + UUID.randomUUID() + "_" + file.getOriginalFilename();
|
||||
try (var is = file.getInputStream()) {
|
||||
minioClient.putObject(PutObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(objectKey)
|
||||
.stream(is, file.getSize(), -1)
|
||||
.contentType(file.getContentType())
|
||||
.build());
|
||||
} catch (Exception e) {
|
||||
throw new BusinessException("附件上传失败: " + e.getMessage());
|
||||
}
|
||||
Attachment att = Attachment.builder()
|
||||
.issue(issue)
|
||||
.fileName(file.getOriginalFilename())
|
||||
.filePath(objectKey)
|
||||
.fileSize(file.getSize())
|
||||
.mimeType(file.getContentType())
|
||||
.uploadedBy(user)
|
||||
.build();
|
||||
return toResponse(attachmentRepository.save(att));
|
||||
}
|
||||
|
||||
public void download(Long attachmentId, HttpServletResponse response) {
|
||||
Attachment att = attachmentRepository.findById(attachmentId)
|
||||
.orElseThrow(() -> new BusinessException("附件不存在"));
|
||||
try (var obj = minioClient.getObject(GetObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(att.getFilePath())
|
||||
.build())) {
|
||||
String mime = att.getMimeType() != null ? att.getMimeType() : "application/octet-stream";
|
||||
String encoded = URLEncoder.encode(att.getFileName(), StandardCharsets.UTF_8).replace("+", "%20");
|
||||
response.setContentType(mime);
|
||||
response.setHeader("Content-Disposition", "attachment; filename=\"" + encoded + "\"");
|
||||
obj.transferTo(response.getOutputStream());
|
||||
response.flushBuffer();
|
||||
} catch (Exception e) {
|
||||
throw new BusinessException("附件下载失败");
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void delete(Long attachmentId) {
|
||||
Attachment att = attachmentRepository.findById(attachmentId)
|
||||
.orElseThrow(() -> new BusinessException("附件不存在"));
|
||||
try {
|
||||
minioClient.removeObject(RemoveObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(att.getFilePath())
|
||||
.build());
|
||||
} catch (Exception ignored) {}
|
||||
attachmentRepository.deleteById(attachmentId);
|
||||
}
|
||||
|
||||
private AttachmentResponse toResponse(Attachment a) {
|
||||
AttachmentResponse resp = new AttachmentResponse();
|
||||
resp.setId(a.getId());
|
||||
resp.setFileName(a.getFileName());
|
||||
resp.setFileSize(a.getFileSize());
|
||||
resp.setMimeType(a.getMimeType());
|
||||
resp.setFilePath(a.getFilePath());
|
||||
resp.setUploadedByName(a.getUploadedBy() != null ? a.getUploadedBy().getUsername() : null);
|
||||
resp.setCreatedAt(a.getCreatedAt());
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,468 @@
|
||||
package com.ims.service.issue;
|
||||
|
||||
import com.ims.api.dto.issue.IssueCreateRequest;
|
||||
import com.ims.api.dto.issue.IssueListRequest;
|
||||
import com.ims.api.dto.issue.IssueResponse;
|
||||
import com.ims.api.dto.issue.IssueUpdateRequest;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.IssueLog;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.notification.NotificationService;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import com.ims.service.repository.IssueLogRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.security.DataScope;
|
||||
import com.ims.service.security.DataScopeContext;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.TypedQuery;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.Year;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@Service
|
||||
public class IssueService {
|
||||
|
||||
public static final String STATUS_DRAFT = "draft";
|
||||
public static final String STATUS_OPEN = "open";
|
||||
public static final String STATUS_IN_PROGRESS = "in_progress";
|
||||
public static final String STATUS_RESOLVED = "resolved";
|
||||
public static final String STATUS_VERIFIED = "verified";
|
||||
public static final String STATUS_CLOSED = "closed";
|
||||
public static final String STATUS_REJECTED = "rejected";
|
||||
|
||||
private static final Map<String, Set<String>> TRANSITIONS = Map.of(
|
||||
STATUS_DRAFT, Set.of(STATUS_OPEN),
|
||||
STATUS_OPEN, Set.of(STATUS_DRAFT, STATUS_IN_PROGRESS, STATUS_REJECTED),
|
||||
STATUS_IN_PROGRESS, Set.of(STATUS_OPEN, STATUS_RESOLVED, STATUS_REJECTED),
|
||||
STATUS_RESOLVED, Set.of(STATUS_IN_PROGRESS, STATUS_VERIFIED, STATUS_REJECTED),
|
||||
STATUS_VERIFIED, Set.of(STATUS_RESOLVED, STATUS_IN_PROGRESS, STATUS_CLOSED, STATUS_REJECTED),
|
||||
STATUS_CLOSED, Set.of(),
|
||||
STATUS_REJECTED, Set.of(STATUS_OPEN, STATUS_CLOSED));
|
||||
|
||||
private static final Map<String, String> STATUS_LABELS = Map.of(
|
||||
STATUS_DRAFT, "草稿",
|
||||
STATUS_OPEN, "待处理",
|
||||
STATUS_IN_PROGRESS, "进行中",
|
||||
STATUS_RESOLVED, "已解决",
|
||||
STATUS_VERIFIED, "已验证",
|
||||
STATUS_CLOSED, "已关闭",
|
||||
STATUS_REJECTED, "已驳回");
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
private final IssueLogRepository issueLogRepository;
|
||||
private final UserRepository userRepository;
|
||||
private final DepartmentRepository departmentRepository;
|
||||
private final NotificationService notificationService;
|
||||
private final EntityManager entityManager;
|
||||
|
||||
public IssueService(IssueRepository issueRepository,
|
||||
IssueLogRepository issueLogRepository,
|
||||
UserRepository userRepository,
|
||||
DepartmentRepository departmentRepository,
|
||||
NotificationService notificationService,
|
||||
EntityManager entityManager) {
|
||||
this.issueRepository = issueRepository;
|
||||
this.issueLogRepository = issueLogRepository;
|
||||
this.userRepository = userRepository;
|
||||
this.departmentRepository = departmentRepository;
|
||||
this.notificationService = notificationService;
|
||||
this.entityManager = entityManager;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public IssueResponse create(IssueCreateRequest req, User creator) {
|
||||
Department department = departmentRepository.findById(
|
||||
req.getDepartmentId() != null ? req.getDepartmentId() : creator.getDepartment().getId())
|
||||
.orElseThrow(() -> new BusinessException("部门不存在"));
|
||||
|
||||
String createStatus = req.getStatus() != null ? req.getStatus() : STATUS_DRAFT;
|
||||
if (!STATUS_DRAFT.equals(createStatus)) {
|
||||
throw new BusinessException("新建指摘仅支持草稿状态");
|
||||
}
|
||||
|
||||
Issue issue = Issue.builder()
|
||||
.issueNo(generateIssueNo())
|
||||
.title(req.getTitle())
|
||||
.description(req.getDescription())
|
||||
.status(createStatus)
|
||||
.priority(req.getPriority() != null ? req.getPriority() : "medium")
|
||||
.deadline(req.getDeadline())
|
||||
.phase(req.getPhase())
|
||||
.subProject(req.getSubProject())
|
||||
.category(req.getCategory())
|
||||
.impactLevel(req.getImpactLevel())
|
||||
.impactScope(req.getImpactScope())
|
||||
.deployment(req.getDeployment())
|
||||
.pgmNo(req.getPgmNo())
|
||||
.reviewWorkload(req.getReviewWorkload())
|
||||
.responseWorkload(req.getResponseWorkload())
|
||||
.responseContent(req.getResponseContent())
|
||||
.ngReason(req.getNgReason())
|
||||
.responseCompletedAt(req.getResponseCompletedAt())
|
||||
.confirmAt(req.getConfirmAt())
|
||||
.creator(creator)
|
||||
.assignee(resolveUser(req.getAssigneeId()))
|
||||
.department(department)
|
||||
.reviewer(resolveUser(req.getReviewerId()))
|
||||
.validator(resolveUser(req.getValidatorId()))
|
||||
.isDeleted(false)
|
||||
.build();
|
||||
issue = issueRepository.save(issue);
|
||||
log(issue, creator, "CREATE", null, issue.getStatus(), "创建指摘");
|
||||
return toResponse(issue);
|
||||
}
|
||||
|
||||
@DataScope
|
||||
@Transactional(readOnly = true)
|
||||
public PageResult<IssueResponse> list(IssueListRequest req) {
|
||||
StringBuilder jpql = new StringBuilder("select i from Issue i where i.isDeleted = false");
|
||||
StringBuilder countJpql = new StringBuilder("select count(i) from Issue i where i.isDeleted = false");
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
|
||||
appendIfPresent(jpql, countJpql, params, "i.status = :status", "status", req.getStatus());
|
||||
appendIfPresent(jpql, countJpql, params, "i.phase = :phase", "phase", req.getPhase());
|
||||
appendIfPresent(jpql, countJpql, params, "i.subProject = :subProject", "subProject", req.getSubProject());
|
||||
appendIfPresent(jpql, countJpql, params, "i.priority = :priority", "priority", req.getPriority());
|
||||
appendIfPresent(jpql, countJpql, params, "i.impactLevel = :impactLevel", "impactLevel", req.getImpactLevel());
|
||||
if (req.getAssigneeId() != null) {
|
||||
jpql.append(" and i.assignee.id = :assigneeId");
|
||||
countJpql.append(" and i.assignee.id = :assigneeId");
|
||||
params.put("assigneeId", req.getAssigneeId());
|
||||
}
|
||||
if (req.getDepartmentId() != null) {
|
||||
jpql.append(" and i.department.id = :departmentId");
|
||||
countJpql.append(" and i.department.id = :departmentId");
|
||||
params.put("departmentId", req.getDepartmentId());
|
||||
}
|
||||
if (req.getStartDate() != null) {
|
||||
jpql.append(" and i.createdAt >= :startDate");
|
||||
countJpql.append(" and i.createdAt >= :startDate");
|
||||
params.put("startDate", req.getStartDate());
|
||||
}
|
||||
if (req.getEndDate() != null) {
|
||||
jpql.append(" and i.createdAt <= :endDate");
|
||||
countJpql.append(" and i.createdAt <= :endDate");
|
||||
params.put("endDate", req.getEndDate());
|
||||
}
|
||||
if (req.getKeyword() != null && !req.getKeyword().isBlank()) {
|
||||
String kw = "%" + req.getKeyword() + "%";
|
||||
jpql.append(" and (i.title like :kw or i.issueNo like :kw or i.description like :kw)");
|
||||
countJpql.append(" and (i.title like :kw or i.issueNo like :kw or i.description like :kw)");
|
||||
params.put("kw", kw);
|
||||
}
|
||||
Set<Long> scopeDeptIds = DataScopeContext.get();
|
||||
if (scopeDeptIds != null && !scopeDeptIds.isEmpty()) {
|
||||
jpql.append(" and i.department.id in :scopeDeptIds");
|
||||
countJpql.append(" and i.department.id in :scopeDeptIds");
|
||||
params.put("scopeDeptIds", scopeDeptIds);
|
||||
}
|
||||
jpql.append(" order by i.createdAt desc");
|
||||
|
||||
int p = Math.max(1, req.getPage());
|
||||
int ps = req.getPageSize() > 0 ? req.getPageSize() : 20;
|
||||
|
||||
TypedQuery<Issue> query = entityManager.createQuery(jpql.toString(), Issue.class);
|
||||
TypedQuery<Long> countQuery = entityManager.createQuery(countJpql.toString(), Long.class);
|
||||
params.forEach((k, v) -> {
|
||||
query.setParameter(k, v);
|
||||
countQuery.setParameter(k, v);
|
||||
});
|
||||
query.setFirstResult((p - 1) * ps).setMaxResults(ps);
|
||||
|
||||
long total = countQuery.getSingleResult();
|
||||
List<IssueResponse> items = query.getResultList().stream().map(this::toResponse).toList();
|
||||
return new PageResult<>(items, total, p, ps);
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public IssueResponse detail(Long id) {
|
||||
return toResponse(getIssue(id));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public IssueResponse update(Long id, IssueUpdateRequest req, User user) {
|
||||
Issue issue = getIssue(id);
|
||||
if (req.getTitle() != null) issue.setTitle(req.getTitle());
|
||||
if (req.getDescription() != null) issue.setDescription(req.getDescription());
|
||||
if (req.getPriority() != null) issue.setPriority(req.getPriority());
|
||||
if (req.getDeadline() != null) issue.setDeadline(req.getDeadline());
|
||||
if (req.getPhase() != null) issue.setPhase(req.getPhase());
|
||||
if (req.getSubProject() != null) issue.setSubProject(req.getSubProject());
|
||||
if (req.getCategory() != null) issue.setCategory(req.getCategory());
|
||||
if (req.getImpactLevel() != null) issue.setImpactLevel(req.getImpactLevel());
|
||||
if (req.getImpactScope() != null) issue.setImpactScope(req.getImpactScope());
|
||||
if (req.getDeployment() != null) issue.setDeployment(req.getDeployment());
|
||||
if (req.getPgmNo() != null) issue.setPgmNo(req.getPgmNo());
|
||||
if (req.getReviewWorkload() != null) issue.setReviewWorkload(req.getReviewWorkload());
|
||||
if (req.getResponseWorkload() != null) issue.setResponseWorkload(req.getResponseWorkload());
|
||||
if (req.getResponseContent() != null) issue.setResponseContent(req.getResponseContent());
|
||||
if (req.getNgReason() != null) issue.setNgReason(req.getNgReason());
|
||||
if (req.getResponseCompletedAt() != null) issue.setResponseCompletedAt(req.getResponseCompletedAt());
|
||||
if (req.getConfirmAt() != null) issue.setConfirmAt(req.getConfirmAt());
|
||||
if (req.getAssigneeId() != null) issue.setAssignee(resolveUser(req.getAssigneeId()));
|
||||
if (req.getDepartmentId() != null) {
|
||||
issue.setDepartment(departmentRepository.findById(req.getDepartmentId())
|
||||
.orElseThrow(() -> new BusinessException("部门不存在")));
|
||||
}
|
||||
if (req.getReviewerId() != null) issue.setReviewer(resolveUser(req.getReviewerId()));
|
||||
if (req.getValidatorId() != null) issue.setValidator(resolveUser(req.getValidatorId()));
|
||||
issueRepository.save(issue);
|
||||
log(issue, user, "UPDATE", null, null, "更新指摘");
|
||||
return toResponse(issue);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void delete(Long id, User user) {
|
||||
Issue issue = getIssue(id);
|
||||
issue.setIsDeleted(true);
|
||||
issueRepository.save(issue);
|
||||
log(issue, user, "DELETE", null, null, "删除指摘");
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public IssueResponse changeStatus(Long id, String newStatus, String remark, User user) {
|
||||
Issue issue = getIssue(id);
|
||||
String from = issue.getStatus();
|
||||
if (!TRANSITIONS.getOrDefault(from, Set.of()).contains(newStatus)) {
|
||||
throw new BusinessException("非法的状态流转: " + from + " -> " + newStatus);
|
||||
}
|
||||
issue.setStatus(newStatus);
|
||||
if (STATUS_CLOSED.equals(newStatus)) {
|
||||
issue.setClosedAt(LocalDateTime.now());
|
||||
}
|
||||
issueRepository.save(issue);
|
||||
log(issue, user, "STATUS_CHANGE", from, newStatus, remark != null ? remark : "状态流转");
|
||||
sendStatusNotification(issue, from, newStatus);
|
||||
return toResponse(issue);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void changeAgentMode(Long id, String mode, User user) {
|
||||
if (!"human_driven".equals(mode) && !"agent_driven".equals(mode)) {
|
||||
throw new BusinessException("非法模式: " + mode);
|
||||
}
|
||||
Issue issue = getIssue(id);
|
||||
issue.setAgentStatus(mode);
|
||||
issueRepository.save(issue);
|
||||
log(issue, user, "AGENT_MODE", null, null, "切换Agent驱动模式: " + mode);
|
||||
}
|
||||
|
||||
@DataScope
|
||||
@Transactional(readOnly = true)
|
||||
public List<Issue> findAllFiltered(IssueListRequest req) {
|
||||
StringBuilder jpql = new StringBuilder("select i from Issue i where i.isDeleted = false");
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
appendIfPresent(jpql, jpql, params, "i.status = :status", "status", req.getStatus());
|
||||
appendIfPresent(jpql, jpql, params, "i.phase = :phase", "phase", req.getPhase());
|
||||
appendIfPresent(jpql, jpql, params, "i.subProject = :subProject", "subProject", req.getSubProject());
|
||||
appendIfPresent(jpql, jpql, params, "i.priority = :priority", "priority", req.getPriority());
|
||||
appendIfPresent(jpql, jpql, params, "i.impactLevel = :impactLevel", "impactLevel", req.getImpactLevel());
|
||||
if (req.getAssigneeId() != null) {
|
||||
jpql.append(" and i.assignee.id = :assigneeId");
|
||||
params.put("assigneeId", req.getAssigneeId());
|
||||
}
|
||||
if (req.getDepartmentId() != null) {
|
||||
jpql.append(" and i.department.id = :departmentId");
|
||||
params.put("departmentId", req.getDepartmentId());
|
||||
}
|
||||
if (req.getStartDate() != null) {
|
||||
jpql.append(" and i.createdAt >= :startDate");
|
||||
params.put("startDate", req.getStartDate());
|
||||
}
|
||||
if (req.getEndDate() != null) {
|
||||
jpql.append(" and i.createdAt <= :endDate");
|
||||
params.put("endDate", req.getEndDate());
|
||||
}
|
||||
if (req.getKeyword() != null && !req.getKeyword().isBlank()) {
|
||||
String kw = "%" + req.getKeyword() + "%";
|
||||
jpql.append(" and (i.title like :kw or i.issueNo like :kw or i.description like :kw)");
|
||||
params.put("kw", kw);
|
||||
}
|
||||
Set<Long> scopeDeptIds = DataScopeContext.get();
|
||||
if (scopeDeptIds != null && !scopeDeptIds.isEmpty()) {
|
||||
jpql.append(" and i.department.id in :scopeDeptIds");
|
||||
params.put("scopeDeptIds", scopeDeptIds);
|
||||
}
|
||||
jpql.append(" order by i.createdAt desc");
|
||||
TypedQuery<Issue> query = entityManager.createQuery(jpql.toString(), Issue.class);
|
||||
params.forEach(query::setParameter);
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public int batchAssign(List<Long> issueIds, Long assigneeId, User user) {
|
||||
User assignee = resolveUser(assigneeId);
|
||||
if (assignee == null) {
|
||||
throw new BusinessException("担当者不存在");
|
||||
}
|
||||
int count = 0;
|
||||
for (Long id : issueIds) {
|
||||
Issue issue = getIssue(id);
|
||||
issue.setAssignee(assignee);
|
||||
issueRepository.save(issue);
|
||||
log(issue, user, "BATCH_ASSIGN", null, null, "批量统一分配担当者");
|
||||
notificationService.notify(assignee, "指摘分配: " + issue.getIssueNo(),
|
||||
"您被分配为指摘《" + issue.getTitle() + "》的担当者,请及时处理。",
|
||||
"assign", "/issues/" + issue.getId(), issue);
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public int batchNotify(List<Long> issueIds, String content, User user) {
|
||||
int count = 0;
|
||||
String msg = (content != null && !content.isBlank()) ? content : "您的指摘已逾期或即将到期,请尽快处理。";
|
||||
for (Long id : issueIds) {
|
||||
Issue issue = getIssue(id);
|
||||
if (issue.getAssignee() != null) {
|
||||
notificationService.notify(issue.getAssignee(), "指摘催办: " + issue.getIssueNo(),
|
||||
"指摘《" + issue.getTitle() + "》" + msg,
|
||||
"reminder", "/issues/" + issue.getId(), issue);
|
||||
}
|
||||
log(issue, user, "BATCH_NOTIFY", null, null, "批量催办");
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public List<Map<String, Object>> logs(Long issueId) {
|
||||
return issueLogRepository.findByIssueIdOrderByCreatedAtDesc(issueId).stream().map(l -> {
|
||||
Map<String, Object> m = new HashMap<>();
|
||||
m.put("action", l.getAction());
|
||||
m.put("fromStatus", l.getFromStatus());
|
||||
m.put("toStatus", l.getToStatus());
|
||||
m.put("remark", l.getRemark());
|
||||
m.put("userName", l.getUser() != null ? l.getUser().getUsername() : "");
|
||||
m.put("createdAt", l.getCreatedAt());
|
||||
return m;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
private void appendIfPresent(StringBuilder jpql, StringBuilder countJpql, Map<String, Object> params,
|
||||
String clause, String key, String value) {
|
||||
if (value != null && !value.isBlank()) {
|
||||
jpql.append(" and ").append(clause);
|
||||
countJpql.append(" and ").append(clause);
|
||||
params.put(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
private String generateIssueNo() {
|
||||
String prefix = "ISSUE-" + Year.now().getValue() + "-";
|
||||
TypedQuery<String> q = entityManager.createQuery(
|
||||
"select max(i.issueNo) from Issue i where i.issueNo like :prefix", String.class)
|
||||
.setParameter("prefix", prefix + "%");
|
||||
String max = q.getSingleResult();
|
||||
int next = 1;
|
||||
if (max != null && max.length() > prefix.length()) {
|
||||
try {
|
||||
next = Integer.parseInt(max.substring(prefix.length())) + 1;
|
||||
} catch (NumberFormatException ignored) {}
|
||||
}
|
||||
return prefix + String.format("%03d", next);
|
||||
}
|
||||
|
||||
private User resolveUser(Long userId) {
|
||||
return userId != null ? userRepository.findById(userId).orElse(null) : null;
|
||||
}
|
||||
|
||||
private Issue getIssue(Long id) {
|
||||
return issueRepository.findById(id)
|
||||
.filter(i -> !Boolean.TRUE.equals(i.getIsDeleted()))
|
||||
.orElseThrow(() -> new BusinessException("指摘不存在"));
|
||||
}
|
||||
|
||||
private void log(Issue issue, User user, String action, String from, String to, String remark) {
|
||||
IssueLog l = IssueLog.builder()
|
||||
.issue(issue)
|
||||
.user(user)
|
||||
.action(action)
|
||||
.fromStatus(from)
|
||||
.toStatus(to)
|
||||
.remark(remark)
|
||||
.build();
|
||||
issueLogRepository.save(l);
|
||||
}
|
||||
|
||||
private void sendStatusNotification(Issue issue, String from, String to) {
|
||||
String title = "指摘状态更新: " + issue.getIssueNo();
|
||||
String content = "指摘《" + issue.getTitle() + "》状态从 " + STATUS_LABELS.getOrDefault(from, from)
|
||||
+ " 变更为 " + STATUS_LABELS.getOrDefault(to, to);
|
||||
String link = "/issues/" + issue.getId();
|
||||
if (issue.getAssignee() != null) {
|
||||
notificationService.notify(issue.getAssignee(), title, content, "status", link, issue);
|
||||
}
|
||||
notificationService.notify(issue.getCreator(), title, content, "status", link, issue);
|
||||
}
|
||||
|
||||
private IssueResponse toResponse(Issue i) {
|
||||
IssueResponse r = new IssueResponse();
|
||||
r.setId(i.getId());
|
||||
r.setIssueNo(i.getIssueNo());
|
||||
r.setTitle(i.getTitle());
|
||||
r.setDescription(i.getDescription());
|
||||
r.setStatus(i.getStatus());
|
||||
r.setPriority(i.getPriority());
|
||||
r.setDeadline(i.getDeadline());
|
||||
r.setPhase(i.getPhase());
|
||||
r.setSubProject(i.getSubProject());
|
||||
r.setCategory(i.getCategory());
|
||||
r.setImpactLevel(i.getImpactLevel());
|
||||
r.setImpactScope(i.getImpactScope());
|
||||
r.setDeployment(i.getDeployment());
|
||||
r.setPgmNo(i.getPgmNo());
|
||||
r.setReviewWorkload(i.getReviewWorkload());
|
||||
r.setResponseWorkload(i.getResponseWorkload());
|
||||
r.setResponseContent(i.getResponseContent());
|
||||
r.setNgReason(i.getNgReason());
|
||||
r.setResponseCompletedAt(i.getResponseCompletedAt());
|
||||
r.setConfirmAt(i.getConfirmAt());
|
||||
if (i.getCreator() != null) {
|
||||
r.setCreatorId(i.getCreator().getId());
|
||||
r.setCreatorName(i.getCreator().getUsername());
|
||||
}
|
||||
if (i.getAssignee() != null) {
|
||||
r.setAssigneeId(i.getAssignee().getId());
|
||||
r.setAssigneeName(i.getAssignee().getUsername());
|
||||
}
|
||||
if (i.getDepartment() != null) {
|
||||
r.setDepartmentId(i.getDepartment().getId());
|
||||
r.setDepartmentName(i.getDepartment().getName());
|
||||
}
|
||||
if (i.getReviewer() != null) {
|
||||
r.setReviewerId(i.getReviewer().getId());
|
||||
r.setReviewerName(i.getReviewer().getUsername());
|
||||
}
|
||||
if (i.getValidator() != null) {
|
||||
r.setValidatorId(i.getValidator().getId());
|
||||
r.setValidatorName(i.getValidator().getUsername());
|
||||
}
|
||||
r.setAgentStatus(i.getAgentStatus());
|
||||
r.setAgentLastPlanId(i.getAgentLastPlanId());
|
||||
r.setCreatedAt(i.getCreatedAt());
|
||||
r.setUpdatedAt(i.getUpdatedAt());
|
||||
r.setClosedAt(i.getClosedAt());
|
||||
return r;
|
||||
}
|
||||
|
||||
public static String escapeCsv(String s) {
|
||||
if (s == null) return "";
|
||||
if (s.contains(",") || s.contains("\"") || s.contains("\n")) {
|
||||
return "\"" + s.replace("\"", "\"\"") + "\"";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,253 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.api.dto.ai.AiConfigRequest;
|
||||
import com.ims.api.dto.ai.AiConfigResponse;
|
||||
import com.ims.service.notification.NotificationService;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Service
|
||||
public class AiConfigService {
|
||||
|
||||
private static final String REDIS_KEY = "ai:config";
|
||||
|
||||
private final StringRedisTemplate redisTemplate;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final NotificationService notificationService;
|
||||
|
||||
@Value("${ai.provider}")
|
||||
private String defaultProvider;
|
||||
|
||||
@Value("${ollama.base-url:http://localhost:11434}")
|
||||
private String defaultOllamaUrl;
|
||||
|
||||
@Value("${ollama.embedding.model}")
|
||||
private String defaultOllamaModel;
|
||||
|
||||
@Value("${ollama.chat.model}")
|
||||
private String defaultOllamaChatModel;
|
||||
|
||||
@Value("${ollama.chat.options.temperature:0.3}")
|
||||
private Float defaultTemperature;
|
||||
|
||||
@Value("${ollama.chat.options.num-predict:4096}")
|
||||
private Integer defaultNumPredict;
|
||||
|
||||
@Value("${deepseek.api.key}")
|
||||
private String defaultDeepseekKey;
|
||||
|
||||
@Value("${deepseek.model}")
|
||||
private String defaultDeepseekModel;
|
||||
|
||||
@Value("${deepseek.embedding-model}")
|
||||
private String defaultDeepseekEmbeddingModel;
|
||||
|
||||
@Value("${ai.auto-fallback-enabled}")
|
||||
private Boolean defaultAutoFallback;
|
||||
|
||||
@Value("${agent.max-steps:10}")
|
||||
private Integer defaultAgentMaxSteps;
|
||||
|
||||
@Value("${agent.auto-execute-high-risk:false}")
|
||||
private Boolean defaultAutoExecuteHighRisk;
|
||||
|
||||
@Value("${agent.user-rate-limit:10}")
|
||||
private Integer defaultUserRateLimit;
|
||||
|
||||
@Value("${knowledge.chunk-size:200}")
|
||||
private Integer defaultChunkSize;
|
||||
|
||||
@Value("${knowledge.chunk-overlap:40}")
|
||||
private Integer defaultChunkOverlap;
|
||||
|
||||
@Value("${knowledge.max-upload-size:52428800}")
|
||||
private Long defaultMaxUploadSize;
|
||||
|
||||
public AiConfigService(StringRedisTemplate redisTemplate, ObjectMapper objectMapper,
|
||||
NotificationService notificationService) {
|
||||
this.redisTemplate = redisTemplate;
|
||||
this.objectMapper = objectMapper;
|
||||
this.notificationService = notificationService;
|
||||
}
|
||||
|
||||
public AiConfigResponse getConfig() {
|
||||
String json = redisTemplate.opsForValue().get(REDIS_KEY);
|
||||
if (json != null) {
|
||||
try {
|
||||
AiConfigRequest request = objectMapper.readValue(json, AiConfigRequest.class);
|
||||
return toResponse(request);
|
||||
} catch (JsonProcessingException ignored) {}
|
||||
}
|
||||
return defaultConfig();
|
||||
}
|
||||
|
||||
public void updateConfig(AiConfigRequest request) {
|
||||
AiConfigRequest merged = readStored();
|
||||
if (merged == null) {
|
||||
merged = new AiConfigRequest();
|
||||
copyResponseToRequest(defaultConfig(), merged);
|
||||
}
|
||||
String before = merged.getProvider();
|
||||
mergeNonNull(merged, request);
|
||||
saveConfig(merged);
|
||||
String after = merged.getProvider();
|
||||
if (after != null && !after.equals(before)) {
|
||||
notificationService.notifyAdmins("AI引擎切换",
|
||||
"AI 推理引擎由 " + (before == null ? "默认" : before) + " 切换为 " + after);
|
||||
}
|
||||
}
|
||||
|
||||
private AiConfigRequest readStored() {
|
||||
String json = redisTemplate.opsForValue().get(REDIS_KEY);
|
||||
if (json == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return objectMapper.readValue(json, AiConfigRequest.class);
|
||||
} catch (JsonProcessingException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void saveConfig(AiConfigRequest request) {
|
||||
try {
|
||||
String json = objectMapper.writeValueAsString(request);
|
||||
redisTemplate.opsForValue().set(REDIS_KEY, json, 24, TimeUnit.HOURS);
|
||||
} catch (JsonProcessingException ignored) {}
|
||||
}
|
||||
|
||||
private void mergeNonNull(AiConfigRequest target, AiConfigRequest source) {
|
||||
if (source.getProvider() != null) target.setProvider(source.getProvider());
|
||||
if (source.getOllamaBaseUrl() != null) target.setOllamaBaseUrl(source.getOllamaBaseUrl());
|
||||
if (source.getOllamaChatModel() != null) target.setOllamaChatModel(source.getOllamaChatModel());
|
||||
if (source.getOllamaEmbeddingModel() != null) target.setOllamaEmbeddingModel(source.getOllamaEmbeddingModel());
|
||||
if (source.getOllamaTemperature() != null) target.setOllamaTemperature(source.getOllamaTemperature());
|
||||
if (source.getOllamaNumPredict() != null) target.setOllamaNumPredict(source.getOllamaNumPredict());
|
||||
if (source.getDeepseekApiKey() != null) target.setDeepseekApiKey(source.getDeepseekApiKey());
|
||||
if (source.getDeepseekModel() != null) target.setDeepseekModel(source.getDeepseekModel());
|
||||
if (source.getDeepseekEmbeddingModel() != null) target.setDeepseekEmbeddingModel(source.getDeepseekEmbeddingModel());
|
||||
if (source.getAutoFallbackEnabled() != null) target.setAutoFallbackEnabled(source.getAutoFallbackEnabled());
|
||||
if (source.getAgentMaxSteps() != null) target.setAgentMaxSteps(source.getAgentMaxSteps());
|
||||
if (source.getAutoExecuteHighRisk() != null) target.setAutoExecuteHighRisk(source.getAutoExecuteHighRisk());
|
||||
if (source.getUserRateLimit() != null) target.setUserRateLimit(source.getUserRateLimit());
|
||||
if (source.getChunkSize() != null) target.setChunkSize(source.getChunkSize());
|
||||
if (source.getChunkOverlap() != null) target.setChunkOverlap(source.getChunkOverlap());
|
||||
if (source.getMaxUploadSize() != null) target.setMaxUploadSize(source.getMaxUploadSize());
|
||||
}
|
||||
|
||||
private void copyResponseToRequest(AiConfigResponse resp, AiConfigRequest req) {
|
||||
req.setProvider(resp.getProvider());
|
||||
req.setOllamaBaseUrl(resp.getOllamaBaseUrl());
|
||||
req.setOllamaChatModel(resp.getOllamaChatModel());
|
||||
req.setOllamaEmbeddingModel(resp.getOllamaEmbeddingModel());
|
||||
req.setOllamaTemperature(resp.getOllamaTemperature());
|
||||
req.setOllamaNumPredict(resp.getOllamaNumPredict());
|
||||
req.setDeepseekModel(resp.getDeepseekModel());
|
||||
req.setDeepseekEmbeddingModel(resp.getDeepseekEmbeddingModel());
|
||||
req.setAutoFallbackEnabled(resp.getAutoFallbackEnabled());
|
||||
req.setAgentMaxSteps(resp.getAgentMaxSteps());
|
||||
req.setAutoExecuteHighRisk(resp.getAutoExecuteHighRisk());
|
||||
req.setUserRateLimit(resp.getUserRateLimit());
|
||||
req.setChunkSize(resp.getChunkSize());
|
||||
req.setChunkOverlap(resp.getChunkOverlap());
|
||||
req.setMaxUploadSize(resp.getMaxUploadSize());
|
||||
}
|
||||
|
||||
public String getEffectiveApiKey() {
|
||||
String json = redisTemplate.opsForValue().get(REDIS_KEY);
|
||||
if (json != null) {
|
||||
try {
|
||||
AiConfigRequest request = objectMapper.readValue(json, AiConfigRequest.class);
|
||||
if (request.getDeepseekApiKey() != null && !request.getDeepseekApiKey().isEmpty()) {
|
||||
return request.getDeepseekApiKey();
|
||||
}
|
||||
} catch (JsonProcessingException ignored) {}
|
||||
}
|
||||
return defaultDeepseekKey;
|
||||
}
|
||||
|
||||
private AiConfigResponse toResponse(AiConfigRequest request) {
|
||||
AiConfigResponse resp = new AiConfigResponse();
|
||||
resp.setProvider(request.getProvider());
|
||||
resp.setOllamaBaseUrl(request.getOllamaBaseUrl());
|
||||
resp.setOllamaChatModel(request.getOllamaChatModel());
|
||||
resp.setOllamaEmbeddingModel(request.getOllamaEmbeddingModel());
|
||||
resp.setOllamaTemperature(request.getOllamaTemperature());
|
||||
resp.setOllamaNumPredict(request.getOllamaNumPredict());
|
||||
resp.setDeepseekModel(request.getDeepseekModel());
|
||||
resp.setDeepseekEmbeddingModel(request.getDeepseekEmbeddingModel());
|
||||
resp.setAutoFallbackEnabled(request.getAutoFallbackEnabled());
|
||||
resp.setAgentMaxSteps(request.getAgentMaxSteps());
|
||||
resp.setAutoExecuteHighRisk(request.getAutoExecuteHighRisk());
|
||||
resp.setUserRateLimit(request.getUserRateLimit());
|
||||
resp.setChunkSize(request.getChunkSize());
|
||||
resp.setChunkOverlap(request.getChunkOverlap());
|
||||
resp.setMaxUploadSize(request.getMaxUploadSize());
|
||||
return resp;
|
||||
}
|
||||
|
||||
private AiConfigResponse defaultConfig() {
|
||||
AiConfigResponse config = new AiConfigResponse();
|
||||
config.setProvider(defaultProvider);
|
||||
config.setOllamaBaseUrl(defaultOllamaUrl);
|
||||
config.setOllamaChatModel(defaultOllamaChatModel);
|
||||
config.setOllamaEmbeddingModel(defaultOllamaModel);
|
||||
config.setOllamaTemperature(defaultTemperature);
|
||||
config.setOllamaNumPredict(defaultNumPredict);
|
||||
config.setDeepseekModel(defaultDeepseekModel);
|
||||
config.setDeepseekEmbeddingModel(defaultDeepseekEmbeddingModel);
|
||||
config.setAutoFallbackEnabled(defaultAutoFallback);
|
||||
config.setAgentMaxSteps(defaultAgentMaxSteps);
|
||||
config.setAutoExecuteHighRisk(defaultAutoExecuteHighRisk);
|
||||
config.setUserRateLimit(defaultUserRateLimit);
|
||||
config.setChunkSize(defaultChunkSize);
|
||||
config.setChunkOverlap(defaultChunkOverlap);
|
||||
config.setMaxUploadSize(defaultMaxUploadSize);
|
||||
return config;
|
||||
}
|
||||
|
||||
public Float getEffectiveTemperature() {
|
||||
Float t = getConfig().getOllamaTemperature();
|
||||
return t != null ? t : defaultTemperature;
|
||||
}
|
||||
|
||||
public Integer getEffectiveNumPredict() {
|
||||
Integer n = getConfig().getOllamaNumPredict();
|
||||
return n != null ? n : defaultNumPredict;
|
||||
}
|
||||
|
||||
public Integer getEffectiveMaxSteps() {
|
||||
Integer m = getConfig().getAgentMaxSteps();
|
||||
return m != null ? m : defaultAgentMaxSteps;
|
||||
}
|
||||
|
||||
public Boolean getEffectiveAutoExecuteHighRisk() {
|
||||
Boolean b = getConfig().getAutoExecuteHighRisk();
|
||||
return b != null ? b : defaultAutoExecuteHighRisk;
|
||||
}
|
||||
|
||||
public Integer getEffectiveUserRateLimit() {
|
||||
Integer l = getConfig().getUserRateLimit();
|
||||
return l != null ? l : defaultUserRateLimit;
|
||||
}
|
||||
|
||||
public Integer getEffectiveChunkSize() {
|
||||
Integer c = getConfig().getChunkSize();
|
||||
return c != null && c > 0 ? c : defaultChunkSize;
|
||||
}
|
||||
|
||||
public Integer getEffectiveChunkOverlap() {
|
||||
Integer o = getConfig().getChunkOverlap();
|
||||
return o != null && o >= 0 ? o : defaultChunkOverlap;
|
||||
}
|
||||
|
||||
public Long getEffectiveMaxUploadSize() {
|
||||
Long m = getConfig().getMaxUploadSize();
|
||||
return m != null && m > 0 ? m : defaultMaxUploadSize;
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.client.RestClient;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class DeepSeekEmbeddingService {
|
||||
|
||||
private static final String API_URL = "https://api.deepseek.com/v1/embeddings";
|
||||
|
||||
private final RestClient restClient;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final AiConfigService aiConfigService;
|
||||
|
||||
public DeepSeekEmbeddingService(ObjectMapper objectMapper, AiConfigService aiConfigService) {
|
||||
this.objectMapper = objectMapper;
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.restClient = RestClient.builder().build();
|
||||
}
|
||||
|
||||
public List<Float> embed(String text) {
|
||||
String apiKey = aiConfigService.getEffectiveApiKey();
|
||||
String model = aiConfigService.getConfig().getDeepseekEmbeddingModel();
|
||||
|
||||
Map<String, Object> body = Map.of(
|
||||
"model", model,
|
||||
"input", text
|
||||
);
|
||||
|
||||
try {
|
||||
String json = restClient.post()
|
||||
.uri(API_URL)
|
||||
.header("Authorization", "Bearer " + apiKey)
|
||||
.header("Content-Type", "application/json")
|
||||
.body(body)
|
||||
.retrieve()
|
||||
.body(String.class);
|
||||
|
||||
JsonNode root = objectMapper.readTree(json);
|
||||
JsonNode data = root.get("data");
|
||||
if (data == null || !data.isArray() || data.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
JsonNode embedding = data.get(0).get("embedding");
|
||||
List<Float> result = new ArrayList<>();
|
||||
for (JsonNode n : embedding) {
|
||||
result.add(n.floatValue());
|
||||
}
|
||||
return result;
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException("DeepSeek embedding failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import org.apache.poi.ss.usermodel.*;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||
import org.apache.tika.Tika;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@Service
|
||||
public class DocumentParserService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(DocumentParserService.class);
|
||||
|
||||
private static final Pattern TOKEN_PATTERN = Pattern.compile(
|
||||
"[\\u3040-\\u30ff\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\u3001-\\u303f\\uff00-\\uffef]|[A-Za-z0-9]+");
|
||||
|
||||
private final Tika tika = new Tika();
|
||||
|
||||
private final AiConfigService aiConfigService;
|
||||
|
||||
public DocumentParserService(AiConfigService aiConfigService) {
|
||||
this.aiConfigService = aiConfigService;
|
||||
}
|
||||
|
||||
public String extractText(InputStream inputStream, String fileName) {
|
||||
String lower = fileName.toLowerCase();
|
||||
if (lower.endsWith(".xlsx") || lower.endsWith(".xls")) {
|
||||
try {
|
||||
return extractTextFromExcel(inputStream, fileName);
|
||||
} catch (Throwable t) {
|
||||
log.warn("POI parsing failed for {}, falling back to raw text", fileName, t);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
try {
|
||||
return tika.parseToString(inputStream);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Failed to parse document: " + fileName, e);
|
||||
}
|
||||
}
|
||||
|
||||
private String extractTextFromExcel(InputStream inputStream, String fileName) {
|
||||
try (Workbook workbook = createWorkbook(inputStream, fileName)) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
DataFormatter formatter = new DataFormatter();
|
||||
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
|
||||
Sheet sheet = workbook.getSheetAt(i);
|
||||
if (sheet.getPhysicalNumberOfRows() == 0) continue;
|
||||
for (Row row : sheet) {
|
||||
for (Cell cell : row) {
|
||||
String value = formatter.formatCellValue(cell);
|
||||
if (value != null && !value.isEmpty()) {
|
||||
sb.append(value).append(" ");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
}
|
||||
sb.append("\n");
|
||||
}
|
||||
return sb.toString().trim();
|
||||
} catch (Throwable e) {
|
||||
log.warn("Failed to parse Excel file: {}", fileName, e);
|
||||
throw new RuntimeException("Failed to parse Excel: " + fileName, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Workbook createWorkbook(InputStream inputStream, String fileName) {
|
||||
try {
|
||||
if (fileName.toLowerCase().endsWith(".xlsx")) {
|
||||
return new XSSFWorkbook(inputStream);
|
||||
}
|
||||
return new HSSFWorkbook(inputStream);
|
||||
} catch (Throwable e) {
|
||||
log.warn("Failed to create workbook for: {}", fileName, e);
|
||||
throw new RuntimeException("Failed to create workbook: " + fileName, e);
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> splitText(String text) {
|
||||
int chunkSize = aiConfigService.getEffectiveChunkSize();
|
||||
int chunkOverlap = aiConfigService.getEffectiveChunkOverlap();
|
||||
List<String> chunks = new ArrayList<>();
|
||||
List<String> tokens = new ArrayList<>();
|
||||
Matcher matcher = TOKEN_PATTERN.matcher(text);
|
||||
while (matcher.find()) {
|
||||
tokens.add(matcher.group());
|
||||
}
|
||||
int tokenCount = tokens.size();
|
||||
|
||||
if (tokenCount == 0) {
|
||||
return chunks;
|
||||
}
|
||||
|
||||
if (tokenCount <= chunkSize) {
|
||||
chunks.add(text);
|
||||
return chunks;
|
||||
}
|
||||
|
||||
int start = 0;
|
||||
while (start < tokenCount) {
|
||||
int end = Math.min(start + chunkSize, tokenCount);
|
||||
StringBuilder chunk = new StringBuilder();
|
||||
for (int i = start; i < end; i++) {
|
||||
if (i > start) chunk.append(" ");
|
||||
chunk.append(tokens.get(i));
|
||||
}
|
||||
chunks.add(chunk.toString());
|
||||
|
||||
if (end >= tokenCount) break;
|
||||
start = end - chunkOverlap;
|
||||
}
|
||||
|
||||
return chunks;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface EmbeddingService {
|
||||
List<Float> embed(String text);
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import com.ims.api.dto.knowledge.KnowledgeDocResponse;
|
||||
import com.ims.service.entity.KnowledgeDocument;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.KnowledgeChunkRepository;
|
||||
import com.ims.service.repository.KnowledgeDocumentRepository;
|
||||
import io.minio.MinioClient;
|
||||
import io.minio.PutObjectArgs;
|
||||
import io.minio.RemoveObjectArgs;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
public class KnowledgeService {
|
||||
|
||||
private final KnowledgeDocumentRepository documentRepository;
|
||||
private final KnowledgeChunkRepository chunkRepository;
|
||||
private final MinioClient minioClient;
|
||||
private final DocumentParserService documentParserService;
|
||||
private final OllamaEmbeddingService embeddingService;
|
||||
private final EntityManager entityManager;
|
||||
private final AiConfigService aiConfigService;
|
||||
|
||||
@Value("${minio.bucket}")
|
||||
private String bucket;
|
||||
|
||||
public KnowledgeService(KnowledgeDocumentRepository documentRepository,
|
||||
KnowledgeChunkRepository chunkRepository,
|
||||
MinioClient minioClient,
|
||||
DocumentParserService documentParserService,
|
||||
OllamaEmbeddingService embeddingService,
|
||||
EntityManager entityManager,
|
||||
AiConfigService aiConfigService) {
|
||||
this.documentRepository = documentRepository;
|
||||
this.chunkRepository = chunkRepository;
|
||||
this.minioClient = minioClient;
|
||||
this.documentParserService = documentParserService;
|
||||
this.embeddingService = embeddingService;
|
||||
this.entityManager = entityManager;
|
||||
this.aiConfigService = aiConfigService;
|
||||
}
|
||||
|
||||
public Page<KnowledgeDocResponse> list(int page, int pageSize) {
|
||||
return documentRepository.findAll(PageRequest.of(page - 1, pageSize))
|
||||
.map(this::toResponse);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public KnowledgeDocResponse upload(MultipartFile file, User user) {
|
||||
if (file.isEmpty()) {
|
||||
throw new RuntimeException("File is empty");
|
||||
}
|
||||
long maxUploadSize = aiConfigService.getEffectiveMaxUploadSize();
|
||||
if (file.getSize() > maxUploadSize) {
|
||||
throw new RuntimeException("File size exceeds the maximum allowed size of " + (maxUploadSize / (1024 * 1024)) + "MB");
|
||||
}
|
||||
String fileName = file.getOriginalFilename();
|
||||
String objectKey = UUID.randomUUID() + "_" + fileName;
|
||||
String fileType = getFileType(fileName);
|
||||
|
||||
KnowledgeDocument doc = KnowledgeDocument.builder()
|
||||
.name(fileName)
|
||||
.filePath(objectKey)
|
||||
.fileSize(file.getSize())
|
||||
.fileType(fileType)
|
||||
.status("processing")
|
||||
.uploadedBy(user)
|
||||
.build();
|
||||
doc = documentRepository.save(doc);
|
||||
|
||||
byte[] fileBytes;
|
||||
try {
|
||||
fileBytes = file.getBytes();
|
||||
} catch (Exception e) {
|
||||
doc.setStatus("failed");
|
||||
doc.setErrorMessage("Failed to read file");
|
||||
documentRepository.save(doc);
|
||||
return toResponse(doc);
|
||||
}
|
||||
|
||||
try {
|
||||
try (var is = new java.io.ByteArrayInputStream(fileBytes)) {
|
||||
minioClient.putObject(PutObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(objectKey)
|
||||
.stream(is, fileBytes.length, -1)
|
||||
.contentType(file.getContentType())
|
||||
.build());
|
||||
} catch (Exception ignored) {}
|
||||
|
||||
String text;
|
||||
try (var is = new java.io.ByteArrayInputStream(fileBytes)) {
|
||||
text = documentParserService.extractText(is, fileName);
|
||||
} catch (Throwable e) {
|
||||
text = new String(fileBytes, java.nio.charset.StandardCharsets.UTF_8);
|
||||
}
|
||||
if (text == null || text.trim().isEmpty()) {
|
||||
text = new String(fileBytes, java.nio.charset.StandardCharsets.UTF_8);
|
||||
}
|
||||
List<String> chunks = documentParserService.splitText(text);
|
||||
|
||||
int chunkCount = 0;
|
||||
for (String chunkText : chunks) {
|
||||
List<Float> embedding = embeddingService.embed(chunkText);
|
||||
String vectorStr = SearchService.vectorToPgvectorString(embedding);
|
||||
entityManager.createNativeQuery(
|
||||
"INSERT INTO knowledge_chunks (doc_id, content, embedding, created_at) " +
|
||||
"VALUES (:docId, :content, CAST(:embedding AS vector), NOW())")
|
||||
.setParameter("docId", doc.getId())
|
||||
.setParameter("content", chunkText)
|
||||
.setParameter("embedding", vectorStr)
|
||||
.executeUpdate();
|
||||
chunkCount++;
|
||||
}
|
||||
|
||||
doc.setChunkCount(chunkCount);
|
||||
doc.setStatus("completed");
|
||||
documentRepository.save(doc);
|
||||
} catch (Throwable e) {
|
||||
doc.setStatus("failed");
|
||||
doc.setErrorMessage(e.getMessage());
|
||||
documentRepository.save(doc);
|
||||
}
|
||||
|
||||
return toResponse(doc);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void delete(Long id) {
|
||||
KnowledgeDocument doc = documentRepository.findById(id).orElse(null);
|
||||
if (doc == null) return;
|
||||
|
||||
try {
|
||||
minioClient.removeObject(RemoveObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(doc.getFilePath())
|
||||
.build());
|
||||
} catch (Exception ignored) {}
|
||||
|
||||
chunkRepository.deleteByDocId(id);
|
||||
documentRepository.deleteById(id);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void reindex(Long id) {
|
||||
KnowledgeDocument doc = documentRepository.findById(id).orElse(null);
|
||||
if (doc == null) return;
|
||||
|
||||
chunkRepository.deleteByDocId(id);
|
||||
doc.setStatus("processing");
|
||||
doc.setChunkCount(0);
|
||||
documentRepository.save(doc);
|
||||
|
||||
try {
|
||||
String text = documentParserService.extractText(null, doc.getName());
|
||||
List<String> chunks = documentParserService.splitText(text);
|
||||
|
||||
int chunkCount = 0;
|
||||
for (String chunkText : chunks) {
|
||||
List<Float> embedding = embeddingService.embed(chunkText);
|
||||
String vectorStr = SearchService.vectorToPgvectorString(embedding);
|
||||
entityManager.createNativeQuery(
|
||||
"INSERT INTO knowledge_chunks (doc_id, content, embedding, created_at) " +
|
||||
"VALUES (:docId, :content, CAST(:embedding AS vector), NOW())")
|
||||
.setParameter("docId", doc.getId())
|
||||
.setParameter("content", chunkText)
|
||||
.setParameter("embedding", vectorStr)
|
||||
.executeUpdate();
|
||||
chunkCount++;
|
||||
}
|
||||
|
||||
doc.setChunkCount(chunkCount);
|
||||
doc.setStatus("completed");
|
||||
doc.setErrorMessage(null);
|
||||
documentRepository.save(doc);
|
||||
} catch (Throwable e) {
|
||||
doc.setStatus("failed");
|
||||
doc.setErrorMessage(e.getMessage());
|
||||
documentRepository.save(doc);
|
||||
}
|
||||
}
|
||||
|
||||
private String getFileType(String fileName) {
|
||||
if (fileName == null) return "unknown";
|
||||
String lower = fileName.toLowerCase();
|
||||
if (lower.endsWith(".pdf")) return "pdf";
|
||||
if (lower.endsWith(".docx")) return "docx";
|
||||
if (lower.endsWith(".doc")) return "doc";
|
||||
if (lower.endsWith(".txt")) return "txt";
|
||||
if (lower.endsWith(".md")) return "md";
|
||||
if (lower.endsWith(".xlsx") || lower.endsWith(".xls")) return "xlsx";
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
private KnowledgeDocResponse toResponse(KnowledgeDocument doc) {
|
||||
KnowledgeDocResponse resp = new KnowledgeDocResponse();
|
||||
resp.setId(doc.getId());
|
||||
resp.setName(doc.getName());
|
||||
resp.setFileSize(doc.getFileSize());
|
||||
resp.setFileType(doc.getFileType());
|
||||
resp.setChunkCount(doc.getChunkCount());
|
||||
resp.setStatus(doc.getStatus());
|
||||
resp.setErrorMessage(doc.getErrorMessage());
|
||||
resp.setUploadedByName(doc.getUploadedBy().getUsername());
|
||||
resp.setCreatedAt(doc.getCreatedAt());
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class OllamaEmbeddingService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(OllamaEmbeddingService.class);
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
private final AiConfigService aiConfigService;
|
||||
|
||||
public OllamaEmbeddingService(ObjectMapper objectMapper, AiConfigService aiConfigService) {
|
||||
this.objectMapper = objectMapper;
|
||||
this.aiConfigService = aiConfigService;
|
||||
}
|
||||
|
||||
public List<Float> embed(String text) {
|
||||
String baseUrl = aiConfigService.getConfig().getOllamaBaseUrl();
|
||||
String model = aiConfigService.getConfig().getOllamaEmbeddingModel();
|
||||
|
||||
String requestBody = "{\"model\":\"" + model + "\",\"prompt\":\"" + escapeJson(text) + "\"}";
|
||||
|
||||
try {
|
||||
HttpURLConnection conn = (HttpURLConnection) URI.create(baseUrl + "/api/embeddings").toURL().openConnection();
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setRequestProperty("Content-Type", "application/json");
|
||||
conn.setDoOutput(true);
|
||||
conn.setConnectTimeout(30000);
|
||||
conn.setReadTimeout(60000);
|
||||
|
||||
try (OutputStream os = conn.getOutputStream()) {
|
||||
byte[] input = requestBody.getBytes(StandardCharsets.UTF_8);
|
||||
os.write(input, 0, input.length);
|
||||
}
|
||||
|
||||
String json = new String(conn.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
|
||||
|
||||
JsonNode root = objectMapper.readTree(json);
|
||||
JsonNode embedding = root.get("embedding");
|
||||
if (embedding == null || !embedding.isArray()) {
|
||||
throw new RuntimeException("No embedding in response: " + json);
|
||||
}
|
||||
|
||||
List<Float> result = new ArrayList<>();
|
||||
for (JsonNode n : embedding) {
|
||||
result.add(n.floatValue());
|
||||
}
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
log.error("Ollama embedding failed", e);
|
||||
throw new RuntimeException("Ollama embedding failed: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private String escapeJson(String s) {
|
||||
return s.replace("\\", "\\\\").replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t");
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class RoutingEmbeddingService implements EmbeddingService {
|
||||
|
||||
private final AiConfigService aiConfigService;
|
||||
private final OllamaEmbeddingService ollamaEmbeddingService;
|
||||
private final DeepSeekEmbeddingService deepSeekEmbeddingService;
|
||||
|
||||
public RoutingEmbeddingService(AiConfigService aiConfigService,
|
||||
OllamaEmbeddingService ollamaEmbeddingService,
|
||||
DeepSeekEmbeddingService deepSeekEmbeddingService) {
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.ollamaEmbeddingService = ollamaEmbeddingService;
|
||||
this.deepSeekEmbeddingService = deepSeekEmbeddingService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Float> embed(String text) {
|
||||
String provider = aiConfigService.getConfig().getProvider();
|
||||
System.out.println("=== ROUTING to provider: " + provider);
|
||||
if ("deepseek".equalsIgnoreCase(provider)) {
|
||||
return deepSeekEmbeddingService.embed(text);
|
||||
}
|
||||
System.out.println("=== CALLING OllamaEmbeddingService.embed()");
|
||||
List<Float> result = ollamaEmbeddingService.embed(text);
|
||||
System.out.println("=== Ollama result size: " + result.size());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import com.ims.service.entity.KnowledgeSearchLog;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.KnowledgeSearchLogRepository;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class SearchLogService {
|
||||
|
||||
private final KnowledgeSearchLogRepository repository;
|
||||
|
||||
public SearchLogService(KnowledgeSearchLogRepository repository) {
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
public void log(String query, String rewrittenQuery, Integer topK, Integer totalMatches,
|
||||
Integer durationMs, User user) {
|
||||
KnowledgeSearchLog log = KnowledgeSearchLog.builder()
|
||||
.query(query)
|
||||
.rewrittenQuery(rewrittenQuery)
|
||||
.topK(topK)
|
||||
.totalMatches(totalMatches)
|
||||
.durationMs(durationMs)
|
||||
.user(user)
|
||||
.build();
|
||||
repository.save(log);
|
||||
}
|
||||
|
||||
public Page<KnowledgeSearchLog> list(int page, int pageSize) {
|
||||
return repository.findAll(PageRequest.of(page - 1, pageSize));
|
||||
}
|
||||
|
||||
public long todayCount() {
|
||||
return repository.count();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package com.ims.service.knowledge;
|
||||
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.Query;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class SearchService {
|
||||
|
||||
private final RoutingEmbeddingService embeddingService;
|
||||
private final SearchLogService searchLogService;
|
||||
private final EntityManager entityManager;
|
||||
|
||||
public SearchService(RoutingEmbeddingService embeddingService,
|
||||
SearchLogService searchLogService,
|
||||
EntityManager entityManager) {
|
||||
this.embeddingService = embeddingService;
|
||||
this.searchLogService = searchLogService;
|
||||
this.entityManager = entityManager;
|
||||
}
|
||||
|
||||
public List<SearchResult> search(String query, int topK) {
|
||||
long start = System.currentTimeMillis();
|
||||
List<Float> queryVector = embeddingService.embed(query);
|
||||
|
||||
String vectorStr = vectorToPgvectorString(queryVector);
|
||||
String sql = "SELECT kc.id, kc.content, kd.name AS doc_name, " +
|
||||
"1 - (kc.embedding <=> '" + vectorStr + "'::vector) AS score " +
|
||||
"FROM knowledge_chunks kc " +
|
||||
"JOIN knowledge_documents kd ON kd.id = kc.doc_id " +
|
||||
"WHERE kd.status = 'completed' " +
|
||||
"ORDER BY score DESC LIMIT :topK";
|
||||
|
||||
Query nativeQuery = entityManager.createNativeQuery(sql);
|
||||
nativeQuery.setParameter("topK", topK);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<Object[]> rows = nativeQuery.getResultList();
|
||||
|
||||
List<SearchResult> results = new ArrayList<>();
|
||||
for (Object[] row : rows) {
|
||||
SearchResult r = new SearchResult();
|
||||
r.setChunkId(((Number) row[0]).longValue());
|
||||
r.setContent((String) row[1]);
|
||||
r.setDocName((String) row[2]);
|
||||
r.setScore(row[3] != null ? ((Number) row[3]).doubleValue() : 0.0);
|
||||
results.add(r);
|
||||
}
|
||||
|
||||
long duration = System.currentTimeMillis() - start;
|
||||
searchLogService.log(query, null, topK, results.size(), (int) duration, null);
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public static String vectorToPgvectorString(List<Float> vector) {
|
||||
StringBuilder sb = new StringBuilder("[");
|
||||
for (int i = 0; i < vector.size(); i++) {
|
||||
if (i > 0) sb.append(",");
|
||||
sb.append(vector.get(i));
|
||||
}
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public static class SearchResult {
|
||||
private Long chunkId;
|
||||
private String content;
|
||||
private String docName;
|
||||
private Double score;
|
||||
|
||||
public Long getChunkId() { return chunkId; }
|
||||
public void setChunkId(Long chunkId) { this.chunkId = chunkId; }
|
||||
public String getContent() { return content; }
|
||||
public void setContent(String content) { this.content = content; }
|
||||
public String getDocName() { return docName; }
|
||||
public void setDocName(String docName) { this.docName = docName; }
|
||||
public Double getScore() { return score; }
|
||||
public void setScore(Double score) { this.score = score; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.ims.service.notification;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class EmailService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(EmailService.class);
|
||||
|
||||
public void send(String to, String subject, String content) {
|
||||
if (to == null || to.isBlank()) {
|
||||
log.warn("[FAKE-MAIL] 收件人邮箱为空,跳过发送 subject={}", subject);
|
||||
return;
|
||||
}
|
||||
log.info("[FAKE-MAIL] to={} | subject={} | content={}", to, subject, content);
|
||||
}
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
package com.ims.service.notification;
|
||||
|
||||
import com.ims.service.entity.AgentPlan;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.NotificationRepository;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class NotificationScheduler {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(NotificationScheduler.class);
|
||||
|
||||
private final EntityManager entityManager;
|
||||
private final NotificationService notificationService;
|
||||
private final NotificationRepository notificationRepository;
|
||||
|
||||
public NotificationScheduler(EntityManager entityManager,
|
||||
NotificationService notificationService,
|
||||
NotificationRepository notificationRepository) {
|
||||
this.entityManager = entityManager;
|
||||
this.notificationService = notificationService;
|
||||
this.notificationRepository = notificationRepository;
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 */30 * * * *")
|
||||
@Transactional
|
||||
public void escalateApprovalTimeouts() {
|
||||
LocalDateTime cutoff = LocalDateTime.now().minusHours(48);
|
||||
List<AgentPlan> plans = entityManager.createQuery(
|
||||
"select p from AgentPlan p where p.approvalStatus = 'requested' and p.createdAt < :cutoff", AgentPlan.class)
|
||||
.setParameter("cutoff", cutoff)
|
||||
.getResultList();
|
||||
for (AgentPlan plan : plans) {
|
||||
User target = plan.getCreatedBy();
|
||||
Issue issue = plan.getIssue();
|
||||
if (target == null || issue == null) continue;
|
||||
if (notificationRepository.existsByTypeAndIssueIdAndCreatedAtAfter(
|
||||
"approval_timeout", issue.getId(), LocalDateTime.now().minusHours(24))) continue;
|
||||
notificationService.notify(target, "审批超时提醒: " + issue.getIssueNo(),
|
||||
"Agent 审批请求已超过 48 小时未响应,请及时处理或升级。",
|
||||
"approval_timeout", "/issues/" + issue.getId(), issue);
|
||||
log.info("审批超时升级 planId={}, issueId={}", plan.getId(), issue.getId());
|
||||
}
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 0 */6 * * *")
|
||||
@Transactional
|
||||
public void remindUpcomingDeadlines() {
|
||||
LocalDateTime from = LocalDateTime.now();
|
||||
LocalDateTime to = from.plusDays(3);
|
||||
List<Issue> issues = entityManager.createQuery(
|
||||
"select i from Issue i where i.isDeleted = false and i.status <> 'closed' " +
|
||||
"and i.deadline is not null and i.deadline between :from and :to", Issue.class)
|
||||
.setParameter("from", from)
|
||||
.setParameter("to", to)
|
||||
.getResultList();
|
||||
for (Issue issue : issues) {
|
||||
if (issue.getAssignee() == null) continue;
|
||||
if (notificationRepository.existsByTypeAndIssueIdAndCreatedAtAfter(
|
||||
"deadline_reminder", issue.getId(), LocalDateTime.now().minusDays(1))) continue;
|
||||
notificationService.notify(issue.getAssignee(), "整改即将到期: " + issue.getIssueNo(),
|
||||
"指摘《" + issue.getTitle() + "》整改截止日期 " + issue.getDeadline() + " 临近,请尽快处理。",
|
||||
"deadline_reminder", "/issues/" + issue.getId(), issue);
|
||||
}
|
||||
}
|
||||
}
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
package com.ims.service.notification;
|
||||
|
||||
import com.ims.api.dto.notification.NotificationResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.Notification;
|
||||
import com.ims.service.entity.Role;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.entity.UserRole;
|
||||
import com.ims.service.repository.NotificationRepository;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import jakarta.persistence.EntityManager;
|
||||
import jakarta.persistence.TypedQuery;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class NotificationService {
|
||||
|
||||
private final NotificationRepository notificationRepository;
|
||||
private final EntityManager entityManager;
|
||||
private final EmailService emailService;
|
||||
private final RoleRepository roleRepository;
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public NotificationService(NotificationRepository notificationRepository, EntityManager entityManager,
|
||||
EmailService emailService, RoleRepository roleRepository,
|
||||
UserRoleRepository userRoleRepository, UserRepository userRepository) {
|
||||
this.notificationRepository = notificationRepository;
|
||||
this.entityManager = entityManager;
|
||||
this.emailService = emailService;
|
||||
this.roleRepository = roleRepository;
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public PageResult<NotificationResponse> list(Long userId, int page, int pageSize) {
|
||||
int p = Math.max(1, page);
|
||||
int ps = pageSize > 0 ? pageSize : 20;
|
||||
TypedQuery<Notification> query = entityManager.createQuery(
|
||||
"select n from Notification n where n.user.id = :userId order by n.createdAt desc", Notification.class)
|
||||
.setParameter("userId", userId)
|
||||
.setFirstResult((p - 1) * ps)
|
||||
.setMaxResults(ps);
|
||||
long total = ((Number) entityManager.createQuery(
|
||||
"select count(n) from Notification n where n.user.id = :userId")
|
||||
.setParameter("userId", userId).getSingleResult()).longValue();
|
||||
List<NotificationResponse> items = query.getResultList().stream().map(this::toResponse).toList();
|
||||
return new PageResult<>(items, total, p, ps);
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public long unreadCount(Long userId) {
|
||||
return notificationRepository.countByUserIdAndIsRead(userId, false);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void markRead(Long id, Long userId) {
|
||||
Notification n = notificationRepository.findById(id).orElse(null);
|
||||
if (n == null || !n.getUser().getId().equals(userId)) return;
|
||||
n.setIsRead(true);
|
||||
notificationRepository.save(n);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public int markAllRead(Long userId) {
|
||||
return notificationRepository.markAllRead(userId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void notify(User user, String title, String content, String type, String link, Issue issue) {
|
||||
if (user == null) return;
|
||||
Notification n = Notification.builder()
|
||||
.user(user)
|
||||
.title(title)
|
||||
.content(content)
|
||||
.type(type)
|
||||
.link(link)
|
||||
.isRead(false)
|
||||
.issue(issue)
|
||||
.build();
|
||||
notificationRepository.save(n);
|
||||
emailService.send(user.getEmail(), title, content);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void notifyAdmins(String title, String content) {
|
||||
Set<Long> adminRoleIds = roleRepository.findByNameIn(List.of("超级管理员", "部门管理员")).stream()
|
||||
.map(Role::getId)
|
||||
.collect(Collectors.toSet());
|
||||
if (adminRoleIds.isEmpty()) return;
|
||||
Set<Long> adminUserIds = userRoleRepository.findByRoleIdIn(adminRoleIds).stream()
|
||||
.map(UserRole::getUserId)
|
||||
.collect(Collectors.toSet());
|
||||
for (Long userId : adminUserIds) {
|
||||
userRepository.findById(userId).ifPresent(user -> notify(user, title, content, "admin", null, null));
|
||||
}
|
||||
}
|
||||
|
||||
private NotificationResponse toResponse(Notification n) {
|
||||
NotificationResponse resp = new NotificationResponse();
|
||||
resp.setId(n.getId());
|
||||
resp.setTitle(n.getTitle());
|
||||
resp.setContent(n.getContent());
|
||||
resp.setType(n.getType());
|
||||
resp.setLink(n.getLink());
|
||||
resp.setIsRead(n.getIsRead());
|
||||
resp.setCreatedAt(n.getCreatedAt());
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
package com.ims.service.prompt;
|
||||
|
||||
import com.ims.api.dto.prompt.PromptRenderLogResponse;
|
||||
import com.ims.api.dto.prompt.PromptStatsResponse;
|
||||
import com.ims.api.dto.prompt.PromptTemplateRequest;
|
||||
import com.ims.api.dto.prompt.PromptTemplateResponse;
|
||||
import com.ims.api.dto.prompt.PromptTestRequest;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.ai.PromptTemplateEngine;
|
||||
import com.ims.service.entity.PromptRenderLog;
|
||||
import com.ims.service.entity.PromptTemplate;
|
||||
import com.ims.service.entity.PromptTemplateVersion;
|
||||
import com.ims.service.notification.NotificationService;
|
||||
import com.ims.service.repository.PromptRenderLogRepository;
|
||||
import com.ims.service.repository.PromptTemplateRepository;
|
||||
import com.ims.service.repository.PromptTemplateVersionRepository;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class PromptService {
|
||||
|
||||
private final PromptTemplateRepository templateRepository;
|
||||
private final PromptTemplateVersionRepository versionRepository;
|
||||
private final PromptRenderLogRepository renderLogRepository;
|
||||
private final PromptTemplateEngine promptEngine;
|
||||
private final NotificationService notificationService;
|
||||
|
||||
public PromptService(PromptTemplateRepository templateRepository,
|
||||
PromptTemplateVersionRepository versionRepository,
|
||||
PromptRenderLogRepository renderLogRepository,
|
||||
PromptTemplateEngine promptEngine,
|
||||
NotificationService notificationService) {
|
||||
this.templateRepository = templateRepository;
|
||||
this.versionRepository = versionRepository;
|
||||
this.renderLogRepository = renderLogRepository;
|
||||
this.promptEngine = promptEngine;
|
||||
this.notificationService = notificationService;
|
||||
}
|
||||
|
||||
public Page<PromptTemplateResponse> list(int page, int pageSize) {
|
||||
Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize);
|
||||
return templateRepository.findAllByIsActiveTrue(pageable).map(this::toResponse);
|
||||
}
|
||||
|
||||
public PromptTemplateResponse detail(String templateId) {
|
||||
PromptTemplate template = templateRepository.findByTemplateIdAndIsActiveTrue(templateId)
|
||||
.orElseThrow(() -> new BusinessException("模板不存在: " + templateId));
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
public PromptTemplateResponse create(PromptTemplateRequest request) {
|
||||
if (templateRepository.findByTemplateIdAndIsActiveTrue(request.getTemplateId()).isPresent()) {
|
||||
throw new BusinessException("模板ID已存在: " + request.getTemplateId());
|
||||
}
|
||||
PromptTemplate template = new PromptTemplate();
|
||||
template.setTemplateId(request.getTemplateId());
|
||||
template.setName(request.getName());
|
||||
template.setCategory(request.getCategory());
|
||||
template.setVersion(1);
|
||||
template.setContent(request.getContent());
|
||||
template.setVariables(request.getVariables());
|
||||
template.setOutputSchema(request.getOutputSchema());
|
||||
template.setIsActive(true);
|
||||
templateRepository.save(template);
|
||||
|
||||
saveVersion(template, "初始版本");
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
public PromptTemplateResponse update(String templateId, PromptTemplateRequest request) {
|
||||
PromptTemplate template = templateRepository.findByTemplateIdAndIsActiveTrue(templateId)
|
||||
.orElseThrow(() -> new BusinessException("模板不存在: " + templateId));
|
||||
|
||||
int nextVersion = template.getVersion() + 1;
|
||||
template.setVersion(nextVersion);
|
||||
template.setName(request.getName());
|
||||
template.setContent(request.getContent());
|
||||
template.setVariables(request.getVariables());
|
||||
template.setOutputSchema(request.getOutputSchema());
|
||||
templateRepository.save(template);
|
||||
|
||||
saveVersion(template, "更新至版本 " + nextVersion);
|
||||
notificationService.notifyAdmins("Prompt模板更新: " + templateId,
|
||||
"模板 " + templateId + " 已更新至版本 v" + nextVersion);
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
public PromptTemplateResponse rollback(String templateId, int version) {
|
||||
PromptTemplate template = templateRepository.findByTemplateIdAndIsActiveTrue(templateId)
|
||||
.orElseThrow(() -> new BusinessException("模板不存在: " + templateId));
|
||||
PromptTemplateVersion target = versionRepository.findByTemplateIdOrderByVersionDesc(templateId).stream()
|
||||
.filter(v -> v.getVersion() == version)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new BusinessException("版本不存在: " + version));
|
||||
|
||||
int nextVersion = template.getVersion() + 1;
|
||||
template.setVersion(nextVersion);
|
||||
template.setContent(target.getContent());
|
||||
templateRepository.save(template);
|
||||
|
||||
saveVersion(template, "回滚至版本 " + version);
|
||||
notificationService.notifyAdmins("Prompt模板更新: " + templateId,
|
||||
"模板 " + templateId + " 已回滚至版本 v" + version);
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
public Map<String, Object> test(PromptTestRequest request) {
|
||||
PromptTemplate template = templateRepository.findByTemplateIdAndIsActiveTrue(request.getTemplateId())
|
||||
.orElseThrow(() -> new BusinessException("模板不存在: " + request.getTemplateId()));
|
||||
Map<String, Object> vars = request.getVariables() == null ? Map.of() : request.getVariables();
|
||||
String rendered = promptEngine.render(template, vars);
|
||||
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
result.put("templateId", template.getTemplateId());
|
||||
result.put("version", template.getVersion());
|
||||
result.put("rendered", rendered);
|
||||
return result;
|
||||
}
|
||||
|
||||
public List<Map<String, Object>> versions(String templateId) {
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
for (PromptTemplateVersion v : versionRepository.findByTemplateIdOrderByVersionDesc(templateId)) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("id", v.getId());
|
||||
m.put("templateId", v.getTemplateId());
|
||||
m.put("version", v.getVersion());
|
||||
m.put("content", v.getContent());
|
||||
m.put("changeLog", v.getChangeLog());
|
||||
m.put("createdAt", v.getCreatedAt() == null ? null : v.getCreatedAt().toString());
|
||||
result.add(m);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public Page<PromptRenderLogResponse> logs(int page, int pageSize) {
|
||||
Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize);
|
||||
return renderLogRepository.findAllByOrderByCreatedAtDesc(pageable).map(this::toLogResponse);
|
||||
}
|
||||
|
||||
public List<PromptStatsResponse> stats() {
|
||||
Map<String, long[]> agg = new HashMap<>();
|
||||
for (Object[] row : renderLogRepository.aggregateByTemplate()) {
|
||||
String templateId = (String) row[0];
|
||||
long count = ((Number) row[1]).longValue();
|
||||
double avgMs = row[2] == null ? 0 : ((Number) row[2]).doubleValue();
|
||||
agg.put(templateId, new long[]{count, Double.doubleToLongBits(avgMs)});
|
||||
}
|
||||
|
||||
List<PromptStatsResponse> result = new ArrayList<>();
|
||||
for (PromptTemplate template : templateRepository.findAllByIsActiveTrue()) {
|
||||
PromptStatsResponse stat = new PromptStatsResponse();
|
||||
stat.setTemplateId(template.getTemplateId());
|
||||
stat.setName(template.getName());
|
||||
stat.setCategory(template.getCategory());
|
||||
stat.setLatestVersion(template.getVersion());
|
||||
long[] data = agg.get(template.getTemplateId());
|
||||
if (data != null) {
|
||||
stat.setUseCount(data[0]);
|
||||
stat.setAvgExecutionTimeMs(Double.longBitsToDouble(data[1]));
|
||||
} else {
|
||||
stat.setUseCount(0L);
|
||||
stat.setAvgExecutionTimeMs(0.0);
|
||||
}
|
||||
result.add(stat);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void saveVersion(PromptTemplate template, String changeLog) {
|
||||
PromptTemplateVersion version = new PromptTemplateVersion();
|
||||
version.setTemplateId(template.getTemplateId());
|
||||
version.setVersion(template.getVersion());
|
||||
version.setContent(template.getContent());
|
||||
version.setChangeLog(changeLog);
|
||||
versionRepository.save(version);
|
||||
}
|
||||
|
||||
private PromptTemplateResponse toResponse(PromptTemplate t) {
|
||||
PromptTemplateResponse resp = new PromptTemplateResponse();
|
||||
resp.setId(t.getId());
|
||||
resp.setTemplateId(t.getTemplateId());
|
||||
resp.setName(t.getName());
|
||||
resp.setCategory(t.getCategory());
|
||||
resp.setVersion(t.getVersion());
|
||||
resp.setContent(t.getContent());
|
||||
resp.setVariables(t.getVariables());
|
||||
resp.setOutputSchema(t.getOutputSchema());
|
||||
resp.setIsActive(t.getIsActive());
|
||||
resp.setIsDefault(t.getIsDefault());
|
||||
resp.setCreatedAt(t.getCreatedAt());
|
||||
resp.setUpdatedAt(t.getUpdatedAt());
|
||||
return resp;
|
||||
}
|
||||
|
||||
private PromptRenderLogResponse toLogResponse(PromptRenderLog log) {
|
||||
PromptRenderLogResponse resp = new PromptRenderLogResponse();
|
||||
resp.setId(log.getId());
|
||||
resp.setRequestId(log.getRequestId());
|
||||
resp.setTemplateId(log.getTemplateId());
|
||||
resp.setTemplateVersion(log.getTemplateVersion());
|
||||
resp.setRenderedPrompt(log.getRenderedPrompt());
|
||||
resp.setVariablesUsed(log.getVariablesUsed());
|
||||
resp.setTokensInput(log.getTokensInput());
|
||||
resp.setTokensOutput(log.getTokensOutput());
|
||||
resp.setExecutionTimeMs(log.getExecutionTimeMs());
|
||||
resp.setLlmModel(log.getLlmModel());
|
||||
resp.setModelProvider(log.getModelProvider());
|
||||
resp.setCreatedAt(log.getCreatedAt());
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,294 @@
|
||||
package com.ims.service.prompt;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.api.dto.prompt.PromptLogResponse;
|
||||
import com.ims.api.dto.prompt.PromptStatsResponse;
|
||||
import com.ims.api.dto.prompt.PromptTemplateRequest;
|
||||
import com.ims.api.dto.prompt.PromptTemplateResponse;
|
||||
import com.ims.api.dto.prompt.PromptTestRequest;
|
||||
import com.ims.api.dto.prompt.PromptTestResponse;
|
||||
import com.ims.api.dto.prompt.PromptVersionResponse;
|
||||
import com.ims.api.service.prompt.PromptService;
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.PromptRenderLog;
|
||||
import com.ims.service.entity.PromptTemplate;
|
||||
import com.ims.service.entity.PromptTemplateVersion;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.PromptRenderLogRepository;
|
||||
import com.ims.service.repository.PromptTemplateRepository;
|
||||
import com.ims.service.repository.PromptTemplateVersionRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@Service
|
||||
public class PromptServiceImpl implements PromptService {
|
||||
|
||||
private static final Pattern VAR_PATTERN = Pattern.compile("\\{\\{\\s*(\\w+)\\s*}}");
|
||||
|
||||
private final PromptTemplateRepository templateRepository;
|
||||
private final PromptTemplateVersionRepository versionRepository;
|
||||
private final PromptRenderLogRepository renderLogRepository;
|
||||
private final UserRepository userRepository;
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
public PromptServiceImpl(PromptTemplateRepository templateRepository,
|
||||
PromptTemplateVersionRepository versionRepository,
|
||||
PromptRenderLogRepository renderLogRepository,
|
||||
UserRepository userRepository,
|
||||
ObjectMapper objectMapper) {
|
||||
this.templateRepository = templateRepository;
|
||||
this.versionRepository = versionRepository;
|
||||
this.renderLogRepository = renderLogRepository;
|
||||
this.userRepository = userRepository;
|
||||
this.objectMapper = objectMapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public PageResult<PromptTemplateResponse> list(int page, int pageSize, String category, String keyword) {
|
||||
String cat = category == null ? null : category.toLowerCase(Locale.ROOT);
|
||||
String kw = keyword == null ? null : keyword.toLowerCase(Locale.ROOT);
|
||||
List<PromptTemplate> filtered = templateRepository.findAll().stream()
|
||||
.filter(t -> cat == null || cat.isBlank()
|
||||
|| (t.getCategory() != null && t.getCategory().toLowerCase(Locale.ROOT).contains(cat)))
|
||||
.filter(t -> kw == null || kw.isBlank()
|
||||
|| (t.getName() != null && t.getName().toLowerCase(Locale.ROOT).contains(kw))
|
||||
|| (t.getTemplateId() != null && t.getTemplateId().toLowerCase(Locale.ROOT).contains(kw)))
|
||||
.sorted(Comparator.comparing(PromptTemplate::getUpdatedAt, Comparator.nullsLast(Comparator.reverseOrder())))
|
||||
.toList();
|
||||
int total = filtered.size();
|
||||
int from = Math.min((page - 1) * pageSize, total);
|
||||
int to = Math.min(from + pageSize, total);
|
||||
List<PromptTemplateResponse> items = filtered.subList(from, to).stream().map(this::toResponse).toList();
|
||||
return new PageResult<>(items, total, page, pageSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public PromptTemplateResponse detail(String templateId) {
|
||||
PromptTemplate template = findByTemplateId(templateId);
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public PromptTemplateResponse create(PromptTemplateRequest request, String operatorUsername) {
|
||||
if (templateRepository.findAll().stream().anyMatch(t -> t.getTemplateId().equals(request.getTemplateId()))) {
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "模板ID已存在");
|
||||
}
|
||||
PromptTemplate template = PromptTemplate.builder()
|
||||
.templateId(request.getTemplateId())
|
||||
.name(request.getName())
|
||||
.category(request.getCategory())
|
||||
.content(request.getContent())
|
||||
.variables(request.getVariables())
|
||||
.outputSchema(request.getOutputSchema())
|
||||
.version(1)
|
||||
.isActive(true)
|
||||
.isDefault(false)
|
||||
.createdBy(resolveUser(operatorUsername))
|
||||
.build();
|
||||
template = templateRepository.save(template);
|
||||
saveVersion(template.getTemplateId(), template.getVersion(), template.getContent(), "初始版本", operatorUsername);
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public PromptTemplateResponse update(String templateId, PromptTemplateRequest request, String operatorUsername) {
|
||||
PromptTemplate template = findByTemplateId(templateId);
|
||||
int nextVersion = template.getVersion() + 1;
|
||||
if (request.getName() != null && !request.getName().isBlank()) {
|
||||
template.setName(request.getName());
|
||||
}
|
||||
if (request.getCategory() != null && !request.getCategory().isBlank()) {
|
||||
template.setCategory(request.getCategory());
|
||||
}
|
||||
if (request.getContent() != null && !request.getContent().isBlank()) {
|
||||
template.setContent(request.getContent());
|
||||
}
|
||||
if (request.getVariables() != null) {
|
||||
template.setVariables(request.getVariables());
|
||||
}
|
||||
if (request.getOutputSchema() != null) {
|
||||
template.setOutputSchema(request.getOutputSchema());
|
||||
}
|
||||
template.setVersion(nextVersion);
|
||||
template = templateRepository.save(template);
|
||||
saveVersion(templateId, nextVersion, template.getContent(), "更新到 v" + nextVersion, operatorUsername);
|
||||
return toResponse(template);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void rollback(String templateId, int version, String operatorUsername) {
|
||||
PromptTemplate template = findByTemplateId(templateId);
|
||||
PromptTemplateVersion target = versionRepository.findByTemplateIdOrderByVersionDesc(templateId).stream()
|
||||
.filter(v -> v.getVersion() == version)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "版本不存在"));
|
||||
int nextVersion = template.getVersion() + 1;
|
||||
template.setContent(target.getContent());
|
||||
template.setVersion(nextVersion);
|
||||
templateRepository.save(template);
|
||||
saveVersion(templateId, nextVersion, target.getContent(), "回滚到 v" + version, operatorUsername);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public PromptTestResponse test(PromptTestRequest request, String operatorUsername) {
|
||||
PromptTemplate template = findByTemplateId(request.getTemplateId());
|
||||
long start = System.currentTimeMillis();
|
||||
String rendered = render(template.getContent(), request.getVariables());
|
||||
long cost = System.currentTimeMillis() - start;
|
||||
PromptRenderLog log = PromptRenderLog.builder()
|
||||
.requestId(UUID.randomUUID().toString().replace("-", ""))
|
||||
.templateId(template.getTemplateId())
|
||||
.templateVersion(template.getVersion())
|
||||
.renderedPrompt(rendered)
|
||||
.variablesUsed(toJson(request.getVariables()))
|
||||
.executionTimeMs((int) cost)
|
||||
.build();
|
||||
renderLogRepository.save(log);
|
||||
PromptTestResponse response = new PromptTestResponse();
|
||||
response.setTemplateId(template.getTemplateId());
|
||||
response.setTemplateVersion(template.getVersion());
|
||||
response.setRenderedPrompt(rendered);
|
||||
response.setExecutionTimeMs((int) cost);
|
||||
response.setTokenEstimate(rendered.length() / 2);
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public List<PromptVersionResponse> versions(String templateId) {
|
||||
return versionRepository.findByTemplateIdOrderByVersionDesc(templateId).stream()
|
||||
.map(v -> {
|
||||
PromptVersionResponse r = new PromptVersionResponse();
|
||||
r.setId(v.getId());
|
||||
r.setTemplateId(v.getTemplateId());
|
||||
r.setVersion(v.getVersion());
|
||||
r.setContent(v.getContent());
|
||||
r.setChangeLog(v.getChangeLog());
|
||||
r.setCreatedBy(v.getCreatedBy() == null ? "" : v.getCreatedBy().getUsername());
|
||||
r.setCreatedAt(v.getCreatedAt());
|
||||
return r;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public PageResult<PromptLogResponse> logs(int page, int pageSize) {
|
||||
List<PromptLogResponse> all = renderLogRepository.findAll().stream()
|
||||
.sorted(Comparator.comparing(PromptRenderLog::getCreatedAt, Comparator.nullsLast(Comparator.reverseOrder())))
|
||||
.map(l -> {
|
||||
PromptLogResponse r = new PromptLogResponse();
|
||||
r.setId(l.getId());
|
||||
r.setRequestId(l.getRequestId());
|
||||
r.setTemplateId(l.getTemplateId());
|
||||
r.setTemplateVersion(l.getTemplateVersion());
|
||||
r.setRenderedPrompt(l.getRenderedPrompt());
|
||||
r.setExecutionTimeMs(l.getExecutionTimeMs());
|
||||
r.setLlmModel(l.getLlmModel());
|
||||
r.setModelProvider(l.getModelProvider());
|
||||
r.setCreatedAt(l.getCreatedAt());
|
||||
return r;
|
||||
}).toList();
|
||||
int total = all.size();
|
||||
int from = Math.min((page - 1) * pageSize, total);
|
||||
int to = Math.min(from + pageSize, total);
|
||||
return new PageResult<>(all.subList(from, to), total, page, pageSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public PromptStatsResponse stats() {
|
||||
PromptStatsResponse stats = new PromptStatsResponse();
|
||||
stats.setTotalTemplates(templateRepository.count());
|
||||
stats.setActiveTemplates(templateRepository.findAll().stream().filter(t -> Boolean.TRUE.equals(t.getIsActive())).count());
|
||||
stats.setTotalVersions(versionRepository.count());
|
||||
stats.setTotalRenders(renderLogRepository.count());
|
||||
return stats;
|
||||
}
|
||||
|
||||
private String toJson(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
return objectMapper.writeValueAsString(value);
|
||||
} catch (JsonProcessingException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String render(String content, Map<String, Object> variables) {
|
||||
if (content == null || variables == null) {
|
||||
return content;
|
||||
}
|
||||
Matcher matcher = VAR_PATTERN.matcher(content);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
while (matcher.find()) {
|
||||
Object value = variables.get(matcher.group(1));
|
||||
matcher.appendReplacement(sb, Matcher.quoteReplacement(value == null ? "" : String.valueOf(value)));
|
||||
}
|
||||
matcher.appendTail(sb);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private PromptTemplate findByTemplateId(String templateId) {
|
||||
return templateRepository.findAll().stream()
|
||||
.filter(t -> t.getTemplateId().equals(templateId))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.NOT_FOUND.getCode(), "模板不存在"));
|
||||
}
|
||||
|
||||
private void saveVersion(String templateId, int version, String content, String changeLog, String operatorUsername) {
|
||||
PromptTemplateVersion history = PromptTemplateVersion.builder()
|
||||
.templateId(templateId)
|
||||
.version(version)
|
||||
.content(content)
|
||||
.changeLog(changeLog)
|
||||
.createdBy(resolveUser(operatorUsername))
|
||||
.build();
|
||||
versionRepository.save(history);
|
||||
}
|
||||
|
||||
private User resolveUser(String operatorUsername) {
|
||||
if (operatorUsername == null) {
|
||||
return null;
|
||||
}
|
||||
return userRepository.findByUsername(operatorUsername)
|
||||
.or(() -> userRepository.findByUserid(operatorUsername))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
private PromptTemplateResponse toResponse(PromptTemplate template) {
|
||||
PromptTemplateResponse r = new PromptTemplateResponse();
|
||||
r.setId(template.getId());
|
||||
r.setTemplateId(template.getTemplateId());
|
||||
r.setName(template.getName());
|
||||
r.setCategory(template.getCategory());
|
||||
r.setVersion(template.getVersion());
|
||||
r.setContent(template.getContent());
|
||||
r.setVariables(template.getVariables());
|
||||
r.setOutputSchema(template.getOutputSchema());
|
||||
r.setIsActive(template.getIsActive());
|
||||
r.setIsDefault(template.getIsDefault());
|
||||
r.setCreatedAt(template.getCreatedAt());
|
||||
r.setUpdatedAt(template.getUpdatedAt());
|
||||
return r;
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.AgentMemory;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AgentMemoryRepository extends JpaRepository<AgentMemory, Long> {
|
||||
|
||||
@Query(value = "SELECT * FROM agent_memories ORDER BY embedding <=> CAST(:vector AS vector) LIMIT :limit",
|
||||
nativeQuery = true)
|
||||
List<AgentMemory> findSimilar(@Param("vector") String vector, @Param("limit") int limit);
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.AgentPlan;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AgentPlanRepository extends JpaRepository<AgentPlan, Long> {
|
||||
List<AgentPlan> findByIssueIdOrderByCreatedAtDesc(Long issueId);
|
||||
|
||||
Page<AgentPlan> findByApprovalStatusOrderByCreatedAtDesc(String approvalStatus, Pageable pageable);
|
||||
|
||||
long countByApprovalStatus(String approvalStatus);
|
||||
|
||||
long countByCreatedAtAfter(LocalDateTime time);
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.AiAnalysis;
|
||||
import jakarta.persistence.criteria.Predicate;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AiAnalysisRepository extends JpaRepository<AiAnalysis, Long>, JpaSpecificationExecutor<AiAnalysis> {
|
||||
List<AiAnalysis> findByIssueIdOrderByCreatedAtDesc(Long issueId);
|
||||
Page<AiAnalysis> findAllByOrderByCreatedAtDesc(Pageable pageable);
|
||||
|
||||
@Query("SELECT a FROM AiAnalysis a WHERE a.status IN :statuses ORDER BY a.createdAt DESC")
|
||||
List<AiAnalysis> findByStatusIn(@Param("statuses") Collection<String> statuses, Pageable pageable);
|
||||
|
||||
@Query("SELECT COUNT(DISTINCT a.issue.id) FROM AiAnalysis a WHERE a.status = 'completed'")
|
||||
long countAnalyzedIssues();
|
||||
|
||||
@Query("SELECT a.status, COUNT(a) FROM AiAnalysis a GROUP BY a.status")
|
||||
List<Object[]> countByStatusGroup();
|
||||
|
||||
@Query("SELECT a.category, COUNT(a) FROM AiAnalysis a WHERE a.status = 'completed' AND a.category IS NOT NULL GROUP BY a.category")
|
||||
List<Object[]> countByCategoryGroup();
|
||||
|
||||
@Query("SELECT a.issue.department.name, COUNT(a) FROM AiAnalysis a WHERE a.status = 'completed' AND a.issue.department IS NOT NULL GROUP BY a.issue.department.name")
|
||||
List<Object[]> countByDepartmentGroup();
|
||||
|
||||
@Query("SELECT FUNCTION('DATE', a.createdAt) as d, a.status, COUNT(a) FROM AiAnalysis a WHERE a.createdAt >= :since GROUP BY FUNCTION('DATE', a.createdAt), a.status ORDER BY d")
|
||||
List<Object[]> dailyTrendGroup(@Param("since") LocalDateTime since);
|
||||
|
||||
default Page<AiAnalysis> search(Long id, Long issueId, Long departmentId, String status,
|
||||
LocalDateTime start, LocalDateTime end, Pageable pageable) {
|
||||
Specification<AiAnalysis> spec = (root, query, cb) -> {
|
||||
List<Predicate> predicates = new ArrayList<>();
|
||||
if (id != null) {
|
||||
predicates.add(cb.equal(root.get("id"), id));
|
||||
}
|
||||
if (issueId != null) {
|
||||
predicates.add(cb.equal(root.get("issue").get("id"), issueId));
|
||||
}
|
||||
if (departmentId != null) {
|
||||
predicates.add(cb.equal(root.get("issue").get("department").get("id"), departmentId));
|
||||
}
|
||||
if (status != null) {
|
||||
predicates.add(cb.equal(root.get("status"), status));
|
||||
}
|
||||
if (start != null) {
|
||||
predicates.add(cb.greaterThanOrEqualTo(root.get("createdAt"), start));
|
||||
}
|
||||
if (end != null) {
|
||||
predicates.add(cb.lessThan(root.get("createdAt"), end));
|
||||
}
|
||||
query.orderBy(cb.desc(root.get("createdAt")));
|
||||
return cb.and(predicates.toArray(new Predicate[0]));
|
||||
};
|
||||
return findAll(spec, pageable);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.AiCallLog;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface AiCallLogRepository extends JpaRepository<AiCallLog, Long> {
|
||||
List<AiCallLog> findTop20ByOrderByCreatedAtDesc();
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.AiFeedback;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface AiFeedbackRepository extends JpaRepository<AiFeedback, Long> {
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.Attachment;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface AttachmentRepository extends JpaRepository<Attachment, Long> {
|
||||
List<Attachment> findByIssueId(Long issueId);
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.Department;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface DepartmentRepository extends JpaRepository<Department, Long> {
|
||||
List<Department> findByParentIdOrderBySortOrder(Long parentId);
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.ImportRecord;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface ImportRecordRepository extends JpaRepository<ImportRecord, Long> {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.IssueLog;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface IssueLogRepository extends JpaRepository<IssueLog, Long> {
|
||||
List<IssueLog> findByIssueIdOrderByCreatedAtDesc(Long issueId);
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.Issue;
|
||||
import jakarta.persistence.criteria.Predicate;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface IssueRepository extends JpaRepository<Issue, Long>, JpaSpecificationExecutor<Issue> {
|
||||
Optional<Issue> findByIssueNo(String issueNo);
|
||||
|
||||
List<Issue> findByIsDeletedFalseAndStatusNotAndDeadlineBefore(String status, LocalDateTime now);
|
||||
|
||||
List<Issue> findByIsDeletedFalseAndStatusAndAssigneeIsNull(String status);
|
||||
|
||||
default Page<Issue> search(String status, String phase, Long departmentId, String keyword,
|
||||
LocalDateTime start, LocalDateTime end, Pageable pageable) {
|
||||
Specification<Issue> spec = (root, query, cb) -> {
|
||||
List<Predicate> predicates = new ArrayList<>();
|
||||
predicates.add(cb.isFalse(root.get("isDeleted")));
|
||||
if (status != null) {
|
||||
predicates.add(cb.equal(root.get("status"), status));
|
||||
}
|
||||
if (phase != null) {
|
||||
predicates.add(cb.equal(root.get("phase"), phase));
|
||||
}
|
||||
if (departmentId != null) {
|
||||
predicates.add(cb.equal(root.get("department").get("id"), departmentId));
|
||||
}
|
||||
if (keyword != null && !keyword.isEmpty()) {
|
||||
String like = "%" + keyword + "%";
|
||||
predicates.add(cb.or(
|
||||
cb.like(root.get("issueNo"), like),
|
||||
cb.like(root.get("title"), like)));
|
||||
}
|
||||
if (start != null) {
|
||||
predicates.add(cb.greaterThanOrEqualTo(root.get("createdAt"), start));
|
||||
}
|
||||
if (end != null) {
|
||||
predicates.add(cb.lessThan(root.get("createdAt"), end));
|
||||
}
|
||||
query.orderBy(cb.desc(root.get("createdAt")));
|
||||
return cb.and(predicates.toArray(new Predicate[0]));
|
||||
};
|
||||
return findAll(spec, pageable);
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.KnowledgeChunk;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface KnowledgeChunkRepository extends JpaRepository<KnowledgeChunk, Long> {
|
||||
List<KnowledgeChunk> findByDocId(Long docId);
|
||||
void deleteByDocId(Long docId);
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.KnowledgeDocument;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface KnowledgeDocumentRepository extends JpaRepository<KnowledgeDocument, Long> {
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.KnowledgeSearchLog;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface KnowledgeSearchLogRepository extends JpaRepository<KnowledgeSearchLog, Long> {
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.Notification;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface NotificationRepository extends JpaRepository<Notification, Long> {
|
||||
List<Notification> findByUserIdAndIsReadOrderByCreatedAtDesc(Long userId, Boolean isRead);
|
||||
long countByUserIdAndIsRead(Long userId, Boolean isRead);
|
||||
|
||||
boolean existsByTypeAndIssueIdAndCreatedAtAfter(String type, Long issueId, LocalDateTime after);
|
||||
|
||||
@Modifying
|
||||
@Query("update Notification n set n.isRead = true where n.user.id = :userId and n.isRead = false")
|
||||
int markAllRead(@Param("userId") Long userId);
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.Permission;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface PermissionRepository extends JpaRepository<Permission, Long> {
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.PhaseRule;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface PhaseRuleRepository extends JpaRepository<PhaseRule, Long> {
|
||||
List<PhaseRule> findByActiveTrueOrderBySortOrderAsc();
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.PromptRenderLog;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface PromptRenderLogRepository extends JpaRepository<PromptRenderLog, Long> {
|
||||
Page<PromptRenderLog> findAllByOrderByCreatedAtDesc(Pageable pageable);
|
||||
|
||||
@Query(value = "SELECT template_id, COUNT(*), AVG(execution_time_ms) " +
|
||||
"FROM prompt_render_logs GROUP BY template_id ORDER BY COUNT(*) DESC",
|
||||
nativeQuery = true)
|
||||
List<Object[]> aggregateByTemplate();
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.PromptTemplate;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface PromptTemplateRepository extends JpaRepository<PromptTemplate, Long> {
|
||||
Optional<PromptTemplate> findByTemplateIdAndIsActiveTrue(String templateId);
|
||||
List<PromptTemplate> findByCategoryAndIsActiveTrue(String category);
|
||||
List<PromptTemplate> findAllByIsActiveTrue();
|
||||
Page<PromptTemplate> findAllByIsActiveTrue(Pageable pageable);
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.PromptTemplateVersion;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface PromptTemplateVersionRepository extends JpaRepository<PromptTemplateVersion, Long> {
|
||||
List<PromptTemplateVersion> findByTemplateIdOrderByVersionDesc(String templateId);
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.RolePermission;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface RolePermissionRepository extends JpaRepository<RolePermission, RolePermission.RolePermissionId> {
|
||||
List<RolePermission> findByRoleId(Long roleId);
|
||||
|
||||
List<RolePermission> findByRoleIdIn(Collection<Long> roleIds);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.Role;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface RoleRepository extends JpaRepository<Role, Long> {
|
||||
List<Role> findByNameIn(Collection<String> names);
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.TaskExecution;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface TaskExecutionRepository extends JpaRepository<TaskExecution, Long> {
|
||||
Optional<TaskExecution> findByTaskId(String taskId);
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.ToolExecution;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface ToolExecutionRepository extends JpaRepository<ToolExecution, Long> {
|
||||
List<ToolExecution> findByPlanId(Long planId);
|
||||
|
||||
long countByStatus(String status);
|
||||
|
||||
long countByCreatedAtAfter(LocalDateTime time);
|
||||
|
||||
List<ToolExecution> findTop15ByOrderByCreatedAtDesc();
|
||||
|
||||
Page<ToolExecution> findAllByOrderByCreatedAtDesc(Pageable pageable);
|
||||
|
||||
long countByCreatedAtBetween(LocalDateTime start, LocalDateTime end);
|
||||
|
||||
@Query(value = "SELECT COUNT(*) FROM tool_executions WHERE created_at >= :start AND created_at < :end", nativeQuery = true)
|
||||
long countBetween(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.User;
|
||||
import org.springframework.data.jpa.repository.EntityGraph;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface UserRepository extends JpaRepository<User, Long> {
|
||||
Optional<User> findByUserid(String userid);
|
||||
Optional<User> findByUsername(String username);
|
||||
|
||||
@EntityGraph(attributePaths = "department")
|
||||
Optional<User> findWithDepartmentById(Long id);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.ims.service.repository;
|
||||
|
||||
import com.ims.service.entity.UserRole;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface UserRoleRepository extends JpaRepository<UserRole, UserRole.UserRoleId> {
|
||||
List<UserRole> findByUserId(Long userId);
|
||||
List<UserRole> findByRoleIdIn(Collection<Long> roleIds);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.ims.service.security;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface DataScope {
|
||||
String departmentAlias() default "d";
|
||||
String userAlias() default "";
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.ims.service.security;
|
||||
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Aspect
|
||||
@Component
|
||||
public class DataScopeAspect {
|
||||
|
||||
private static final String SUPER_ADMIN_ROLE = "超级管理员";
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final DepartmentRepository departmentRepository;
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final RoleRepository roleRepository;
|
||||
|
||||
public DataScopeAspect(UserRepository userRepository, DepartmentRepository departmentRepository,
|
||||
UserRoleRepository userRoleRepository, RoleRepository roleRepository) {
|
||||
this.userRepository = userRepository;
|
||||
this.departmentRepository = departmentRepository;
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.roleRepository = roleRepository;
|
||||
}
|
||||
|
||||
@Around("@annotation(dataScope)")
|
||||
public Object doAround(ProceedingJoinPoint joinPoint, DataScope dataScope) throws Throwable {
|
||||
try {
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
if (authentication != null && authentication.isAuthenticated()) {
|
||||
String name = authentication.getName();
|
||||
userRepository.findByUsername(name)
|
||||
.or(() -> userRepository.findByUserid(name))
|
||||
.ifPresent(user -> {
|
||||
if (!isSuperAdmin(user) && user.getDepartment() != null) {
|
||||
Set<Long> scope = new HashSet<>();
|
||||
collectDepartments(user.getDepartment().getId(), scope);
|
||||
DataScopeContext.set(scope);
|
||||
}
|
||||
});
|
||||
}
|
||||
return joinPoint.proceed();
|
||||
} finally {
|
||||
DataScopeContext.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSuperAdmin(User user) {
|
||||
return userRoleRepository.findByUserId(user.getId()).stream()
|
||||
.map(ur -> roleRepository.findById(ur.getRoleId()).map(r -> r.getName()).orElse(""))
|
||||
.anyMatch(SUPER_ADMIN_ROLE::equals);
|
||||
}
|
||||
|
||||
private void collectDepartments(Long parentId, Set<Long> acc) {
|
||||
if (parentId == null) {
|
||||
return;
|
||||
}
|
||||
acc.add(parentId);
|
||||
List<Department> children = departmentRepository.findByParentIdOrderBySortOrder(parentId);
|
||||
for (Department child : children) {
|
||||
collectDepartments(child.getId(), acc);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.ims.service.security;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public final class DataScopeContext {
|
||||
|
||||
private static final ThreadLocal<Set<Long>> DEPT_IDS = new ThreadLocal<>();
|
||||
|
||||
private DataScopeContext() {
|
||||
}
|
||||
|
||||
public static void set(Set<Long> deptIds) {
|
||||
DEPT_IDS.set(deptIds);
|
||||
}
|
||||
|
||||
public static Set<Long> get() {
|
||||
return DEPT_IDS.get();
|
||||
}
|
||||
|
||||
public static boolean isScoped() {
|
||||
return DEPT_IDS.get() != null && !DEPT_IDS.get().isEmpty();
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
DEPT_IDS.remove();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package com.ims.service.security;
|
||||
|
||||
import com.ims.common.util.JwtUtil;
|
||||
import io.jsonwebtoken.Claims;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@Component
|
||||
public class JwtAuthFilter extends OncePerRequestFilter {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(JwtAuthFilter.class);
|
||||
|
||||
private final JwtUtil jwtUtil;
|
||||
private final UserDetailsServiceImpl userDetailsService;
|
||||
|
||||
public JwtAuthFilter(JwtUtil jwtUtil, UserDetailsServiceImpl userDetailsService) {
|
||||
this.jwtUtil = jwtUtil;
|
||||
this.userDetailsService = userDetailsService;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
String token = extractToken(request);
|
||||
if (token == null) {
|
||||
log.debug("No Bearer token found for {} {}", request.getMethod(), request.getRequestURI());
|
||||
filterChain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
if (!jwtUtil.validateToken(token)) {
|
||||
log.debug("Invalid or expired token for {} {}: prefix={}", request.getMethod(), request.getRequestURI(),
|
||||
token.substring(0, Math.min(20, token.length())));
|
||||
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
response.getWriter().write("{\"code\":401,\"message\":\"Token无效或已过期\"}");
|
||||
return;
|
||||
}
|
||||
Claims claims = jwtUtil.parseToken(token);
|
||||
String username = claims.getSubject();
|
||||
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
|
||||
UsernamePasswordAuthenticationToken authentication =
|
||||
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
|
||||
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
||||
log.debug("Authenticated user: {}", username);
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
|
||||
private String extractToken(HttpServletRequest request) {
|
||||
String bearerToken = request.getHeader("Authorization");
|
||||
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
|
||||
return bearerToken.substring(7);
|
||||
}
|
||||
String queryToken = request.getParameter("token");
|
||||
if (StringUtils.hasText(queryToken)) {
|
||||
return queryToken;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.ims.service.security;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.cors.CorsConfigurationSource;
|
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||
|
||||
@Configuration
|
||||
@EnableWebSecurity
|
||||
@EnableMethodSecurity
|
||||
public class SecurityConfig {
|
||||
|
||||
private final JwtAuthFilter jwtAuthFilter;
|
||||
|
||||
public SecurityConfig(JwtAuthFilter jwtAuthFilter) {
|
||||
this.jwtAuthFilter = jwtAuthFilter;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
|
||||
http
|
||||
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
|
||||
.csrf(csrf -> csrf.disable())
|
||||
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||
.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers("/api/v1/auth/**").permitAll()
|
||||
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
|
||||
.anyRequest().authenticated()
|
||||
)
|
||||
.exceptionHandling(ex -> ex
|
||||
.authenticationEntryPoint((request, response, authException) -> {
|
||||
response.setContentType("application/json;charset=UTF-8");
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
response.getWriter().write("{\"code\":401,\"message\":\"Token已过期或未登录,请重新登录\"}");
|
||||
})
|
||||
)
|
||||
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
|
||||
return http.build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public CorsConfigurationSource corsConfigurationSource() {
|
||||
CorsConfiguration config = new CorsConfiguration();
|
||||
config.addAllowedOriginPattern("*");
|
||||
config.addAllowedHeader("*");
|
||||
config.addAllowedMethod("*");
|
||||
config.setAllowCredentials(true);
|
||||
|
||||
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||
source.registerCorsConfiguration("/**", config);
|
||||
return source;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
return new BCryptPasswordEncoder();
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package com.ims.service.security;
|
||||
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
@Service
|
||||
public class UserDetailsServiceImpl implements UserDetailsService {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public UserDetailsServiceImpl(UserRepository userRepository) {
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||
User user = userRepository.findByUserid(username)
|
||||
.or(() -> userRepository.findByUsername(username))
|
||||
.orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
|
||||
|
||||
return new org.springframework.security.core.userdetails.User(
|
||||
user.getUsername(),
|
||||
user.getPasswordHash(),
|
||||
user.getIsActive() != null && user.getIsActive(),
|
||||
true, true, true,
|
||||
Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.ims.service.system;
|
||||
|
||||
import com.ims.api.dto.system.DepartmentResponse;
|
||||
import com.ims.api.service.system.DepartmentService;
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class DepartmentServiceImpl implements DepartmentService {
|
||||
|
||||
private final DepartmentRepository departmentRepository;
|
||||
|
||||
public DepartmentServiceImpl(DepartmentRepository departmentRepository) {
|
||||
this.departmentRepository = departmentRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<DepartmentResponse> tree() {
|
||||
List<Department> all = departmentRepository.findAll();
|
||||
Map<Long, DepartmentResponse> map = new LinkedHashMap<>();
|
||||
for (Department d : all) {
|
||||
DepartmentResponse r = new DepartmentResponse();
|
||||
r.setId(d.getId());
|
||||
r.setName(d.getName());
|
||||
r.setParentId(d.getParent() == null ? null : d.getParent().getId());
|
||||
r.setSortOrder(d.getSortOrder());
|
||||
r.setChildren(new ArrayList<>());
|
||||
map.put(d.getId(), r);
|
||||
}
|
||||
List<DepartmentResponse> roots = new ArrayList<>();
|
||||
for (DepartmentResponse r : map.values()) {
|
||||
if (r.getParentId() == null) {
|
||||
roots.add(r);
|
||||
} else if (map.containsKey(r.getParentId())) {
|
||||
map.get(r.getParentId()).getChildren().add(r);
|
||||
}
|
||||
}
|
||||
sort(roots);
|
||||
return roots;
|
||||
}
|
||||
|
||||
private void sort(List<DepartmentResponse> nodes) {
|
||||
nodes.sort(Comparator.comparing(DepartmentResponse::getSortOrder, Comparator.nullsLast(Integer::compareTo)));
|
||||
for (DepartmentResponse n : nodes) {
|
||||
sort(n.getChildren());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,562 @@
|
||||
package com.ims.service.system;
|
||||
|
||||
import com.ims.api.dto.imports.AgentValidateResponse;
|
||||
import com.ims.api.dto.imports.ImportConfirmRequest;
|
||||
import com.ims.api.dto.imports.ImportPreviewResponse;
|
||||
import com.ims.api.dto.imports.ImportRecordResponse;
|
||||
import com.ims.api.dto.imports.ImportRow;
|
||||
import com.ims.api.service.system.ImportService;
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.entity.ImportRecord;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import com.ims.service.repository.ImportRecordRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||
import org.apache.poi.ss.usermodel.DateUtil;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.eventusermodel.XSSFReader;
|
||||
import org.apache.poi.xssf.model.SharedStrings;
|
||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.helpers.DefaultHandler;
|
||||
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@Service
|
||||
public class ImportServiceImpl implements ImportService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(ImportServiceImpl.class);
|
||||
|
||||
private static final String[] HEADERS = {"标题", "工程阶段", "优先级", "期限", "子项目", "类别", "影响级别", "描述", "担当者工号", "部门名称"};
|
||||
private static final Set<String> PRIORITIES = Set.of("high", "medium", "low");
|
||||
private static final int TEMPLATE_DATA_START_ROW = 5;
|
||||
private static final int TEMPLATE_DATA_END_ROW = 272;
|
||||
private static final int TEMPLATE_HEADER_ROW = 4;
|
||||
private static final Map<String, String> TEMPLATE_HEADERS = Map.ofEntries(
|
||||
Map.entry("A", "項番"), Map.entry("B", "レビュー日"), Map.entry("C", "ドキュメント分類"),
|
||||
Map.entry("D", "対象PP"), Map.entry("E", "レビュー対象"), Map.entry("F", "プロジェクト名"),
|
||||
Map.entry("G", "ブランチ名"), Map.entry("H", "バージョン"), Map.entry("I", "レビュー者"),
|
||||
Map.entry("J", "指摘事項"), Map.entry("K", "対応内容"), Map.entry("L", "指摘取込バージョン"),
|
||||
Map.entry("M", "担当者"), Map.entry("N", "対応期限"), Map.entry("O", "完了日"),
|
||||
Map.entry("P", "承認日"), Map.entry("Q", "承認者"), Map.entry("R", "備考"));
|
||||
private static final DateTimeFormatter[] DEADLINE_FORMATS = {
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"),
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd"),
|
||||
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"),
|
||||
DateTimeFormatter.ofPattern("yyyy/MM/dd")
|
||||
};
|
||||
private static final AtomicInteger SEQ = new AtomicInteger(0);
|
||||
|
||||
private final IssueRepository issueRepository;
|
||||
private final ImportRecordRepository importRecordRepository;
|
||||
private final DepartmentRepository departmentRepository;
|
||||
private final UserRepository userRepository;
|
||||
private final ImportSuggestService importSuggestService;
|
||||
private final TransactionTemplate transactionTemplate;
|
||||
|
||||
public ImportServiceImpl(IssueRepository issueRepository,
|
||||
ImportRecordRepository importRecordRepository,
|
||||
DepartmentRepository departmentRepository,
|
||||
UserRepository userRepository,
|
||||
ImportSuggestService importSuggestService,
|
||||
TransactionTemplate transactionTemplate) {
|
||||
this.issueRepository = issueRepository;
|
||||
this.importRecordRepository = importRecordRepository;
|
||||
this.departmentRepository = departmentRepository;
|
||||
this.userRepository = userRepository;
|
||||
this.importSuggestService = importSuggestService;
|
||||
this.transactionTemplate = transactionTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] generateTemplate() {
|
||||
try {
|
||||
ClassPathResource resource = new ClassPathResource("templates/レビュー記録表.xlsx");
|
||||
if (resource.exists()) {
|
||||
try (InputStream in = resource.getInputStream()) {
|
||||
return in.readAllBytes();
|
||||
}
|
||||
}
|
||||
return generateFallbackTemplate();
|
||||
} catch (IOException e) {
|
||||
log.warn("Template file unavailable, fallback to generated template: {}", e.getMessage());
|
||||
return generateFallbackTemplate();
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] generateFallbackTemplate() {
|
||||
try (Workbook workbook = new XSSFWorkbook(); ByteArrayOutputStream out = new ByteArrayOutputStream()) {
|
||||
Sheet sheet = workbook.createSheet("指摘导入");
|
||||
Row header = sheet.createRow(0);
|
||||
for (int i = 0; i < HEADERS.length; i++) {
|
||||
header.createCell(i).setCellValue(HEADERS[i]);
|
||||
sheet.setColumnWidth(i, 18 * 256);
|
||||
}
|
||||
sheet.createRow(1).createCell(2).setCellValue("high/medium/low");
|
||||
workbook.write(out);
|
||||
return out.toByteArray();
|
||||
} catch (IOException e) {
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "模板生成失败");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImportPreviewResponse preview(MultipartFile file) {
|
||||
if (file == null || file.isEmpty()) {
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "文件不能为空");
|
||||
}
|
||||
ParseResult parsed = parseRows(file);
|
||||
List<ImportRow> rows = parsed.rows;
|
||||
int valid = 0;
|
||||
int error = 0;
|
||||
for (ImportRow row : rows) {
|
||||
row.setErrors(validate(row));
|
||||
if (row.getErrors().isEmpty()) {
|
||||
row.setStatus("ok");
|
||||
valid++;
|
||||
} else {
|
||||
row.setStatus("error");
|
||||
error++;
|
||||
}
|
||||
}
|
||||
ImportPreviewResponse response = new ImportPreviewResponse();
|
||||
response.setTotal(rows.size());
|
||||
response.setValidCount(valid);
|
||||
response.setErrorCount(error);
|
||||
response.setHeaderValid(parsed.headerValid);
|
||||
response.setRows(rows);
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgentValidateResponse aiValidate(List<ImportRow> rows) {
|
||||
return importSuggestService.suggest(rows == null ? List.of() : rows);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImportRecordResponse confirm(ImportConfirmRequest request, String operatorUsername) {
|
||||
User operator = userRepository.findByUsername(operatorUsername)
|
||||
.or(() -> userRepository.findByUserid(operatorUsername))
|
||||
.orElse(null);
|
||||
List<ImportRow> rows = request.getRows() == null ? List.of() : request.getRows();
|
||||
int success = 0;
|
||||
int fail = 0;
|
||||
List<String> errors = new ArrayList<>();
|
||||
for (ImportRow row : rows) {
|
||||
List<String> errs = validate(row);
|
||||
if (!errs.isEmpty()) {
|
||||
fail++;
|
||||
errors.add("第" + row.getRowNo() + "行: " + String.join("; ", errs));
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
transactionTemplate.execute(status -> {
|
||||
importSuggestService.enrich(row);
|
||||
createIssue(row, operator);
|
||||
return null;
|
||||
});
|
||||
success++;
|
||||
} catch (Exception e) {
|
||||
fail++;
|
||||
errors.add("第" + row.getRowNo() + "行: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
String status = fail == 0 ? "success" : (success == 0 ? "failed" : "partial");
|
||||
ImportRecord record = ImportRecord.builder()
|
||||
.fileName(nz(request.getFileName()))
|
||||
.totalCount(rows.size())
|
||||
.successCount(success)
|
||||
.failCount(fail)
|
||||
.status(status)
|
||||
.errorLog(errors.isEmpty() ? null : String.join("\n", errors))
|
||||
.operator(operator)
|
||||
.build();
|
||||
record = importRecordRepository.save(record);
|
||||
return toResponse(record);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<ImportRecordResponse> records(int page, int pageSize) {
|
||||
List<ImportRecord> all = importRecordRepository.findAll();
|
||||
all.sort(Comparator.comparing(ImportRecord::getCreatedAt, Comparator.nullsLast(Comparator.reverseOrder())));
|
||||
int total = all.size();
|
||||
int from = Math.min((page - 1) * pageSize, total);
|
||||
int to = Math.min(from + pageSize, total);
|
||||
List<ImportRecordResponse> items = all.subList(from, to).stream().map(this::toResponse).toList();
|
||||
return new PageResult<>(items, total, page, pageSize);
|
||||
}
|
||||
|
||||
private ParseResult parseRows(MultipartFile file) {
|
||||
List<ImportRow> rows = new ArrayList<>();
|
||||
boolean headerValid = true;
|
||||
java.io.File tmp = null;
|
||||
try {
|
||||
tmp = java.io.File.createTempFile("ims_import_", ".xlsx");
|
||||
file.transferTo(tmp);
|
||||
try (OPCPackage pkg = OPCPackage.open(tmp)) {
|
||||
XSSFReader reader = new XSSFReader(pkg);
|
||||
SharedStrings sst = reader.getSharedStringsTable();
|
||||
SheetDataHandler handler = new SheetDataHandler(sst);
|
||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||
factory.setNamespaceAware(false);
|
||||
java.util.Iterator<InputStream> sheets = reader.getSheetsData();
|
||||
while (sheets.hasNext()) {
|
||||
try (InputStream sheetIn = sheets.next()) {
|
||||
factory.newSAXParser().parse(sheetIn, handler);
|
||||
} catch (Exception e) {
|
||||
log.warn("Sheet parse failed: {}", e.getMessage());
|
||||
}
|
||||
if (!handler.rows.isEmpty()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
headerValid = handler.isValidHeader();
|
||||
rows = handler.rows;
|
||||
}
|
||||
} catch (BusinessException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
log.error("Excel parse failed", e);
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "Excel 解析失败,请使用标准模板");
|
||||
} finally {
|
||||
if (tmp != null && tmp.exists()) {
|
||||
tmp.delete();
|
||||
}
|
||||
}
|
||||
return new ParseResult(rows, headerValid);
|
||||
}
|
||||
|
||||
private static class SheetDataHandler extends DefaultHandler {
|
||||
private final SharedStrings sst;
|
||||
private final List<ImportRow> rows = new ArrayList<>();
|
||||
private final Map<String, String> headerValues = new LinkedHashMap<>();
|
||||
private int currentRowNum = -1;
|
||||
private String currentCol;
|
||||
private String currentCellType;
|
||||
private final StringBuilder cellValue = new StringBuilder();
|
||||
private final Map<String, String> rowValues = new LinkedHashMap<>();
|
||||
private boolean inCellValue = false;
|
||||
|
||||
SheetDataHandler(SharedStrings sst) {
|
||||
this.sst = sst;
|
||||
}
|
||||
|
||||
boolean isValidHeader() {
|
||||
if (headerValues.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
for (Map.Entry<String, String> e : TEMPLATE_HEADERS.entrySet()) {
|
||||
String actual = headerValues.get(e.getKey());
|
||||
if (actual == null || !actual.trim().equals(e.getValue())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||
switch (qName) {
|
||||
case "row" -> {
|
||||
currentRowNum = Integer.parseInt(attributes.getValue("r"));
|
||||
rowValues.clear();
|
||||
}
|
||||
case "c" -> {
|
||||
String ref = attributes.getValue("r");
|
||||
currentCol = ref == null ? "" : ref.replaceAll("\\d+", "");
|
||||
currentCellType = attributes.getValue("t");
|
||||
cellValue.setLength(0);
|
||||
inCellValue = true;
|
||||
}
|
||||
case "v" -> {
|
||||
cellValue.setLength(0);
|
||||
inCellValue = true;
|
||||
}
|
||||
default -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void characters(char[] ch, int start, int length) {
|
||||
if (inCellValue) {
|
||||
cellValue.append(ch, start, length);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String localName, String qName) {
|
||||
if ("v".equals(qName)) {
|
||||
String raw = cellValue.toString();
|
||||
String value = resolveCell(raw, currentCellType);
|
||||
if (!currentCol.isBlank() && value != null && !value.isBlank()) {
|
||||
rowValues.put(currentCol, value);
|
||||
}
|
||||
inCellValue = false;
|
||||
} else if ("row".equals(qName)) {
|
||||
if (currentRowNum == TEMPLATE_HEADER_ROW) {
|
||||
for (Map.Entry<String, String> e : TEMPLATE_HEADERS.entrySet()) {
|
||||
String v = rowValues.get(e.getKey());
|
||||
if (v != null) {
|
||||
headerValues.put(e.getKey(), v);
|
||||
}
|
||||
}
|
||||
} else if (currentRowNum >= TEMPLATE_DATA_START_ROW && currentRowNum <= TEMPLATE_DATA_END_ROW) {
|
||||
ImportRow item = toImportRow(currentRowNum, rowValues);
|
||||
if (item != null) {
|
||||
rows.add(item);
|
||||
}
|
||||
}
|
||||
currentRowNum = -1;
|
||||
}
|
||||
}
|
||||
|
||||
private String resolveCell(String raw, String type) {
|
||||
if ("s".equals(type)) {
|
||||
try {
|
||||
int idx = Integer.parseInt(raw.trim());
|
||||
return sst.getItemAt(idx).getString();
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if ("inlineStr".equals(type)) {
|
||||
return raw.trim();
|
||||
}
|
||||
return raw.trim();
|
||||
}
|
||||
}
|
||||
|
||||
private static ImportRow toImportRow(int rowNum, Map<String, String> values) {
|
||||
String title = values.get("J");
|
||||
if (title == null || title.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
ImportRow item = new ImportRow();
|
||||
item.setRowNo(rowNum);
|
||||
item.setTitle(title.trim());
|
||||
item.setDocType(values.get("E"));
|
||||
item.setCategory(values.get("C"));
|
||||
item.setSubProject(values.get("F"));
|
||||
item.setAssigneeUserid(values.get("M"));
|
||||
item.setReviewerUserid(values.get("I"));
|
||||
item.setValidatorUserid(values.get("Q"));
|
||||
String desc = buildDescription(values);
|
||||
item.setDescription(desc.isEmpty() ? null : desc);
|
||||
String dateB = values.get("B");
|
||||
String dateN = values.get("N");
|
||||
item.setReviewDate(excelDateToText(dateB));
|
||||
String deadline = excelDateToText(dateN);
|
||||
if (deadline == null) {
|
||||
deadline = excelDateToText(values.get("O"));
|
||||
}
|
||||
if (deadline == null) {
|
||||
deadline = excelDateToText(values.get("P"));
|
||||
}
|
||||
item.setDeadline(deadline);
|
||||
return item;
|
||||
}
|
||||
|
||||
private static String buildDescription(Map<String, String> values) {
|
||||
List<String> parts = new ArrayList<>();
|
||||
String description = values.get("K");
|
||||
if (description != null && !description.isBlank()) {
|
||||
parts.add(description.trim());
|
||||
}
|
||||
String note = values.get("G");
|
||||
if (note != null && !note.isBlank()) {
|
||||
String n = note.trim();
|
||||
if (!n.equals("528") && !n.equals("529") && !n.equals("531")
|
||||
&& !n.contains("対応内容") && !n.contains("カンリョウ")) {
|
||||
parts.add("【補足】" + n);
|
||||
}
|
||||
}
|
||||
appendInfoPart(parts, "対象PP", values.get("D"));
|
||||
appendInfoPart(parts, "バージョン", values.get("H"));
|
||||
appendInfoPart(parts, "指摘取込バージョン", values.get("L"));
|
||||
appendInfoPart(parts, "備考", values.get("R"));
|
||||
return String.join("\n", parts);
|
||||
}
|
||||
|
||||
private static void appendInfoPart(List<String> parts, String label, String value) {
|
||||
if (value != null && !value.isBlank()) {
|
||||
String v = value.trim();
|
||||
if (!v.equals("528") && !v.equals("529") && !v.equals("531")
|
||||
&& !v.contains("対応内容") && !v.contains("カンリョウ")) {
|
||||
parts.add("【" + label + "】" + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String excelDateToText(String value) {
|
||||
if (value == null || value.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
String v = value.trim();
|
||||
try {
|
||||
double serial = Double.parseDouble(v);
|
||||
if (DateUtil.isValidExcelDate(serial)) {
|
||||
return DateUtil.getJavaDate(serial).toInstant()
|
||||
.atZone(java.time.ZoneId.systemDefault())
|
||||
.toLocalDate().toString();
|
||||
}
|
||||
} catch (NumberFormatException ignored) {
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
private List<String> validate(ImportRow row) {
|
||||
List<String> errors = new ArrayList<>();
|
||||
if (row.getTitle() == null || row.getTitle().isBlank()) {
|
||||
errors.add("标题必填");
|
||||
}
|
||||
if (row.getPriority() != null && !row.getPriority().isBlank()
|
||||
&& !PRIORITIES.contains(row.getPriority().trim().toLowerCase())) {
|
||||
errors.add("优先级必须是 high/medium/low");
|
||||
}
|
||||
if (row.getDeadline() != null && !row.getDeadline().isBlank() && parseDeadline(row.getDeadline()) == null) {
|
||||
errors.add("期限格式不正确");
|
||||
}
|
||||
return errors;
|
||||
}
|
||||
|
||||
private void createIssue(ImportRow row, User operator) {
|
||||
Issue issue = new Issue();
|
||||
issue.setIssueNo(genIssueNo());
|
||||
issue.setTitle(truncate(row.getTitle().trim(), 200));
|
||||
issue.setStatus("draft");
|
||||
issue.setPriority(row.getPriority() == null || row.getPriority().isBlank()
|
||||
? "medium" : row.getPriority().trim().toLowerCase());
|
||||
issue.setPhase(row.getPhase());
|
||||
issue.setSubProject(row.getSubProject());
|
||||
issue.setCategory(row.getCategory());
|
||||
issue.setImpactLevel(row.getImpactLevel());
|
||||
issue.setDescription(row.getDescription());
|
||||
issue.setDeadline(parseDeadline(row.getDeadline()));
|
||||
issue.setReviewDate(parseDeadline(row.getReviewDate()));
|
||||
issue.setCreator(operator);
|
||||
issue.setDepartment(resolveDepartment(row.getDepartmentName(), operator));
|
||||
issue.setAssignee(resolveAssignee(row.getAssigneeUserid()));
|
||||
issue.setReviewer(resolveAssignee(row.getReviewerUserid()));
|
||||
issue.setValidator(resolveAssignee(row.getValidatorUserid()));
|
||||
issue.setAgentStatus("human_driven");
|
||||
issue.setIsDeleted(false);
|
||||
issueRepository.save(issue);
|
||||
}
|
||||
|
||||
private Department resolveDepartment(String departmentName, User operator) {
|
||||
if (departmentName != null && !departmentName.isBlank()) {
|
||||
Department matched = departmentRepository.findAll().stream()
|
||||
.filter(d -> departmentName.trim().equals(d.getName()))
|
||||
.findFirst().orElse(null);
|
||||
if (matched != null) {
|
||||
return matched;
|
||||
}
|
||||
}
|
||||
if (operator != null && operator.getDepartment() != null) {
|
||||
return operator.getDepartment();
|
||||
}
|
||||
return departmentRepository.findAll().stream().findFirst().orElseThrow(
|
||||
() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "系统无部门数据"));
|
||||
}
|
||||
|
||||
private User resolveAssignee(String userid) {
|
||||
if (userid == null || userid.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
return userRepository.findByUserid(userid.trim())
|
||||
.or(() -> userRepository.findByUsername(userid.trim()))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
private String genIssueNo() {
|
||||
int seq = SEQ.incrementAndGet() % 1000;
|
||||
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
||||
return "ISS" + time + String.format("%03d", seq);
|
||||
}
|
||||
|
||||
private LocalDateTime parseDeadline(String value) {
|
||||
if (value == null || value.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
String v = value.trim();
|
||||
for (DateTimeFormatter f : DEADLINE_FORMATS) {
|
||||
try {
|
||||
return LocalDateTime.parse(v, f);
|
||||
} catch (DateTimeParseException ignored) {}
|
||||
}
|
||||
try {
|
||||
return LocalDate.parse(v, DateTimeFormatter.ofPattern("yyyy/MM/dd")).atStartOfDay();
|
||||
} catch (DateTimeParseException ignored) {}
|
||||
try {
|
||||
return LocalDate.parse(v, DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay();
|
||||
} catch (DateTimeParseException ignored) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String truncate(String value, int max) {
|
||||
if (value == null || value.length() <= max) {
|
||||
return value;
|
||||
}
|
||||
return value.substring(0, max);
|
||||
}
|
||||
|
||||
private ImportRecordResponse toResponse(ImportRecord record) {
|
||||
ImportRecordResponse r = new ImportRecordResponse();
|
||||
r.setId(record.getId());
|
||||
r.setFileName(record.getFileName());
|
||||
r.setTotalCount(record.getTotalCount());
|
||||
r.setSuccessCount(record.getSuccessCount());
|
||||
r.setFailCount(record.getFailCount());
|
||||
r.setStatus(record.getStatus());
|
||||
r.setErrorLog(record.getErrorLog());
|
||||
r.setOperator(record.getOperator() == null ? "" : record.getOperator().getUsername());
|
||||
r.setCreatedAt(record.getCreatedAt());
|
||||
return r;
|
||||
}
|
||||
|
||||
private String nz(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
|
||||
private static class ParseResult {
|
||||
private final List<ImportRow> rows;
|
||||
private final boolean headerValid;
|
||||
|
||||
ParseResult(List<ImportRow> rows, boolean headerValid) {
|
||||
this.rows = rows;
|
||||
this.headerValid = headerValid;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,591 @@
|
||||
package com.ims.service.system;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.ims.api.dto.imports.AgentValidateResponse;
|
||||
import com.ims.api.dto.imports.ImportRow;
|
||||
import com.ims.api.dto.imports.ImportSuggestion;
|
||||
import com.ims.service.ai.RoutingChatService;
|
||||
import com.ims.service.entity.PhaseRule;
|
||||
import com.ims.service.repository.PhaseRuleRepository;
|
||||
import com.ims.service.repository.PromptTemplateRepository;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@Service
|
||||
public class ImportSuggestService {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(ImportSuggestService.class);
|
||||
|
||||
private static final int LLM_BATCH_SIZE = 3;
|
||||
|
||||
private static final String[] PHASE_DICT = {"基本设计", "详细设计", "单体测试", "结合测试", "系统测试", "验收", "开发", "测试"};
|
||||
private static final Set<String> PRIORITIES = Set.of("high", "medium", "low");
|
||||
private static final List<PhaseRule> BUILTIN_PHASE_RULES = List.of(
|
||||
rule("詳細設計", "详细设计", "exact"),
|
||||
rule("開発", "开发", "exact"),
|
||||
rule("画面設計書", "详细设计", "contains"),
|
||||
rule("共通部品設計書", "详细设计", "contains"),
|
||||
rule("Impl", "开发", "impl"),
|
||||
rule("単体テスト", "单体测试", "contains"),
|
||||
rule("結合テスト", "结合测试", "contains"),
|
||||
rule("詳細設計", "详细设计", "contains"),
|
||||
rule("構築手順書", "开发", "contains"),
|
||||
rule("設定条件書", "基本设计", "contains"),
|
||||
rule("パラメータシート", "详细设计", "contains"),
|
||||
rule("運用受入", "验收", "contains"),
|
||||
rule("運用", "验收", "contains"),
|
||||
rule("受入", "验收", "contains"));
|
||||
private static final DateTimeFormatter[] DEADLINE_FORMATS = {
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"),
|
||||
DateTimeFormatter.ofPattern("yyyy-MM-dd"),
|
||||
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"),
|
||||
DateTimeFormatter.ofPattern("yyyy/MM/dd")
|
||||
};
|
||||
private static final Map<String, String> PRIORITY_ALIASES = Map.of(
|
||||
"紧急", "high", "高", "high", "中", "medium", "低", "low");
|
||||
private static final Map<String, String> HIGH_KEYWORDS = Map.ofEntries(
|
||||
Map.entry("崩溃", "high"), Map.entry("宕机", "high"), Map.entry("无法启动", "high"), Map.entry("停机", "high"),
|
||||
Map.entry("故障", "high"), Map.entry("异常", "high"), Map.entry("损坏", "high"), Map.entry("严重", "high"),
|
||||
Map.entry("障害", "high"), Map.entry("異常", "high"), Map.entry("エラー", "high"), Map.entry("不整合", "high"),
|
||||
Map.entry("論理エラー", "high"), Map.entry("ロジックエラー", "high"), Map.entry("動作しない", "high"),
|
||||
Map.entry("失敗する", "high"), Map.entry("セキュリティ", "high"), Map.entry("データ不整合", "high"),
|
||||
Map.entry("优化", "low"), Map.entry("性能", "low"), Map.entry("建议", "low"), Map.entry("改进", "low"),
|
||||
Map.entry("コメント", "low"), Map.entry("注釈", "low"), Map.entry("表記", "low"), Map.entry("見直し", "low"),
|
||||
Map.entry("フォーマット", "low"), Map.entry("ドキュメント", "low"));
|
||||
|
||||
private static final String SYSTEM_PROMPT =
|
||||
"你是「指摘管理系统」的数据校验专家 Agent,专精于制造业与软件工程领域的质量问题数据校验。"
|
||||
+ "对批量导入的指摘数据做智能校验,判断该文件是否可作为指摘表导入,并找出可修正的字段问题。"
|
||||
+ "只输出一个 JSON 对象,不要输出任何其他文字或 Markdown 代码块标记。";
|
||||
|
||||
private static final String VALIDATE_BATCH_001 =
|
||||
"请对以下批量导入的指摘数据行进行智能校验。\n\n"
|
||||
+ "字段说明:title=指摘事項、description=対応内容、deadline=対応期限、reviewDate=レビュー実施日、phase=工程阶段、priority=优先级、category=ドキュメント分類、subProject=プロジェクト名、docType=対象ドキュメント\n"
|
||||
+ "已知规则:\n"
|
||||
+ "- 优先级取值必须为 high(紧急)、medium(中)、low(低)。若遇到 \"紧急\"、\"高\"、\"中\"、\"低\"、\"HIGH\" 等非规范写法,请给出归一化建议\n"
|
||||
+ "- 工程阶段应是规范阶段名称(如:基本设计、详细设计、单体测试、结合测试、系统测试、验收、开发)\n"
|
||||
+ "- 期限应为日期格式(yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)\n"
|
||||
+ "- 标题必填,不允许为空\n"
|
||||
+ "- 若没有有效数据行、所有行缺少标题或内容明显与指摘无关,则该文件不能作为指摘表导入\n\n"
|
||||
+ "智能推断要求(仅当字段缺失或为空时):\n"
|
||||
+ "- 若 phase 为空,根据 docType(対象ドキュメント文件名,如含 \"単体テスト\"、\"結合テスト\"、\"画面設計書\"、\"共通部品設計書\"、\"構築手順書\"、\"設定条件書\"、\"パラメータシート\"、\"運用\")或指摘内容上下文推断工程阶段\n"
|
||||
+ "- 若 priority 为空,根据指摘内容的严重程度推断:功能异常/安全/数据不一致/无法运行→high;逻辑需修正/规格不一致→medium;表示/注释/格式/文档→low\n"
|
||||
+ "- 推断结果作为 suggestions 输出(field 为 phase 或 priority),并附简短 reason 说明推断依据\n\n"
|
||||
+ "数据行(JSON):\n%s\n\n"
|
||||
+ "输出格式:单个 JSON 对象,结构为 {\"usable\":true或false,\"usableReason\":\"文件级不可用原因(可用时为空字符串)\","
|
||||
+ "\"suggestions\":[{\"rowNo\":行号,\"field\":\"字段英文名\",\"fieldName\":\"字段中文名\","
|
||||
+ "\"original\":\"原始值\",\"suggested\":\"建议值\",\"reason\":\"修正理由\",\"level\":\"fix或error\"}]}\n"
|
||||
+ "- usable=false 表示整个文件不能作为指摘表导入(如无有效数据行、无标题、内容与指摘无关)\n"
|
||||
+ "- 行内原值已规范或无法推断正确值,则不要输出该项。无任何建议时 suggestions 输出 []。\n"
|
||||
+ "- level=error 表示该字段值非法无法自动修正,level=fix 表示可一键应用的修正建议。\n"
|
||||
+ "- reason 必须简短(不超过20字),直接说明修正内容与原因,禁止出现\"参照\"、\"参考\"、\"参见\"等表述。";
|
||||
|
||||
private final RoutingChatService chatService;
|
||||
private final ObjectMapper objectMapper;
|
||||
private final ObjectMapper rawJsonMapper;
|
||||
private final PromptTemplateRepository promptTemplateRepository;
|
||||
private final PhaseRuleRepository phaseRuleRepository;
|
||||
|
||||
private volatile List<PhaseRule> phaseRuleCache;
|
||||
private volatile long phaseRuleCacheAt;
|
||||
|
||||
private static final long PHASE_RULE_CACHE_TTL_MS = 60_000;
|
||||
|
||||
private static PhaseRule rule(String keyword, String phase, String matchMode) {
|
||||
return PhaseRule.builder().keyword(keyword).phase(phase).matchMode(matchMode).active(true).sortOrder(0).build();
|
||||
}
|
||||
|
||||
public ImportSuggestService(RoutingChatService chatService, ObjectMapper objectMapper,
|
||||
PromptTemplateRepository promptTemplateRepository,
|
||||
PhaseRuleRepository phaseRuleRepository) {
|
||||
this.chatService = chatService;
|
||||
this.objectMapper = objectMapper;
|
||||
this.rawJsonMapper = new ObjectMapper().configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);
|
||||
this.promptTemplateRepository = promptTemplateRepository;
|
||||
this.phaseRuleRepository = phaseRuleRepository;
|
||||
}
|
||||
|
||||
public AgentValidateResponse suggest(List<ImportRow> rows) {
|
||||
long startNanos = System.nanoTime();
|
||||
List<ImportRow> list = rows == null ? List.of() : rows;
|
||||
|
||||
FileUsability ruleUsable = ruleUsability(list);
|
||||
List<ImportSuggestion> rules = ruleSuggest(list);
|
||||
|
||||
LlmResult llm = null;
|
||||
try {
|
||||
llm = llmSuggest(list);
|
||||
} catch (Exception e) {
|
||||
log.warn("AI validate unavailable, fallback to rule engine: {}", e.getMessage());
|
||||
}
|
||||
boolean usable;
|
||||
String usableReason;
|
||||
if (llm != null) {
|
||||
usable = ruleUsable.usable;
|
||||
usableReason = ruleUsable.usable
|
||||
? (llm.usable != null && !llm.usable ? "AI提示:" + nz(llm.usableReason) : "")
|
||||
: ruleUsable.reason;
|
||||
} else {
|
||||
usable = ruleUsable.usable;
|
||||
usableReason = ruleUsable.reason;
|
||||
}
|
||||
|
||||
List<ImportSuggestion> merged = rules;
|
||||
if (llm != null && llm.suggestions != null && !llm.suggestions.isEmpty()) {
|
||||
merged = merge(rules, llm.suggestions);
|
||||
}
|
||||
|
||||
long elapsedMs = (System.nanoTime() - startNanos) / 1_000_000;
|
||||
log.info("Agent validate finished: rows={} engine={} suggestions={} elapsedMs={}",
|
||||
list.size(), llm != null ? "ai" : "rule", merged.size(), elapsedMs);
|
||||
|
||||
AgentValidateResponse response = new AgentValidateResponse();
|
||||
response.setUsable(usable);
|
||||
response.setUsableReason(usableReason);
|
||||
response.setSuggestions(merged);
|
||||
response.setEngine(llm != null ? "ai" : "rule");
|
||||
response.setElapsedMs(elapsedMs);
|
||||
return response;
|
||||
}
|
||||
|
||||
public void enrich(ImportRow row) {
|
||||
if (row == null) {
|
||||
return;
|
||||
}
|
||||
if (row.getPriority() == null || row.getPriority().isBlank()) {
|
||||
String inferred = inferPriority(row);
|
||||
if (inferred != null) {
|
||||
row.setPriority(inferred);
|
||||
}
|
||||
}
|
||||
if (row.getPhase() == null || row.getPhase().isBlank()) {
|
||||
String inferred = inferPhase(row);
|
||||
if (inferred != null) {
|
||||
row.setPhase(inferred);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private FileUsability ruleUsability(List<ImportRow> rows) {
|
||||
if (rows.isEmpty()) {
|
||||
return new FileUsability(false, "文件中未检测到有效的指摘数据行,无法作为指摘表导入。");
|
||||
}
|
||||
boolean anyTitle = rows.stream().anyMatch(r -> !nz(r.getTitle()).isBlank());
|
||||
if (!anyTitle) {
|
||||
return new FileUsability(false, "文件中缺少指摘标题,无法识别为有效指摘数据。");
|
||||
}
|
||||
return new FileUsability(true, "");
|
||||
}
|
||||
|
||||
private List<ImportSuggestion> ruleSuggest(List<ImportRow> rows) {
|
||||
List<ImportSuggestion> result = new ArrayList<>();
|
||||
for (ImportRow row : rows) {
|
||||
if (row.getRowNo() == null) {
|
||||
continue;
|
||||
}
|
||||
result.addAll(rowLevelErrors(row));
|
||||
String phase = nz(row.getPhase());
|
||||
if (!phase.isBlank() && !matchesDict(phase)) {
|
||||
String match = nearestPhase(phase);
|
||||
if (match != null) {
|
||||
result.add(build(row.getRowNo(), "phase", "工程阶段", phase, match,
|
||||
"「" + phase + "」非规范阶段名,应改为「" + match + "」",
|
||||
"fix"));
|
||||
}
|
||||
} else if (phase.isBlank()) {
|
||||
String inferred = inferPhase(row);
|
||||
if (inferred != null) {
|
||||
result.add(build(row.getRowNo(), "phase", "工程阶段", "", inferred,
|
||||
"未填写,按対象ドキュメント推断为「" + inferred + "」",
|
||||
"fix"));
|
||||
}
|
||||
}
|
||||
String priority = nz(row.getPriority()).trim();
|
||||
if (priority.isBlank()) {
|
||||
String suggested = inferPriority(row);
|
||||
if (suggested != null) {
|
||||
result.add(build(row.getRowNo(), "priority", "优先级", "", suggested,
|
||||
"未填写,按内容严重程度推断为「" + suggested + "」",
|
||||
"fix"));
|
||||
}
|
||||
} else {
|
||||
String normalized = normalizePriority(priority);
|
||||
if (normalized != null && !normalized.equals(priority.toLowerCase())) {
|
||||
result.add(build(row.getRowNo(), "priority", "优先级", priority, normalized,
|
||||
"「" + priority + "」非规范取值,应改为 " + normalized,
|
||||
"fix"));
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<ImportSuggestion> rowLevelErrors(ImportRow row) {
|
||||
List<ImportSuggestion> list = new ArrayList<>();
|
||||
if (nz(row.getTitle()).isBlank()) {
|
||||
list.add(build(row.getRowNo(), "title", "标题", null, null, "标题必填", "error"));
|
||||
}
|
||||
String priority = nz(row.getPriority()).trim();
|
||||
if (!priority.isBlank() && normalizePriority(priority) == null) {
|
||||
list.add(build(row.getRowNo(), "priority", "优先级", priority, null, "优先级必须是 high/medium/low", "error"));
|
||||
}
|
||||
String deadline = nz(row.getDeadline()).trim();
|
||||
if (!deadline.isBlank() && !isValidDeadline(deadline)) {
|
||||
list.add(build(row.getRowNo(), "deadline", "期限", deadline, null,
|
||||
"期限格式不正确(应为 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss)", "error"));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private LlmResult llmSuggest(List<ImportRow> rows) {
|
||||
try {
|
||||
if (rows.isEmpty()) {
|
||||
return new LlmResult(true, "", List.of());
|
||||
}
|
||||
List<ImportSuggestion> allSuggestions = new ArrayList<>();
|
||||
Boolean usable = null;
|
||||
String usableReason = "";
|
||||
for (int i = 0; i < rows.size(); i += LLM_BATCH_SIZE) {
|
||||
List<ImportRow> batch = rows.subList(i, Math.min(i + LLM_BATCH_SIZE, rows.size()));
|
||||
LlmResult partial = llmSuggestBatch(batch);
|
||||
if (partial == null) {
|
||||
return null;
|
||||
}
|
||||
if (partial.suggestions != null) {
|
||||
allSuggestions.addAll(partial.suggestions);
|
||||
}
|
||||
if (Boolean.FALSE.equals(partial.usable)) {
|
||||
usable = false;
|
||||
usableReason = nz(partial.usableReason);
|
||||
} else if (usable == null) {
|
||||
usable = true;
|
||||
}
|
||||
}
|
||||
return new LlmResult(usable, usableReason, allSuggestions);
|
||||
} catch (Exception e) {
|
||||
log.warn("LLM suggest failed: {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private LlmResult llmSuggestBatch(List<ImportRow> batch) {
|
||||
try {
|
||||
String rowsJson = rawJsonMapper.writeValueAsString(batch.stream().map(r -> {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("rowNo", r.getRowNo());
|
||||
m.put("title", r.getTitle());
|
||||
m.put("docType", r.getDocType());
|
||||
m.put("phase", r.getPhase());
|
||||
m.put("priority", r.getPriority());
|
||||
m.put("deadline", r.getDeadline());
|
||||
m.put("reviewDate", r.getReviewDate());
|
||||
m.put("category", r.getCategory());
|
||||
m.put("impactLevel", r.getImpactLevel());
|
||||
m.put("description", r.getDescription());
|
||||
m.put("subProject", r.getSubProject());
|
||||
return m;
|
||||
}).toList());
|
||||
String userPrompt = String.format(loadPromptTemplate(), rowsJson);
|
||||
long llmStart = System.nanoTime();
|
||||
String output = chatService.chat(SYSTEM_PROMPT, userPrompt);
|
||||
long llmElapsedMs = (System.nanoTime() - llmStart) / 1_000_000;
|
||||
log.info("LLM batch suggest: rows={} elapsedMs={}", batch.size(), llmElapsedMs);
|
||||
return parseLlmResult(output);
|
||||
} catch (Exception e) {
|
||||
log.warn("LLM batch suggest failed: {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String loadPromptTemplate() {
|
||||
try {
|
||||
return promptTemplateRepository.findByTemplateIdAndIsActiveTrue("VALIDATE_BATCH_001")
|
||||
.map(t -> t.getContent() == null || t.getContent().isBlank()
|
||||
? VALIDATE_BATCH_001 : t.getContent().replace("{{rows}}", "%s"))
|
||||
.orElse(VALIDATE_BATCH_001);
|
||||
} catch (Exception e) {
|
||||
log.warn("Load prompt template from DB failed, use builtin: {}", e.getMessage());
|
||||
return VALIDATE_BATCH_001;
|
||||
}
|
||||
}
|
||||
|
||||
private LlmResult parseLlmResult(String output) {
|
||||
String text = output == null ? "" : output.trim();
|
||||
if (text.startsWith("```")) {
|
||||
text = text.replaceAll("^```(?:json)?\\s*", "").replaceAll("\\s*```$", "");
|
||||
}
|
||||
if (text.isBlank()) {
|
||||
return null;
|
||||
}
|
||||
JsonNode node;
|
||||
try {
|
||||
node = objectMapper.readTree(text);
|
||||
} catch (Exception e) {
|
||||
log.warn("LLM output is not valid JSON: {}", e.getMessage());
|
||||
return null;
|
||||
}
|
||||
if (node.isArray()) {
|
||||
return new LlmResult(null, "", parseSuggestionArray(node));
|
||||
}
|
||||
if (!node.isObject()) {
|
||||
return null;
|
||||
}
|
||||
Boolean usable = node.path("usable").isMissingNode() || node.path("usable").isNull()
|
||||
? null : node.path("usable").asBoolean();
|
||||
String usableReason = node.path("usableReason").asText();
|
||||
List<ImportSuggestion> suggestions = parseSuggestionArray(node.path("suggestions"));
|
||||
return new LlmResult(usable, usableReason, suggestions);
|
||||
}
|
||||
|
||||
private List<ImportSuggestion> parseSuggestionArray(JsonNode array) {
|
||||
List<ImportSuggestion> list = new ArrayList<>();
|
||||
if (array == null || !array.isArray()) {
|
||||
return list;
|
||||
}
|
||||
for (JsonNode n : array) {
|
||||
ImportSuggestion s = parseSuggestion(n);
|
||||
if (s != null) {
|
||||
list.add(s);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
private ImportSuggestion parseSuggestion(JsonNode n) {
|
||||
ImportSuggestion s = new ImportSuggestion();
|
||||
s.setRowNo(n.path("rowNo").isMissingNode() || n.path("rowNo").isNull() ? null : n.path("rowNo").asInt());
|
||||
s.setField(n.path("field").asText());
|
||||
s.setFieldName(n.path("fieldName").asText());
|
||||
s.setOriginal(n.path("original").asText());
|
||||
s.setSuggested(n.path("suggested").asText());
|
||||
s.setReason(n.path("reason").asText());
|
||||
s.setLevel(n.path("level").isMissingNode() || n.path("level").asText().isBlank() ? "fix" : n.path("level").asText());
|
||||
if (s.getRowNo() != null && s.getSuggested() != null && !s.getSuggested().isBlank()) {
|
||||
return s;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<ImportSuggestion> merge(List<ImportSuggestion> rules, List<ImportSuggestion> ai) {
|
||||
Map<String, ImportSuggestion> map = new LinkedHashMap<>();
|
||||
for (ImportSuggestion s : ai) {
|
||||
map.put(key(s), s);
|
||||
}
|
||||
for (ImportSuggestion s : rules) {
|
||||
map.putIfAbsent(key(s), s);
|
||||
}
|
||||
return new ArrayList<>(map.values());
|
||||
}
|
||||
|
||||
private String key(ImportSuggestion s) {
|
||||
return s.getRowNo() + ":" + s.getField();
|
||||
}
|
||||
|
||||
private boolean matchesDict(String value) {
|
||||
String v = value.trim();
|
||||
for (String d : PHASE_DICT) {
|
||||
if (v.equals(d)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private String nearestPhase(String value) {
|
||||
String v = value.trim();
|
||||
String best = null;
|
||||
int bestDist = Integer.MAX_VALUE;
|
||||
for (String d : PHASE_DICT) {
|
||||
int dist = levenshtein(v, d);
|
||||
if (dist < bestDist) {
|
||||
bestDist = dist;
|
||||
best = d;
|
||||
}
|
||||
}
|
||||
return bestDist <= 2 ? best : null;
|
||||
}
|
||||
|
||||
private int levenshtein(String a, String b) {
|
||||
int[][] dp = new int[a.length() + 1][b.length() + 1];
|
||||
for (int i = 0; i <= a.length(); i++) {
|
||||
dp[i][0] = i;
|
||||
}
|
||||
for (int j = 0; j <= b.length(); j++) {
|
||||
dp[0][j] = j;
|
||||
}
|
||||
for (int i = 1; i <= a.length(); i++) {
|
||||
for (int j = 1; j <= b.length(); j++) {
|
||||
int cost = a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1;
|
||||
dp[i][j] = Math.min(Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + cost);
|
||||
}
|
||||
}
|
||||
return dp[a.length()][b.length()];
|
||||
}
|
||||
|
||||
private String inferPriority(ImportRow row) {
|
||||
String text = nz(row.getTitle()) + " " + nz(row.getDescription());
|
||||
String lower = text.toLowerCase();
|
||||
for (Map.Entry<String, String> e : HIGH_KEYWORDS.entrySet()) {
|
||||
if (lower.contains(e.getKey())) {
|
||||
return e.getValue();
|
||||
}
|
||||
}
|
||||
return "medium";
|
||||
}
|
||||
|
||||
private String inferPhase(ImportRow row) {
|
||||
List<PhaseRule> rules = loadPhaseRules();
|
||||
String subProject = nz(row.getSubProject()).trim();
|
||||
if (!subProject.isBlank()) {
|
||||
String phase = matchExact(rules, subProject);
|
||||
if (phase != null) {
|
||||
return phase;
|
||||
}
|
||||
}
|
||||
String docType = nz(row.getDocType()).trim();
|
||||
if (!docType.isBlank()) {
|
||||
String phase = matchContains(rules, docType);
|
||||
if (phase != null) {
|
||||
return phase;
|
||||
}
|
||||
String implPhase = matchImpl(rules, docType);
|
||||
if (implPhase != null) {
|
||||
return implPhase;
|
||||
}
|
||||
}
|
||||
String text = nz(row.getTitle()) + " " + nz(row.getDescription()) + " " + nz(row.getCategory());
|
||||
return matchContains(rules, text);
|
||||
}
|
||||
|
||||
private List<PhaseRule> loadPhaseRules() {
|
||||
long now = System.currentTimeMillis();
|
||||
if (phaseRuleCache != null && now - phaseRuleCacheAt < PHASE_RULE_CACHE_TTL_MS) {
|
||||
return phaseRuleCache;
|
||||
}
|
||||
List<PhaseRule> rules = BUILTIN_PHASE_RULES;
|
||||
try {
|
||||
List<PhaseRule> fromDb = phaseRuleRepository.findByActiveTrueOrderBySortOrderAsc();
|
||||
if (fromDb != null && !fromDb.isEmpty()) {
|
||||
rules = fromDb;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("Load phase rules from DB failed, fallback to builtin: {}", e.getMessage());
|
||||
}
|
||||
phaseRuleCache = rules;
|
||||
phaseRuleCacheAt = now;
|
||||
return rules;
|
||||
}
|
||||
|
||||
private String matchExact(List<PhaseRule> rules, String value) {
|
||||
for (PhaseRule r : rules) {
|
||||
if ("exact".equalsIgnoreCase(r.getMatchMode()) && value.equals(r.getKeyword())) {
|
||||
return r.getPhase();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String matchContains(List<PhaseRule> rules, String text) {
|
||||
for (PhaseRule r : rules) {
|
||||
if ("contains".equalsIgnoreCase(r.getMatchMode()) && text.contains(r.getKeyword())) {
|
||||
return r.getPhase();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String matchImpl(List<PhaseRule> rules, String value) {
|
||||
for (PhaseRule r : rules) {
|
||||
if ("impl".equalsIgnoreCase(r.getMatchMode())
|
||||
&& value.endsWith(r.getKeyword())) {
|
||||
return r.getPhase();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String normalizePriority(String value) {
|
||||
String v = value.trim();
|
||||
for (Map.Entry<String, String> e : PRIORITY_ALIASES.entrySet()) {
|
||||
if (e.getKey().equalsIgnoreCase(v)) {
|
||||
return e.getValue();
|
||||
}
|
||||
}
|
||||
if (PRIORITIES.contains(v.toLowerCase())) {
|
||||
return v.toLowerCase();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private ImportSuggestion build(Integer rowNo, String field, String fieldName,
|
||||
String original, String suggested, String reason, String level) {
|
||||
ImportSuggestion s = new ImportSuggestion();
|
||||
s.setRowNo(rowNo);
|
||||
s.setField(field);
|
||||
s.setFieldName(fieldName);
|
||||
s.setOriginal(original);
|
||||
s.setSuggested(suggested);
|
||||
s.setReason(reason);
|
||||
s.setLevel(level);
|
||||
return s;
|
||||
}
|
||||
|
||||
private boolean isValidDeadline(String value) {
|
||||
String v = value.trim();
|
||||
for (DateTimeFormatter f : DEADLINE_FORMATS) {
|
||||
try {
|
||||
LocalDateTime.parse(v, f);
|
||||
return true;
|
||||
} catch (DateTimeParseException ignored) {}
|
||||
}
|
||||
try {
|
||||
LocalDate.parse(v, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
|
||||
return true;
|
||||
} catch (DateTimeParseException ignored) {}
|
||||
try {
|
||||
LocalDate.parse(v, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||
return true;
|
||||
} catch (DateTimeParseException ignored) {}
|
||||
return false;
|
||||
}
|
||||
|
||||
private String nz(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
|
||||
private static class LlmResult {
|
||||
private final Boolean usable;
|
||||
private final String usableReason;
|
||||
private final List<ImportSuggestion> suggestions;
|
||||
|
||||
LlmResult(Boolean usable, String usableReason, List<ImportSuggestion> suggestions) {
|
||||
this.usable = usable;
|
||||
this.usableReason = usableReason == null ? "" : usableReason;
|
||||
this.suggestions = suggestions;
|
||||
}
|
||||
}
|
||||
|
||||
private static class FileUsability {
|
||||
private final boolean usable;
|
||||
private final String reason;
|
||||
|
||||
FileUsability(boolean usable, String reason) {
|
||||
this.usable = usable;
|
||||
this.reason = reason;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.ims.service.system;
|
||||
|
||||
import com.ims.api.dto.system.LogQueryRequest;
|
||||
import com.ims.api.dto.system.LogResponse;
|
||||
import com.ims.api.service.system.LogService;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.service.entity.IssueLog;
|
||||
import com.ims.service.entity.TaskExecution;
|
||||
import com.ims.service.repository.IssueLogRepository;
|
||||
import com.ims.service.repository.TaskExecutionRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
@Service
|
||||
public class LogServiceImpl implements LogService {
|
||||
|
||||
private final IssueLogRepository issueLogRepository;
|
||||
private final TaskExecutionRepository taskExecutionRepository;
|
||||
|
||||
public LogServiceImpl(IssueLogRepository issueLogRepository,
|
||||
TaskExecutionRepository taskExecutionRepository) {
|
||||
this.issueLogRepository = issueLogRepository;
|
||||
this.taskExecutionRepository = taskExecutionRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public PageResult<LogResponse> list(LogQueryRequest request) {
|
||||
List<LogResponse> all = new ArrayList<>();
|
||||
for (IssueLog log : issueLogRepository.findAll()) {
|
||||
LogResponse r = new LogResponse();
|
||||
r.setId(log.getId());
|
||||
r.setOperator(log.getUser() == null ? "" : log.getUser().getUsername());
|
||||
r.setAction(log.getAction());
|
||||
r.setResource("issue");
|
||||
String detail = "指摘 " + (log.getIssue() == null ? "" : log.getIssue().getIssueNo());
|
||||
String from = nz(log.getFromStatus());
|
||||
String to = nz(log.getToStatus());
|
||||
if (!from.isEmpty() || !to.isEmpty()) {
|
||||
detail += " 状态: " + from + " -> " + to;
|
||||
}
|
||||
if (log.getRemark() != null && !log.getRemark().isBlank()) {
|
||||
detail += " " + log.getRemark();
|
||||
}
|
||||
r.setDetail(detail);
|
||||
r.setCreatedAt(log.getCreatedAt());
|
||||
all.add(r);
|
||||
}
|
||||
for (TaskExecution t : taskExecutionRepository.findAll()) {
|
||||
LogResponse r = new LogResponse();
|
||||
r.setId(t.getId());
|
||||
r.setOperator(t.getCreatedBy() == null ? "" : t.getCreatedBy().getUsername());
|
||||
r.setAction("task." + t.getTaskType());
|
||||
r.setResource("task");
|
||||
String detail = "任务 " + t.getTaskId() + " 状态: " + t.getStatus();
|
||||
if (t.getErrorMessage() != null && !t.getErrorMessage().isBlank()) {
|
||||
detail += " 错误: " + t.getErrorMessage();
|
||||
}
|
||||
r.setDetail(detail);
|
||||
r.setCreatedAt(t.getCreatedAt());
|
||||
all.add(r);
|
||||
}
|
||||
String keyword = request.getKeyword() == null ? null : request.getKeyword().toLowerCase(Locale.ROOT);
|
||||
String operator = request.getOperator() == null ? null : request.getOperator().toLowerCase(Locale.ROOT);
|
||||
String actionType = request.getActionType();
|
||||
LocalDateTime start = request.getStartTime();
|
||||
LocalDateTime end = request.getEndTime();
|
||||
List<LogResponse> filtered = all.stream()
|
||||
.filter(r -> operator == null || r.getOperator() != null
|
||||
&& r.getOperator().toLowerCase(Locale.ROOT).contains(operator))
|
||||
.filter(r -> actionType == null || actionType.isBlank() || r.getAction().contains(actionType))
|
||||
.filter(r -> keyword == null || keyword.isBlank()
|
||||
|| (r.getOperator() != null && r.getOperator().toLowerCase(Locale.ROOT).contains(keyword))
|
||||
|| (r.getDetail() != null && r.getDetail().toLowerCase(Locale.ROOT).contains(keyword)))
|
||||
.filter(r -> start == null || (r.getCreatedAt() != null && !r.getCreatedAt().isBefore(start)))
|
||||
.filter(r -> end == null || (r.getCreatedAt() != null && !r.getCreatedAt().isAfter(end)))
|
||||
.sorted(Comparator.comparing(LogResponse::getCreatedAt, Comparator.nullsLast(Comparator.reverseOrder())))
|
||||
.toList();
|
||||
int total = filtered.size();
|
||||
int from = Math.min((request.getPage() - 1) * request.getPageSize(), total);
|
||||
int to = Math.min(from + request.getPageSize(), total);
|
||||
return new PageResult<>(filtered.subList(from, to), total, request.getPage(), request.getPageSize());
|
||||
}
|
||||
|
||||
private String nz(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
package com.ims.service.system;
|
||||
|
||||
import com.ims.api.dto.system.PermissionResponse;
|
||||
import com.ims.api.dto.system.RoleRequest;
|
||||
import com.ims.api.dto.system.RoleResponse;
|
||||
import com.ims.api.service.system.RoleService;
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Permission;
|
||||
import com.ims.service.entity.Role;
|
||||
import com.ims.service.entity.RolePermission;
|
||||
import com.ims.service.repository.PermissionRepository;
|
||||
import com.ims.service.repository.RolePermissionRepository;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class RoleServiceImpl implements RoleService {
|
||||
|
||||
private static final String DEFAULT_DATA_SCOPE = "all";
|
||||
|
||||
private final RoleRepository roleRepository;
|
||||
private final RolePermissionRepository rolePermissionRepository;
|
||||
private final PermissionRepository permissionRepository;
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
|
||||
public RoleServiceImpl(RoleRepository roleRepository,
|
||||
RolePermissionRepository rolePermissionRepository,
|
||||
PermissionRepository permissionRepository,
|
||||
JdbcTemplate jdbcTemplate) {
|
||||
this.roleRepository = roleRepository;
|
||||
this.rolePermissionRepository = rolePermissionRepository;
|
||||
this.permissionRepository = permissionRepository;
|
||||
this.jdbcTemplate = jdbcTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public List<RoleResponse> list() {
|
||||
return roleRepository.findAll().stream().map(this::toResponse).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public List<PermissionResponse> permissions() {
|
||||
return permissionRepository.findAll().stream()
|
||||
.sorted(Comparator.comparing(Permission::getId))
|
||||
.map(p -> {
|
||||
PermissionResponse r = new PermissionResponse();
|
||||
r.setId(p.getId());
|
||||
r.setCode(p.getCode());
|
||||
r.setName(p.getName());
|
||||
r.setResource(p.getResource());
|
||||
return r;
|
||||
}).toList();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public RoleResponse create(RoleRequest request) {
|
||||
if (roleRepository.findAll().stream().anyMatch(r -> r.getName().equals(request.getName()))) {
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "角色名称已存在");
|
||||
}
|
||||
Role role = Role.builder()
|
||||
.name(request.getName())
|
||||
.description(request.getDescription())
|
||||
.agentAutoExecute(Boolean.TRUE.equals(request.getAgentAutoExecute()))
|
||||
.build();
|
||||
role = roleRepository.save(role);
|
||||
String scope = request.getDataScope() == null || request.getDataScope().isBlank()
|
||||
? DEFAULT_DATA_SCOPE : request.getDataScope();
|
||||
jdbcTemplate.update("UPDATE roles SET data_scope = ? WHERE id = ?", scope, role.getId());
|
||||
savePermissions(role.getId(), request.getPermissionIds());
|
||||
return toResponse(role);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public RoleResponse update(Long id, RoleRequest request) {
|
||||
Role role = roleRepository.findById(id)
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "角色不存在"));
|
||||
if (request.getName() != null && !request.getName().isBlank()) {
|
||||
role.setName(request.getName());
|
||||
}
|
||||
if (request.getDescription() != null) {
|
||||
role.setDescription(request.getDescription());
|
||||
}
|
||||
if (request.getAgentAutoExecute() != null) {
|
||||
role.setAgentAutoExecute(request.getAgentAutoExecute());
|
||||
}
|
||||
roleRepository.save(role);
|
||||
if (request.getDataScope() != null) {
|
||||
jdbcTemplate.update("UPDATE roles SET data_scope = ? WHERE id = ?", request.getDataScope(), id);
|
||||
}
|
||||
savePermissions(id, request.getPermissionIds());
|
||||
return toResponse(role);
|
||||
}
|
||||
|
||||
private void savePermissions(Long roleId, List<Long> permissionIds) {
|
||||
List<RolePermission> existing = rolePermissionRepository.findByRoleId(roleId);
|
||||
if (!existing.isEmpty()) {
|
||||
rolePermissionRepository.deleteAll(existing);
|
||||
}
|
||||
if (permissionIds == null || permissionIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<RolePermission> permissions = permissionIds.stream()
|
||||
.filter(permissionRepository::existsById)
|
||||
.map(permissionId -> RolePermission.builder().roleId(roleId).permissionId(permissionId).build())
|
||||
.toList();
|
||||
if (!permissions.isEmpty()) {
|
||||
rolePermissionRepository.saveAll(permissions);
|
||||
}
|
||||
}
|
||||
|
||||
private RoleResponse toResponse(Role role) {
|
||||
RoleResponse r = new RoleResponse();
|
||||
r.setId(role.getId());
|
||||
r.setName(role.getName());
|
||||
r.setDescription(role.getDescription());
|
||||
r.setAgentAutoExecute(role.getAgentAutoExecute());
|
||||
r.setDataScope(readDataScope(role.getId()));
|
||||
r.setCreatedAt(role.getCreatedAt());
|
||||
r.setPermissionIds(rolePermissionRepository.findByRoleId(role.getId())
|
||||
.stream().map(RolePermission::getPermissionId).toList());
|
||||
return r;
|
||||
}
|
||||
|
||||
private String readDataScope(Long roleId) {
|
||||
List<String> result = jdbcTemplate.queryForList("SELECT data_scope FROM roles WHERE id = ?", String.class, roleId);
|
||||
return result.isEmpty() || result.get(0) == null ? DEFAULT_DATA_SCOPE : result.get(0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
package com.ims.service.system;
|
||||
|
||||
import com.ims.api.dto.system.UserRequest;
|
||||
import com.ims.api.dto.system.UserResponse;
|
||||
import com.ims.api.service.system.UserService;
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.entity.Role;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.entity.UserRole;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
@Service
|
||||
public class UserServiceImpl implements UserService {
|
||||
|
||||
private static final String DEFAULT_PASSWORD = "Admin@123456";
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final DepartmentRepository departmentRepository;
|
||||
private final RoleRepository roleRepository;
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final PasswordEncoder passwordEncoder;
|
||||
|
||||
public UserServiceImpl(UserRepository userRepository,
|
||||
DepartmentRepository departmentRepository,
|
||||
RoleRepository roleRepository,
|
||||
UserRoleRepository userRoleRepository,
|
||||
PasswordEncoder passwordEncoder) {
|
||||
this.userRepository = userRepository;
|
||||
this.departmentRepository = departmentRepository;
|
||||
this.roleRepository = roleRepository;
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.passwordEncoder = passwordEncoder;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public PageResult<UserResponse> list(int page, int pageSize, String keyword, Long departmentId, Boolean isActive) {
|
||||
List<User> filtered = userRepository.findAll().stream()
|
||||
.filter(u -> departmentId == null || (u.getDepartment() != null && departmentId.equals(u.getDepartment().getId())))
|
||||
.filter(u -> isActive == null || isActive.equals(u.getIsActive()))
|
||||
.filter(u -> keyword == null || keyword.isBlank() || matches(u, keyword))
|
||||
.sorted(Comparator.comparing(User::getCreatedAt, Comparator.nullsLast(Comparator.reverseOrder())))
|
||||
.toList();
|
||||
int total = filtered.size();
|
||||
int from = Math.min((page - 1) * pageSize, total);
|
||||
int to = Math.min(from + pageSize, total);
|
||||
List<UserResponse> items = filtered.subList(from, to).stream().map(this::toResponse).toList();
|
||||
return new PageResult<>(items, total, page, pageSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public UserResponse create(UserRequest request) {
|
||||
if (userRepository.findByUserid(request.getUserid()).isPresent()) {
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "账号已存在");
|
||||
}
|
||||
if (userRepository.findByUsername(request.getUsername()).isPresent()) {
|
||||
throw new BusinessException(ResultCode.BAD_REQUEST.getCode(), "用户名已存在");
|
||||
}
|
||||
Department department = departmentRepository.findById(request.getDepartmentId())
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "部门不存在"));
|
||||
String password = request.getPassword() == null || request.getPassword().isBlank()
|
||||
? DEFAULT_PASSWORD : request.getPassword();
|
||||
User user = User.builder()
|
||||
.userid(request.getUserid())
|
||||
.username(request.getUsername())
|
||||
.email(request.getEmail())
|
||||
.passwordHash(passwordEncoder.encode(password))
|
||||
.department(department)
|
||||
.isActive(request.getIsActive() == null || request.getIsActive())
|
||||
.agentAutoExecute(Boolean.TRUE.equals(request.getAgentAutoExecute()))
|
||||
.build();
|
||||
user = userRepository.save(user);
|
||||
saveRoles(user.getId(), request.getRoleIds());
|
||||
return toResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public UserResponse update(Long id, UserRequest request) {
|
||||
User user = userRepository.findById(id)
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "用户不存在"));
|
||||
if (request.getUsername() != null && !request.getUsername().isBlank()) {
|
||||
user.setUsername(request.getUsername());
|
||||
}
|
||||
if (request.getEmail() != null) {
|
||||
user.setEmail(request.getEmail());
|
||||
}
|
||||
if (request.getPassword() != null && !request.getPassword().isBlank()) {
|
||||
user.setPasswordHash(passwordEncoder.encode(request.getPassword()));
|
||||
}
|
||||
if (request.getDepartmentId() != null) {
|
||||
user.setDepartment(departmentRepository.findById(request.getDepartmentId())
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "部门不存在")));
|
||||
}
|
||||
if (request.getIsActive() != null) {
|
||||
user.setIsActive(request.getIsActive());
|
||||
}
|
||||
if (request.getAgentAutoExecute() != null) {
|
||||
user.setAgentAutoExecute(request.getAgentAutoExecute());
|
||||
}
|
||||
user = userRepository.save(user);
|
||||
saveRoles(id, request.getRoleIds());
|
||||
return toResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateStatus(Long id, Boolean isActive) {
|
||||
User user = userRepository.findById(id)
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.BAD_REQUEST.getCode(), "用户不存在"));
|
||||
user.setIsActive(isActive);
|
||||
userRepository.save(user);
|
||||
}
|
||||
|
||||
private boolean matches(User u, String keyword) {
|
||||
String kw = keyword.toLowerCase(Locale.ROOT);
|
||||
return (u.getUserid() != null && u.getUserid().toLowerCase(Locale.ROOT).contains(kw))
|
||||
|| (u.getUsername() != null && u.getUsername().toLowerCase(Locale.ROOT).contains(kw))
|
||||
|| (u.getEmail() != null && u.getEmail().toLowerCase(Locale.ROOT).contains(kw));
|
||||
}
|
||||
|
||||
private void saveRoles(Long userId, List<Long> roleIds) {
|
||||
List<UserRole> existing = userRoleRepository.findByUserId(userId);
|
||||
if (!existing.isEmpty()) {
|
||||
userRoleRepository.deleteAll(existing);
|
||||
}
|
||||
if (roleIds == null || roleIds.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<UserRole> roles = roleIds.stream()
|
||||
.filter(roleRepository::existsById)
|
||||
.map(roleId -> UserRole.builder().userId(userId).roleId(roleId).build())
|
||||
.toList();
|
||||
if (!roles.isEmpty()) {
|
||||
userRoleRepository.saveAll(roles);
|
||||
}
|
||||
}
|
||||
|
||||
private UserResponse toResponse(User u) {
|
||||
UserResponse r = new UserResponse();
|
||||
r.setId(u.getId());
|
||||
r.setUserid(u.getUserid());
|
||||
r.setUsername(u.getUsername());
|
||||
r.setEmail(u.getEmail());
|
||||
r.setDepartmentId(u.getDepartment() == null ? null : u.getDepartment().getId());
|
||||
r.setDepartmentName(u.getDepartment() == null ? null : u.getDepartment().getName());
|
||||
r.setIsActive(u.getIsActive());
|
||||
r.setAgentAutoExecute(u.getAgentAutoExecute());
|
||||
r.setLastLoginAt(u.getLastLoginAt());
|
||||
r.setCreatedAt(u.getCreatedAt());
|
||||
List<Long> roleIds = userRoleRepository.findByUserId(u.getId()).stream().map(UserRole::getRoleId).toList();
|
||||
r.setRoleIds(roleIds);
|
||||
r.setRoles(roleIds.isEmpty() ? List.of()
|
||||
: roleRepository.findAllById(roleIds).stream().map(Role::getName).toList());
|
||||
return r;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
-- departments 部门表
|
||||
CREATE TABLE departments (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
parent_id BIGINT REFERENCES departments(id),
|
||||
sort_order INT DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- users 用户表
|
||||
CREATE TABLE users (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
userid VARCHAR(50) NOT NULL UNIQUE,
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
email VARCHAR(100),
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
department_id BIGINT NOT NULL REFERENCES departments(id),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
agent_auto_execute BOOLEAN DEFAULT FALSE,
|
||||
last_login_at TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- roles 角色表
|
||||
CREATE TABLE roles (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
name VARCHAR(50) NOT NULL UNIQUE,
|
||||
description VARCHAR(255),
|
||||
agent_auto_execute BOOLEAN DEFAULT FALSE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- permissions 权限表
|
||||
CREATE TABLE permissions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
code VARCHAR(100) NOT NULL UNIQUE,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
resource VARCHAR(50) NOT NULL,
|
||||
description VARCHAR(255)
|
||||
);
|
||||
|
||||
-- user_roles 用户角色关联
|
||||
CREATE TABLE user_roles (
|
||||
user_id BIGINT NOT NULL REFERENCES users(id),
|
||||
role_id BIGINT NOT NULL REFERENCES roles(id),
|
||||
PRIMARY KEY (user_id, role_id)
|
||||
);
|
||||
|
||||
-- role_permissions 角色权限关联
|
||||
CREATE TABLE role_permissions (
|
||||
role_id BIGINT NOT NULL REFERENCES roles(id),
|
||||
permission_id BIGINT NOT NULL REFERENCES permissions(id),
|
||||
PRIMARY KEY (role_id, permission_id)
|
||||
);
|
||||
@@ -0,0 +1,96 @@
|
||||
-- issues 指摘主表
|
||||
CREATE TABLE issues (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
issue_no VARCHAR(20) NOT NULL UNIQUE,
|
||||
title VARCHAR(200) NOT NULL,
|
||||
description TEXT,
|
||||
status VARCHAR(30) NOT NULL DEFAULT 'draft',
|
||||
priority VARCHAR(10) NOT NULL DEFAULT 'medium',
|
||||
deadline TIMESTAMP,
|
||||
phase VARCHAR(50),
|
||||
sub_project VARCHAR(100),
|
||||
category VARCHAR(50),
|
||||
impact_level VARCHAR(10),
|
||||
impact_scope VARCHAR(200),
|
||||
deployment VARCHAR(100),
|
||||
pgm_no VARCHAR(50),
|
||||
review_workload DECIMAL(5,1),
|
||||
response_workload DECIMAL(5,1),
|
||||
response_content TEXT,
|
||||
ng_reason VARCHAR(200),
|
||||
response_completed_at TIMESTAMP,
|
||||
confirm_at TIMESTAMP,
|
||||
creator_id BIGINT NOT NULL REFERENCES users(id),
|
||||
assignee_id BIGINT REFERENCES users(id),
|
||||
department_id BIGINT NOT NULL REFERENCES departments(id),
|
||||
reviewer_id BIGINT REFERENCES users(id),
|
||||
validator_id BIGINT REFERENCES users(id),
|
||||
ai_analysis_id BIGINT,
|
||||
agent_last_plan_id BIGINT,
|
||||
agent_status VARCHAR(20) DEFAULT 'human_driven',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
closed_at TIMESTAMP,
|
||||
is_deleted BOOLEAN DEFAULT FALSE
|
||||
);
|
||||
|
||||
-- issue_logs 指摘操作日志
|
||||
CREATE TABLE issue_logs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
issue_id BIGINT NOT NULL REFERENCES issues(id),
|
||||
user_id BIGINT NOT NULL REFERENCES users(id),
|
||||
action VARCHAR(30) NOT NULL,
|
||||
from_status VARCHAR(30),
|
||||
to_status VARCHAR(30),
|
||||
remark VARCHAR(500),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- attachments 附件表
|
||||
CREATE TABLE attachments (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
issue_id BIGINT NOT NULL REFERENCES issues(id),
|
||||
file_name VARCHAR(200) NOT NULL,
|
||||
file_path VARCHAR(500) NOT NULL,
|
||||
file_size BIGINT NOT NULL,
|
||||
mime_type VARCHAR(100),
|
||||
uploaded_by BIGINT NOT NULL REFERENCES users(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- notifications 通知表
|
||||
CREATE TABLE notifications (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id),
|
||||
title VARCHAR(200) NOT NULL,
|
||||
content VARCHAR(1000) NOT NULL,
|
||||
type VARCHAR(30) NOT NULL,
|
||||
link VARCHAR(500),
|
||||
is_read BOOLEAN DEFAULT FALSE,
|
||||
issue_id BIGINT REFERENCES issues(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- task_executions 异步任务表
|
||||
CREATE TABLE task_executions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
task_id VARCHAR(64) NOT NULL UNIQUE,
|
||||
task_type VARCHAR(30) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||||
result_url VARCHAR(500),
|
||||
error_message TEXT,
|
||||
created_by BIGINT NOT NULL REFERENCES users(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
started_at TIMESTAMP,
|
||||
completed_at TIMESTAMP,
|
||||
retry_count INT DEFAULT 0
|
||||
);
|
||||
|
||||
-- 索引
|
||||
CREATE INDEX idx_issues_dept_status ON issues(department_id, status, created_at DESC);
|
||||
CREATE INDEX idx_issues_assignee ON issues(assignee_id, status);
|
||||
CREATE INDEX idx_issues_deadline ON issues(deadline);
|
||||
CREATE INDEX idx_issues_no ON issues(issue_no);
|
||||
CREATE INDEX idx_issue_logs_issue ON issue_logs(issue_id, created_at DESC);
|
||||
CREATE INDEX idx_attachments_issue ON attachments(issue_id);
|
||||
CREATE INDEX idx_notifications_user ON notifications(user_id, is_read, created_at DESC);
|
||||
@@ -0,0 +1,28 @@
|
||||
-- ai_analysis AI分析结果表
|
||||
CREATE TABLE ai_analysis (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
issue_id BIGINT NOT NULL REFERENCES issues(id),
|
||||
category VARCHAR(100),
|
||||
keywords VARCHAR(500),
|
||||
root_cause VARCHAR(1000),
|
||||
suggestion TEXT,
|
||||
status VARCHAR(20) DEFAULT 'pending',
|
||||
helpful_count INT DEFAULT 0,
|
||||
prompt_template_id VARCHAR(100),
|
||||
prompt_version INT,
|
||||
model_provider VARCHAR(20),
|
||||
model_name VARCHAR(50),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- ai_feedback AI反馈表
|
||||
CREATE TABLE ai_feedback (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
ai_analysis_id BIGINT NOT NULL REFERENCES ai_analysis(id),
|
||||
user_id BIGINT NOT NULL REFERENCES users(id),
|
||||
is_helpful BOOLEAN NOT NULL,
|
||||
comment VARCHAR(500),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX idx_ai_analysis_issue ON ai_analysis(issue_id, created_at DESC);
|
||||
@@ -0,0 +1,43 @@
|
||||
-- agent_plans Agent规划表
|
||||
CREATE TABLE agent_plans (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
issue_id BIGINT NOT NULL REFERENCES issues(id),
|
||||
goal TEXT NOT NULL,
|
||||
plan_steps JSONB NOT NULL,
|
||||
status VARCHAR(20) DEFAULT 'pending',
|
||||
requires_approval BOOLEAN DEFAULT FALSE,
|
||||
approval_status VARCHAR(20),
|
||||
approval_comment VARCHAR(500),
|
||||
created_by BIGINT REFERENCES users(id),
|
||||
model_provider VARCHAR(20),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
completed_at TIMESTAMP
|
||||
);
|
||||
|
||||
-- agent_memories Agent长期记忆表
|
||||
CREATE TABLE agent_memories (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
issue_summary TEXT NOT NULL,
|
||||
solution_steps JSONB NOT NULL,
|
||||
effectiveness_score DECIMAL(3,2) DEFAULT 0.00,
|
||||
embedding VECTOR(1536),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- tool_executions 工具执行明细表
|
||||
CREATE TABLE tool_executions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
plan_id BIGINT REFERENCES agent_plans(id),
|
||||
tool_name VARCHAR(50) NOT NULL,
|
||||
input_params JSONB NOT NULL,
|
||||
output_result TEXT,
|
||||
status VARCHAR(20) DEFAULT 'success',
|
||||
execution_time_ms BIGINT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX idx_agent_plans_issue ON agent_plans(issue_id, created_at DESC);
|
||||
CREATE INDEX idx_tool_executions_plan ON tool_executions(plan_id);
|
||||
-- agent_memories 向量索引
|
||||
CREATE INDEX idx_agent_memories_embedding ON agent_memories USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
||||
@@ -0,0 +1,40 @@
|
||||
-- knowledge_documents 知识库文档表
|
||||
CREATE TABLE knowledge_documents (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
file_path VARCHAR(500) NOT NULL,
|
||||
file_size BIGINT NOT NULL,
|
||||
file_type VARCHAR(20) NOT NULL,
|
||||
chunk_count INT DEFAULT 0,
|
||||
status VARCHAR(20) DEFAULT 'pending',
|
||||
error_message TEXT,
|
||||
uploaded_by BIGINT NOT NULL REFERENCES users(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- knowledge_chunks 知识库向量切片表
|
||||
CREATE TABLE knowledge_chunks (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
doc_id BIGINT NOT NULL REFERENCES knowledge_documents(id),
|
||||
content TEXT NOT NULL,
|
||||
embedding VECTOR(1536) NOT NULL,
|
||||
metadata JSONB,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- knowledge_search_logs 知识库检索审计表
|
||||
CREATE TABLE knowledge_search_logs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
user_id BIGINT REFERENCES users(id),
|
||||
issue_id BIGINT REFERENCES issues(id),
|
||||
query TEXT NOT NULL,
|
||||
rewritten_query TEXT,
|
||||
top_k INT DEFAULT 5,
|
||||
total_matches INT,
|
||||
duration_ms INT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX idx_knowledge_chunks_embedding ON knowledge_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
||||
CREATE INDEX idx_knowledge_search_logs_user ON knowledge_search_logs(user_id, created_at DESC);
|
||||
@@ -0,0 +1,48 @@
|
||||
-- prompt_templates Prompt模板主表
|
||||
CREATE TABLE prompt_templates (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
template_id VARCHAR(100) NOT NULL UNIQUE,
|
||||
name VARCHAR(200) NOT NULL,
|
||||
category VARCHAR(50) NOT NULL,
|
||||
version INT NOT NULL DEFAULT 1,
|
||||
content TEXT NOT NULL,
|
||||
variables JSONB,
|
||||
output_schema JSONB,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
is_default BOOLEAN DEFAULT FALSE,
|
||||
created_by BIGINT REFERENCES users(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- prompt_template_versions Prompt模板版本历史表
|
||||
CREATE TABLE prompt_template_versions (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
template_id VARCHAR(100) NOT NULL,
|
||||
version INT NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
change_log VARCHAR(500),
|
||||
created_by BIGINT REFERENCES users(id),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- prompt_render_logs Prompt渲染审计表
|
||||
CREATE TABLE prompt_render_logs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
request_id VARCHAR(64) NOT NULL,
|
||||
template_id VARCHAR(100) NOT NULL,
|
||||
template_version INT NOT NULL,
|
||||
rendered_prompt TEXT NOT NULL,
|
||||
variables_used JSONB,
|
||||
tokens_input INT,
|
||||
tokens_output INT,
|
||||
execution_time_ms INT,
|
||||
llm_model VARCHAR(50),
|
||||
model_provider VARCHAR(20),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX idx_prompt_templates_id ON prompt_templates(template_id, is_active);
|
||||
CREATE INDEX idx_prompt_templates_cat ON prompt_templates(category, is_active);
|
||||
CREATE INDEX idx_prompt_render_logs_req ON prompt_render_logs(request_id);
|
||||
CREATE INDEX idx_prompt_render_logs_tpl ON prompt_render_logs(template_id, created_at DESC);
|
||||
@@ -0,0 +1,43 @@
|
||||
-- 部门数据
|
||||
INSERT INTO departments (id, name, parent_id, sort_order) VALUES
|
||||
(1, '总公司', NULL, 1),
|
||||
(2, '技术部', 1, 1),
|
||||
(3, '质量部', 1, 2),
|
||||
(4, '产品部', 1, 3);
|
||||
|
||||
-- 角色数据
|
||||
INSERT INTO roles (id, name, description, agent_auto_execute) VALUES
|
||||
(1, '超级管理员', '系统最高权限角色', TRUE),
|
||||
(2, '部门管理员', '管理部门内用户和业务', FALSE),
|
||||
(3, '指摘录入员', '负责录入指摘', FALSE),
|
||||
(4, '整改担当', '负责对应整改', FALSE),
|
||||
(5, '验证人员', '负责验证整改结果', FALSE),
|
||||
(6, '只读用户', '仅有查看权限', FALSE);
|
||||
|
||||
-- 用户数据(密码均为 Admin@2026,bcrypt 哈希)
|
||||
INSERT INTO users (id, userid, username, email, password_hash, department_id, is_active, agent_auto_execute) VALUES
|
||||
(1, 'admin', '系统管理员', '[email protected]', '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6', 1, TRUE, TRUE),
|
||||
(2, 'zhangsan', '张三', '[email protected]', '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6', 2, TRUE, FALSE),
|
||||
(3, 'lisi', '李四', '[email protected]', '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6', 3, TRUE, FALSE);
|
||||
|
||||
-- 用户角色关联
|
||||
INSERT INTO user_roles (user_id, role_id) VALUES
|
||||
(1, 1),
|
||||
(2, 2),
|
||||
(3, 5);
|
||||
|
||||
-- 权限数据(菜单权限)
|
||||
INSERT INTO permissions (id, code, name, resource, description) VALUES
|
||||
(1, 'MENU_DASHBOARD', '工作台', 'menu', '工作台页面'),
|
||||
(2, 'MENU_ISSUES', '指摘列表', 'menu', '指摘列表页面'),
|
||||
(3, 'MENU_BATCH_INPUT', '批量录入', 'menu', '批量录入页面'),
|
||||
(4, 'MENU_AI_ANALYSIS', 'AI智能分析', 'menu', 'AI分析管理页面'),
|
||||
(5, 'MENU_KNOWLEDGE_BASE', '知识库管理', 'menu', '知识库管理页面'),
|
||||
(6, 'MENU_SYSTEM_USERS', '用户管理', 'menu', '用户管理页面'),
|
||||
(7, 'MENU_SYSTEM_ROLES', '角色权限', 'menu', '角色权限页面'),
|
||||
(8, 'MENU_SYSTEM_LOGS', '系统日志', 'menu', '系统日志页面'),
|
||||
(9, 'MENU_SYSTEM_AGENT', 'Agent管理', 'menu', 'Agent管理页面');
|
||||
|
||||
-- 超级管理员赋权
|
||||
INSERT INTO role_permissions (role_id, permission_id)
|
||||
SELECT 1, id FROM permissions;
|
||||
@@ -0,0 +1,2 @@
|
||||
UPDATE users SET password_hash = '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6'
|
||||
WHERE userid IN ('admin', 'zhangsan', 'lisi');
|
||||
@@ -0,0 +1,14 @@
|
||||
-- 修正向量维度:nomic-embed-text 输出 768 维,而非 1536
|
||||
DROP TABLE IF EXISTS knowledge_chunks CASCADE;
|
||||
|
||||
CREATE TABLE knowledge_chunks (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
doc_id BIGINT NOT NULL REFERENCES knowledge_documents(id),
|
||||
content TEXT NOT NULL,
|
||||
embedding VECTOR(768) NOT NULL,
|
||||
metadata JSONB,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
DROP INDEX IF EXISTS idx_knowledge_chunks_embedding;
|
||||
CREATE INDEX idx_knowledge_chunks_embedding ON knowledge_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
||||
@@ -0,0 +1,44 @@
|
||||
-- Prompt模板种子数据(内容取自概要设计 3.4 节,其余模板与 V4.2 一致)
|
||||
-- 模板ID:SYS_ROLE_001 / PLAN_001 / ANALYSIS_ROOT_CAUSE_001 / QUERY_REWRITE_001 / MEMORY_RERANK_001 / FORMAT_JSON_001
|
||||
|
||||
INSERT INTO prompt_templates (template_id, name, category, version, content, variables, output_schema, is_active, is_default, created_by) VALUES
|
||||
|
||||
('SYS_ROLE_001', '系统角色Prompt模板', 'system', 1,
|
||||
E'# 角色定义\n你是「指摘管理专家Agent」,专精于制造业与软件工程领域的质量问题跟踪与整改管理。\n你的知识边界严格限定于以下范围:\n- 指摘全生命周期管理(创建 → 分配 → 整改 → 验证 → 关闭)\n- 工程质量管理标准(ISO 9001、CMMI、企业内部QA规范)\n- 历史成功案例与失败教训(来自本地知识库检索)\n- 项目工程阶段管理(需求/设计/编码/测试/部署/运维)\n\n# 身份标识\n- 系统名称:指摘管理系统(Issue Tracking System)\n- 你的名称:指摘助手(Issue Assistant)\n- 当前版本:V6.0\n\n# 行为约束(强制遵守,违反将导致操作被拒绝)\n1. 【术语强制】所有输入输出必须使用标准指摘管理术语:\n - 使用「对应者」而非「负责人」「处理人」\n - 使用「PGM」指代项目编号,格式为 PGM-XXXX\n - 使用「指摘」而非「问题」「缺陷」「bug」\n - 使用「对应内容」而非「解决方案」「修复方案」\n - 使用「确认者」而非「审核人」「验收人」\n - 使用「对应完了日」而非「完成日期」\n - 使用「review工数」和「对应工数」计量工作量\n - 状态术语:draft(草稿)/ open(待处理)/ in_progress(进行中)/ resolved(已解决)/ verified(已验证)/ closed(已关闭)/ rejected(已驳回)\n\n2. 【审批强制】涉及以下高风险操作必须调用 request_human_approval 工具:\n - 关闭指摘(close_issue)\n - 删除指摘(delete_issue)\n - 跨部门分配指摘(assignee部门 ≠ 当前指摘部门)\n - 修改已验证状态的指摘\n - 批量操作超过10条指摘\n - 任何涉及数据删除或不可逆变更的操作\n\n3. 【知识优先】生成整改建议时,必须遵循以下优先级:\n - 第一优先:引用本地知识库中的历史成功案例(需标注案例ID)\n - 第二优先:引用企业内部QA规范\n - 第三优先:基于通用工程管理最佳实践\n - 禁止:提供与指摘管理无关的建议(如财务、人事、市场等)\n\n4. 【上下文依赖】当用户意图模糊时,必须优先询问以下信息以明确上下文:\n - 指摘ID(issue_id)\n - 工程阶段(phase)\n - 归属部门(department_id)\n - 当前状态(status)\n 禁止在上下文不明的情况下执行操作。\n\n5. 【输出结构化】所有输出必须严格符合预定义JSON Schema或Markdown模板,禁止自由发挥。\n - 分析类输出 → JSON格式\n - 对话类输出 → Markdown格式,含结构化标题\n - 工具调用 → 严格参数格式\n\n6. 【安全边界】禁止执行以下行为:\n - 生成、传播或协助创建恶意代码\n - 泄露其他用户的敏感信息(密码、个人联系方式等)\n - 执行超出指摘管理范畴的系统操作\n - 伪造或篡改审计日志\n\n# 当前环境信息\n- 当前用户:{{currentUserName}}({{currentUserRole}})\n- 所属部门:{{currentUserDepartment}}\n- Agent自动执行权限:{{agentAutoExecuteEnabled}}\n- 可用工具列表(格式:工具名 - 描述):\n{{availableTools}}\n- 当前时间:{{currentTime}}\n\n# 工具调用规则(适用于当前AI引擎:{{modelProvider}})\n- 当你需要调用工具时,请在你的回复中输出一个 JSON 对象,格式为:\n{\n "tool": "工具名",\n "parameters": { ... }\n}\n- 不要用自然语言额外解释,直接输出该 JSON。\n- 如果目标已完成,输出 { "tool": "goal_completed", "parameters": {} }。',
|
||||
'[{"name":"currentUserName","type":"string","required":true,"description":"当前登录用户名"},{"name":"currentUserRole","type":"string","required":true,"description":"当前用户角色名"},{"name":"currentUserDepartment","type":"string","required":true,"description":"当前用户所属部门"},{"name":"agentAutoExecuteEnabled","type":"boolean","required":true,"description":"Agent自动执行权限"},{"name":"availableTools","type":"string","required":true,"description":"可用工具列表(已格式化文本)"},{"name":"currentTime","type":"string","required":true,"description":"当前时间"},{"name":"modelProvider","type":"string","required":true,"description":"当前AI引擎"}]',
|
||||
'{"type":"object","description":"系统角色约束,用于引导模型行为","properties":{"tool":{"type":"string","description":"工具名"},"parameters":{"type":"object","description":"工具参数"}}}',
|
||||
TRUE, TRUE, NULL),
|
||||
|
||||
('PLAN_001', 'ReAct规划Prompt模板', 'agent', 1,
|
||||
E'# 任务\n基于用户目标和当前上下文,生成结构化的执行计划(ReAct循环)。\n\n# 输入\n用户目标:{{userGoal}}\n当前指摘上下文:{{issueContext}}\n历史相似案例:{{similarCases}}\n可用工具列表:{{availableTools}}\n已执行步骤:{{executedSteps}}\n当前步数:{{currentStep}} / 最大步数:{{maxSteps}}\n\n# 思考格式(必须严格遵循)\n你必须按以下结构输出思考过程,**且最终必须输出一个 JSON 对象**,其中 `action` 字段包含下一步的工具调用。\n\n[思考]\n1. 用户意图解析:将自然语言目标转化为明确的业务操作\n2. 上下文评估:当前已掌握的信息是否足够执行\n3. 工具选择:从可用工具中选择最合适的工具(仅限1个)\n4. 参数生成:为选定工具生成所需参数\n5. 风险评估:判断是否需要人工审批\n6. 输出格式:确认输出符合JSON Schema\n\n[行动]\n```json\n{\n "action": {\n "tool_name": "工具名称(必须从可用工具列表中选择)",\n "parameters": {\n "param1": "值1",\n "param2": "值2"\n },\n "reasoning": "选择此工具的理由(一句话)",\n "requires_approval": true/false,\n "approval_reason": "如需要审批,写明原因"\n }\n}\n```\n\n# 约束\n- 每步只能调用一个工具。\n- 如需审批,必须调用 request_human_approval 工具,不得直接执行目标操作。\n- 参数中的ID类字段必须为数字,禁止传递字符串ID。\n- 如用户目标已完成,输出 tool_name 为 "goal_completed"。\n- 如达到最大步数仍未完成,输出 tool_name 为 "max_steps_reached" 并说明原因。',
|
||||
'[{"name":"userGoal","type":"string","required":true,"description":"用户目标"},{"name":"issueContext","type":"string","required":true,"description":"当前指摘上下文"},{"name":"similarCases","type":"string","required":false,"description":"历史相似案例"},{"name":"availableTools","type":"string","required":true,"description":"可用工具列表"},{"name":"executedSteps","type":"string","required":false,"description":"已执行步骤"},{"name":"currentStep","type":"integer","required":true,"description":"当前步数"},{"name":"maxSteps","type":"integer","required":true,"description":"最大步数"}]',
|
||||
'{"type":"object","properties":{"action":{"type":"object","required":["tool_name","parameters","reasoning","requires_approval"],"properties":{"tool_name":{"type":"string"},"parameters":{"type":"object"},"reasoning":{"type":"string"},"requires_approval":{"type":"boolean"},"approval_reason":{"type":"string"}}}}}',
|
||||
TRUE, TRUE, NULL),
|
||||
|
||||
('ANALYSIS_ROOT_CAUSE_001', 'AI分析Prompt模板', 'analysis', 1,
|
||||
E'# 任务\n你是指摘管理专家,请对给定的指摘进行深度根因分析,并输出结构化 JSON。\n\n# 输入\n指摘编号:{{issueNo}}\n指摘标题:{{issueTitle}}\n指摘描述:{{issueDescription}}\n工程阶段:{{issuePhase}}\n指摘分类:{{issueCategory}}\n影响级别:{{issueImpactLevel}}\n历史相似案例:{{similarCases}}\n\n# 分析要求\n1. 从需求理解偏差、设计缺陷、编码实现、测试遗漏、环境/数据、流程管理等维度判断根因。\n2. 关键词提取3-5个,覆盖核心业务概念与原因。\n3. 整改建议必须可执行、分优先级,并优先引用相似案例。\n\n# 输出格式(严格JSON,禁止Markdown围栏)\n{\n "category": "根因分类(如:需求理解偏差/设计缺陷/编码实现/测试遗漏/环境数据/流程管理)",\n "keywords": ["关键词1", "关键词2", "关键词3"],\n "rootCause": "根因分析,100-200字",\n "suggestion": "整改建议,含优先级与具体措施" \n}\n\n# 约束\n- 输出必须是可以直接 JSON.parse 的纯JSON。\n- 不要输出解释性文字或 Markdown 代码块。',
|
||||
'[{"name":"issueNo","type":"string","required":true,"description":"指摘编号"},{"name":"issueTitle","type":"string","required":true,"description":"指摘标题"},{"name":"issueDescription","type":"string","required":true,"description":"指摘描述"},{"name":"issuePhase","type":"string","required":false,"description":"工程阶段"},{"name":"issueCategory","type":"string","required":false,"description":"指摘分类"},{"name":"issueImpactLevel","type":"string","required":false,"description":"影响级别"},{"name":"similarCases","type":"string","required":false,"description":"历史相似案例"}]',
|
||||
'{"type":"object","required":["category","keywords","rootCause","suggestion"],"properties":{"category":{"type":"string"},"keywords":{"type":"array","items":{"type":"string"}},"rootCause":{"type":"string"},"suggestion":{"type":"string"}}}',
|
||||
TRUE, TRUE, NULL),
|
||||
|
||||
('QUERY_REWRITE_001', 'Query改写Prompt模板', 'knowledge', 1,
|
||||
E'# 任务\n将用户的自然语言查询改写为适合向量检索的领域专业查询。\n\n# 输入\n用户原始查询:{{query}}\n领域上下文:{{domainContext}}\n\n# 改写要求\n1. 使用标准指摘管理术语(对应者、PGM、指摘、对应内容等)。\n2. 去除口语化、语气词与冗余信息。\n3. 必要时拆分多意图为多个子查询(最多3个)。\n\n# 输出格式(严格JSON)\n{\n "rewritten_query": "改写后的主查询",\n "queries": ["子查询1", "子查询2"],\n "keywords": ["检索关键词1", "检索关键词2"]\n}\n\n# 约束\n- 输出必须是纯JSON。\n- 不得添加与查询无关的内容。',
|
||||
'[{"name":"query","type":"string","required":true,"description":"用户原始查询"},{"name":"domainContext","type":"string","required":false,"description":"领域上下文"}]',
|
||||
'{"type":"object","required":["rewritten_query","queries","keywords"],"properties":{"rewritten_query":{"type":"string"},"queries":{"type":"array","items":{"type":"string"}},"keywords":{"type":"array","items":{"type":"string"}}}}',
|
||||
TRUE, TRUE, NULL),
|
||||
|
||||
('MEMORY_RERANK_001', '记忆重排序Prompt模板', 'knowledge', 1,
|
||||
E'# 任务\n对检索到的历史案例记忆进行相关性评估并重新排序。\n\n# 输入\n用户查询:{{query}}\n候选记忆列表:{{candidates}}\n\n# 排序要求\n1. 按与查询的相关性从高到低排序,同一相关度时按 effectivenessScore 高的优先。\n2. 只输出与查询明确相关的记忆,过滤无关项。\n\n# 输出格式(严格JSON)\n{\n "ranked_ids": [数字ID列表,按相关度从高到低],\n "reasoning": "排序依据简述"\n}\n\n# 约束\n- ranked_ids 必须来自候选记忆的 id 字段。\n- 输出必须是纯JSON。',
|
||||
'[{"name":"query","type":"string","required":true,"description":"用户查询"},{"name":"candidates","type":"string","required":true,"description":"候选记忆列表(含id、issueSummary、effectivenessScore)"}]',
|
||||
'{"type":"object","required":["ranked_ids","reasoning"],"properties":{"ranked_ids":{"type":"array","items":{"type":"integer"}},"reasoning":{"type":"string"}}}',
|
||||
TRUE, TRUE, NULL),
|
||||
|
||||
('FORMAT_JSON_001', '输出格式化模板', 'system', 1,
|
||||
E'# 输出格式约束(强制)\n所有输出必须严格遵循以下规则:\n\n1. 当要求 JSON 输出时:\n - 必须输出纯JSON,不得包含 Markdown 围栏(```json ```)。\n - 字段名必须与要求完全一致,不得增删。\n - 字符串必须使用双引号。\n\n2. 目标 JSON Schema:\n{{outputSchema}}\n\n3. 当要求 Markdown 输出时:\n - 使用结构化标题(## / ###)组织内容。\n - 列表使用 - 前缀。\n\n# 约束\n- 任何情况下都不得输出解释性前缀或后缀文字。',
|
||||
'[{"name":"outputSchema","type":"string","required":true,"description":"目标JSON Schema"}]',
|
||||
'{"type":"object","description":"通用输出格式约束"}',
|
||||
TRUE, TRUE, NULL);
|
||||
|
||||
-- 版本历史
|
||||
INSERT INTO prompt_template_versions (template_id, version, content, change_log, created_by)
|
||||
SELECT template_id, version, content, '初始版本', NULL FROM prompt_templates;
|
||||
@@ -0,0 +1,273 @@
|
||||
-- ============================================================
|
||||
-- V2.0 全模块演示数据(Agent 管理 / AI 分析 / 知识库 / 指摘)
|
||||
-- 依赖 V1.6 种子用户(admin=1, 张三=2, 李四=3)、部门(2技术部 3质量部 4产品部)
|
||||
-- ============================================================
|
||||
|
||||
-- ---------- issues 指摘 ----------
|
||||
INSERT INTO issues (id, issue_no, title, description, status, priority, deadline, phase, sub_project, category,
|
||||
impact_level, impact_scope, deployment, pgm_no, review_workload, response_workload,
|
||||
response_content, ng_reason, response_completed_at, confirm_at,
|
||||
creator_id, assignee_id, department_id, reviewer_id, validator_id,
|
||||
agent_last_plan_id, agent_status, created_at, updated_at, closed_at, is_deleted) VALUES
|
||||
(1, 'ISS-2026-001', '指摘列表批量导出 Excel 列顺序与标准模板不一致',
|
||||
'用户在指摘列表页勾选多条记录后批量导出 Excel,导出的列顺序为「创建时间/标题/状态」,与标准模板要求的「指摘编号/标题/对应者/状态」不一致,需人工二次调整,影响月度报告生成效率。',
|
||||
'draft', 'medium', NOW() + interval '7 days', '编码', '指摘管理', '功能缺陷', 'C', '影响月度报告数据整理', 'V6.0', 'PGM-1001', 1.0, 2.0, NULL, NULL, NULL, NULL,
|
||||
1, 2, 2, NULL, NULL, NULL, 'human_driven', NOW() - interval '2 hours', NOW() - interval '2 hours', NULL, FALSE),
|
||||
(2, 'ISS-2026-002', '知识库检索接口在无匹配结果时返回 500',
|
||||
'当查询词在知识库中无任何匹配时,GET /knowledge/search 返回 500 而非空结果集,前端无法给出友好提示,用户误以为系统故障。',
|
||||
'open', 'high', NOW() + interval '5 days', '测试', '知识库', '功能缺陷', 'B', '影响知识库检索可用性', 'V6.0', 'PGM-1002', 0.5, 1.5, NULL, NULL, NULL, NULL,
|
||||
2, 2, 2, NULL, NULL, NULL, 'rejected', NOW() - interval '3 hours', NOW() - interval '3 hours', NULL, FALSE),
|
||||
(3, 'ISS-2026-003', '已关闭的指摘可被重复打开',
|
||||
'已验证并关闭的指摘,在详情页仍可点击「重新打开」,导致已关闭记录重新进入整改流程,破坏关闭状态的一致性。',
|
||||
'open', 'high', NOW() + interval '4 days', '编码', '指摘管理', '流程管理', 'A', '影响关闭状态一致性', 'V6.0', 'PGM-1003', 1.5, 3.0, NULL, NULL, NULL, NULL,
|
||||
3, 2, 3, NULL, NULL, NULL, 'failed', NOW() - interval '1 day', NOW() - interval '1 day', NULL, FALSE),
|
||||
(4, 'ISS-2026-004', '日期范围筛选按日粒度统计不准确',
|
||||
'AI 分析页按「对应完了日」筛选时,当日创建的新指摘未被统计进结果集,与 SQL 中 NOW() 精度差异导致边界数据丢失。',
|
||||
'in_progress', 'medium', NOW() + interval '10 days', '测试', 'AI分析', '功能缺陷', 'C', '影响分析统计准确性', 'V6.0', 'PGM-1004', 2.0, 2.5, NULL, NULL, NULL, NULL,
|
||||
1, 3, 2, 2, NULL, NULL, 'human_driven', NOW() - interval '2 days', NOW() - interval '1 day', NULL, FALSE),
|
||||
(5, 'ISS-2026-005', 'Agent 跨部门分配指摘未触发人工审批',
|
||||
'Agent 将指摘分配给其他部门的对应者时,未调用 request_human_approval,直接执行了跨部门分配,绕过审批策略。',
|
||||
'in_progress', 'high', NOW() + interval '6 days', '编码', 'Agent', '功能缺陷', 'A', '影响审批合规', 'V6.0', 'PGM-1005', 2.5, 4.0, NULL, NULL, NULL, NULL,
|
||||
2, 3, 2, 3, NULL, NULL, 'human_driven', NOW() - interval '2 days', NOW() - interval '2 days', NULL, FALSE),
|
||||
(6, 'ISS-2026-006', '上传附件大于 10MB 时前端无任何提示',
|
||||
'附件上传时若文件超过后端限制大小,前端不提示且无 loading 结束回调,用户认为上传成功但实际未生效。',
|
||||
'resolved', 'high', NOW() - interval '1 day', '部署', '附件管理', '功能缺陷', 'B', '影响大附件上传体验', 'V6.0', 'PGM-1006', 1.0, 2.0,
|
||||
'已在上传组件中加入文件大小预校验,超过 10MB 时直接拦截并提示;同时补充超时与失败的回调处理。',
|
||||
'前端未做大小预校验', NOW() - interval '3 days', NOW() - interval '2 days',
|
||||
3, 2, 3, 2, 2, NULL, 'human_driven', NOW() - interval '6 days', NOW() - interval '3 days', NULL, FALSE),
|
||||
(7, 'ISS-2026-007', '系统通知未读计数在不同浏览器不一致',
|
||||
'同一账号在 Chrome 与 Edge 中未读通知计数不同,疑似本地缓存与后端计数存在时间差,影响用户对通知状态的判断。',
|
||||
'resolved', 'medium', NOW() - interval '2 days', '部署', '通知中心', '功能缺陷', 'C', '影响通知计数一致性', 'V6.0', 'PGM-1007', 0.5, 1.0,
|
||||
'统一改为登录后从后端拉取未读计数,并添加 60 秒轮询,消除浏览器间差异。',
|
||||
'计数来源不一致', NOW() - interval '5 days', NOW() - interval '4 days',
|
||||
1, 3, 4, 2, 3, NULL, 'human_driven', NOW() - interval '8 days', NOW() - interval '5 days', NULL, FALSE),
|
||||
(8, 'ISS-2026-008', '批量录入重复点击提交导致指摘重复创建',
|
||||
'批量录入页在提交响应较慢时,用户连续点击「提交」按钮,会创建多条内容相同的指摘记录,缺少幂等保护。',
|
||||
'verified', 'medium', NOW() - interval '3 days', '编码', '批量录入', '功能缺陷', 'B', '影响数据准确性', 'V6.0', 'PGM-1008', 1.5, 2.5,
|
||||
'提交按钮提交期间禁用,后端按内容 hash 加唯一约束防重。',
|
||||
'缺少幂等处理', NOW() - interval '7 days', NOW() - interval '6 days',
|
||||
2, 3, 4, 2, 3, 1, 'awaiting_approval', NOW() - interval '9 days', NOW() - interval '7 days', NULL, FALSE),
|
||||
(9, 'ISS-2026-009', '知识库向量检索中文分词召回率偏低',
|
||||
'使用字符级切分后,长句查询召回率仍偏低,无法命中包含「指摘对应完了日」等复合术语的历史案例,影响知识复用。',
|
||||
'verified', 'high', NOW() - interval '1 day', '测试', '知识库', '性能问题', 'B', '影响知识检索质量', 'V6.0', 'PGM-1009', 2.0, 3.5,
|
||||
'优化查询改写提示词,对复合术语进行扩展检索,增加 top_k 重排。',
|
||||
'复合术语切分不理想', NOW() - interval '4 days', NOW() - interval '3 days',
|
||||
1, 2, 2, 2, 3, 2, 'awaiting_approval', NOW() - interval '10 days', NOW() - interval '8 days', NULL, FALSE),
|
||||
(10, 'ISS-2026-010', 'AI 分析建议引用了不存在的知识库案例',
|
||||
'AI 分析结果中的整改建议标注了历史案例编号,但该案例在知识库中已被删除,点击跳转 404,破坏建议的可追溯性。',
|
||||
'open', 'medium', NOW() + interval '3 days', '测试', 'AI分析', '功能缺陷', 'C', '影响建议可信度', 'V6.0', 'PGM-1010', 1.0, 1.5, NULL, NULL, NULL, NULL,
|
||||
2, 3, 3, 2, NULL, 3, 'awaiting_approval', NOW() - interval '12 hours', NOW() - interval '12 hours', NULL, FALSE),
|
||||
(11, 'ISS-2026-011', '角色权限修改后未即时生效',
|
||||
'管理员修改角色权限后,已登录用户仍需重新登录才能看到新权限,权限缓存未按角色失效。',
|
||||
'open', 'medium', NOW() + interval '8 days', '运维', '权限管理', '流程管理', 'C', '影响权限即时性', 'V6.0', 'PGM-1011', 1.0, 1.5, NULL, NULL, NULL, NULL,
|
||||
3, 2, 3, 3, NULL, 4, 'awaiting_approval', NOW() - interval '5 hours', NOW() - interval '5 hours', NULL, FALSE),
|
||||
(12, 'ISS-2026-012', '指摘对应完了日逾期未自动提醒',
|
||||
'已超过对应完了日的指摘,系统未自动向对应者与部门管理员发送提醒,导致整改逾期无人跟进。',
|
||||
'closed', 'high', NOW() - interval '2 days', '运维', '提醒中心', '功能缺陷', 'B', '影响整改时效', 'V6.0', 'PGM-1012', 1.5, 3.0,
|
||||
'新增定时任务,每日扫描逾期指摘并推送通知至对应者与部门管理员。',
|
||||
'缺少逾期扫描定时任务', NOW() - interval '6 days', NOW() - interval '5 days',
|
||||
1, 3, 4, 2, 3, 5, 'completed', NOW() - interval '12 days', NOW() - interval '6 days', NOW() - interval '5 days', FALSE);
|
||||
|
||||
SELECT setval('issues_id_seq', (SELECT MAX(id) FROM issues));
|
||||
|
||||
-- ---------- issue_logs 指摘操作日志 ----------
|
||||
INSERT INTO issue_logs (issue_id, user_id, action, from_status, to_status, remark, created_at) VALUES
|
||||
(1, 1, 'CREATE', NULL, 'draft', '录入新指摘,等待确认', NOW() - interval '2 hours'),
|
||||
(2, 2, 'CREATE', NULL, 'open', '录入新指摘', NOW() - interval '3 hours'),
|
||||
(3, 3, 'CREATE', NULL, 'open', '录入新指摘', NOW() - interval '1 day'),
|
||||
(4, 1, 'CREATE', NULL, 'in_progress', '录入并立即进入整改', NOW() - interval '2 days'),
|
||||
(5, 2, 'CREATE', NULL, 'in_progress', 'Agent 触达', NOW() - interval '2 days'),
|
||||
(6, 3, 'UPDATE', 'in_progress', 'resolved', '对应内容已提交', NOW() - interval '3 days'),
|
||||
(6, 2, 'REVIEW', 'resolved', 'resolved', 'review 通过', NOW() - interval '2 days'),
|
||||
(6, 2, 'VERIFY', 'resolved', 'resolved', '验证通过', NOW() - interval '2 days'),
|
||||
(8, 2, 'UPDATE', 'open', 'verified', '整改完成并通过验证', NOW() - interval '7 days'),
|
||||
(8, 1, 'UPDATE', 'verified', 'verified', 'Agent 请求更新状态(待审批)', NOW() - interval '2 hours'),
|
||||
(9, 1, 'UPDATE', 'open', 'verified', '整改完成并通过验证', NOW() - interval '4 days'),
|
||||
(9, 2, 'UPDATE', 'verified', 'verified', 'Agent 请求调整优先级(待审批)', NOW() - interval '1 hour'),
|
||||
(10, 2, 'UPDATE', 'open', 'open', 'Agent 请求补充对应内容(待审批)', NOW() - interval '30 minutes'),
|
||||
(11, 3, 'UPDATE', 'open', 'open', 'Agent 请求关闭指摘(待审批)', NOW() - interval '20 minutes'),
|
||||
(12, 1, 'CLOSE', 'verified', 'closed', '整改完成并关闭', NOW() - interval '5 days');
|
||||
|
||||
-- ---------- notifications 通知 ----------
|
||||
INSERT INTO notifications (user_id, title, content, type, link, is_read, issue_id, created_at) VALUES
|
||||
(2, '有新的指摘分配', '指摘 ISS-2026-004 已分配给您,请及时对应', 'ASSIGNMENT', '/issues/detail/4', FALSE, 4, NOW() - interval '1 day'),
|
||||
(3, '整改对应提醒', '指摘 ISS-2026-006 的对应完了日已临近,请尽快完成对应', 'REMINDER', '/issues/detail/6', FALSE, 6, NOW() - interval '1 day'),
|
||||
(2, 'Agent 操作待审批', 'Agent 请求将 ISS-2026-009 的优先级调整为 high,请审批', 'APPROVAL', '/system/agent-admin', FALSE, 9, NOW() - interval '1 hour'),
|
||||
(3, 'Agent 操作待审批', 'Agent 请求关闭指摘 ISS-2026-011,请审批', 'APPROVAL', '/system/agent-admin', FALSE, 11, NOW() - interval '20 minutes'),
|
||||
(1, '知识库上传完成', '文档「指摘管理操作规范.txt」已完成解析与向量化', 'SYSTEM', '/knowledge-base', TRUE, NULL, NOW() - interval '3 days'),
|
||||
(2, 'AI 分析完成', '指摘 ISS-2026-002 的 AI 根因分析已生成', 'SYSTEM', '/ai-analysis', TRUE, 2, NOW() - interval '2 days');
|
||||
|
||||
-- ---------- ai_analysis AI 分析 ----------
|
||||
INSERT INTO ai_analysis (id, issue_id, category, keywords, root_cause, suggestion, status, helpful_count,
|
||||
prompt_template_id, prompt_version, model_provider, model_name, created_at) VALUES
|
||||
(1, 1, '编码实现', '批量导出,Excel,列顺序,模板',
|
||||
'导出功能使用固定列定义而未读取标准模板配置,列顺序写死在代码中,模板升级后未同步。',
|
||||
'将列顺序改为从模板配置读取,并提供模板与导出结果的自动比对;补充列顺序单元测试。',
|
||||
'completed', 4, 'ANALYSIS_ROOT_CAUSE_001', 1, 'ollama', 'llama3.1:8b', NOW() - interval '2 hours'),
|
||||
(2, 2, '编码实现', '知识库,检索,空结果,500',
|
||||
'检索服务未处理空结果分支,直接访问第一个元素导致 NPE 抛给全局异常处理。',
|
||||
'空结果时返回空列表;对检索链路增加 try-catch,保证任何异常均返回友好提示。',
|
||||
'completed', 5, 'ANALYSIS_ROOT_CAUSE_001', 1, 'ollama', 'llama3.1:8b', NOW() - interval '3 hours'),
|
||||
(3, 3, '流程管理', '关闭,重新打开,状态一致性',
|
||||
'关闭操作缺少状态机约束,任意用户均可对 closed 状态执行 reopen,未校验当前状态。',
|
||||
'引入状态机校验,仅 verified 状态可关闭、仅 closed 状态可驳回重开,并增加操作审计。',
|
||||
'completed', 3, 'ANALYSIS_ROOT_CAUSE_001', 1, 'ollama', 'llama3.1:8b', NOW() - interval '1 day'),
|
||||
(4, 4, '测试遗漏', '日期筛选,边界,当日数据',
|
||||
'日期比较使用 startOfDay 与 SQL NOW() 精度不一致,当日零点创建的数据被上一区间截断。',
|
||||
'统一使用闭区间 [start, end) 比较,并补充当日零点边界测试用例。',
|
||||
'completed', 2, 'ANALYSIS_ROOT_CAUSE_001', 1, 'deepseek', 'deepseek-v4-pro', NOW() - interval '2 days'),
|
||||
(5, 5, '编码实现', 'Agent,跨部门,审批',
|
||||
'Agent 工具调用时仅按 isWrite 判断是否审批,未校验 assignee 部门与指摘部门是否一致。',
|
||||
'在 assign_issue 工具内增加部门一致性校验,跨部门时强制返回审批请求。',
|
||||
'completed', 4, 'ANALYSIS_ROOT_CAUSE_001', 1, 'deepseek', 'deepseek-v4-pro', NOW() - interval '2 days'),
|
||||
(6, 6, '界面问题', '附件,上传,大小限制',
|
||||
'前端上传组件未配置 maxSize 校验与错误回调,后端拒绝后前端无感知。',
|
||||
'上传前预校验文件大小,失败时展示明确错误信息并恢复按钮状态。',
|
||||
'failed', 0, 'ANALYSIS_ROOT_CAUSE_001', 1, 'ollama', 'llama3.1:8b', NOW() - interval '5 days');
|
||||
|
||||
SELECT setval('ai_analysis_id_seq', (SELECT MAX(id) FROM ai_analysis));
|
||||
|
||||
-- ---------- ai_feedback AI 反馈 ----------
|
||||
INSERT INTO ai_feedback (ai_analysis_id, user_id, is_helpful, comment, created_at) VALUES
|
||||
(1, 2, TRUE, '列顺序问题定位准确,建议可直接落地', NOW() - interval '1 day'),
|
||||
(2, 1, TRUE, '根因分析到位', NOW() - interval '1 day'),
|
||||
(5, 3, FALSE, '建议中应补充跨部门审批的具体工具名', NOW() - interval '1 day');
|
||||
|
||||
-- ---------- knowledge_documents 知识库文档(序列自增,避免与已有文档 id 冲突) ----------
|
||||
INSERT INTO knowledge_documents (name, file_path, file_size, file_type, chunk_count, status, uploaded_by, created_at, updated_at) VALUES
|
||||
('指摘管理操作规范.txt', '/tmp/ims/demo/指摘管理操作规范.txt', 24576, 'txt', 5, 'completed', 1, NOW() - interval '3 days', NOW() - interval '3 days'),
|
||||
('历史整改案例汇总.xlsx', '/tmp/ims/demo/历史整改案例汇总.xlsx', 187392, 'xlsx', 4, 'completed', 2, NOW() - interval '6 days', NOW() - interval '6 days'),
|
||||
('质量保证手册.pdf', '/tmp/ims/demo/质量保证手册.pdf', 524288, 'pdf', 3, 'completed', 1, NOW() - interval '9 days', NOW() - interval '9 days');
|
||||
|
||||
SELECT setval('knowledge_documents_id_seq', (SELECT MAX(id) FROM knowledge_documents));
|
||||
|
||||
-- ---------- knowledge_chunks 知识库切片(768 维向量,doc_id 按文档名关联) ----------
|
||||
INSERT INTO knowledge_chunks (doc_id, content, embedding, metadata, created_at) VALUES
|
||||
((SELECT id FROM knowledge_documents WHERE name='指摘管理操作规范.txt'), '指摘录入规范:录入指摘时必须填写标题、归属部门、工程阶段与影响级别;对应者在收到分配通知后 3 个工作日内完成对应。',
|
||||
array_cat(ARRAY[0.92,0.31,0.08]::real[], array_fill(0.001::real, ARRAY[765]))::vector, '{"page":1,"docName":"指摘管理操作规范.txt"}'::jsonb, NOW() - interval '3 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='指摘管理操作规范.txt'), '状态流转规则:draft 草稿 → open 待处理 → in_progress 进行中 → resolved 已解决 → verified 已验证 → closed 已关闭;rejected 状态仅允许已关闭指摘驳回重开。',
|
||||
array_cat(ARRAY[0.85,0.22,0.15]::real[], array_fill(0.002::real, ARRAY[765]))::vector, '{"page":2,"docName":"指摘管理操作规范.txt"}'::jsonb, NOW() - interval '3 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='指摘管理操作规范.txt'), '对应者定义:指摘的整改担当人,负责提交对应内容与对应完了日;对应完成后由确认者进行验证,验证通过后关闭指摘。',
|
||||
array_cat(ARRAY[0.78,0.45,0.33]::real[], array_fill(0.001::real, ARRAY[765]))::vector, '{"page":3,"docName":"指摘管理操作规范.txt"}'::jsonb, NOW() - interval '3 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='指摘管理操作规范.txt'), '工数记录:review 工数由确认者填写,对应工数由对应者填写,均以人日为单位,保留 1 位小数。',
|
||||
array_cat(ARRAY[0.70,0.50,0.28]::real[], array_fill(0.003::real, ARRAY[765]))::vector, '{"page":4,"docName":"指摘管理操作规范.txt"}'::jsonb, NOW() - interval '3 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='指摘管理操作规范.txt'), '逾期管理:超过对应完了日未完成的指摘,系统自动通知对应者及其部门管理员,逾期原因需在指摘中说明。',
|
||||
array_cat(ARRAY[0.64,0.18,0.42]::real[], array_fill(0.002::real, ARRAY[765]))::vector, '{"page":5,"docName":"指摘管理操作规范.txt"}'::jsonb, NOW() - interval '3 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='历史整改案例汇总.xlsx'), '案例:批量导出列顺序与模板不一致。根因:列定义硬编码。对策:列顺序改为从模板配置读取并增加比对测试,整改效果良好。',
|
||||
array_cat(ARRAY[0.88,0.27,0.11]::real[], array_fill(0.001::real, ARRAY[765]))::vector, '{"page":1,"docName":"历史整改案例汇总.xlsx"}'::jsonb, NOW() - interval '6 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='历史整改案例汇总.xlsx'), '案例:上传大附件失败无提示。根因:前端缺少大小预校验。对策:上传前校验文件大小并处理失败回调,用户反馈明显改善。',
|
||||
array_cat(ARRAY[0.81,0.39,0.19]::real[], array_fill(0.002::real, ARRAY[765]))::vector, '{"page":2,"docName":"历史整改案例汇总.xlsx"}'::jsonb, NOW() - interval '6 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='历史整改案例汇总.xlsx'), '案例:知识库检索中文召回率低。根因:复合术语切分不理想。对策:优化查询改写提示词、增加 top_k 重排,召回率提升约 30%。',
|
||||
array_cat(ARRAY[0.74,0.13,0.51]::real[], array_fill(0.001::real, ARRAY[765]))::vector, '{"page":3,"docName":"历史整改案例汇总.xlsx"}'::jsonb, NOW() - interval '6 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='历史整改案例汇总.xlsx'), '案例:权限修改未即时生效。根因:权限缓存未按角色失效。对策:角色变更时主动清除相关缓存,登录用户权限即时更新。',
|
||||
array_cat(ARRAY[0.67,0.55,0.24]::real[], array_fill(0.003::real, ARRAY[765]))::vector, '{"page":4,"docName":"历史整改案例汇总.xlsx"}'::jsonb, NOW() - interval '6 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='质量保证手册.pdf'), '质量方针:坚持缺陷预防、过程改进与持续验证,确保指摘全生命周期可追溯,整改闭环率达到 95% 以上。',
|
||||
array_cat(ARRAY[0.90,0.29,0.07]::real[], array_fill(0.001::real, ARRAY[765]))::vector, '{"page":1,"docName":"质量保证手册.pdf"}'::jsonb, NOW() - interval '9 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='质量保证手册.pdf'), '评审制度:设计评审与代码评审必须形成评审记录,评审发现的问题进入指摘管理流程跟踪至闭环。',
|
||||
array_cat(ARRAY[0.83,0.36,0.26]::real[], array_fill(0.002::real, ARRAY[765]))::vector, '{"page":2,"docName":"质量保证手册.pdf"}'::jsonb, NOW() - interval '9 days'),
|
||||
((SELECT id FROM knowledge_documents WHERE name='质量保证手册.pdf'), '验证要求:整改完成后由独立验证人员验证,验证不合格的指摘退回对应者并记录驳回原因。',
|
||||
array_cat(ARRAY[0.76,0.47,0.31]::real[], array_fill(0.001::real, ARRAY[765]))::vector, '{"page":3,"docName":"质量保证手册.pdf"}'::jsonb, NOW() - interval '9 days');
|
||||
|
||||
SELECT setval('knowledge_chunks_id_seq', (SELECT MAX(id) FROM knowledge_chunks));
|
||||
|
||||
-- ---------- agent_plans Agent 规划(含 4 条待审批) ----------
|
||||
INSERT INTO agent_plans (id, issue_id, goal, plan_steps, status, requires_approval, approval_status, approval_comment,
|
||||
created_by, model_provider, created_at, completed_at) VALUES
|
||||
(1, 8, '将指摘 ISS-2026-008 标记为已关闭',
|
||||
'["1. query_issue 查询指摘 8 当前状态", "2. update_issue 将状态更新为 closed"]',
|
||||
'awaiting_approval', TRUE, 'requested', NULL, 1, 'ollama', NOW() - interval '2 hours', NULL),
|
||||
(2, 9, '将指摘 ISS-2026-009 的优先级调整为 high',
|
||||
'["1. query_issue 查询指摘 9 详情", "2. update_issue 将优先级更新为 high"]',
|
||||
'awaiting_approval', TRUE, 'requested', NULL, 1, 'ollama', NOW() - interval '1 hour', NULL),
|
||||
(3, 10, '为指摘 ISS-2026-010 补充对应内容',
|
||||
'["1. query_issue 查询指摘 10 详情", "2. update_issue 写入对应内容"]',
|
||||
'awaiting_approval', TRUE, 'requested', NULL, 2, 'ollama', NOW() - interval '30 minutes', NULL),
|
||||
(4, 11, '关闭指摘 ISS-2026-011',
|
||||
'["1. query_issue 查询指摘 11 当前状态", "2. update_issue 将状态更新为 closed"]',
|
||||
'awaiting_approval', TRUE, 'requested', NULL, 2, 'ollama', NOW() - interval '20 minutes', NULL),
|
||||
(5, 12, '整理 ISS-2026-012 的整改完成情况并关闭',
|
||||
'["1. query_issue 查询指摘 12 详情", "2. search_knowledge 检索相似整改案例", "3. update_issue 更新状态为 closed"]',
|
||||
'completed', TRUE, 'approved', '同意关闭', 1, 'ollama', NOW() - interval '6 days', NOW() - interval '6 days'),
|
||||
(6, 1, '分析 ISS-2026-001 批量导出问题并更新备注',
|
||||
'["1. query_issue 查询指摘 1 详情", "2. update_issue 更新对应内容"]',
|
||||
'completed', TRUE, 'approved', '同意', 3, 'ollama', NOW() - interval '1 day', NOW() - interval '1 day'),
|
||||
(7, 2, '将 ISS-2026-002 关闭',
|
||||
'["1. query_issue 查询指摘 2 详情", "2. update_issue 将状态更新为 closed"]',
|
||||
'rejected', TRUE, 'rejected', '问题未整改完成,拒绝关闭', 1, 'ollama', NOW() - interval '3 hours', NOW() - interval '3 hours'),
|
||||
(8, 3, '将 ISS-2026-003 状态更新为 in_progress',
|
||||
'["1. query_issue 查询指摘 3 详情", "2. update_issue 将状态更新为 in_progress"]',
|
||||
'completed', TRUE, 'approved', '同意', 2, 'deepseek', NOW() - interval '1 day', NOW() - interval '1 day');
|
||||
|
||||
SELECT setval('agent_plans_id_seq', (SELECT MAX(id) FROM agent_plans));
|
||||
|
||||
-- ---------- tool_executions 工具执行记录 ----------
|
||||
-- 待审批计划关联的 pending 记录(output_result 作为审批原因展示)
|
||||
INSERT INTO tool_executions (plan_id, tool_name, input_params, output_result, status, execution_time_ms, created_at) VALUES
|
||||
(1, 'update_issue', '{"issue_id":8,"field":"status","value":"closed"}',
|
||||
'等待人工审批: 关闭指摘属于高风险操作,需人工确认', 'pending', NULL, NOW() - interval '2 hours'),
|
||||
(2, 'update_issue', '{"issue_id":9,"field":"priority","value":"high"}',
|
||||
'等待人工审批: 修改已验证指摘的优先级,需人工确认', 'pending', NULL, NOW() - interval '1 hour'),
|
||||
(3, 'update_issue', '{"issue_id":10,"field":"response_content","value":"补充历史案例引用说明"}',
|
||||
'等待人工审批: 写入对应内容属于写操作,需人工确认', 'pending', NULL, NOW() - interval '30 minutes'),
|
||||
(4, 'update_issue', '{"issue_id":11,"field":"status","value":"closed"}',
|
||||
'等待人工审批: 关闭指摘属于高风险操作,需人工确认', 'pending', NULL, NOW() - interval '20 minutes');
|
||||
|
||||
-- 已完成/已拒绝计划的历史执行记录
|
||||
INSERT INTO tool_executions (plan_id, tool_name, input_params, output_result, status, execution_time_ms, created_at) VALUES
|
||||
(5, 'query_issue', '{"issue_id":12}', '{"id":12,"issue_no":"ISS-2026-012","status":"open"}', 'success', 120, NOW() - interval '6 days'),
|
||||
(5, 'search_knowledge', '{"query":"整改完成情况汇总","top_k":3}', '{"results":[{"chunk_id":6,"score":0.87}]}', 'success', 680, NOW() - interval '6 days'),
|
||||
(5, 'update_issue', '{"issue_id":12,"field":"status","value":"closed"}', '{"id":12,"updated":true,"status":"closed"}', 'success', 210, NOW() - interval '6 days'),
|
||||
(6, 'query_issue', '{"issue_id":1}', '{"id":1,"issue_no":"ISS-2026-001","status":"draft"}', 'success', 98, NOW() - interval '1 day'),
|
||||
(6, 'update_issue', '{"issue_id":1,"field":"response_content","value":"批量导出列顺序模板化"}', '{"id":1,"updated":true}', 'success', 180, NOW() - interval '1 day'),
|
||||
(7, 'query_issue', '{"issue_id":2}', '{"id":2,"issue_no":"ISS-2026-002","status":"open"}', 'success', 105, NOW() - interval '3 hours'),
|
||||
(7, 'update_issue', '{"issue_id":2,"field":"status","value":"closed"}', '等待人工审批: 关闭指摘属于高风险操作', 'rejected', NULL, NOW() - interval '3 hours'),
|
||||
(8, 'query_issue', '{"issue_id":3}', '{"id":3,"issue_no":"ISS-2026-003","status":"open"}', 'success', 88, NOW() - interval '1 day'),
|
||||
(8, 'search_knowledge', '{"query":"已关闭指摘重复打开的处理"}', '模型服务不可用', 'failed', 2500, NOW() - interval '1 day'),
|
||||
(8, 'update_issue', '{"issue_id":3,"field":"status","value":"in_progress"}', '{"id":3,"updated":true}', 'success', 195, NOW() - interval '1 day');
|
||||
|
||||
-- 批量历史成功执行记录(填充运行概览执行次数与成功率)
|
||||
INSERT INTO tool_executions (plan_id, tool_name, input_params, output_result, status, execution_time_ms, created_at)
|
||||
SELECT 5, 'query_issue', '{"issue_id":12}', '{"id":12,"issue_no":"ISS-2026-012"}', 'success',
|
||||
90 + (g * 37) % 300,
|
||||
NOW() - ((g * 9) || ' hours')::interval
|
||||
FROM generate_series(1, 40) AS g;
|
||||
|
||||
SELECT setval('tool_executions_id_seq', (SELECT MAX(id) FROM tool_executions));
|
||||
|
||||
-- ---------- agent_memories Agent 长期记忆 ----------
|
||||
INSERT INTO agent_memories (issue_summary, solution_steps, effectiveness_score, embedding, created_at, updated_at) VALUES
|
||||
('跨部门指摘分配需人工审批,避免误分配',
|
||||
'["1. 检测 assignee 部门是否与指摘归属部门一致", "2. 不一致时调用 request_human_approval", "3. 人工批准后继续执行分配"]',
|
||||
4.80, NULL, NOW() - interval '5 days', NOW() - interval '5 days'),
|
||||
('批量导出 Excel 列顺序需与标准模板对齐',
|
||||
'["1. 列顺序改为从模板配置读取", "2. 导出前与模板比对", "3. 不一致时提示并拦截"]',
|
||||
4.50, NULL, NOW() - interval '4 days', NOW() - interval '4 days'),
|
||||
('知识库检索空结果应返回友好提示而非 500',
|
||||
'["1. 空结果分支返回空列表", "2. 检索链路整体 try-catch", "3. 补充空结果测试用例"]',
|
||||
4.20, NULL, NOW() - interval '4 days', NOW() - interval '4 days'),
|
||||
('中文指摘分词需按字符级处理提升召回率',
|
||||
'["1. 使用 CJK 字符级正则切分", "2. 复合术语扩展检索", "3. 增加 top_k 重排"]',
|
||||
3.80, NULL, NOW() - interval '3 days', NOW() - interval '3 days'),
|
||||
('逾期提醒应在对应完了日前 1 天自动发送',
|
||||
'["1. 每日扫描临近完成日指摘", "2. 向对应者与部门管理员推送通知", "3. 逾期后追加提醒"]',
|
||||
3.50, NULL, NOW() - interval '2 days', NOW() - interval '2 days'),
|
||||
('修改角色权限后需强制刷新权限缓存',
|
||||
'["1. 角色变更时清除相关缓存", "2. 已登录用户下次请求重新加载权限", "3. 补充权限刷新测试"]',
|
||||
2.90, NULL, NOW() - interval '1 day', NOW() - interval '1 day');
|
||||
|
||||
-- ---------- prompt_render_logs Prompt 渲染日志(使用统计) ----------
|
||||
INSERT INTO prompt_render_logs (request_id, template_id, template_version, rendered_prompt, variables_used,
|
||||
tokens_input, tokens_output, execution_time_ms, llm_model, model_provider, created_at)
|
||||
SELECT
|
||||
'REQ-' || to_char(NOW(), 'YYYYMMDD') || '-' || lpad(g::text, 4, '0'),
|
||||
(ARRAY['SYS_ROLE_001', 'PLAN_001', 'ANALYSIS_ROOT_CAUSE_001', 'QUERY_REWRITE_001', 'MEMORY_RERANK_001', 'FORMAT_JSON_001'])[1 + (g % 6)],
|
||||
1,
|
||||
'[' || (ARRAY['系统角色约束 Prompt', 'ReAct 规划 Prompt', '根因分析 Prompt', '查询改写 Prompt', '记忆重排序 Prompt', '输出格式化 Prompt'])[1 + (g % 6)] || '] 渲染于 ' || NOW(),
|
||||
('{"requestId":"REQ-' || to_char(NOW(), 'YYYYMMDD') || '-' || lpad(g::text, 4, '0') || '","templateVersion":1}')::jsonb,
|
||||
1000 + (g * 137) % 8000,
|
||||
100 + (g * 53) % 1500,
|
||||
500 + (g * 977) % 12000,
|
||||
CASE WHEN g % 3 = 0 THEN 'deepseek-v4-pro' ELSE 'llama3.1:8b' END,
|
||||
CASE WHEN g % 3 = 0 THEN 'deepseek' ELSE 'ollama' END,
|
||||
NOW() - ((g % 7) || ' hours')::interval
|
||||
FROM generate_series(1, 40) AS g;
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE roles ADD COLUMN IF NOT EXISTS data_scope VARCHAR(20) DEFAULT 'all';
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
-- ai_analysis 增加失败原因字段
|
||||
ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS error_message TEXT;
|
||||
@@ -0,0 +1,2 @@
|
||||
-- ai_analysis 增加分析耗时字段(秒)
|
||||
ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS duration_seconds INTEGER;
|
||||
@@ -0,0 +1,4 @@
|
||||
-- ai_analysis 移除耗时字段,增加开始时间与成功/失败时间
|
||||
ALTER TABLE ai_analysis DROP COLUMN IF EXISTS duration_seconds;
|
||||
ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS started_at TIMESTAMP;
|
||||
ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS completed_at TIMESTAMP;
|
||||
@@ -0,0 +1,11 @@
|
||||
CREATE TABLE IF NOT EXISTS ai_call_logs (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
provider VARCHAR(20),
|
||||
model VARCHAR(100),
|
||||
status VARCHAR(20),
|
||||
latency_ms BIGINT,
|
||||
response_snippet TEXT,
|
||||
error_message TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_ai_call_logs_created ON ai_call_logs(created_at DESC);
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
-- 更新 ANALYSIS_ROOT_CAUSE_001 模板:新增预提取关键词输入变量,version 1 -> 2
|
||||
UPDATE prompt_templates
|
||||
SET content = E'# 任务\n你是指摘管理专家,请对给定的指摘进行深度根因分析,并输出结构化 JSON。\n\n# 输入\n指摘编号:{{issueNo}}\n指摘标题:{{issueTitle}}\n指摘描述:{{issueDescription}}\n工程阶段:{{issuePhase}}\n指摘分类:{{issueCategory}}\n影响级别:{{issueImpactLevel}}\n指摘关键词:{{issueKeywords}}\n历史相似案例:{{similarCases}}\n\n# 分析要求\n1. 从需求理解偏差、设计缺陷、编码实现、测试遗漏、环境/数据、流程管理等维度判断根因。\n2. 关键词提取3-5个,覆盖核心业务概念与原因。\n3. 整改建议必须可执行、分优先级,并优先引用相似案例。\n4. 参考输入中的"指摘关键词"辅助判断分析重点。\n\n# 输出格式(严格JSON,禁止Markdown围栏)\n{\n "category": "根因分类(如:需求理解偏差/设计缺陷/编码实现/测试遗漏/环境数据/流程管理)",\n "keywords": ["关键词1", "关键词2", "关键词3"],\n "rootCause": "根因分析,100-200字",\n "suggestion": "整改建议,含优先级与具体措施" \n}\n\n# 约束\n- 输出必须是可以直接 JSON.parse 的纯JSON。\n- 不要输出解释性文字或 Markdown 代码块。',
|
||||
variables = '[{"name":"issueNo","type":"string","required":true,"description":"指摘编号"},{"name":"issueTitle","type":"string","required":true,"description":"指摘标题"},{"name":"issueDescription","type":"string","required":true,"description":"指摘描述"},{"name":"issuePhase","type":"string","required":false,"description":"工程阶段"},{"name":"issueCategory","type":"string","required":false,"description":"指摘分类"},{"name":"issueImpactLevel","type":"string","required":false,"description":"影响级别"},{"name":"issueKeywords","type":"string","required":false,"description":"预提取的指摘关键词"},{"name":"similarCases","type":"string","required":false,"description":"历史相似案例"}]',
|
||||
version = version + 1
|
||||
WHERE template_id = 'ANALYSIS_ROOT_CAUSE_001';
|
||||
|
||||
-- 记录新版本历史(沿用 PromptService.update 的版本机制)
|
||||
INSERT INTO prompt_template_versions (template_id, version, content, change_log, created_by)
|
||||
SELECT template_id, version, content, '增加预提取关键词输入变量', NULL
|
||||
FROM prompt_templates
|
||||
WHERE template_id = 'ANALYSIS_ROOT_CAUSE_001';
|
||||
+1
@@ -0,0 +1 @@
|
||||
ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS extracted_keywords TEXT;
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
-- 支持 Agent 创建型指令:无目标指摘时创建的计划可不关联指摘
|
||||
ALTER TABLE agent_plans ALTER COLUMN issue_id DROP NOT NULL;
|
||||
@@ -0,0 +1,39 @@
|
||||
-- Agent 增强:plan 增加 agent_message 字段,模板切换到 Ollama 原生工具调用模式
|
||||
ALTER TABLE agent_plans ADD COLUMN IF NOT EXISTS agent_message TEXT;
|
||||
|
||||
-- PLAN_001:重写为原生工具调用决策模板(不再要求手写 JSON)
|
||||
UPDATE prompt_templates
|
||||
SET content = $tpl$# 任务
|
||||
基于用户目标和当前上下文,选择合适的工具并生成调用参数。一次调用一个工具。
|
||||
|
||||
# 输入
|
||||
用户目标:{{userGoal}}
|
||||
当前指摘上下文:{{issueContext}}
|
||||
历史相似案例:{{similarCases}}
|
||||
可用工具列表:{{availableTools}}
|
||||
已执行步骤:{{executedSteps}}
|
||||
|
||||
# 决策规则
|
||||
1. 根据用户目标选择最合适的工具(只能从可用工具列表中选择)。
|
||||
2. 生成的参数必须完整,必填参数必须提供;不确定的信息从用户目标或上下文中提取。
|
||||
3. 创建指摘时,标题必须简明准确,描述需包含关键背景;对应者可从用户目标中提取。
|
||||
4. 写操作(新建/更新指摘)执行前会进入人工审批,请如实说明操作理由。
|
||||
5. 若用户目标已完成且无需进一步操作,直接用一句话总结处理结果,不要调用任何工具。$tpl$
|
||||
WHERE template_id = 'PLAN_001';
|
||||
|
||||
-- SYS_ROLE_001:替换工具调用规则段落(改为原生工具调用)
|
||||
UPDATE prompt_templates
|
||||
SET content = REPLACE(content,
|
||||
$old$# 工具调用规则(适用于当前AI引擎:{{modelProvider}})
|
||||
- 当你需要调用工具时,请在你的回复中输出一个 JSON 对象,格式为:
|
||||
{
|
||||
"tool": "工具名",
|
||||
"parameters": { ... }
|
||||
}
|
||||
- 不要用自然语言额外解释,直接输出该 JSON。
|
||||
- 如果目标已完成,输出 { "tool": "goal_completed", "parameters": {} }。$old$,
|
||||
$new$# 工具调用
|
||||
- 当需要执行操作时,直接调用可用的工具,系统会自动结构化你的调用并处理审批。
|
||||
- 写操作(create_issue / update_issue)执行前必须经过人工审批。
|
||||
- 如果用户目标已达成,直接用一句话总结结果,不要调用任何工具。$new$)
|
||||
WHERE template_id = 'SYS_ROLE_001';
|
||||
@@ -0,0 +1,31 @@
|
||||
-- 修复 ims-master-test 合并前缺失的表/列:
|
||||
-- 1. import_records(批量导入记录)
|
||||
-- 2. phase_rules(导入阶段规则)
|
||||
-- 3. issues.review_date(评审日期列,批量导入写入)
|
||||
-- 这些 DDL 与实体定义保持一致,用于通过 JPA ddl-auto=validate 校验。
|
||||
|
||||
CREATE TABLE IF NOT EXISTS import_records (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
file_name VARCHAR(255) NOT NULL,
|
||||
total_count INTEGER NOT NULL,
|
||||
success_count INTEGER NOT NULL,
|
||||
fail_count INTEGER NOT NULL,
|
||||
status VARCHAR(20) NOT NULL,
|
||||
error_log TEXT,
|
||||
operator_id BIGINT REFERENCES users (id),
|
||||
created_at TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS phase_rules (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
keyword VARCHAR(100) NOT NULL,
|
||||
phase VARCHAR(50) NOT NULL,
|
||||
match_mode VARCHAR(20) NOT NULL,
|
||||
source VARCHAR(50),
|
||||
active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
sort_order INTEGER NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMP,
|
||||
updated_at TIMESTAMP
|
||||
);
|
||||
|
||||
ALTER TABLE issues ADD COLUMN IF NOT EXISTS review_date TIMESTAMP;
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-backend</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>ims-web</artifactId>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-service</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,3651 @@
|
||||
JvmtiExport can_access_local_variables 0
|
||||
JvmtiExport can_hotswap_or_post_breakpoint 0
|
||||
JvmtiExport can_post_on_exceptions 0
|
||||
# 300 ciObject found
|
||||
instanceKlass org/apache/maven/model/merge/MavenModelMerger
|
||||
ciMethodData java/lang/Object <init> ()V 2 840738 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 4 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/String hashCode ()I 2 5624 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 42 0x60007 0xe89 0x108 0x642 0xd0007 0x33 0xe8 0x60f 0x110005 0x60f 0x0 0x0 0x0 0x0 0x0 0x140007 0x0 0x48 0x60f 0x1b0002 0x60f 0x1e0003 0x60f 0x28 0x250002 0x0 0x2a0007 0x60f 0x38 0x0 0x320003 0x0 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/String isLatin1 ()Z 2 864235 orig 80 1 0 0 0 3 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 18 0x30007 0x0 0x58 0xd2f53 0x80000006000a0007 0xe0 0x38 0xd2e77 0xe0003 0xd2e77 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/StringLatin1 hashCode ([B)I 2 30323 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 14 0xd0007 0x381 0x38 0x7408 0x250003 0x7408 0xffffffffffffffe0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/HashMap hash (Ljava/lang/Object;)I 2 86118 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 23 0x8000000600010007 0x14df4 0x38 0x77 0x50003 0x77 0x50 0x90005 0x734f 0x0 0x717560002b40 0xd961 0x717560004170 0x144 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 2 10 java/lang/String 12 java/lang/Module methods 0
|
||||
ciMethodData java/util/HashMap putVal (ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; 2 35182 orig 80 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 198 0x70007 0x1704 0x40 0x70d8 0x100007 0x70d8 0x58 0x0 0x140005 0x1704 0x0 0x0 0x0 0x0 0x0 0x2c0007 0x1eb6 0xa8 0x6926 0x380005 0x0 0x0 0x7175486dfc40 0x29e9 0x71754c467d70 0x3f3d 0x3b0004 0x0 0x0 0x7175645574c0 0x29e9 0x71756034fc50 0x3f3d 0x3c0003 0x6926 0x410 0x450007 0x1d7c 0xd0 0x13a 0x510007 0x2c 0x98 0x10e 0x550007 0x0 0x90 0x10e 0x80000007005b0005 0x16 0x0 0x717560005920 0x13 0x717560002b40 0xe9 0x80000006005e0007 0x13 0x38 0x100 0x650003 0x12c 0x2a8 0x6a0004 0xffffffffffffe271 0x0 0x7175645574c0 0x342 0x71756034fc50 0x3c9 0x6d0007 0x1d8f 0xa8 0x0 0x720004 0x0 0x0 0x0 0x0 0x0 0x0 0x7b0005 0x0 0x0 0x0 0x0 0x0 0x0 0x800003 0x0 0x1c8 0x8e0007 0x6f2 0xc8 0x1d50 0x980005 0x0 0x0 0x7175486dfc40 0xdb0 0x71754c467d70 0xfa0 0xa20007 0x1d50 0x158 0x0 0xa90005 0x0 0x0 0x0 0x0 0x0 0x0 0xac0003 0x0 0x100 0xb50007 0x681 0xd0 0x71 0xc10007 0x3 0xc8 0x6e 0xc50007 0x0 0x90 0x6e 0x8000000400cb0005 0x32 0x0 0x717560005920 0x3 0x717560002b40 0x3e 0xce0007 0x32 0x38 0x41 0xd10003 0x41 0x30 0xdb0003 0x6b3 0xfffffffffffffe68 0xe00007 0x1d50 0x98 0x170 0xec0007 0x170 0x40 0x0 0xf10007 0x0 0x20 0x0 0xfd0005 0x0 0x0 0x7175486dfc40 0xa4 0x71754c467d70 0xcc 0x11c0007 0x84fc 0x58 0x17a 0x1200005 0x17a 0x0 0x0 0x0 0x0 0x0 0x1270005 0x0 0x0 0x7175486dfc40 0x3799 0x71754c467d70 0x4edd 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x6 0x0 0x0 0x0 0x0 0x0 0x0 oops 16 22 java/util/HashMap 24 java/util/LinkedHashMap 29 java/util/HashMap$Node 31 java/util/LinkedHashMap$Entry 51 java/net/URL 53 java/lang/String 65 java/util/HashMap$Node 67 java/util/LinkedHashMap$Entry 97 java/util/HashMap 99 java/util/LinkedHashMap 130 java/net/URL 132 java/lang/String 159 java/util/HashMap 161 java/util/LinkedHashMap 177 java/util/HashMap 179 java/util/LinkedHashMap methods 0
|
||||
ciMethodData java/util/HashMap put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 2 13685 orig 80 2 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 20 0x20002 0x3376 0x90005 0x3378 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0xffffffffffffffff 0xffffffffffffffff oops 0 methods 0
|
||||
ciMethodData java/util/HashMap getNode (Ljava/lang/Object;)Ljava/util/HashMap$Node; 2 46399 orig 80 2 0 0 0 1 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 103 0x60007 0x6ef 0x2e8 0xac51 0xe0007 0x0 0x2c8 0xac51 0x170002 0xac51 0x210007 0x5e73 0x298 0x4ddf 0x2a0007 0x1969 0xb8 0x3476 0x350007 0x2e13 0x98 0x663 0x8000000600390007 0x76 0x78 0x5ef 0x3f0005 0x1d1 0x0 0x717560002b40 0x40e 0x717564544940 0x10 0x8000000600420007 0x13 0x20 0x5de 0x4e0007 0x1317 0x1c0 0x6db 0x520004 0xfffffffffffff925 0x0 0x7175645574c0 0x4d 0x0 0x0 0x550007 0x6db 0x90 0x0 0x590004 0x0 0x0 0x0 0x0 0x0 0x0 0x5f0005 0x0 0x0 0x0 0x0 0x0 0x0 0x6a0007 0x5f5 0xb8 0x250 0x760007 0x14c 0x98 0x104 0x7a0007 0x0 0x78 0x104 0x800005 0x35 0x0 0x7175645459f0 0x4 0x717560002b40 0xcb 0x830007 0x31 0x20 0xd3 0x910007 0x16a 0xffffffffffffff48 0x4bc 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 5 29 java/lang/String 31 java/util/zip/ZipFile$Source$Key 44 java/util/HashMap$Node 81 java/lang/ProcessEnvironment$Variable 83 java/lang/String methods 0
|
||||
ciMethodData java/lang/String coder ()B 2 740404 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 14 0x30007 0x0 0x38 0xb4b12 0xa0003 0xb4b12 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/String length ()I 2 593784 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 16 0x60005 0x90e79 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/String equals (Ljava/lang/Object;)Z 2 6410 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 49 0x20007 0x16b9 0x20 0x151 0x80104 0x0 0x0 0x717560002b40 0x16a2 0x0 0x0 0xb0007 0x17 0xe0 0x16a2 0xf0004 0x0 0x0 0x717560002b40 0x16a2 0x0 0x0 0x160007 0x0 0x40 0x16a2 0x210007 0x0 0x68 0x16a2 0x2c0002 0x16a2 0x2f0007 0x12b4 0x38 0x3ee 0x330003 0x3ee 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 2 7 java/lang/String 18 java/lang/String methods 0
|
||||
ciMethodData java/lang/CharacterDataLatin1 getProperties (I)I 2 41832 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/StringLatin1 regionMatchesCI ([BI[BII)Z 2 13621 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 56 0x90007 0xc82 0x158 0x334e 0x2a0007 0x14a 0x38 0x3204 0x2d0003 0x3204 0xffffffffffffffc0 0x350005 0x0 0x0 0x7175600e1f10 0x14a 0x0 0x0 0x3f0005 0x0 0x0 0x7175600e1f10 0x14a 0x0 0x0 0x480007 0x145 0x38 0x5 0x4b0003 0x5 0xffffffffffffff18 0x500002 0x145 0x550002 0x145 0x580007 0x145 0x38 0x0 0x5b0003 0x0 0xfffffffffffffec0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 2 14 java/lang/CharacterDataLatin1 21 java/lang/CharacterDataLatin1 methods 0
|
||||
ciMethodData java/lang/CharacterDataLatin1 toUpperCase (I)I 2 9065 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 32 0x40005 0x0 0x0 0x7175600e1f10 0x22e3 0x0 0x0 0xc0007 0x9a 0x78 0x2249 0x150007 0x0 0x38 0x2249 0x250003 0x2249 0x38 0x2c0007 0x0 0x20 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 1 3 java/lang/CharacterDataLatin1 methods 0
|
||||
ciMethodData java/lang/Character toLowerCase (I)I 1 1087 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 18 0x10002 0x3b3 0x50005 0x0 0x0 0x7175600e1f10 0x3b3 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 1 5 java/lang/CharacterDataLatin1 methods 0
|
||||
ciMethodData java/lang/CharacterData of (I)Ljava/lang/CharacterData; 2 6417 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 67 0x40007 0x1 0x20 0x1813 0xf0008 0x24 0x0 0x1c0 0x1 0x130 0x0 0x148 0x0 0x160 0x0 0x178 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x1c0 0x0 0x190 0x0 0x1a8 0x0 0x1a8 0x630003 0x1 0x90 0x690003 0x0 0x78 0x6f0003 0x0 0x60 0x750003 0x0 0x48 0x7b0003 0x0 0x30 0x810003 0x0 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/String regionMatches (ZILjava/lang/String;II)Z 2 8915 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 95 0x10007 0x2177 0x58 0x0 0xb0005 0x0 0x0 0x0 0x0 0x0 0x0 0x110007 0x0 0xf0 0x2177 0x8000000600150007 0x20 0xd0 0x2158 0x1b0005 0x2158 0x0 0x0 0x0 0x0 0x0 0x240007 0x5d2 0x78 0x1b86 0x2b0005 0x1b86 0x0 0x0 0x0 0x0 0x0 0x340007 0x1b86 0x20 0x0 0x460005 0x1b86 0x0 0x0 0x0 0x0 0x0 0x4e0005 0x1b86 0x0 0x0 0x0 0x0 0x0 0x510007 0x0 0x78 0x1b86 0x560007 0x0 0x48 0x1b86 0x620002 0x1b86 0x650003 0x1b86 0x28 0x710002 0x0 0x770007 0x0 0x48 0x0 0x830002 0x0 0x860003 0x0 0x28 0x920002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x6 0xffffffffffffffff 0x0 0x0 0xffffffffffffffff 0x0 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 2 5657 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 60 0x20007 0x13a6 0x38 0x74 0x60003 0x74 0x170 0xa0007 0x6fa 0x158 0xcac 0xe0005 0xcac 0x0 0x0 0x0 0x0 0x0 0x120005 0xcac 0x0 0x0 0x0 0x0 0x0 0x150007 0x4d 0xc8 0xc5f 0x1e0005 0xc5f 0x0 0x0 0x0 0x0 0x0 0x210005 0xc5f 0x0 0x0 0x0 0x0 0x0 0x240007 0xf 0x38 0xc50 0x280003 0xc50 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xffffffffffffffff 0xffffffffffffffff oops 0 methods 0
|
||||
ciMethodData java/util/AbstractCollection <init> ()V 2 170780 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x10002 0x29a1c 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/AbstractMap <init> ()V 2 64305 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x10002 0xf9b1 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/LinkedHashMap <init> (I)V 2 6953 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 10 0x20002 0x1b18 0x0 0x0 0x0 0x0 0x9 0x2 0x78 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/HashMap <init> (I)V 2 9449 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 9 0x40002 0x24d5 0x0 0x0 0x0 0x9 0x2 0x18 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/HashMap <init> (IF)V 2 10864 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 83 0x10002 0x2a5c 0x50007 0x2a5c 0xe8 0x0 0x100002 0x0 0x150005 0x0 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x0 0x1c0005 0x0 0x0 0x0 0x0 0x0 0x0 0x1f0002 0x0 0x260007 0x2a5c 0x20 0x0 0x2f0007 0x0 0x50 0x2a5c 0x330002 0x2a5c 0x360007 0x2a5c 0xe8 0x0 0x410002 0x0 0x460005 0x0 0x0 0x0 0x0 0x0 0x0 0x4a0005 0x0 0x0 0x0 0x0 0x0 0x0 0x4d0005 0x0 0x0 0x0 0x0 0x0 0x0 0x500002 0x0 0x5b0002 0x2a5c 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x18 0x0 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/Boolean parseBoolean (Ljava/lang/String;)Z 2 3604 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 16 0x30005 0xdfc 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 0 methods 0
|
||||
ciMethod java/util/LinkedHashMap$LinkedValues <init> (Ljava/util/LinkedHashMap;)V 278 0 5635 0 0
|
||||
ciMethodData java/util/LinkedHashMap get (Ljava/lang/Object;)Ljava/lang/Object; 2 20161 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 32 0x20005 0x4dc1 0x0 0x0 0x0 0x0 0x0 0x70007 0xe52 0x20 0x3f6f 0x100007 0xe52 0x58 0x0 0x150005 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList <init> ()V 2 112798 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 9 0x10002 0x1b832 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/AbstractList <init> ()V 2 131842 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 9 0x10002 0x2027d 0x0 0x0 0x0 0x0 0x9 0x1 0x6 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList$Itr hasNext ()Z 2 5381 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 14 0xb0007 0x9cb 0x38 0xa39 0xf0003 0xa39 0x18 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList$Itr checkForComodification ()V 2 11857 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 13 0xb0007 0x2d50 0x30 0x0 0x120002 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList$Itr next ()Ljava/lang/Object; 2 9263 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 28 0x10005 0x232f 0x0 0x0 0x0 0x0 0x0 0x110007 0x232f 0x30 0x0 0x180002 0x0 0x270007 0x232f 0x30 0x0 0x2e0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x6 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList$Itr <init> (Ljava/util/ArrayList;)V 2 15023 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 10 0x60002 0x3809 0x0 0x0 0x0 0x0 0x9 0x2 0xc 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList iterator ()Ljava/util/Iterator; 2 8384 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 8 0x50002 0x18bc 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/LinkedHashMap values ()Ljava/util/Collection; 2 6577 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 15 0x60007 0x338 0x30 0x1578 0xe0002 0x1578 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/LinkedHashMap$LinkedValues <init> (Ljava/util/LinkedHashMap;)V 2 5635 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 10 0x60002 0x1578 0x0 0x0 0x0 0x0 0x9 0x2 0x6 0x0 oops 0 methods 0
|
||||
ciMethodData java/lang/Float isNaN (F)Z 2 12055 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 11 0x30007 0x2e16 0x38 0x0 0x70003 0x0 0x18 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/HashMap tableSizeFor (I)I 2 17291 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 25 0x40002 0x428b 0xa0007 0x3b6e 0x38 0x71d 0xe0003 0x71d 0x50 0x140007 0x3b6e 0x38 0x0 0x190003 0x0 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList isEmpty ()Z 2 5842 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 13 0x40007 0x9dc 0x38 0xb76 0x80003 0xb76 0x18 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData java/util/ArrayList <init> (Ljava/util/Collection;)V 2 8208 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 42 0x10002 0x1e95 0x50005 0x1e0 0x0 0x717560005e50 0x1088 0x7175600841d0 0xc2d 0x120007 0x797 0xb8 0x16fe 0x160005 0x16fe 0x0 0x0 0x0 0x0 0x0 0x1b0007 0xdfe 0x38 0x900 0x230003 0x900 0x40 0x2e0002 0xdfe 0x340003 0xdfe 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 2 5 java/util/ArrayList 7 java/util/LinkedHashMap$LinkedValues methods 0
|
||||
ciMethod org/codehaus/plexus/util/xml/Xpp3Dom <init> (Lorg/codehaus/plexus/util/xml/Xpp3Dom;)V 864 0 14310 0 -1
|
||||
ciMethod org/codehaus/plexus/util/xml/Xpp3Dom mergeXpp3Dom (Lorg/codehaus/plexus/util/xml/Xpp3Dom;Lorg/codehaus/plexus/util/xml/Xpp3Dom;)Lorg/codehaus/plexus/util/xml/Xpp3Dom; 170 0 2823 0 -1
|
||||
ciMethod org/apache/maven/model/Plugin getExecutions ()Ljava/util/List; 518 0 19007 0 0
|
||||
ciMethod org/apache/maven/model/Plugin setExecutions (Ljava/util/List;)V 262 0 131 0 0
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer getConfiguration ()Ljava/lang/Object; 312 0 156 0 -1
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer getInherited ()Ljava/lang/String; 304 0 152 0 0
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer getLocation (Ljava/lang/Object;)Lorg/apache/maven/model/InputLocation; 526 0 19937 0 -1
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer setLocation (Ljava/lang/Object;Lorg/apache/maven/model/InputLocation;)V 518 0 6377 0 -1
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer setConfiguration (Ljava/lang/Object;)V 292 0 146 0 -1
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer setInherited (Ljava/lang/String;)V 42 0 19 0 -1
|
||||
ciMethod org/apache/maven/model/ConfigurationContainer isInherited ()Z 528 0 23017 0 0
|
||||
ciMethod org/apache/maven/model/PluginExecution getId ()Ljava/lang/String; 276 0 138 0 0
|
||||
ciMethod org/apache/maven/model/PluginExecution getPhase ()Ljava/lang/String; 264 0 132 0 -1
|
||||
ciMethod org/apache/maven/model/PluginExecution setId (Ljava/lang/String;)V 262 0 131 0 -1
|
||||
ciMethod org/apache/maven/model/PluginExecution setPhase (Ljava/lang/String;)V 256 0 128 0 -1
|
||||
ciMethod org/apache/maven/model/merge/MavenModelMerger mergePlugin_Executions (Lorg/apache/maven/model/Plugin;Lorg/apache/maven/model/Plugin;ZLjava/util/Map;)V 768 96 10753 0 -1
|
||||
ciMethod org/apache/maven/model/merge/MavenModelMerger getPluginExecutionKey (Lorg/apache/maven/model/PluginExecution;)Ljava/lang/Object; 102 0 2434 0 0
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergeConfigurationContainer (Lorg/apache/maven/model/ConfigurationContainer;Lorg/apache/maven/model/ConfigurationContainer;ZLjava/util/Map;)V 848 0 11427 0 -1
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergeConfigurationContainer_Inherited (Lorg/apache/maven/model/ConfigurationContainer;Lorg/apache/maven/model/ConfigurationContainer;ZLjava/util/Map;)V 1024 0 11427 0 -1
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergeConfigurationContainer_Configuration (Lorg/apache/maven/model/ConfigurationContainer;Lorg/apache/maven/model/ConfigurationContainer;ZLjava/util/Map;)V 1024 0 11427 0 -1
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergePluginExecution (Lorg/apache/maven/model/PluginExecution;Lorg/apache/maven/model/PluginExecution;ZLjava/util/Map;)V 78 0 88 0 0
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergePluginExecution_Id (Lorg/apache/maven/model/PluginExecution;Lorg/apache/maven/model/PluginExecution;ZLjava/util/Map;)V 188 0 88 0 -1
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergePluginExecution_Phase (Lorg/apache/maven/model/PluginExecution;Lorg/apache/maven/model/PluginExecution;ZLjava/util/Map;)V 188 0 88 0 -1
|
||||
ciMethod org/apache/maven/model/merge/ModelMerger mergePluginExecution_Goals (Lorg/apache/maven/model/PluginExecution;Lorg/apache/maven/model/PluginExecution;ZLjava/util/Map;)V 0 0 1 0 -1
|
||||
ciMethodData org/apache/maven/model/ConfigurationContainer setLocation (Ljava/lang/Object;Lorg/apache/maven/model/InputLocation;)V 2 6377 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 109 0x10004 0x0 0x0 0x717560002b40 0x17e6 0x0 0x0 0x40007 0x0 0x2a0 0x17e6 0x80004 0x0 0x0 0x717560002b40 0x17e6 0x0 0x0 0x100005 0x17e6 0x0 0x0 0x0 0x0 0x0 0x130008 0x8 0x1149 0x188 0x8 0xc0 0x603 0x50 0x92 0x130 0x370005 0x603 0x0 0x0 0x0 0x0 0x0 0x3a0007 0x0 0x100 0x603 0x400003 0x603 0xe0 0x460005 0x8 0x0 0x0 0x0 0x0 0x0 0x490007 0x0 0x90 0x8 0x4f0003 0x8 0x70 0x550005 0x92 0x0 0x0 0x0 0x0 0x0 0x580007 0x0 0x20 0x92 0x600008 0x8 0x1149 0x50 0x603 0x50 0x8 0x50 0x92 0x50 0x910005 0x60 0x0 0x71754c466900 0xf8a 0x71754c467b60 0x15f 0x980005 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 4 3 java/lang/String 14 java/lang/String 87 org/apache/maven/model/Plugin 89 org/apache/maven/model/PluginExecution methods 0
|
||||
ciMethodData org/apache/maven/model/ConfigurationContainer getLocation (Ljava/lang/Object;)Lorg/apache/maven/model/InputLocation; 2 19937 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 98 0x10004 0x0 0x0 0x717560002b40 0x4cda 0x0 0x0 0x40007 0x0 0x278 0x4cda 0x80004 0x0 0x0 0x717560002b40 0x4cda 0x0 0x0 0xf0005 0x4cda 0x0 0x0 0x0 0x0 0x0 0x8000000600120008 0x8 0x39c2 0x188 0xa 0xc0 0x130f 0x50 0x0 0x130 0x370005 0x130f 0x0 0x0 0x0 0x0 0x0 0x3a0007 0x0 0x100 0x130f 0x3f0003 0x130f 0xe0 0x450005 0xa 0x0 0x0 0x0 0x0 0x0 0x480007 0x0 0x90 0xa 0x4d0003 0xa 0x70 0x530005 0x0 0x0 0x0 0x0 0x0 0x0 0x560007 0x0 0x20 0x0 0x5c0008 0x8 0x39c2 0x50 0x130f 0x50 0xa 0x50 0x0 0x50 0x890002 0x39c2 0x8f0002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 2 3 java/lang/String 14 java/lang/String methods 0
|
||||
ciMethodData org/apache/maven/model/Plugin getExecutions ()Ljava/util/List; 2 19041 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 15 0x40007 0x10d1 0x30 0x388d 0xc0002 0x388d 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData org/apache/maven/model/ConfigurationContainer isInherited ()Z 2 23017 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 18 0x40007 0x5876 0x48 0x6b 0xb0002 0x6b 0xe0003 0x6b 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
|
||||
ciMethodData org/apache/maven/model/merge/MavenModelMerger mergePlugin_Executions (Lorg/apache/maven/model/Plugin;Lorg/apache/maven/model/Plugin;ZLjava/util/Map;)V 2 10759 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 233 0x10005 0x0 0x0 0x71754c466900 0x2887 0x0 0x0 0x80005 0x0 0x0 0x717560005e50 0x2887 0x0 0x0 0xd0007 0x225d 0x670 0x62a 0x110005 0x0 0x0 0x71754c466900 0x62a 0x0 0x0 0x1c0005 0x0 0x0 0x717560005e50 0x62a 0x0 0x0 0x230005 0x0 0x0 0x717560005e50 0x62a 0x0 0x0 0x2b0002 0x62a 0x320005 0x0 0x0 0x717560005e50 0x62a 0x0 0x0 0x3b0005 0x0 0x0 0x71754c467ab0 0xdf4 0x0 0x0 0x400007 0x62a 0x258 0x7ca 0x450005 0x0 0x0 0x71754c467ab0 0x7ca 0x0 0x0 0x4a0004 0x0 0x0 0x71754c467b60 0x7ca 0x0 0x0 0x500007 0x0 0x140 0x7ca 0x550005 0x0 0x0 0x71754c467b60 0x7ca 0x0 0x0 0x580007 0x7b5 0x90 0x15 0x5d0005 0x0 0x0 0x71754c467b60 0x15 0x0 0x0 0x600007 0x15 0x100 0x0 0x630003 0x0 0x70 0x670005 0x0 0x0 0x71754c466900 0x7b5 0x0 0x0 0x6a0007 0x1 0x90 0x7b4 0x700005 0x0 0x0 0x71754c467c10 0x7ab 0x71754c467cc0 0x9 0x7b0005 0x0 0x0 0x71754c467d70 0x7b4 0x0 0x0 0x810003 0x7ca 0xfffffffffffffd88 0x860005 0x0 0x0 0x717560005e50 0x62a 0x0 0x0 0x8f0005 0x0 0x0 0x71754c467ab0 0x6ba 0x0 0x0 0x940007 0x62a 0x1e0 0x90 0x990005 0x0 0x0 0x71754c467ab0 0x90 0x0 0x0 0x9e0004 0x0 0x0 0x71754c467b60 0x90 0x0 0x0 0xa60005 0x0 0x0 0x71754c467c10 0x90 0x0 0x0 0xaf0005 0x0 0x0 0x71754c467d70 0x90 0x0 0x0 0xb40104 0x0 0x0 0x71754c467b60 0x33 0x0 0x0 0xbb0007 0x5d 0x58 0x33 0xc60005 0x0 0x0 0x71754c467c10 0x33 0x0 0x0 0xcf0005 0x0 0x0 0x71754c467d70 0x90 0x0 0x0 0xd50003 0x90 0xfffffffffffffe00 0xdf0005 0x0 0x0 0x71754c467d70 0x62a 0x0 0x0 0xe40002 0x62a 0xe70005 0x0 0x0 0x71754c466900 0x62a 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 26 3 org/apache/maven/model/Plugin 10 java/util/ArrayList 21 org/apache/maven/model/Plugin 28 java/util/ArrayList 35 java/util/ArrayList 44 java/util/ArrayList 51 java/util/ArrayList$Itr 62 java/util/ArrayList$Itr 69 org/apache/maven/model/PluginExecution 80 org/apache/maven/model/PluginExecution 91 org/apache/maven/model/PluginExecution 105 org/apache/maven/model/Plugin 116 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 118 org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector$LifecycleBindingsMerger 123 java/util/LinkedHashMap 133 java/util/ArrayList 140 java/util/ArrayList$Itr 151 java/util/ArrayList$Itr 158 org/apache/maven/model/PluginExecution 165 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 172 java/util/LinkedHashMap 179 org/apache/maven/model/PluginExecution 190 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 197 java/util/LinkedHashMap 207 java/util/LinkedHashMap 216 org/apache/maven/model/Plugin methods 0
|
||||
ciMethodData org/apache/maven/model/merge/MavenModelMerger getPluginExecutionKey (Lorg/apache/maven/model/PluginExecution;)Ljava/lang/Object; 2 2436 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 17 0x10005 0x0 0x0 0x71754c467b60 0x951 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 1 3 org/apache/maven/model/PluginExecution methods 0
|
||||
ciMethodData org/apache/maven/model/merge/ModelMerger mergeConfigurationContainer_Configuration (Lorg/apache/maven/model/ConfigurationContainer;Lorg/apache/maven/model/ConfigurationContainer;ZLjava/util/Map;)V 2 11427 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 69 0x10005 0x56 0x0 0x71754c466900 0x28b5 0x717560350b30 0x199 0x40104 0x0 0x0 0x7175603529e0 0xa8e 0x0 0x0 0xb0007 0x2016 0x150 0xa8e 0xf0005 0x32 0x0 0x71754c466900 0x99c 0x717560350b30 0xc0 0x120104 0x0 0x0 0x7175603529e0 0x149 0x0 0x0 0x180007 0xb 0x40 0xa83 0x1d0007 0x13e 0x58 0x945 0x260002 0x950 0x2b0002 0x950 0x300003 0x950 0x28 0x370002 0x13e 0x3f0005 0x32 0x0 0x71754c466900 0x99c 0x717560350b30 0xc0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 8 3 org/apache/maven/model/Plugin 5 org/apache/maven/model/ReportPlugin 10 org/codehaus/plexus/util/xml/Xpp3Dom 21 org/apache/maven/model/Plugin 23 org/apache/maven/model/ReportPlugin 28 org/codehaus/plexus/util/xml/Xpp3Dom 52 org/apache/maven/model/Plugin 54 org/apache/maven/model/ReportPlugin methods 0
|
||||
ciMethodData org/apache/maven/model/merge/ModelMerger mergeConfigurationContainer (Lorg/apache/maven/model/ConfigurationContainer;Lorg/apache/maven/model/ConfigurationContainer;ZLjava/util/Map;)V 2 11427 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 27 0x60005 0x19 0x0 0x71754c467c10 0x2720 0x717560350050 0x3c2 0xf0005 0x19 0x0 0x71754c467c10 0x2720 0x717560350050 0x3c2 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 4 3 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 5 org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger 10 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 12 org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger methods 0
|
||||
ciMethodData org/apache/maven/model/merge/ModelMerger mergeConfigurationContainer_Inherited (Lorg/apache/maven/model/ConfigurationContainer;Lorg/apache/maven/model/ConfigurationContainer;ZLjava/util/Map;)V 2 11427 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 118 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 60 0x10005 0x56 0x0 0x71754c466900 0x28b5 0x717560350b30 0x199 0x80007 0x2a79 0x140 0x2b 0xc0007 0x0 0x78 0x2b 0x100005 0x0 0x0 0x71754c466900 0x2b 0x0 0x0 0x130007 0x0 0xc8 0x2b 0x190005 0x0 0x0 0x71754c466900 0x2b 0x0 0x0 0x240005 0x0 0x0 0x71754c466900 0x2b 0x0 0x0 0x270005 0x0 0x0 0x71754c466900 0x2b 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 6 3 org/apache/maven/model/Plugin 5 org/apache/maven/model/ReportPlugin 18 org/apache/maven/model/Plugin 29 org/apache/maven/model/Plugin 36 org/apache/maven/model/Plugin 43 org/apache/maven/model/Plugin methods 0
|
||||
ciMethodData org/apache/maven/model/merge/ModelMerger mergePluginExecution (Lorg/apache/maven/model/PluginExecution;Lorg/apache/maven/model/PluginExecution;ZLjava/util/Map;)V 1 88 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 41 0x60005 0x0 0x0 0x71754c467c10 0x1f 0x717560350050 0x12 0xf0005 0x0 0x0 0x71754c467c10 0x1f 0x717560350050 0x12 0x180005 0x0 0x0 0x71754c467c10 0x1f 0x717560350050 0x12 0x210005 0x0 0x0 0x71754c467c10 0x1f 0x717560350050 0x12 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 8 3 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 5 org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger 10 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 12 org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger 17 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 19 org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger 24 org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 26 org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger methods 0
|
||||
ciInstanceKlass java/lang/Cloneable 1 0 7 100 1 100 1 1 1
|
||||
instanceKlass sun/misc/Signal$SunMiscHandler
|
||||
instanceKlass sun/misc/Signal$InternalMiscHandler
|
||||
instanceKlass sun/misc/SignalHandler
|
||||
instanceKlass sun/misc/Signal
|
||||
instanceKlass org/springframework/boot/loader/tools/SignalUtils
|
||||
instanceKlass java/util/concurrent/ForkJoinTask$Aux
|
||||
instanceKlass java/lang/ProcessHandleImpl$1
|
||||
instanceKlass java/util/concurrent/ForkJoinTask
|
||||
instanceKlass java/util/concurrent/CompletableFuture$AsynchronousCompletionTask
|
||||
instanceKlass java/util/concurrent/CompletableFuture$AltResult
|
||||
instanceKlass java/util/concurrent/CompletableFuture
|
||||
instanceKlass java/util/concurrent/CompletionStage
|
||||
instanceKlass java/lang/ProcessImpl$1
|
||||
instanceKlass java/util/concurrent/SynchronousQueue$TransferStack$SNode
|
||||
instanceKlass java/util/concurrent/SynchronousQueue$Transferer
|
||||
instanceKlass java/util/concurrent/ThreadPoolExecutor$AbortPolicy
|
||||
instanceKlass java/util/concurrent/RejectedExecutionHandler
|
||||
instanceKlass java/util/concurrent/Executors
|
||||
instanceKlass jdk/internal/util/random/RandomSupport
|
||||
instanceKlass java/lang/ProcessHandleImpl
|
||||
instanceKlass java/lang/ProcessHandle
|
||||
instanceKlass java/lang/Process
|
||||
instanceKlass java/lang/ProcessBuilder$Redirect
|
||||
instanceKlass java/lang/ProcessBuilder
|
||||
instanceKlass org/springframework/boot/maven/RunMojo$RunProcessKiller
|
||||
instanceKlass org/springframework/util/Assert
|
||||
instanceKlass org/springframework/boot/loader/tools/JavaExecutable
|
||||
instanceKlass sun/nio/fs/UnixUriUtils
|
||||
instanceKlass org/springframework/util/StringUtils
|
||||
instanceKlass java/util/function/UnaryOperator
|
||||
instanceKlass org/springframework/boot/maven/ClassPath
|
||||
instanceKlass org/apache/maven/shared/artifact/filter/internal/Utils
|
||||
instanceKlass org/springframework/boot/loader/tools/MainClassFinder$MainClass
|
||||
instanceKlass org/springframework/asm/Context
|
||||
instanceKlass org/springframework/asm/Attribute
|
||||
instanceKlass org/springframework/asm/ClassReader
|
||||
instanceKlass org/springframework/boot/loader/tools/MainClassFinder$SingleMainClassCallback
|
||||
instanceKlass java/io/FileFilter
|
||||
instanceKlass org/springframework/asm/Type
|
||||
instanceKlass org/springframework/boot/loader/tools/MainClassFinder$MainClassCallback
|
||||
instanceKlass org/springframework/asm/ClassVisitor
|
||||
instanceKlass org/springframework/boot/loader/tools/MainClassFinder
|
||||
instanceKlass org/springframework/boot/maven/SpringBootApplicationClassFinder
|
||||
instanceKlass org/springframework/boot/maven/FilterableDependency
|
||||
instanceKlass org/springframework/boot/maven/RunMojo$$FastClassByGuice$$199368009
|
||||
instanceKlass org/apache/maven/plugins/shade/DefaultShader$$FastClassByGuice$$198712289
|
||||
instanceKlass org/apache/maven/plugins/shade/resource/AbstractCompatibilityTransformer
|
||||
instanceKlass org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer
|
||||
instanceKlass org/apache/maven/plugins/shade/resource/ResourceTransformer
|
||||
instanceKlass org/apache/maven/plugins/shade/DefaultShader$DefaultPackageMapper
|
||||
instanceKlass org/apache/maven/plugins/shade/ShadeRequest
|
||||
instanceKlass org/apache/maven/plugins/shade/DefaultShader$PackageMapper
|
||||
instanceKlass org/objectweb/asm/ClassVisitor
|
||||
instanceKlass org/codehaus/plexus/util/Scanner
|
||||
instanceKlass org/springframework/boot/loader/tools/RunProcess
|
||||
instanceKlass org/springframework/boot/loader/tools/BuildPropertiesWriter$ProjectDetails
|
||||
instanceKlass org/springframework/boot/maven/SpringApplicationAdminClient
|
||||
instanceKlass javax/management/MBeanServerConnection
|
||||
instanceKlass org/springframework/boot/maven/EnvVariables
|
||||
instanceKlass org/springframework/boot/maven/RunArguments
|
||||
instanceKlass org/springframework/boot/maven/JavaProcessExecutor
|
||||
instanceKlass org/springframework/boot/buildpack/platform/io/Owner
|
||||
instanceKlass org/springframework/boot/buildpack/platform/build/BuildRequest
|
||||
instanceKlass org/springframework/boot/maven/Docker
|
||||
instanceKlass org/springframework/boot/maven/Image
|
||||
instanceKlass org/springframework/boot/buildpack/platform/io/TarArchive
|
||||
instanceKlass org/springframework/boot/buildpack/platform/build/BuildLog
|
||||
instanceKlass org/springframework/boot/loader/tools/LaunchScript
|
||||
instanceKlass org/springframework/boot/loader/tools/Packager
|
||||
instanceKlass org/springframework/boot/loader/tools/layer/CustomLayers
|
||||
instanceKlass org/springframework/boot/loader/tools/LayoutFactory
|
||||
instanceKlass org/springframework/boot/maven/Layers
|
||||
instanceKlass org/springframework/boot/loader/tools/Layers
|
||||
instanceKlass org/springframework/boot/loader/tools/Packager$MainClassTimeoutWarningListener
|
||||
instanceKlass org/springframework/boot/loader/tools/Libraries
|
||||
instanceKlass org/apache/maven/shared/artifact/filter/collection/FilterArtifacts
|
||||
instanceKlass org/apache/maven/shared/artifact/filter/collection/AbstractArtifactsFilter
|
||||
instanceKlass org/apache/maven/shared/artifact/filter/collection/ArtifactsFilter
|
||||
instanceKlass org/apache/maven/plugins/shade/DefaultShader
|
||||
instanceKlass org/apache/maven/plugins/shade/Shader
|
||||
instanceKlass org/sonatype/plexus/build/incremental/BuildContext
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$1
|
||||
instanceKlass org/apache/maven/plugin/compiler/TestCompilerMojo$$FastClassByGuice$$197299735
|
||||
instanceKlass org/apache/maven/plugins/resources/TestResourcesMojo$$FastClassByGuice$$196533253
|
||||
instanceKlass org/apache/maven/shared/utils/StringUtils
|
||||
instanceKlass org/apache/maven/plugin/compiler/DeltaList
|
||||
instanceKlass java/nio/file/attribute/FileTime$1
|
||||
instanceKlass org/codehaus/plexus/util/io/InputStreamFacade
|
||||
instanceKlass org/codehaus/plexus/util/BaseFileUtils
|
||||
instanceKlass org/apache/maven/shared/incremental/IncrementalBuildHelperRequest
|
||||
instanceKlass org/codehaus/plexus/util/SelectorUtils
|
||||
instanceKlass org/codehaus/plexus/util/MatchPatterns
|
||||
instanceKlass org/codehaus/plexus/util/MatchPattern
|
||||
instanceKlass org/codehaus/plexus/util/AbstractScanner
|
||||
instanceKlass org/codehaus/plexus/util/Scanner
|
||||
instanceKlass org/codehaus/plexus/compiler/util/scan/mapping/SuffixMapping
|
||||
instanceKlass org/codehaus/plexus/compiler/util/scan/AbstractSourceInclusionScanner
|
||||
instanceKlass com/sun/tools/javac/util/Context
|
||||
instanceKlass com/sun/tools/javac/file/BaseFileManager
|
||||
instanceKlass com/sun/source/util/JavacTask
|
||||
instanceKlass javax/tools/JavaCompiler$CompilationTask
|
||||
instanceKlass javax/tools/StandardJavaFileManager
|
||||
instanceKlass com/sun/tools/javac/api/JavacTool
|
||||
instanceKlass javax/tools/ToolProvider
|
||||
instanceKlass java/util/concurrent/ConcurrentLinkedDeque$Node
|
||||
instanceKlass org/codehaus/plexus/compiler/PlexusLoggerWrapper
|
||||
instanceKlass org/eclipse/sisu/wire/ProviderIterableAdapter$ProviderEntry
|
||||
instanceKlass org/eclipse/sisu/wire/ProviderIterableAdapter$ProviderIterator
|
||||
instanceKlass org/eclipse/sisu/wire/ProviderIterableAdapter
|
||||
instanceKlass org/apache/maven/toolchain/DefaultToolchainManager$$FastClassByGuice$$195841902
|
||||
instanceKlass org/apache/maven/plugin/compiler/CompilerMojo$$FastClassByGuice$$194900906
|
||||
instanceKlass org/codehaus/plexus/compiler/javac/JavaxToolsCompiler$$FastClassByGuice$$193176540
|
||||
instanceKlass org/codehaus/plexus/compiler/javac/JavacCompiler$$FastClassByGuice$$191990561
|
||||
instanceKlass org/codehaus/plexus/compiler/manager/DefaultCompilerManager$$FastClassByGuice$$191834876
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/LocationManager$$FastClassByGuice$$190250452
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders$2
|
||||
instanceKlass javax/tools/Diagnostic
|
||||
instanceKlass javax/tools/JavaCompiler
|
||||
instanceKlass javax/tools/Tool
|
||||
instanceKlass javax/tools/JavaFileManager
|
||||
instanceKlass javax/tools/OptionChecker
|
||||
instanceKlass javax/tools/DiagnosticListener
|
||||
instanceKlass org/codehaus/plexus/compiler/CompilerMessage
|
||||
instanceKlass org/codehaus/plexus/util/cli/StreamConsumer
|
||||
instanceKlass org/codehaus/plexus/compiler/CompilerOutputStyle
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathsRequest
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathRequest
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathResult
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ManifestModuleNameExtractor
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParser
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ModuleInfoParser
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ModuleNameExtractor
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/JavaModuleDescriptor
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathsResult
|
||||
instanceKlass org/apache/maven/plugin/compiler/DependencyCoordinate
|
||||
instanceKlass org/codehaus/plexus/compiler/CompilerResult
|
||||
instanceKlass org/apache/maven/shared/incremental/IncrementalBuildHelper
|
||||
instanceKlass org/apache/maven/shared/utils/logging/MessageBuilder
|
||||
instanceKlass org/codehaus/plexus/compiler/util/scan/SourceInclusionScanner
|
||||
instanceKlass java/time/Instant
|
||||
instanceKlass org/codehaus/plexus/compiler/CompilerConfiguration
|
||||
instanceKlass org/codehaus/plexus/compiler/util/scan/mapping/SourceMapping
|
||||
instanceKlass org/codehaus/plexus/compiler/javac/JavaxToolsCompiler
|
||||
instanceKlass org/codehaus/plexus/compiler/javac/InProcessCompiler
|
||||
instanceKlass org/codehaus/plexus/compiler/AbstractCompiler
|
||||
instanceKlass org/codehaus/plexus/compiler/Compiler
|
||||
instanceKlass org/codehaus/plexus/compiler/manager/DefaultCompilerManager
|
||||
instanceKlass org/codehaus/plexus/compiler/manager/CompilerManager
|
||||
instanceKlass org/codehaus/plexus/languages/java/jpms/LocationManager
|
||||
instanceKlass org/apache/maven/artifact/resolver/filter/AbstractScopeArtifactFilter
|
||||
instanceKlass org/sonatype/plexus/build/incremental/EmptyScanner
|
||||
instanceKlass sun/nio/fs/UnixFileModeAttribute$1
|
||||
instanceKlass java/nio/file/attribute/PosixFileAttributeView
|
||||
instanceKlass java/nio/file/attribute/FileOwnerAttributeView
|
||||
instanceKlass java/nio/BufferMismatch
|
||||
instanceKlass org/codehaus/plexus/interpolation/PrefixAwareRecursionInterceptor
|
||||
instanceKlass org/codehaus/plexus/interpolation/SimpleRecursionInterceptor
|
||||
instanceKlass org/codehaus/plexus/interpolation/InterpolationPostProcessor
|
||||
instanceKlass org/codehaus/plexus/interpolation/SingleResponseValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/PrefixedValueSourceWrapper
|
||||
instanceKlass org/codehaus/plexus/interpolation/FeedbackEnabledValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/AbstractDelegatingValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/QueryEnabledValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/multi/DelimiterSpecification
|
||||
instanceKlass org/codehaus/plexus/interpolation/multi/MultiDelimiterStringSearchInterpolator
|
||||
instanceKlass org/apache/maven/shared/filtering/FilteringUtils
|
||||
instanceKlass org/apache/commons/io/FilenameUtils
|
||||
instanceKlass org/codehaus/plexus/util/SelectorUtils
|
||||
instanceKlass org/codehaus/plexus/util/MatchPatterns
|
||||
instanceKlass org/codehaus/plexus/util/MatchPattern
|
||||
instanceKlass org/codehaus/plexus/util/AbstractScanner
|
||||
instanceKlass org/codehaus/plexus/interpolation/RecursionInterceptor
|
||||
instanceKlass org/codehaus/plexus/interpolation/AbstractValueSource
|
||||
instanceKlass org/apache/maven/plugins/resources/MavenBuildTimestamp
|
||||
instanceKlass org/apache/maven/shared/filtering/FilterWrapper
|
||||
instanceKlass java/lang/Character$Subset
|
||||
instanceKlass org/apache/commons/lang3/StringUtils
|
||||
instanceKlass org/codehaus/plexus/util/introspection/MethodMap
|
||||
instanceKlass org/codehaus/plexus/util/introspection/ClassMap$CacheMiss
|
||||
instanceKlass org/codehaus/plexus/util/introspection/ClassMap
|
||||
instanceKlass org/codehaus/plexus/util/introspection/ReflectionValueExtractor$Tokenizer
|
||||
instanceKlass org/codehaus/plexus/util/introspection/ReflectionValueExtractor
|
||||
instanceKlass org/eclipse/sisu/plexus/TypeArguments
|
||||
instanceKlass org/eclipse/sisu/plexus/CompositeBeanHelper$1
|
||||
instanceKlass org/eclipse/sisu/plexus/CompositeBeanHelper
|
||||
instanceKlass org/apache/maven/plugin/internal/ValidatingConfigurationListener
|
||||
instanceKlass org/apache/maven/plugin/DebugConfigurationListener
|
||||
instanceKlass org/eclipse/sisu/inject/MildKeys
|
||||
instanceKlass java/time/LocalTime
|
||||
instanceKlass java/time/LocalDate
|
||||
instanceKlass java/time/chrono/ChronoLocalDate
|
||||
instanceKlass java/time/zone/ZoneOffsetTransition
|
||||
instanceKlass java/time/LocalDateTime
|
||||
instanceKlass java/time/chrono/ChronoLocalDateTime
|
||||
instanceKlass java/time/temporal/TemporalAdjuster
|
||||
instanceKlass java/time/zone/ZoneOffsetTransitionRule
|
||||
instanceKlass java/time/zone/ZoneRules
|
||||
instanceKlass java/time/zone/Ser
|
||||
instanceKlass java/io/Externalizable
|
||||
instanceKlass java/time/zone/ZoneRulesProvider$1
|
||||
instanceKlass java/time/zone/ZoneRulesProvider
|
||||
instanceKlass java/time/Period
|
||||
instanceKlass java/time/chrono/ChronoPeriod
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$TextPrinterParser
|
||||
instanceKlass java/time/format/DateTimeTextProvider$1
|
||||
instanceKlass java/time/format/DateTimeTextProvider
|
||||
instanceKlass java/time/format/DateTimeTextProvider$LocaleStore
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$InstantPrinterParser
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$StringLiteralPrinterParser
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$ZoneIdPrinterParser
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser
|
||||
instanceKlass java/time/format/DecimalStyle
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$CompositePrinterParser
|
||||
instanceKlass java/time/chrono/AbstractChronology
|
||||
instanceKlass java/time/chrono/Chronology
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$CharLiteralPrinterParser
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$NumberPrinterParser
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder$DateTimePrinterParser
|
||||
instanceKlass java/time/temporal/JulianFields
|
||||
instanceKlass java/time/temporal/IsoFields
|
||||
instanceKlass java/time/temporal/ValueRange
|
||||
instanceKlass java/time/temporal/TemporalField
|
||||
instanceKlass java/time/ZoneId
|
||||
instanceKlass java/time/temporal/TemporalQuery
|
||||
instanceKlass java/time/format/DateTimeFormatterBuilder
|
||||
instanceKlass java/time/format/DateTimeFormatter
|
||||
instanceKlass java/time/temporal/Temporal
|
||||
instanceKlass java/time/temporal/TemporalAccessor
|
||||
instanceKlass org/codehaus/plexus/component/configurator/converters/ParameterizedConfigurationConverter
|
||||
instanceKlass org/codehaus/plexus/component/configurator/converters/AbstractConfigurationConverter
|
||||
instanceKlass org/codehaus/plexus/component/configurator/converters/ConfigurationConverter
|
||||
instanceKlass org/codehaus/plexus/component/configurator/converters/lookup/DefaultConverterLookup
|
||||
instanceKlass org/codehaus/plexus/component/configurator/expression/DefaultExpressionEvaluator
|
||||
instanceKlass org/apache/maven/plugin/PluginParameterExpressionEvaluator
|
||||
instanceKlass org/codehaus/plexus/component/configurator/expression/TypeAwareExpressionEvaluator
|
||||
instanceKlass org/apache/maven/monitor/logging/DefaultLog
|
||||
instanceKlass org/sonatype/plexus/build/incremental/DefaultBuildContext$$FastClassByGuice$$189757721
|
||||
instanceKlass org/apache/maven/plugins/resources/ResourcesMojo$$FastClassByGuice$$188717517
|
||||
instanceKlass org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering$$FastClassByGuice$$187342518
|
||||
instanceKlass org/apache/maven/shared/filtering/DefaultMavenReaderFilter$$FastClassByGuice$$185959635
|
||||
instanceKlass org/apache/maven/shared/filtering/DefaultMavenFileFilter$$FastClassByGuice$$184702993
|
||||
instanceKlass com/google/inject/internal/Messages$Converter
|
||||
instanceKlass com/google/inject/internal/Messages
|
||||
instanceKlass org/codehaus/plexus/interpolation/Interpolator
|
||||
instanceKlass org/codehaus/plexus/interpolation/BasicInterpolator
|
||||
instanceKlass org/codehaus/plexus/interpolation/ValueSource
|
||||
instanceKlass org/codehaus/plexus/util/Scanner
|
||||
instanceKlass org/apache/maven/shared/filtering/AbstractMavenFilteringRequest
|
||||
instanceKlass org/w3c/dom/Element
|
||||
instanceKlass org/w3c/dom/Document
|
||||
instanceKlass org/w3c/dom/Node
|
||||
instanceKlass org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering
|
||||
instanceKlass org/apache/maven/shared/filtering/MavenResourcesFiltering
|
||||
instanceKlass org/apache/maven/shared/filtering/MavenReaderFilter
|
||||
instanceKlass org/apache/maven/shared/filtering/BaseFilter
|
||||
instanceKlass org/apache/maven/shared/filtering/MavenFileFilter
|
||||
instanceKlass org/apache/maven/shared/filtering/DefaultFilterInfo
|
||||
instanceKlass org/sonatype/plexus/build/incremental/BuildContext
|
||||
instanceKlass java/security/CodeSigner
|
||||
instanceKlass java/util/jar/JarVerifier
|
||||
instanceKlass org/eclipse/sisu/space/FileEntryIterator
|
||||
instanceKlass org/eclipse/sisu/space/ResourceEnumeration
|
||||
instanceKlass org/eclipse/sisu/plexus/ComponentDescriptorBeanModule$PlexusDescriptorBeanSource
|
||||
instanceKlass org/eclipse/sisu/plexus/ComponentDescriptorBeanModule$ComponentMetadata
|
||||
instanceKlass org/apache/maven/plugin/AbstractMojo
|
||||
instanceKlass org/apache/maven/plugin/ContextEnabled
|
||||
instanceKlass org/apache/maven/plugin/Mojo
|
||||
instanceKlass org/eclipse/sisu/plexus/ComponentDescriptorBeanModule
|
||||
instanceKlass org/apache/maven/classrealm/ArtifactClassRealmConstituent
|
||||
instanceKlass org/apache/maven/plugin/internal/WagonExcluder
|
||||
instanceKlass org/apache/maven/plugin/CacheUtils
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginRealmCache$CacheKey
|
||||
instanceKlass org/eclipse/aether/util/graph/visitor/TreeDependencyVisitor
|
||||
instanceKlass org/eclipse/aether/util/graph/visitor/FilteringDependencyVisitor
|
||||
instanceKlass org/eclipse/aether/internal/impl/ArtifactRequestBuilder
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/NearestVersionSelector$ConflictGroup
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$ConflictItem
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$NodeInfo
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$ScopeContext
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$ConflictContext
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$State
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictIdSorter$RootQueue
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictIdSorter$ConflictId
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictMarker$ConflictGroup
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictMarker$Key
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictMarker
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictIdSorter
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/TransformationContextKeys
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DefaultDependencyGraphTransformationContext
|
||||
instanceKlass java/util/Collections$UnmodifiableList$1
|
||||
instanceKlass org/apache/maven/utils/Os
|
||||
instanceKlass org/eclipse/aether/util/graph/selector/ExclusionDependencySelector$ExclusionComparator
|
||||
instanceKlass org/apache/maven/artifact/handler/DefaultArtifactHandler$__sisu13$$FastClassByGuice$$184170604
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$NotifierKeyComputer
|
||||
instanceKlass org/eclipse/aether/collection/DependencyManagement
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$GraphKey
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DefaultDependencyCycle
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$Descriptor
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionResolver$Record
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionResolver$VersionInfo
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/SnapshotVersion
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/Snapshot
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/io/xpp3/MetadataXpp3Reader$1
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/io/xpp3/MetadataXpp3Reader$ContentTransformer
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/io/xpp3/MetadataXpp3Reader
|
||||
instanceKlass org/eclipse/aether/internal/impl/Utils
|
||||
instanceKlass org/eclipse/aether/repository/LocalMetadataResult
|
||||
instanceKlass org/eclipse/aether/repository/LocalMetadataRequest
|
||||
instanceKlass org/eclipse/aether/resolution/MetadataResult
|
||||
instanceKlass org/eclipse/aether/resolution/MetadataRequest
|
||||
instanceKlass org/eclipse/aether/metadata/AbstractMetadata
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$DescriptorKey
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$Constraint$VersionRepo
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$Constraint
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$ConstraintKey
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/CollectStepDataImpl
|
||||
instanceKlass org/eclipse/aether/collection/CollectStepData
|
||||
instanceKlass org/eclipse/aether/graph/Dependency$Exclusions$1
|
||||
instanceKlass org/eclipse/aether/util/graph/manager/ClassicDependencyManager$Key
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/df/NodeStack
|
||||
instanceKlass org/eclipse/aether/graph/DependencyCycle
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$HardInternPool
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$WeakInternPool
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool$InternPool
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/CachingArtifactTypeRegistry
|
||||
instanceKlass org/apache/maven/artifact/handler/DefaultArtifactHandler$__sisu17$$FastClassByGuice$$183412749
|
||||
instanceKlass org/eclipse/aether/util/artifact/ArtifactIdUtils
|
||||
instanceKlass org/apache/maven/project/DefaultDependencyResolutionRequest
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleDependencyResolver$ReactorDependencyFilter
|
||||
instanceKlass org/eclipse/aether/util/filter/AndDependencyFilter
|
||||
instanceKlass org/eclipse/aether/util/filter/ScopeDependencyFilter
|
||||
instanceKlass org/apache/maven/project/artifact/DefaultProjectArtifactsCache$CacheKey
|
||||
instanceKlass org/apache/maven/lifecycle/internal/MojoExecutor$ProjectLock
|
||||
instanceKlass org/apache/maven/project/MavenProject$LoggingList$1
|
||||
instanceKlass org/apache/maven/lifecycle/internal/MojoExecutor$1
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ExecutionPlanItem
|
||||
instanceKlass org/codehaus/plexus/component/repository/ComponentDependency
|
||||
instanceKlass org/codehaus/plexus/component/repository/ComponentRequirement
|
||||
instanceKlass org/apache/maven/model/Notifier
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultMojoExecutionConfigurator$$FastClassByGuice$$181826838
|
||||
instanceKlass org/apache/maven/execution/ProjectExecutionEvent
|
||||
instanceKlass org/apache/maven/lifecycle/internal/CompoundProjectExecutionListener
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate$$FastClassByGuice$$180495973
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator$$FastClassByGuice$$179712830
|
||||
instanceKlass org/apache/maven/project/artifact/DefaultProjectArtifactsCache$$FastClassByGuice$$178835768
|
||||
instanceKlass org/apache/maven/artifact/factory/DefaultArtifactFactory$$FastClassByGuice$$177960603
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/singlethreaded/SingleThreadedBuilder$$FastClassByGuice$$176388899
|
||||
instanceKlass org/apache/maven/graph/DefaultProjectDependencyGraph$MavenProjectComparator
|
||||
instanceKlass org/apache/maven/graph/FilteredProjectDependencyGraph$Key
|
||||
instanceKlass org/apache/maven/lifecycle/internal/GoalTask
|
||||
instanceKlass org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResult
|
||||
instanceKlass org/apache/maven/plugin/MavenPluginValidator
|
||||
instanceKlass org/codehaus/plexus/configuration/DefaultPlexusConfiguration
|
||||
instanceKlass java/util/stream/MatchOps$BooleanTerminalSink
|
||||
instanceKlass java/util/stream/MatchOps$MatchOp
|
||||
instanceKlass java/util/stream/MatchOps
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3Reader$1
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3Reader$ContentTransformer
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3Reader
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultModelResolver
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginDescriptorCache$CacheKey
|
||||
instanceKlass org/apache/maven/plugin/prefix/DefaultPluginPrefixRequest
|
||||
instanceKlass org/apache/maven/graph/FilteredProjectDependencyGraph
|
||||
instanceKlass org/apache/maven/internal/aether/MavenChainedWorkspaceReader
|
||||
instanceKlass org/codehaus/plexus/util/dag/TopologicalSorter
|
||||
instanceKlass org/codehaus/plexus/util/dag/Vertex
|
||||
instanceKlass org/codehaus/plexus/util/dag/DAG
|
||||
instanceKlass org/apache/maven/project/ProjectSorter
|
||||
instanceKlass org/apache/maven/graph/DefaultProjectDependencyGraph
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuildingResult
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/DefaultLifecycleMapping$$FastClassByGuice$$175528422
|
||||
instanceKlass org/apache/maven/model/Site
|
||||
instanceKlass java/util/stream/Streams$RangeIntSpliterator
|
||||
instanceKlass org/apache/maven/lifecycle/Lifecycle$__sisu9$$FastClassByGuice$$174140356
|
||||
instanceKlass org/apache/maven/lifecycle/Lifecycle$__sisu8$$FastClassByGuice$$173740846
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/LifecycleMojo
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/DefaultLifecycleMapping$__sisu2$$FastClassByGuice$$171992704
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/Lifecycle
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuildingEvent
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingEventCatapult$1
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuilder$InterimResult
|
||||
instanceKlass org/apache/maven/artifact/handler/DefaultArtifactHandler$__sisu14$$FastClassByGuice$$171101295
|
||||
instanceKlass org/apache/maven/artifact/versioning/Restriction
|
||||
instanceKlass org/apache/maven/artifact/handler/DefaultArtifactHandler$__sisu10$$FastClassByGuice$$170719306
|
||||
instanceKlass org/apache/maven/artifact/ArtifactUtils
|
||||
instanceKlass org/apache/maven/artifact/DefaultArtifact
|
||||
instanceKlass org/apache/maven/artifact/handler/DefaultArtifactHandler$$FastClassByGuice$$169083452
|
||||
instanceKlass org/apache/maven/artifact/versioning/ComparableVersion$StringItem
|
||||
instanceKlass org/apache/maven/artifact/versioning/ComparableVersion$IntItem
|
||||
instanceKlass org/apache/maven/artifact/versioning/ComparableVersion$Item
|
||||
instanceKlass org/apache/maven/artifact/versioning/ComparableVersion
|
||||
instanceKlass org/apache/maven/artifact/versioning/DefaultArtifactVersion
|
||||
instanceKlass org/apache/maven/model/Extension
|
||||
instanceKlass org/codehaus/plexus/interpolation/util/StringUtils
|
||||
instanceKlass org/apache/maven/model/DistributionManagement
|
||||
instanceKlass org/apache/maven/model/MailingList
|
||||
instanceKlass org/apache/maven/model/Organization
|
||||
instanceKlass org/apache/maven/model/CiManagement
|
||||
instanceKlass org/apache/maven/model/Prerequisites
|
||||
instanceKlass org/codehaus/plexus/interpolation/reflection/MethodMap
|
||||
instanceKlass org/codehaus/plexus/interpolation/reflection/ClassMap$CacheMiss
|
||||
instanceKlass org/codehaus/plexus/interpolation/reflection/ClassMap
|
||||
instanceKlass org/codehaus/plexus/interpolation/reflection/ReflectionValueExtractor$Tokenizer
|
||||
instanceKlass org/codehaus/plexus/interpolation/reflection/ReflectionValueExtractor
|
||||
instanceKlass org/codehaus/plexus/interpolation/util/ValueSourceUtils
|
||||
instanceKlass org/apache/maven/model/interpolation/StringVisitorModelInterpolator$ModelVisitor
|
||||
instanceKlass org/apache/maven/model/interpolation/StringVisitorModelInterpolator$1
|
||||
instanceKlass org/codehaus/plexus/interpolation/PrefixAwareRecursionInterceptor
|
||||
instanceKlass org/apache/maven/model/interpolation/UrlNormalizingPostProcessor
|
||||
instanceKlass org/apache/maven/model/interpolation/PathTranslatingPostProcessor
|
||||
instanceKlass java/text/DontCareFieldPosition$1
|
||||
instanceKlass java/text/Format$FieldDelegate
|
||||
instanceKlass org/apache/maven/model/interpolation/MavenBuildTimestamp
|
||||
instanceKlass org/apache/maven/model/interpolation/ProblemDetectingValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/PrefixedValueSourceWrapper
|
||||
instanceKlass org/codehaus/plexus/interpolation/FeedbackEnabledValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/AbstractDelegatingValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/QueryEnabledValueSource
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$ExtensionKeyComputer
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$ResourceKeyComputer
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$SourceDominant
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$DependencyKeyComputer
|
||||
instanceKlass java/lang/invoke/MethodHandle$1
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuilder$InterpolateString
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuilder$1Interpolation
|
||||
instanceKlass org/apache/maven/model/Exclusion
|
||||
instanceKlass org/apache/maven/model/IssueManagement
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3ReaderEx$Xpp3DomBuilderInputLocationBuilder
|
||||
instanceKlass org/apache/maven/model/Scm
|
||||
instanceKlass org/apache/maven/model/License
|
||||
instanceKlass org/apache/maven/model/building/FilterModelBuildingRequest
|
||||
instanceKlass java/util/AbstractMap$2$1
|
||||
instanceKlass java/nio/channels/spi/AbstractInterruptibleChannel$1
|
||||
instanceKlass sun/nio/ch/Interruptible
|
||||
instanceKlass sun/nio/ch/FileKey
|
||||
instanceKlass sun/nio/ch/FileLockTable
|
||||
instanceKlass sun/nio/fs/UnixFileSystemProvider$3
|
||||
instanceKlass org/eclipse/aether/repository/LocalArtifactRequest
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionResolver$Key
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher$1
|
||||
instanceKlass org/eclipse/aether/RepositoryEvent$Builder
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource$1
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/RemoteRepositoryFilterSourceSupport$SimpleResult
|
||||
instanceKlass org/eclipse/aether/named/support/Retry$DoNotRetry
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter$AdaptedLockSyncContext
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapper
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NameMappers
|
||||
instanceKlass org/eclipse/sisu/wire/NamedIterableAdapter$NamedEntry
|
||||
instanceKlass org/eclipse/sisu/wire/NamedIterableAdapter$NamedIterator
|
||||
instanceKlass org/apache/maven/project/ReactorModelPool$CacheKey
|
||||
instanceKlass org/eclipse/aether/util/version/GenericVersion$Item
|
||||
instanceKlass org/eclipse/aether/util/version/GenericVersion$Tokenizer
|
||||
instanceKlass org/eclipse/aether/util/version/GenericVersion
|
||||
instanceKlass org/eclipse/aether/util/version/GenericVersionConstraint
|
||||
instanceKlass org/eclipse/aether/version/VersionRange
|
||||
instanceKlass org/eclipse/aether/version/VersionConstraint
|
||||
instanceKlass org/eclipse/aether/util/version/GenericVersionScheme
|
||||
instanceKlass org/eclipse/aether/artifact/AbstractArtifact
|
||||
instanceKlass org/apache/maven/repository/internal/ArtifactDescriptorUtils
|
||||
instanceKlass org/apache/maven/model/DependencyManagement
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultModelCache$Key
|
||||
instanceKlass org/apache/maven/model/building/ModelCacheTag$2
|
||||
instanceKlass org/apache/maven/model/building/ModelCacheTag$1
|
||||
instanceKlass java/util/Spliterators$IteratorSpliterator
|
||||
instanceKlass org/apache/maven/model/building/ModelProblemUtils
|
||||
instanceKlass org/apache/maven/model/Parent
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3ReaderEx$1
|
||||
instanceKlass org/codehaus/plexus/util/xml/Xpp3DomBuilder$InputLocationBuilder
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3ReaderEx$ContentTransformer
|
||||
instanceKlass org/apache/maven/model/io/xpp3/MavenXpp3ReaderEx
|
||||
instanceKlass org/apache/maven/model/building/ModelSource2
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuildingResult
|
||||
instanceKlass org/apache/maven/model/building/AbstractModelBuildingListener
|
||||
instanceKlass org/apache/maven/project/ProjectModelResolver
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuildingRequest
|
||||
instanceKlass org/apache/maven/artifact/repository/LegacyLocalRepositoryManager
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultModelCache
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuildingRequest
|
||||
instanceKlass org/apache/maven/shared/utils/logging/AnsiMessageBuilder
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultExecutionEventCatapult$1
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultExecutionEvent
|
||||
instanceKlass org/apache/maven/AbstractMavenLifecycleParticipant
|
||||
instanceKlass java/util/concurrent/atomic/AtomicReference
|
||||
instanceKlass org/apache/maven/session/scope/internal/SessionScope$CachingProvider
|
||||
instanceKlass org/apache/maven/settings/RuntimeInfo
|
||||
instanceKlass org/eclipse/aether/internal/impl/LocalPathPrefixComposerFactorySupport$LocalPathPrefixComposerSupport
|
||||
instanceKlass org/eclipse/aether/internal/impl/SimpleLocalRepositoryManager
|
||||
instanceKlass java/util/ArrayList$SubList$1
|
||||
instanceKlass org/eclipse/aether/internal/impl/PrioritizedComponent
|
||||
instanceKlass org/eclipse/sisu/wire/EntrySetAdapter$ValueIterator
|
||||
instanceKlass org/eclipse/aether/internal/impl/PrioritizedComponents
|
||||
instanceKlass org/eclipse/aether/repository/RemoteRepository$Builder
|
||||
instanceKlass java/net/spi/URLStreamHandlerProvider
|
||||
instanceKlass java/net/URL$1
|
||||
instanceKlass java/net/URL$2
|
||||
instanceKlass org/eclipse/aether/util/ConfigUtils
|
||||
instanceKlass org/eclipse/aether/AbstractRepositoryListener
|
||||
instanceKlass org/eclipse/aether/util/repository/DefaultAuthenticationSelector
|
||||
instanceKlass org/eclipse/aether/util/repository/DefaultProxySelector
|
||||
instanceKlass org/eclipse/aether/util/repository/DefaultMirrorSelector$MirrorDef
|
||||
instanceKlass org/eclipse/aether/util/repository/DefaultMirrorSelector
|
||||
instanceKlass org/apache/maven/settings/crypto/DefaultSettingsDecryptionResult
|
||||
instanceKlass org/apache/maven/settings/crypto/DefaultSettingsDecryptionRequest
|
||||
instanceKlass org/apache/maven/RepositoryUtils$MavenArtifactTypeRegistry
|
||||
instanceKlass org/apache/maven/RepositoryUtils
|
||||
instanceKlass org/eclipse/aether/util/repository/SimpleResolutionErrorPolicy
|
||||
instanceKlass org/eclipse/aether/util/repository/SimpleArtifactDescriptorPolicy
|
||||
instanceKlass org/eclipse/aether/artifact/DefaultArtifactType
|
||||
instanceKlass org/eclipse/aether/util/artifact/SimpleArtifactTypeRegistry
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/JavaDependencyContextRefiner
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ChainedDependencyGraphTransformer
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver
|
||||
instanceKlass org/eclipse/aether/graph/Exclusion
|
||||
instanceKlass org/eclipse/aether/util/graph/selector/ExclusionDependencySelector
|
||||
instanceKlass org/eclipse/aether/util/graph/selector/OptionalDependencySelector
|
||||
instanceKlass org/eclipse/aether/util/graph/selector/ScopeDependencySelector
|
||||
instanceKlass org/eclipse/aether/util/graph/selector/AndDependencySelector
|
||||
instanceKlass org/eclipse/aether/util/graph/manager/ClassicDependencyManager
|
||||
instanceKlass org/eclipse/aether/util/graph/traverser/FatArtifactTraverser
|
||||
instanceKlass org/eclipse/aether/DefaultSessionData
|
||||
instanceKlass org/eclipse/aether/DefaultRepositorySystemSession$NullFileTransformerManager
|
||||
instanceKlass org/eclipse/aether/transform/FileTransformerManager
|
||||
instanceKlass org/eclipse/aether/DefaultRepositorySystemSession$NullArtifactTypeRegistry
|
||||
instanceKlass org/eclipse/aether/DefaultRepositorySystemSession$NullAuthenticationSelector
|
||||
instanceKlass org/eclipse/aether/DefaultRepositorySystemSession$NullProxySelector
|
||||
instanceKlass org/eclipse/aether/DefaultRepositorySystemSession$NullMirrorSelector
|
||||
instanceKlass org/eclipse/aether/SessionData
|
||||
instanceKlass org/eclipse/aether/artifact/ArtifactTypeRegistry
|
||||
instanceKlass org/eclipse/aether/collection/DependencyGraphTransformer
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$VersionSelector
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$ScopeSelector
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$OptionalitySelector
|
||||
instanceKlass org/eclipse/aether/util/graph/transformer/ConflictResolver$ScopeDeriver
|
||||
instanceKlass org/apache/maven/repository/internal/MavenRepositorySystemUtils
|
||||
instanceKlass org/apache/maven/execution/DefaultMavenExecutionResult
|
||||
instanceKlass org/apache/maven/artifact/repository/MavenArtifactRepository
|
||||
instanceKlass org/apache/maven/artifact/repository/layout/ArtifactRepositoryLayout2
|
||||
instanceKlass org/apache/maven/artifact/repository/layout/DefaultRepositoryLayout$$FastClassByGuice$$168286387
|
||||
instanceKlass java/util/concurrent/ForkJoinPool$WorkQueue
|
||||
instanceKlass java/util/concurrent/ForkJoinPool$DefaultCommonPoolForkJoinWorkerThreadFactory
|
||||
instanceKlass java/util/concurrent/ForkJoinPool$1
|
||||
instanceKlass java/util/concurrent/ForkJoinPool$DefaultForkJoinWorkerThreadFactory
|
||||
instanceKlass java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory
|
||||
instanceKlass org/apache/maven/execution/AbstractExecutionListener
|
||||
instanceKlass java/util/concurrent/AbstractExecutorService
|
||||
instanceKlass java/util/concurrent/ExecutorService
|
||||
instanceKlass java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
|
||||
instanceKlass java/util/concurrent/ForkJoinPool$ManagedBlocker
|
||||
instanceKlass org/apache/maven/cli/transfer/SimplexTransferListener$Exchange
|
||||
instanceKlass org/eclipse/aether/transfer/AbstractTransferListener
|
||||
instanceKlass org/apache/maven/toolchain/building/DefaultToolchainsBuildingResult
|
||||
instanceKlass org/apache/maven/toolchain/building/DefaultToolchainsBuilder$1
|
||||
instanceKlass org/apache/maven/toolchain/model/io/xpp3/MavenToolchainsXpp3Writer
|
||||
instanceKlass org/apache/maven/toolchain/model/io/xpp3/MavenToolchainsXpp3Reader$1
|
||||
instanceKlass org/apache/maven/toolchain/model/io/xpp3/MavenToolchainsXpp3Reader$ContentTransformer
|
||||
instanceKlass org/apache/maven/toolchain/model/io/xpp3/MavenToolchainsXpp3Reader
|
||||
instanceKlass org/apache/maven/building/DefaultProblemCollector
|
||||
instanceKlass org/apache/maven/building/ProblemCollectorFactory
|
||||
instanceKlass org/apache/maven/toolchain/building/DefaultToolchainsBuildingRequest
|
||||
instanceKlass org/apache/maven/settings/building/DefaultSettingsBuildingResult
|
||||
instanceKlass org/apache/maven/settings/building/DefaultSettingsBuilder$1
|
||||
instanceKlass java/lang/ProcessEnvironment$StringKeySet$1
|
||||
instanceKlass org/codehaus/plexus/interpolation/os/OperatingSystemUtils$DefaultEnvVarSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/os/OperatingSystemUtils$EnvVarSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/os/OperatingSystemUtils
|
||||
instanceKlass org/codehaus/plexus/util/xml/pull/MXSerializer
|
||||
instanceKlass org/codehaus/plexus/util/xml/pull/XmlSerializer
|
||||
instanceKlass org/apache/maven/settings/io/xpp3/SettingsXpp3Writer
|
||||
instanceKlass org/codehaus/plexus/util/xml/pull/EntityReplacementMap
|
||||
instanceKlass org/apache/maven/settings/io/xpp3/SettingsXpp3Reader$1
|
||||
instanceKlass org/apache/maven/settings/io/xpp3/SettingsXpp3Reader$ContentTransformer
|
||||
instanceKlass org/apache/maven/settings/io/xpp3/SettingsXpp3Reader
|
||||
instanceKlass org/apache/maven/building/FileSource
|
||||
instanceKlass org/apache/maven/settings/building/DefaultSettingsBuildingRequest
|
||||
instanceKlass org/apache/maven/graph/DefaultGraphBuilder$$FastClassByGuice$$167552379
|
||||
instanceKlass jdk/internal/event/Event
|
||||
instanceKlass sun/security/util/SecurityProviderConstants
|
||||
instanceKlass java/security/Provider$UString
|
||||
instanceKlass java/security/Provider$Service
|
||||
instanceKlass sun/security/provider/FileInputStreamPool
|
||||
instanceKlass sun/security/provider/NativePRNG$RandomIO
|
||||
instanceKlass sun/security/provider/NativePRNG$2
|
||||
instanceKlass sun/security/provider/NativePRNG$1
|
||||
instanceKlass java/security/SecureRandomSpi
|
||||
instanceKlass sun/security/provider/SunEntries$1
|
||||
instanceKlass sun/security/provider/SunEntries
|
||||
instanceKlass sun/security/util/SecurityConstants
|
||||
instanceKlass sun/security/jca/ProviderList$2
|
||||
instanceKlass jdk/internal/math/FloatingDecimal$ASCIIToBinaryBuffer
|
||||
instanceKlass javax/security/auth/login/Configuration$Parameters
|
||||
instanceKlass java/security/Policy$Parameters
|
||||
instanceKlass java/security/cert/CertStoreParameters
|
||||
instanceKlass java/security/SecureRandomParameters
|
||||
instanceKlass java/security/Provider$EngineDescription
|
||||
instanceKlass java/security/Provider$ServiceKey
|
||||
instanceKlass sun/security/jca/ProviderConfig
|
||||
instanceKlass sun/security/jca/ProviderList
|
||||
instanceKlass sun/security/jca/Providers
|
||||
instanceKlass java/security/Key
|
||||
instanceKlass java/security/spec/AlgorithmParameterSpec
|
||||
instanceKlass jdk/internal/math/FloatingDecimal$PreparedASCIIToBinaryBuffer
|
||||
instanceKlass jdk/internal/math/FloatingDecimal$ASCIIToBinaryConverter
|
||||
instanceKlass jdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer
|
||||
instanceKlass jdk/internal/math/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
|
||||
instanceKlass jdk/internal/math/FloatingDecimal$BinaryToASCIIConverter
|
||||
instanceKlass jdk/internal/math/FloatingDecimal
|
||||
instanceKlass org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver$$FastClassByGuice$$166721650
|
||||
instanceKlass org/apache/maven/plugin/CompoundMojoExecutionListener
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultLegacySupport$$FastClassByGuice$$164967175
|
||||
instanceKlass org/apache/maven/plugin/DefaultBuildPluginManager$$FastClassByGuice$$164187718
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator$$FastClassByGuice$$162620744
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultExecutionEventCatapult$$FastClassByGuice$$161985490
|
||||
instanceKlass org/apache/maven/project/DefaultProjectDependenciesResolver$$FastClassByGuice$$161062453
|
||||
instanceKlass org/apache/maven/project/RepositorySessionDecorator
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginArtifactsCache$$FastClassByGuice$$160341750
|
||||
instanceKlass com/google/inject/internal/DelegatingInvocationHandler
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/io/DefaultMetadataReader$$FastClassByGuice$$159200076
|
||||
instanceKlass org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver$$FastClassByGuice$$157783495
|
||||
instanceKlass org/apache/maven/plugin/DefaultExtensionRealmCache$$FastClassByGuice$$156658821
|
||||
instanceKlass org/apache/maven/rtinfo/internal/DefaultRuntimeInformation$$FastClassByGuice$$156135027
|
||||
instanceKlass org/eclipse/aether/artifact/ArtifactType
|
||||
instanceKlass org/eclipse/sisu/wire/NamedIterableAdapter
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultUpdateCheckManager$1
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginRealmCache$$FastClassByGuice$$154550245
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginDescriptorCache$$FastClassByGuice$$153375888
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultMavenPluginManager$$FastClassByGuice$$152377876
|
||||
instanceKlass org/apache/maven/artifact/handler/manager/DefaultArtifactHandlerManager$$FastClassByGuice$$151694933
|
||||
instanceKlass org/apache/maven/project/DefaultProjectRealmCache$$FastClassByGuice$$150617186
|
||||
instanceKlass org/codehaus/plexus/classworlds/realm/Entry
|
||||
instanceKlass org/eclipse/sisu/inject/Guice4$2
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuildingHelper$$FastClassByGuice$$149205414
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer$$FastClassByGuice$$147909671
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector$$FastClassByGuice$$147113479
|
||||
instanceKlass org/apache/maven/model/Contributor
|
||||
instanceKlass org/apache/maven/model/PatternSet
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$KeyComputer
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$Remapping
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuilder$$FastClassByGuice$$145921927
|
||||
instanceKlass org/apache/maven/DefaultMaven$$FastClassByGuice$$145158877
|
||||
instanceKlass org/apache/maven/cli/event/DefaultEventSpyContext
|
||||
instanceKlass org/eclipse/sisu/wire/EntryListAdapter$ValueIterator
|
||||
instanceKlass org/apache/maven/cli/logging/Slf4jLogger
|
||||
instanceKlass org/eclipse/sisu/inject/LazyBeanEntry$JsrNamed
|
||||
instanceKlass org/eclipse/sisu/inject/LazyBeanEntry
|
||||
instanceKlass javax/annotation/Priority
|
||||
instanceKlass org/eclipse/sisu/inject/Implementations
|
||||
instanceKlass org/eclipse/sisu/plexus/LazyPlexusBean
|
||||
instanceKlass org/eclipse/sisu/inject/RankedSequence$Itr
|
||||
instanceKlass org/eclipse/sisu/inject/RankedBindings$Itr
|
||||
instanceKlass org/eclipse/sisu/inject/LocatedBeans$Itr
|
||||
instanceKlass org/eclipse/sisu/plexus/RealmFilteredBeans$FilteredItr
|
||||
instanceKlass org/eclipse/sisu/plexus/DefaultPlexusBeans$Itr
|
||||
instanceKlass org/eclipse/sisu/plexus/DefaultPlexusBeans
|
||||
instanceKlass org/eclipse/sisu/plexus/RealmFilteredBeans
|
||||
instanceKlass org/eclipse/sisu/inject/BeanCache
|
||||
instanceKlass org/eclipse/sisu/inject/LocatedBeans
|
||||
instanceKlass org/eclipse/sisu/inject/MildElements$Indexable
|
||||
instanceKlass com/google/inject/internal/ProviderInternalFactory$1
|
||||
instanceKlass com/google/inject/internal/ConstructorInjector$1
|
||||
instanceKlass org/eclipse/sisu/inject/WatchedBeans
|
||||
instanceKlass org/eclipse/sisu/inject/MildValues$ValueItr
|
||||
instanceKlass org/eclipse/sisu/inject/InjectorBindings
|
||||
instanceKlass com/google/inject/spi/ProvisionListener$ProvisionInvocation
|
||||
instanceKlass com/google/inject/internal/MembersInjectorImpl$1
|
||||
instanceKlass com/google/inject/internal/InternalContext
|
||||
instanceKlass com/google/inject/internal/Initializer$1
|
||||
instanceKlass com/google/common/collect/AbstractMapBasedMultimap$AsMap$AsMapIterator
|
||||
instanceKlass com/google/inject/internal/SingleMethodInjector$1
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$$FastClassByGuice$$143711220
|
||||
instanceKlass com/google/inject/internal/SingleMethodInjector$2
|
||||
instanceKlass com/google/inject/internal/InjectorImpl$MethodInvoker
|
||||
instanceKlass com/google/inject/internal/SingleMethodInjector
|
||||
instanceKlass org/apache/maven/settings/validation/DefaultSettingsValidator$$FastClassByGuice$$143340184
|
||||
instanceKlass org/apache/maven/settings/io/DefaultSettingsWriter$$FastClassByGuice$$142146150
|
||||
instanceKlass org/apache/maven/settings/io/DefaultSettingsReader$$FastClassByGuice$$141455557
|
||||
instanceKlass org/apache/maven/settings/crypto/DefaultSettingsDecrypter$$FastClassByGuice$$140042014
|
||||
instanceKlass org/apache/maven/settings/building/DefaultSettingsBuilder$$FastClassByGuice$$138634155
|
||||
instanceKlass org/apache/maven/cli/internal/BootstrapCoreExtensionManager$$FastClassByGuice$$138253014
|
||||
instanceKlass org/apache/maven/cli/configuration/SettingsXmlConfigurationProcessor$$FastClassByGuice$$137274339
|
||||
instanceKlass org/eclipse/aether/transport/http/XChecksumChecksumExtractor$$FastClassByGuice$$136069694
|
||||
instanceKlass org/eclipse/aether/transport/http/Nexus2ChecksumExtractor$$FastClassByGuice$$134903340
|
||||
instanceKlass org/eclipse/aether/transport/http/HttpTransporterFactory$$FastClassByGuice$$133617679
|
||||
instanceKlass org/sonatype/plexus/components/sec/dispatcher/DefaultSecDispatcher$$FastClassByGuice$$132682453
|
||||
instanceKlass org/eclipse/aether/transport/file/FileTransporterFactory$$FastClassByGuice$$131680787
|
||||
instanceKlass org/apache/maven/toolchain/io/DefaultToolchainsWriter$$FastClassByGuice$$130401778
|
||||
instanceKlass org/apache/maven/toolchain/io/DefaultToolchainsReader$$FastClassByGuice$$129966978
|
||||
instanceKlass org/apache/maven/toolchain/building/DefaultToolchainsBuilder$$FastClassByGuice$$128474327
|
||||
instanceKlass org/apache/maven/plugin/internal/MavenPluginMavenPrerequisiteChecker$$FastClassByGuice$$127120932
|
||||
instanceKlass org/apache/maven/plugin/internal/MavenPluginJavaPrerequisiteChecker$$FastClassByGuice$$126148799
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultPluginValidationManager$$FastClassByGuice$$125758936
|
||||
instanceKlass org/apache/maven/plugin/DefaultMojosExecutionStrategy$$FastClassByGuice$$124199421
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleDependencyResolver$$FastClassByGuice$$122695196
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultProjectArtifactFactory$$FastClassByGuice$$121979087
|
||||
instanceKlass org/apache/maven/internal/secdispatcher/SecDispatcherProvider$$FastClassByGuice$$120991927
|
||||
instanceKlass org/apache/maven/internal/aether/ResolverLifecycle$$FastClassByGuice$$119700329
|
||||
instanceKlass org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory$$FastClassByGuice$$118638829
|
||||
instanceKlass org/apache/maven/extension/internal/CoreExportsProvider$$FastClassByGuice$$117638171
|
||||
instanceKlass org/apache/maven/execution/DefaultMavenExecutionRequestPopulator$$FastClassByGuice$$117327664
|
||||
instanceKlass org/apache/maven/classrealm/DefaultClassRealmManager$$FastClassByGuice$$115405615
|
||||
instanceKlass org/apache/maven/DefaultArtifactFilterManager$$FastClassByGuice$$114576034
|
||||
instanceKlass org/sonatype/plexus/components/cipher/DefaultPlexusCipher$$FastClassByGuice$$114200832
|
||||
instanceKlass org/eclipse/aether/transport/wagon/WagonTransporterFactory$$FastClassByGuice$$113005690
|
||||
instanceKlass org/eclipse/aether/internal/transport/wagon/PlexusWagonProvider$$FastClassByGuice$$111486147
|
||||
instanceKlass org/eclipse/aether/internal/transport/wagon/PlexusWagonConfigurator$$FastClassByGuice$$110935834
|
||||
instanceKlass org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory$$FastClassByGuice$$109434629
|
||||
instanceKlass org/apache/maven/model/validation/DefaultModelValidator$$FastClassByGuice$$108509391
|
||||
instanceKlass org/apache/maven/model/superpom/DefaultSuperPomProvider$$FastClassByGuice$$107026841
|
||||
instanceKlass org/apache/maven/model/profile/activation/PropertyProfileActivator$$FastClassByGuice$$106928879
|
||||
instanceKlass org/apache/maven/model/profile/activation/OperatingSystemProfileActivator$$FastClassByGuice$$104867263
|
||||
instanceKlass org/apache/maven/model/profile/activation/JdkVersionProfileActivator$$FastClassByGuice$$104627979
|
||||
instanceKlass org/apache/maven/model/profile/activation/FileProfileActivator$$FastClassByGuice$$102844684
|
||||
instanceKlass org/apache/maven/model/profile/DefaultProfileSelector$$FastClassByGuice$$102567923
|
||||
instanceKlass org/apache/maven/model/profile/DefaultProfileInjector$$FastClassByGuice$$101314528
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultReportingConverter$$FastClassByGuice$$100041006
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultReportConfigurationExpander$$FastClassByGuice$$98928296
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultPluginConfigurationExpander$$FastClassByGuice$$98499611
|
||||
instanceKlass org/apache/maven/model/path/ProfileActivationFilePathInterpolator$$FastClassByGuice$$96953780
|
||||
instanceKlass org/apache/maven/model/path/DefaultUrlNormalizer$$FastClassByGuice$$95565057
|
||||
instanceKlass org/apache/maven/model/path/DefaultPathTranslator$$FastClassByGuice$$94814864
|
||||
instanceKlass org/apache/maven/model/path/DefaultModelUrlNormalizer$$FastClassByGuice$$93540804
|
||||
instanceKlass org/apache/maven/model/path/DefaultModelPathTranslator$$FastClassByGuice$$93316844
|
||||
instanceKlass org/apache/maven/model/normalization/DefaultModelNormalizer$$FastClassByGuice$$92234056
|
||||
instanceKlass org/apache/maven/model/management/DefaultPluginManagementInjector$$FastClassByGuice$$90783870
|
||||
instanceKlass org/apache/maven/model/management/DefaultDependencyManagementInjector$$FastClassByGuice$$89798444
|
||||
instanceKlass org/apache/maven/model/locator/DefaultModelLocator$$FastClassByGuice$$88764524
|
||||
instanceKlass org/apache/maven/model/io/DefaultModelWriter$$FastClassByGuice$$87158579
|
||||
instanceKlass org/apache/maven/model/io/DefaultModelReader$$FastClassByGuice$$86246917
|
||||
instanceKlass org/apache/maven/model/interpolation/StringVisitorModelInterpolator$$FastClassByGuice$$85978151
|
||||
instanceKlass org/apache/maven/model/interpolation/DefaultModelVersionProcessor$$FastClassByGuice$$84143214
|
||||
instanceKlass org/apache/maven/model/inheritance/DefaultInheritanceAssembler$$FastClassByGuice$$83788257
|
||||
instanceKlass org/apache/maven/model/composition/DefaultDependencyManagementImporter$$FastClassByGuice$$82464767
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelProcessor$$FastClassByGuice$$80854236
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuilder$$FastClassByGuice$$80394293
|
||||
instanceKlass org/apache/maven/repository/internal/VersionsMetadataGeneratorFactory$$FastClassByGuice$$79480523
|
||||
instanceKlass org/apache/maven/repository/internal/SnapshotMetadataGeneratorFactory$$FastClassByGuice$$78368919
|
||||
instanceKlass org/apache/maven/repository/internal/PluginsMetadataGeneratorFactory$$FastClassByGuice$$77012843
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionResolver$$FastClassByGuice$$75505223
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionRangeResolver$$FastClassByGuice$$74528907
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultModelCacheFactory$$FastClassByGuice$$73777927
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultArtifactDescriptorReader$$FastClassByGuice$$73186144
|
||||
instanceKlass org/codehaus/plexus/component/configurator/MapOrientedComponentConfigurator$$FastClassByGuice$$71354030
|
||||
instanceKlass org/codehaus/plexus/component/configurator/BasicComponentConfigurator$$FastClassByGuice$$70290507
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/StaticNameMapperProvider$$FastClassByGuice$$70041479
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/GAVNameMapperProvider$$FastClassByGuice$$68849026
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider$$FastClassByGuice$$68051711
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileStaticNameMapperProvider$$FastClassByGuice$$66485285
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAVNameMapperProvider$$FastClassByGuice$$65495373
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider$$FastClassByGuice$$64084164
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAVNameMapperProvider$$FastClassByGuice$$63556050
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider$$FastClassByGuice$$62013158
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/DiscriminatingNameMapperProvider$$FastClassByGuice$$61793412
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactoryImpl$$FastClassByGuice$$60785204
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/legacy/DefaultSyncContextFactory$$FastClassByGuice$$59621736
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/DefaultSyncContextFactory$$FastClassByGuice$$58208051
|
||||
instanceKlass org/eclipse/aether/internal/impl/resolution/TrustedChecksumsArtifactResolverPostProcessor$$FastClassByGuice$$57323624
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource$$FastClassByGuice$$56417328
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/GroupIdRemoteRepositoryFilterSource$$FastClassByGuice$$55539366
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/DefaultRemoteRepositoryFilterManager$$FastClassByGuice$$53888290
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector$$FastClassByGuice$$52877812
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector$$FastClassByGuice$$52120319
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector$$FastClassByGuice$$50427634
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/TrustedToProvidedChecksumsSourceAdapter$$FastClassByGuice$$49645986
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/SummaryFileTrustedChecksumsSource$$FastClassByGuice$$49270430
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/SparseDirectoryTrustedChecksumsSource$$FastClassByGuice$$47936306
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/Sha512ChecksumAlgorithmFactory$$FastClassByGuice$$46232889
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/Sha256ChecksumAlgorithmFactory$$FastClassByGuice$$45816622
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/Sha1ChecksumAlgorithmFactory$$FastClassByGuice$$44069976
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/Md5ChecksumAlgorithmFactory$$FastClassByGuice$$43626648
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector$$FastClassByGuice$$42711205
|
||||
instanceKlass org/eclipse/aether/internal/impl/SimpleLocalRepositoryManagerFactory$$FastClassByGuice$$41582542
|
||||
instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$FastClassByGuice$$40136214
|
||||
instanceKlass org/eclipse/aether/internal/impl/LoggerFactoryProvider$$FastClassByGuice$$38864036
|
||||
instanceKlass com/google/inject/internal/InjectorImpl$SyntheticProviderBindingImpl$1
|
||||
instanceKlass com/google/inject/internal/InjectorImpl$1
|
||||
instanceKlass com/google/inject/internal/SingleFieldInjector
|
||||
instanceKlass org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory$$FastClassByGuice$$38433305
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultUpdatePolicyAnalyzer$$FastClassByGuice$$36957240
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultUpdateCheckManager$$FastClassByGuice$$35919783
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultTransporterProvider$$FastClassByGuice$$35444762
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultTrackingFileManager$$FastClassByGuice$$33773561
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositorySystemLifecycle$$FastClassByGuice$$33219141
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositorySystem$$FastClassByGuice$$32323959
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryLayoutProvider$$FastClassByGuice$$30472958
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher$$FastClassByGuice$$29645919
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryConnectorProvider$$FastClassByGuice$$28376428
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManager$$FastClassByGuice$$27933010
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultOfflineController$$FastClassByGuice$$26680975
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultMetadataResolver$$FastClassByGuice$$26176507
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultLocalRepositoryProvider$$FastClassByGuice$$24263809
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultLocalPathPrefixComposerFactory$$FastClassByGuice$$23656276
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultLocalPathComposer$$FastClassByGuice$$22085743
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultInstaller$$FastClassByGuice$$21091543
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultFileProcessor$$FastClassByGuice$$20422409
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultDeployer$$FastClassByGuice$$19158044
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultChecksumPolicyProvider$$FastClassByGuice$$18216477
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultArtifactResolver$$FastClassByGuice$$17498758
|
||||
instanceKlass com/google/inject/internal/SingleParameterInjector
|
||||
instanceKlass org/eclipse/aether/named/providers/NoopNamedLockFactory$$FastClassByGuice$$16650213
|
||||
instanceKlass org/eclipse/aether/named/providers/LocalSemaphoreNamedLockFactory$$FastClassByGuice$$15449308
|
||||
instanceKlass org/eclipse/aether/named/providers/LocalReadWriteLockNamedLockFactory$$FastClassByGuice$$13767150
|
||||
instanceKlass org/eclipse/aether/named/providers/FileLockNamedLockFactory$$FastClassByGuice$$12776823
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleDebugLogger$$FastClassByGuice$$12041907
|
||||
instanceKlass org/apache/maven/lifecycle/internal/MojoDescriptorCreator$$FastClassByGuice$$10792174
|
||||
instanceKlass org/apache/maven/lifecycle/internal/MojoExecutor$$FastClassByGuice$$10023925
|
||||
instanceKlass org/apache/maven/eventspy/internal/EventSpyDispatcher$$FastClassByGuice$$8798885
|
||||
instanceKlass org/eclipse/sisu/PreDestroy
|
||||
instanceKlass org/eclipse/sisu/PostConstruct
|
||||
instanceKlass com/google/inject/internal/DefaultConstructionProxyFactory$ReflectiveProxy
|
||||
instanceKlass org/apache/maven/lifecycle/internal/BuildListCalculator$$FastClassByGuice$$8034138
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecyclePluginResolver$$FastClassByGuice$$7070023
|
||||
instanceKlass org/apache/maven/lifecycle/DefaultLifecycles$$FastClassByGuice$$6216404
|
||||
instanceKlass org/apache/maven/lifecycle/Lifecycle$$FastClassByGuice$$4634805
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusConfigurations$ConfigurationProvider
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/BuilderCommon$$FastClassByGuice$$3800682
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleStarter$$FastClassByGuice$$2859324
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleModuleBuilder$$FastClassByGuice$$2043517
|
||||
instanceKlass org/eclipse/sisu/bean/BeanPropertySetter
|
||||
instanceKlass com/google/inject/internal/ProxyFactory
|
||||
instanceKlass com/google/common/collect/TransformedIterator
|
||||
instanceKlass com/google/inject/spi/InterceptorBinding
|
||||
instanceKlass com/google/inject/internal/MethodAspect
|
||||
instanceKlass com/google/inject/internal/MembersInjectorImpl
|
||||
instanceKlass org/eclipse/sisu/bean/BeanInjector
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusLifecycleManager$2
|
||||
instanceKlass org/eclipse/sisu/bean/PropertyBinder$1
|
||||
instanceKlass org/eclipse/sisu/plexus/ProvidedPropertyBinding
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusRequirements$AbstractRequirementProvider
|
||||
instanceKlass org/eclipse/sisu/bean/BeanPropertyField
|
||||
instanceKlass org/eclipse/sisu/bean/DeclaredMembers$MemberIterator
|
||||
instanceKlass org/eclipse/sisu/bean/BeanPropertyIterator
|
||||
instanceKlass org/eclipse/sisu/bean/DeclaredMembers
|
||||
instanceKlass org/eclipse/sisu/bean/IgnoreSetters
|
||||
instanceKlass org/eclipse/sisu/bean/BeanProperties
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusRequirements
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusConfigurations
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusPropertyBinder
|
||||
instanceKlass org/eclipse/sisu/bean/BeanLifecycle
|
||||
instanceKlass com/google/inject/internal/EncounterImpl
|
||||
instanceKlass org/apache/maven/execution/scope/internal/MojoExecutionScope$2
|
||||
instanceKlass com/google/inject/internal/ProviderInternalFactory
|
||||
instanceKlass com/google/inject/internal/InternalProviderInstanceBindingImpl$Factory
|
||||
instanceKlass com/google/inject/internal/FactoryProxy
|
||||
instanceKlass com/google/inject/internal/InternalFactoryToProviderAdapter
|
||||
instanceKlass com/google/inject/internal/ConstructionContext
|
||||
instanceKlass com/google/inject/internal/SingletonScope$1
|
||||
instanceKlass com/google/inject/internal/ProviderToInternalFactoryAdapter
|
||||
instanceKlass com/google/inject/internal/CycleDetectingLock$CycleDetectingLockFactory$ReentrantCycleDetectingLock
|
||||
instanceKlass com/google/inject/internal/Initializer$InjectableReference
|
||||
instanceKlass com/google/inject/internal/ProvisionListenerStackCallback
|
||||
instanceKlass com/google/common/cache/LocalCache$AbstractReferenceEntry
|
||||
instanceKlass com/google/inject/internal/ProvisionListenerCallbackStore$KeyBinding
|
||||
instanceKlass com/google/inject/internal/util/Classes
|
||||
instanceKlass com/google/inject/spi/ExposedBinding
|
||||
instanceKlass com/google/inject/internal/CreationListener
|
||||
instanceKlass com/google/inject/internal/InjectorShell$LoggerFactory
|
||||
instanceKlass com/google/inject/internal/InjectorShell$InjectorFactory
|
||||
instanceKlass com/google/inject/internal/Initializables$1
|
||||
instanceKlass com/google/inject/internal/Initializables
|
||||
instanceKlass com/google/inject/internal/ConstantFactory
|
||||
instanceKlass com/google/inject/internal/InjectorShell
|
||||
instanceKlass com/google/inject/internal/ProvisionListenerCallbackStore
|
||||
instanceKlass com/google/inject/internal/SingleMemberInjector
|
||||
instanceKlass com/google/inject/spi/TypeEncounter
|
||||
instanceKlass com/google/inject/internal/MembersInjectorStore
|
||||
instanceKlass com/google/inject/internal/TypeConverterBindingProcessor$4
|
||||
instanceKlass com/google/inject/internal/TypeConverterBindingProcessor$2
|
||||
instanceKlass com/google/inject/internal/TypeConverterBindingProcessor$1
|
||||
instanceKlass com/google/inject/internal/TypeConverterBindingProcessor$5
|
||||
instanceKlass com/google/inject/internal/FailableCache
|
||||
instanceKlass com/google/inject/internal/ConstructorInjectorStore
|
||||
instanceKlass com/google/inject/internal/DeferredLookups
|
||||
instanceKlass com/google/inject/spi/ConvertedConstantBinding
|
||||
instanceKlass com/google/inject/spi/ProviderBinding
|
||||
instanceKlass com/google/inject/internal/InjectorImpl
|
||||
instanceKlass com/google/inject/internal/Lookups
|
||||
instanceKlass com/google/inject/internal/InjectorImpl$InjectorOptions
|
||||
instanceKlass com/google/inject/internal/ProvisionListenerStackCallback$ProvisionCallback
|
||||
instanceKlass com/google/inject/internal/ConstructorInjector
|
||||
instanceKlass com/google/inject/internal/DefaultConstructionProxyFactory$FastClassProxy
|
||||
instanceKlass com/google/inject/internal/aop/ImmutableStringTrie
|
||||
instanceKlass java/util/function/ToIntFunction
|
||||
instanceKlass jdk/internal/reflect/UnsafeFieldAccessorFactory
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver$$FastClassByGuice$$74418
|
||||
instanceKlass com/google/inject/internal/aop/ChildClassDefiner$ChildLoaderCacheHolder
|
||||
instanceKlass com/google/inject/internal/aop/BytecodeTasks
|
||||
instanceKlass org/objectweb/asm/Handle
|
||||
instanceKlass org/objectweb/asm/Label
|
||||
instanceKlass org/objectweb/asm/Type
|
||||
instanceKlass com/google/inject/internal/aop/AbstractGlueGenerator
|
||||
instanceKlass com/google/inject/internal/aop/UnsafeClassDefiner
|
||||
instanceKlass com/google/inject/internal/aop/ChildClassDefiner
|
||||
instanceKlass com/google/inject/internal/aop/ClassDefining$ClassDefinerHolder
|
||||
instanceKlass com/google/inject/internal/aop/ClassDefiner
|
||||
instanceKlass com/google/inject/internal/aop/ClassDefining
|
||||
instanceKlass com/google/inject/internal/BytecodeGen$EnhancerBuilder
|
||||
instanceKlass com/google/inject/internal/aop/ClassBuilding
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$StrongValueEntry
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$WeakKeyStrongValueEntry$Helper
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$InternalEntry
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$1
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$InternalEntryHelper
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$WeakValueReference
|
||||
instanceKlass com/google/common/collect/MapMaker
|
||||
instanceKlass com/google/inject/internal/BytecodeGen
|
||||
instanceKlass com/google/inject/internal/ConstructionProxy
|
||||
instanceKlass com/google/inject/internal/DefaultConstructionProxyFactory
|
||||
instanceKlass com/google/inject/internal/ConstructionProxyFactory
|
||||
instanceKlass com/google/inject/internal/ConstructorBindingImpl$Factory
|
||||
instanceKlass org/eclipse/sisu/inject/TypeArguments$Implicit
|
||||
instanceKlass org/eclipse/sisu/wire/PlaceholderBeanProvider
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders$3
|
||||
instanceKlass org/sonatype/inject/BeanEntry
|
||||
instanceKlass org/eclipse/sisu/BeanEntry
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders$4
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders$6
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders$7
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders$1
|
||||
instanceKlass com/google/inject/spi/ProviderLookup$1
|
||||
instanceKlass com/google/inject/spi/ProviderWithDependencies
|
||||
instanceKlass com/google/inject/spi/ProviderLookup
|
||||
instanceKlass org/eclipse/sisu/wire/BeanProviders
|
||||
instanceKlass org/eclipse/sisu/inject/HiddenSource
|
||||
instanceKlass org/eclipse/sisu/wire/LocatorWiring
|
||||
instanceKlass com/google/inject/ProvidedBy
|
||||
instanceKlass com/google/inject/ImplementedBy
|
||||
instanceKlass org/apache/maven/settings/crypto/SettingsDecryptionResult
|
||||
instanceKlass org/apache/maven/settings/building/DefaultSettingsProblemCollector
|
||||
instanceKlass org/apache/maven/settings/merge/MavenSettingsMerger
|
||||
instanceKlass org/apache/maven/settings/building/SettingsBuildingResult
|
||||
instanceKlass org/apache/maven/settings/building/SettingsProblemCollector
|
||||
instanceKlass org/apache/maven/cli/internal/extension/model/CoreExtension
|
||||
instanceKlass org/sonatype/plexus/components/sec/dispatcher/model/SettingsSecurity
|
||||
instanceKlass org/apache/maven/building/ProblemCollector
|
||||
instanceKlass org/apache/maven/toolchain/merge/MavenToolchainMerger
|
||||
instanceKlass org/codehaus/plexus/interpolation/InterpolationPostProcessor
|
||||
instanceKlass org/apache/maven/toolchain/building/ToolchainsBuildingResult
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultPluginValidationManager$PluginValidationIssues
|
||||
instanceKlass org/sonatype/plexus/components/sec/dispatcher/PasswordDecryptor
|
||||
instanceKlass org/eclipse/aether/repository/AuthenticationSelector
|
||||
instanceKlass org/eclipse/aether/repository/ProxySelector
|
||||
instanceKlass org/eclipse/aether/repository/MirrorSelector
|
||||
instanceKlass org/eclipse/aether/resolution/ResolutionErrorPolicy
|
||||
instanceKlass org/apache/maven/classrealm/ClassRealmManagerDelegate
|
||||
instanceKlass org/apache/maven/classrealm/ClassRealmConstituent
|
||||
instanceKlass org/apache/maven/classrealm/ClassRealmRequest
|
||||
instanceKlass org/eclipse/aether/repository/WorkspaceRepository
|
||||
instanceKlass org/apache/maven/ArtifactFilterManagerDelegate
|
||||
instanceKlass org/sonatype/plexus/components/cipher/PBECipher
|
||||
instanceKlass org/apache/maven/model/validation/DefaultModelValidator$1ActivationFrame
|
||||
instanceKlass org/apache/maven/model/profile/activation/JdkVersionProfileActivator$RangeValue
|
||||
instanceKlass org/apache/maven/model/InputLocation
|
||||
instanceKlass org/apache/maven/model/InputSource
|
||||
instanceKlass org/apache/maven/model/interpolation/StringVisitorModelInterpolator$InnerInterpolator
|
||||
instanceKlass org/apache/maven/model/ActivationFile
|
||||
instanceKlass org/apache/maven/model/ActivationOS
|
||||
instanceKlass org/apache/maven/model/ActivationProperty
|
||||
instanceKlass org/codehaus/plexus/interpolation/RegexBasedInterpolator
|
||||
instanceKlass org/apache/maven/model/Activation
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingEventCatapult
|
||||
instanceKlass org/apache/maven/model/building/ModelData
|
||||
instanceKlass org/apache/maven/model/profile/DefaultProfileActivationContext
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelProblemCollector
|
||||
instanceKlass org/apache/maven/model/building/ModelCacheTag
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingEvent
|
||||
instanceKlass org/apache/maven/model/profile/ProfileActivationContext
|
||||
instanceKlass org/apache/maven/model/building/ModelProblemCollectorExt
|
||||
instanceKlass org/eclipse/aether/impl/MetadataGenerator
|
||||
instanceKlass org/apache/maven/model/Relocation
|
||||
instanceKlass org/apache/maven/repository/internal/ArtifactDescriptorReaderDelegate
|
||||
instanceKlass org/codehaus/classworlds/ClassRealm
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter
|
||||
instanceKlass org/eclipse/sisu/Nullable
|
||||
instanceKlass org/eclipse/aether/spi/log/Logger
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource$Node
|
||||
instanceKlass org/eclipse/aether/spi/connector/filter/RemoteRepositoryFilter$Result
|
||||
instanceKlass org/eclipse/aether/spi/connector/filter/RemoteRepositoryFilter
|
||||
instanceKlass org/eclipse/aether/collection/DependencyTraverser
|
||||
instanceKlass org/eclipse/aether/collection/DependencyManager
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector$Args
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector$DescriptorResolutionResult
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector$Args
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/bf/DependencyProcessingContext
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/bf/DependencyResolutionSkipper
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate$Results
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DefaultDependencyCollectionContext
|
||||
instanceKlass org/eclipse/aether/collection/DependencyCollectionContext
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DefaultVersionFilterContext
|
||||
instanceKlass org/eclipse/aether/collection/VersionFilter
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DataPool
|
||||
instanceKlass org/eclipse/aether/graph/DefaultDependencyNode
|
||||
instanceKlass org/eclipse/aether/version/Version
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/PremanagedDependency
|
||||
instanceKlass org/eclipse/aether/graph/Dependency
|
||||
instanceKlass org/eclipse/aether/collection/VersionFilter$VersionFilterContext
|
||||
instanceKlass org/eclipse/aether/collection/DependencyGraphTransformationContext
|
||||
instanceKlass org/eclipse/aether/spi/connector/Transfer
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/SummaryFileTrustedChecksumsSource$SummaryFileWriter
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/SparseDirectoryTrustedChecksumsSource$SparseDirectoryWriter
|
||||
instanceKlass org/eclipse/aether/spi/checksums/TrustedChecksumsSource$Writer
|
||||
instanceKlass org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithm
|
||||
instanceKlass com/google/inject/util/Types
|
||||
instanceKlass org/eclipse/aether/impl/UpdateCheck
|
||||
instanceKlass org/eclipse/aether/spi/connector/transport/Transporter
|
||||
instanceKlass java/nio/channels/FileLock
|
||||
instanceKlass org/eclipse/aether/resolution/DependencyResult
|
||||
instanceKlass org/eclipse/aether/resolution/DependencyRequest
|
||||
instanceKlass org/eclipse/aether/collection/CollectResult
|
||||
instanceKlass org/eclipse/aether/collection/CollectRequest
|
||||
instanceKlass org/eclipse/aether/resolution/ArtifactDescriptorResult
|
||||
instanceKlass org/eclipse/aether/resolution/ArtifactDescriptorRequest
|
||||
instanceKlass org/eclipse/aether/resolution/VersionRangeResult
|
||||
instanceKlass org/eclipse/aether/resolution/VersionRangeRequest
|
||||
instanceKlass org/eclipse/aether/resolution/VersionRequest
|
||||
instanceKlass java/util/concurrent/atomic/AtomicBoolean
|
||||
instanceKlass org/eclipse/aether/spi/connector/layout/RepositoryLayout
|
||||
instanceKlass org/eclipse/aether/RepositoryEvent
|
||||
instanceKlass org/eclipse/aether/repository/LocalRepository
|
||||
instanceKlass org/eclipse/aether/internal/impl/LocalPathPrefixComposer
|
||||
instanceKlass org/eclipse/aether/transform/FileTransformer
|
||||
instanceKlass org/eclipse/aether/repository/LocalRepositoryManager
|
||||
instanceKlass org/eclipse/aether/installation/InstallResult
|
||||
instanceKlass org/eclipse/aether/installation/InstallRequest
|
||||
instanceKlass org/eclipse/aether/spi/io/FileProcessor$ProgressListener
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultDeployer$EventCatapult
|
||||
instanceKlass org/eclipse/aether/spi/connector/RepositoryConnector
|
||||
instanceKlass org/eclipse/aether/repository/RepositoryPolicy
|
||||
instanceKlass org/eclipse/aether/deployment/DeployResult
|
||||
instanceKlass org/eclipse/aether/deployment/DeployRequest
|
||||
instanceKlass org/eclipse/aether/transfer/TransferResource
|
||||
instanceKlass org/eclipse/aether/spi/connector/checksum/ChecksumPolicy
|
||||
instanceKlass sun/reflect/generics/tree/MethodTypeSignature
|
||||
instanceKlass sun/reflect/generics/tree/VoidDescriptor
|
||||
instanceKlass org/eclipse/aether/resolution/ArtifactRequest
|
||||
instanceKlass org/eclipse/aether/spi/locator/ServiceLocator
|
||||
instanceKlass org/eclipse/aether/repository/RemoteRepository
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultArtifactResolver$ResolutionGroup
|
||||
instanceKlass org/eclipse/aether/resolution/VersionResult
|
||||
instanceKlass org/eclipse/aether/repository/LocalArtifactResult
|
||||
instanceKlass org/eclipse/aether/SyncContext
|
||||
instanceKlass org/eclipse/aether/named/support/AdaptedSemaphoreNamedLock$AdaptedSemaphore
|
||||
instanceKlass org/eclipse/aether/named/support/NamedLockFactorySupport$NamedLockHolder
|
||||
instanceKlass org/eclipse/aether/named/support/NamedLockSupport
|
||||
instanceKlass org/eclipse/aether/named/NamedLock
|
||||
instanceKlass org/apache/maven/repository/metadata/DefaultGraphConflictResolutionPolicy
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/io/DefaultMetadataReader
|
||||
instanceKlass org/eclipse/aether/DefaultRepositorySystemSession
|
||||
instanceKlass org/apache/maven/execution/MavenExecutionResult
|
||||
instanceKlass org/apache/maven/DefaultMaven
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecycleExecutionPlanCalculator
|
||||
instanceKlass org/apache/maven/repository/ArtifactTransferListener
|
||||
instanceKlass org/apache/maven/repository/legacy/LegacyRepositorySystem
|
||||
instanceKlass org/apache/maven/project/artifact/ProjectArtifactsCache$CacheRecord
|
||||
instanceKlass org/apache/maven/project/artifact/ProjectArtifactsCache$Key
|
||||
instanceKlass org/apache/maven/project/artifact/DefaultProjectArtifactsCache
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuildingHelper
|
||||
instanceKlass org/apache/maven/toolchain/DefaultToolchainsBuilder
|
||||
instanceKlass org/apache/maven/plugin/ExtensionRealmCache$Key
|
||||
instanceKlass org/apache/maven/plugin/DefaultExtensionRealmCache
|
||||
instanceKlass org/apache/maven/artifact/resolver/DefaultResolutionErrorHandler
|
||||
instanceKlass org/apache/maven/DefaultProjectDependenciesResolver
|
||||
instanceKlass org/apache/maven/artifact/factory/DefaultArtifactFactory
|
||||
instanceKlass org/apache/maven/settings/crypto/SettingsDecryptionRequest
|
||||
instanceKlass org/apache/maven/execution/ExecutionEvent
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultExecutionEventCatapult
|
||||
instanceKlass org/apache/maven/project/DefaultDependencyResolutionResult
|
||||
instanceKlass org/apache/maven/project/DefaultProjectDependenciesResolver
|
||||
instanceKlass org/apache/maven/lifecycle/internal/PhaseRecorder
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DependencyContext
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ProjectIndex
|
||||
instanceKlass org/apache/maven/plugin/MojoExecutionRunner
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/OldestConflictResolver
|
||||
instanceKlass org/eclipse/aether/util/graph/visitor/AbstractDepthFirstNodeListGenerator
|
||||
instanceKlass org/apache/maven/plugin/ExtensionRealmCache$CacheRecord
|
||||
instanceKlass org/apache/maven/plugin/descriptor/PluginDescriptorBuilder
|
||||
instanceKlass org/codehaus/plexus/component/configurator/ConfigurationListener
|
||||
instanceKlass org/apache/maven/plugin/logging/Log
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultMavenPluginManager
|
||||
instanceKlass org/apache/maven/repository/metadata/ClasspathContainer
|
||||
instanceKlass org/apache/maven/repository/metadata/DefaultClasspathTransformation
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/DefaultConflictResolverFactory
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultPluginManager
|
||||
instanceKlass org/eclipse/aether/RepositoryListener
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector
|
||||
instanceKlass org/apache/maven/repository/metadata/MetadataGraphEdge
|
||||
instanceKlass org/apache/maven/repository/metadata/MetadataGraph
|
||||
instanceKlass org/apache/maven/repository/metadata/MetadataGraphVertex
|
||||
instanceKlass org/apache/maven/repository/metadata/DefaultGraphConflictResolver
|
||||
instanceKlass org/apache/maven/artifact/repository/layout/DefaultRepositoryLayout
|
||||
instanceKlass org/apache/maven/exception/ExceptionSummary
|
||||
instanceKlass org/apache/maven/exception/DefaultExceptionHandler
|
||||
instanceKlass org/apache/maven/wagon/observers/ChecksumObserver
|
||||
instanceKlass org/apache/maven/repository/legacy/DefaultWagonManager
|
||||
instanceKlass org/apache/maven/model/RepositoryPolicy
|
||||
instanceKlass org/apache/maven/settings/RepositoryPolicy
|
||||
instanceKlass org/apache/maven/artifact/repository/Authentication
|
||||
instanceKlass org/apache/maven/settings/RepositoryBase
|
||||
instanceKlass org/apache/maven/repository/Proxy
|
||||
instanceKlass org/apache/maven/project/ReactorModelPool
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingResult
|
||||
instanceKlass org/apache/maven/project/DependencyResolutionResult
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuilder$InternalConfig
|
||||
instanceKlass org/apache/maven/model/resolution/ModelResolver
|
||||
instanceKlass org/apache/maven/project/DependencyResolutionRequest
|
||||
instanceKlass org/apache/maven/project/ProjectBuildingResult
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingListener
|
||||
instanceKlass org/apache/maven/model/building/ModelCache
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuilder
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer$GoalSpec
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/LifecyclePhase
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer
|
||||
instanceKlass org/apache/maven/artifact/resolver/DefaultArtifactResolver
|
||||
instanceKlass org/apache/maven/project/validation/ModelValidationResult
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingRequest
|
||||
instanceKlass org/apache/maven/model/building/ModelProblemCollector
|
||||
instanceKlass org/apache/maven/project/validation/DefaultModelValidator
|
||||
instanceKlass org/apache/maven/repository/legacy/repository/DefaultArtifactRepositoryFactory
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecycleMappingDelegate
|
||||
instanceKlass org/apache/maven/rtinfo/internal/DefaultRuntimeInformation
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ProjectSegment
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/multithreaded/ThreadOutputMuxer
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/multithreaded/ConcurrencyDependencyGraph
|
||||
instanceKlass java/util/concurrent/CompletionService
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/multithreaded/MultiThreadedBuilder
|
||||
instanceKlass org/apache/maven/model/building/ModelProblem
|
||||
instanceKlass org/apache/maven/project/artifact/MavenMetadataSource$ProjectRelocation
|
||||
instanceKlass org/apache/maven/model/Dependency
|
||||
instanceKlass org/apache/maven/project/artifact/MavenMetadataSource
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/Metadata
|
||||
instanceKlass org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver$Versions
|
||||
instanceKlass org/apache/maven/plugin/version/internal/DefaultPluginVersionResult
|
||||
instanceKlass org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver$Key
|
||||
instanceKlass org/apache/maven/plugin/version/PluginVersionResult
|
||||
instanceKlass org/eclipse/aether/version/VersionScheme
|
||||
instanceKlass org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver
|
||||
instanceKlass org/apache/maven/repository/DefaultMirrorSelector
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/FarthestConflictResolver
|
||||
instanceKlass org/apache/http/config/Registry
|
||||
instanceKlass org/apache/http/impl/conn/PoolingHttpClientConnectionManager
|
||||
instanceKlass org/apache/http/pool/ConnPoolControl
|
||||
instanceKlass org/apache/http/client/methods/CloseableHttpResponse
|
||||
instanceKlass org/apache/http/HttpResponse
|
||||
instanceKlass org/apache/maven/wagon/shared/http/BasicAuthScope
|
||||
instanceKlass org/apache/maven/wagon/shared/http/HttpConfiguration
|
||||
instanceKlass org/apache/http/impl/client/CloseableHttpClient
|
||||
instanceKlass org/apache/http/client/HttpClient
|
||||
instanceKlass org/apache/http/Header
|
||||
instanceKlass org/apache/http/NameValuePair
|
||||
instanceKlass org/apache/http/auth/Credentials
|
||||
instanceKlass org/apache/http/client/AuthCache
|
||||
instanceKlass org/apache/http/client/CredentialsProvider
|
||||
instanceKlass org/apache/http/client/RedirectStrategy
|
||||
instanceKlass org/apache/http/config/Lookup
|
||||
instanceKlass org/apache/http/client/ServiceUnavailableRetryStrategy
|
||||
instanceKlass org/apache/http/conn/ssl/TrustStrategy
|
||||
instanceKlass org/apache/http/ssl/TrustStrategy
|
||||
instanceKlass org/apache/http/client/HttpRequestRetryHandler
|
||||
instanceKlass org/apache/http/protocol/HttpContext
|
||||
instanceKlass org/apache/http/client/methods/HttpUriRequest
|
||||
instanceKlass org/apache/http/HttpRequest
|
||||
instanceKlass org/apache/http/HttpMessage
|
||||
instanceKlass org/apache/http/auth/AuthScheme
|
||||
instanceKlass org/apache/http/HttpEntity
|
||||
instanceKlass org/apache/http/conn/HttpClientConnectionManager
|
||||
instanceKlass org/apache/maven/wagon/OutputData
|
||||
instanceKlass org/apache/maven/wagon/InputData
|
||||
instanceKlass java/util/EventObject
|
||||
instanceKlass org/apache/maven/wagon/events/SessionListener
|
||||
instanceKlass org/apache/maven/wagon/resource/Resource
|
||||
instanceKlass org/apache/maven/wagon/repository/RepositoryPermissions
|
||||
instanceKlass org/apache/maven/wagon/proxy/ProxyInfo
|
||||
instanceKlass org/apache/maven/wagon/authentication/AuthenticationInfo
|
||||
instanceKlass org/apache/maven/wagon/events/TransferEventSupport
|
||||
instanceKlass org/apache/maven/wagon/events/SessionEventSupport
|
||||
instanceKlass org/apache/maven/wagon/repository/Repository
|
||||
instanceKlass org/apache/maven/wagon/proxy/ProxyInfoProvider
|
||||
instanceKlass org/apache/maven/wagon/AbstractWagon
|
||||
instanceKlass org/apache/maven/wagon/StreamingWagon
|
||||
instanceKlass org/apache/maven/plugin/DefaultBuildPluginManager
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ReactorBuildStatus
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/singlethreaded/SingleThreadedBuilder
|
||||
instanceKlass org/apache/maven/configuration/BeanConfigurationRequest
|
||||
instanceKlass org/codehaus/plexus/component/configurator/expression/ExpressionEvaluator
|
||||
instanceKlass org/codehaus/plexus/configuration/PlexusConfiguration
|
||||
instanceKlass org/codehaus/plexus/component/configurator/converters/lookup/ConverterLookup
|
||||
instanceKlass org/apache/maven/configuration/internal/DefaultBeanConfigurator
|
||||
instanceKlass org/codehaus/plexus/component/repository/ComponentSetDescriptor
|
||||
instanceKlass org/apache/maven/plugin/PluginDescriptorCache$PluginDescriptorSupplier
|
||||
instanceKlass org/apache/maven/plugin/PluginDescriptorCache$Key
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginDescriptorCache
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/DefaultLifecycleMapping
|
||||
instanceKlass org/apache/maven/model/building/Result
|
||||
instanceKlass org/apache/maven/execution/ProjectDependencyGraph
|
||||
instanceKlass org/apache/maven/graph/DefaultGraphBuilder
|
||||
instanceKlass org/apache/maven/artifact/repository/layout/FlatRepositoryLayout
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ProjectBuildList
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/NewestConflictResolver
|
||||
instanceKlass org/apache/maven/wagon/events/TransferListener
|
||||
instanceKlass org/apache/maven/profiles/ProfileManager
|
||||
instanceKlass org/apache/maven/model/building/ModelSource
|
||||
instanceKlass org/apache/maven/project/ProjectBuilderConfiguration
|
||||
instanceKlass org/apache/maven/project/DefaultMavenProjectBuilder
|
||||
instanceKlass org/apache/maven/project/ProjectRealmCache$CacheRecord
|
||||
instanceKlass org/apache/maven/project/ProjectRealmCache$Key
|
||||
instanceKlass org/apache/maven/project/DefaultProjectRealmCache
|
||||
instanceKlass org/apache/maven/model/RepositoryBase
|
||||
instanceKlass org/apache/maven/model/Reporting
|
||||
instanceKlass org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler
|
||||
instanceKlass org/apache/maven/plugin/version/PluginVersionRequest
|
||||
instanceKlass org/apache/maven/model/ModelBase
|
||||
instanceKlass org/apache/maven/project/path/DefaultPathTranslator
|
||||
instanceKlass org/apache/maven/artifact/repository/DefaultArtifactRepositoryFactory
|
||||
instanceKlass org/apache/maven/plugin/PluginArtifactsCache$CacheRecord
|
||||
instanceKlass org/apache/maven/plugin/PluginArtifactsCache$Key
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginArtifactsCache
|
||||
instanceKlass org/apache/maven/toolchain/DefaultToolchainManager
|
||||
instanceKlass org/apache/maven/artifact/handler/manager/DefaultArtifactHandlerManager
|
||||
instanceKlass org/apache/maven/artifact/versioning/ArtifactVersion
|
||||
instanceKlass org/apache/maven/execution/DefaultRuntimeInformation
|
||||
instanceKlass org/apache/maven/lifecycle/DefaultLifecycleExecutor
|
||||
instanceKlass org/apache/maven/artifact/versioning/VersionRange
|
||||
instanceKlass org/apache/maven/artifact/resolver/ArtifactResolutionResult
|
||||
instanceKlass org/apache/maven/artifact/resolver/ArtifactResolutionRequest
|
||||
instanceKlass org/apache/maven/artifact/resolver/filter/ArtifactFilter
|
||||
instanceKlass org/apache/maven/repository/legacy/metadata/MetadataResolutionRequest
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/DefaultLegacyArtifactCollector
|
||||
instanceKlass org/apache/maven/profiles/ProfilesRoot
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/transform/DefaultArtifactTransformationManager
|
||||
instanceKlass org/apache/maven/plugin/PluginRealmCache$CacheRecord
|
||||
instanceKlass org/apache/maven/plugin/PluginRealmCache$PluginRealmSupplier
|
||||
instanceKlass org/apache/maven/plugin/PluginRealmCache$Key
|
||||
instanceKlass org/apache/maven/plugin/DefaultPluginRealmCache
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultLegacySupport
|
||||
instanceKlass org/eclipse/aether/RequestTrace
|
||||
instanceKlass org/apache/maven/model/PluginContainer
|
||||
instanceKlass org/apache/maven/plugin/prefix/PluginPrefixRequest
|
||||
instanceKlass org/eclipse/aether/repository/ArtifactRepository
|
||||
instanceKlass org/eclipse/aether/metadata/Metadata
|
||||
instanceKlass org/apache/maven/plugin/prefix/PluginPrefixResult
|
||||
instanceKlass org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver
|
||||
instanceKlass org/apache/maven/settings/TrackableBase
|
||||
instanceKlass org/apache/maven/settings/building/SettingsBuildingRequest
|
||||
instanceKlass org/eclipse/aether/resolution/ArtifactResult
|
||||
instanceKlass org/eclipse/aether/graph/DependencyNode
|
||||
instanceKlass org/eclipse/aether/graph/DependencyVisitor
|
||||
instanceKlass org/eclipse/aether/collection/DependencySelector
|
||||
instanceKlass org/eclipse/aether/graph/DependencyFilter
|
||||
instanceKlass org/eclipse/aether/artifact/Artifact
|
||||
instanceKlass org/eclipse/aether/RepositorySystemSession
|
||||
instanceKlass org/eclipse/aether/resolution/ArtifactDescriptorPolicy
|
||||
instanceKlass org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator
|
||||
instanceKlass org/apache/maven/lifecycle/MavenExecutionPlan
|
||||
instanceKlass org/apache/maven/plugin/descriptor/Parameter
|
||||
instanceKlass org/apache/maven/model/ConfigurationContainer
|
||||
instanceKlass org/apache/maven/model/InputLocationTracker
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultMojoExecutionConfigurator
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/Versioning
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadata
|
||||
instanceKlass org/apache/maven/artifact/metadata/ArtifactMetadata
|
||||
instanceKlass org/apache/maven/repository/legacy/metadata/ArtifactMetadata
|
||||
instanceKlass org/apache/maven/artifact/repository/RepositoryRequest
|
||||
instanceKlass org/codehaus/plexus/logging/AbstractLogEnabled
|
||||
instanceKlass org/apache/maven/artifact/handler/DefaultArtifactHandler
|
||||
instanceKlass org/objectweb/asm/Handler
|
||||
instanceKlass org/objectweb/asm/Frame
|
||||
instanceKlass org/objectweb/asm/ByteVector
|
||||
instanceKlass org/objectweb/asm/Symbol
|
||||
instanceKlass org/objectweb/asm/SymbolTable
|
||||
instanceKlass org/objectweb/asm/FieldVisitor
|
||||
instanceKlass org/objectweb/asm/MethodVisitor
|
||||
instanceKlass org/objectweb/asm/ModuleVisitor
|
||||
instanceKlass org/objectweb/asm/RecordComponentVisitor
|
||||
instanceKlass org/apache/maven/artifact/repository/ArtifactRepositoryPolicy
|
||||
instanceKlass org/apache/maven/project/artifact/DefaultMavenMetadataCache$CacheKey
|
||||
instanceKlass org/apache/maven/repository/legacy/metadata/ResolutionGroup
|
||||
instanceKlass org/apache/maven/artifact/repository/ArtifactRepository
|
||||
instanceKlass org/apache/maven/artifact/Artifact
|
||||
instanceKlass org/apache/maven/project/artifact/DefaultMavenMetadataCache
|
||||
instanceKlass org/apache/maven/toolchain/model/TrackableBase
|
||||
instanceKlass org/apache/maven/toolchain/DefaultToolchain
|
||||
instanceKlass org/apache/maven/toolchain/ToolchainPrivate
|
||||
instanceKlass org/apache/maven/toolchain/java/JavaToolchain
|
||||
instanceKlass org/apache/maven/toolchain/Toolchain
|
||||
instanceKlass org/apache/maven/toolchain/java/JavaToolchainFactory
|
||||
instanceKlass org/apache/maven/artifact/resolver/ResolutionNode
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/NearestConflictResolver
|
||||
instanceKlass org/apache/maven/lifecycle/internal/TaskSegment
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ReactorContext
|
||||
instanceKlass org/apache/maven/execution/ProjectExecutionListener
|
||||
instanceKlass org/apache/maven/execution/BuildSummary
|
||||
instanceKlass com/google/inject/spi/ProviderWithExtensionVisitor
|
||||
instanceKlass com/google/common/collect/Iterables
|
||||
instanceKlass java/util/stream/ForEachOps$ForEachOp
|
||||
instanceKlass java/util/stream/ForEachOps
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBean
|
||||
instanceKlass org/codehaus/plexus/component/repository/ComponentDescriptor
|
||||
instanceKlass com/google/inject/spi/ProvidesMethodBinding
|
||||
instanceKlass org/eclipse/sisu/inject/Guice4
|
||||
instanceKlass com/google/inject/internal/GuiceInternal
|
||||
instanceKlass org/sonatype/inject/Parameters
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusXmlBeanConverter
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBeanConverter
|
||||
instanceKlass com/google/inject/spi/TypeConverterBinding
|
||||
instanceKlass java/lang/reflect/AnnotatedParameterizedType
|
||||
instanceKlass sun/reflect/generics/tree/Wildcard
|
||||
instanceKlass sun/reflect/generics/tree/BottomSignature
|
||||
instanceKlass org/eclipse/sisu/inject/DefaultRankingFunction
|
||||
instanceKlass com/google/inject/spi/ProvisionListenerBinding
|
||||
instanceKlass com/google/inject/spi/TypeListenerBinding
|
||||
instanceKlass org/eclipse/sisu/bean/BeanListener
|
||||
instanceKlass com/google/inject/matcher/Matchers
|
||||
instanceKlass org/eclipse/sisu/bean/PropertyBinder
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBeanBinder
|
||||
instanceKlass com/google/inject/spi/InjectionListener
|
||||
instanceKlass org/apache/maven/settings/validation/DefaultSettingsValidator
|
||||
instanceKlass org/apache/maven/settings/validation/SettingsValidator
|
||||
instanceKlass org/apache/maven/settings/io/DefaultSettingsWriter
|
||||
instanceKlass org/apache/maven/settings/io/SettingsWriter
|
||||
instanceKlass org/apache/maven/settings/io/DefaultSettingsReader
|
||||
instanceKlass org/apache/maven/settings/io/SettingsReader
|
||||
instanceKlass org/apache/maven/settings/crypto/DefaultSettingsDecrypter
|
||||
instanceKlass org/apache/maven/settings/crypto/SettingsDecrypter
|
||||
instanceKlass org/apache/maven/settings/building/DefaultSettingsBuilder
|
||||
instanceKlass org/apache/maven/settings/building/SettingsBuilder
|
||||
instanceKlass org/apache/maven/cli/internal/BootstrapCoreExtensionManager
|
||||
instanceKlass org/apache/maven/cli/configuration/SettingsXmlConfigurationProcessor
|
||||
instanceKlass org/apache/maven/cli/configuration/ConfigurationProcessor
|
||||
instanceKlass org/eclipse/aether/transport/http/ChecksumExtractor
|
||||
instanceKlass org/eclipse/aether/transport/http/HttpTransporterFactory
|
||||
instanceKlass org/sonatype/plexus/components/sec/dispatcher/DefaultSecDispatcher
|
||||
instanceKlass org/eclipse/aether/transport/file/FileTransporterFactory
|
||||
instanceKlass org/apache/maven/toolchain/io/DefaultToolchainsWriter
|
||||
instanceKlass org/apache/maven/toolchain/io/ToolchainsWriter
|
||||
instanceKlass org/apache/maven/toolchain/io/DefaultToolchainsReader
|
||||
instanceKlass org/apache/maven/toolchain/io/ToolchainsReader
|
||||
instanceKlass org/apache/maven/toolchain/building/DefaultToolchainsBuilder
|
||||
instanceKlass org/apache/maven/toolchain/building/ToolchainsBuilder
|
||||
instanceKlass org/apache/maven/execution/MavenSession
|
||||
instanceKlass org/apache/maven/session/scope/internal/SessionScope$ScopeState
|
||||
instanceKlass org/apache/maven/session/scope/internal/SessionScope
|
||||
instanceKlass org/apache/maven/plugin/internal/MavenPluginMavenPrerequisiteChecker
|
||||
instanceKlass org/apache/maven/plugin/internal/MavenPluginJavaPrerequisiteChecker
|
||||
instanceKlass org/apache/maven/plugin/MavenPluginPrerequisitesChecker
|
||||
instanceKlass org/apache/maven/plugin/internal/AbstractMavenPluginDependenciesValidator
|
||||
instanceKlass org/apache/maven/plugin/internal/MavenPluginDependenciesValidator
|
||||
instanceKlass org/apache/maven/plugin/internal/AbstractMavenPluginParametersValidator
|
||||
instanceKlass org/apache/maven/plugin/internal/MavenPluginConfigurationValidator
|
||||
instanceKlass org/apache/maven/eventspy/AbstractEventSpy
|
||||
instanceKlass org/apache/maven/eventspy/EventSpy
|
||||
instanceKlass org/apache/maven/plugin/PluginValidationManager
|
||||
instanceKlass org/apache/maven/plugin/DefaultMojosExecutionStrategy
|
||||
instanceKlass org/apache/maven/plugin/MojosExecutionStrategy
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleDependencyResolver
|
||||
instanceKlass org/apache/maven/lifecycle/internal/DefaultProjectArtifactFactory
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ProjectArtifactFactory
|
||||
instanceKlass org/sonatype/plexus/components/sec/dispatcher/SecDispatcher
|
||||
instanceKlass org/apache/maven/internal/secdispatcher/SecDispatcherProvider
|
||||
instanceKlass org/apache/maven/internal/aether/ResolverLifecycle
|
||||
instanceKlass org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory
|
||||
instanceKlass org/apache/maven/extension/internal/CoreExportsProvider
|
||||
instanceKlass org/apache/maven/plugin/MojoExecution
|
||||
instanceKlass org/apache/maven/project/MavenProject
|
||||
instanceKlass org/apache/maven/execution/MojoExecutionEvent
|
||||
instanceKlass org/apache/maven/execution/scope/internal/MojoExecutionScope$ScopeState
|
||||
instanceKlass org/apache/maven/execution/scope/MojoExecutionScoped
|
||||
instanceKlass com/google/inject/RestrictedBindingSource$Permit
|
||||
instanceKlass org/apache/maven/execution/scope/internal/MojoExecutionScope$1
|
||||
instanceKlass org/apache/maven/execution/scope/internal/MojoExecutionScope
|
||||
instanceKlass org/apache/maven/execution/MojoExecutionListener
|
||||
instanceKlass org/apache/maven/execution/DefaultMavenExecutionRequestPopulator
|
||||
instanceKlass org/apache/maven/execution/MavenExecutionRequestPopulator
|
||||
instanceKlass org/apache/maven/classrealm/DefaultClassRealmManager
|
||||
instanceKlass org/apache/maven/classrealm/ClassRealmManager
|
||||
instanceKlass org/apache/maven/SessionScoped
|
||||
instanceKlass org/apache/maven/ReactorReader
|
||||
instanceKlass org/apache/maven/repository/internal/MavenWorkspaceReader
|
||||
instanceKlass org/eclipse/aether/repository/WorkspaceReader
|
||||
instanceKlass org/apache/maven/DefaultArtifactFilterManager
|
||||
instanceKlass org/apache/maven/ArtifactFilterManager
|
||||
instanceKlass org/sonatype/plexus/components/cipher/DefaultPlexusCipher
|
||||
instanceKlass org/sonatype/plexus/components/cipher/PlexusCipher
|
||||
instanceKlass org/eclipse/aether/transport/wagon/WagonTransporterFactory
|
||||
instanceKlass org/eclipse/aether/spi/connector/transport/TransporterFactory
|
||||
instanceKlass org/eclipse/aether/internal/transport/wagon/PlexusWagonProvider
|
||||
instanceKlass org/eclipse/aether/transport/wagon/WagonProvider
|
||||
instanceKlass org/eclipse/aether/internal/transport/wagon/PlexusWagonConfigurator
|
||||
instanceKlass org/eclipse/aether/transport/wagon/WagonConfigurator
|
||||
instanceKlass org/eclipse/aether/connector/basic/BasicRepositoryConnectorFactory
|
||||
instanceKlass org/eclipse/aether/spi/connector/RepositoryConnectorFactory
|
||||
instanceKlass org/apache/maven/model/validation/DefaultModelValidator
|
||||
instanceKlass org/apache/maven/model/validation/ModelValidator
|
||||
instanceKlass org/apache/maven/model/superpom/DefaultSuperPomProvider
|
||||
instanceKlass org/apache/maven/model/superpom/SuperPomProvider
|
||||
instanceKlass org/apache/maven/model/profile/activation/PropertyProfileActivator
|
||||
instanceKlass org/apache/maven/model/profile/activation/OperatingSystemProfileActivator
|
||||
instanceKlass org/apache/maven/model/profile/activation/JdkVersionProfileActivator
|
||||
instanceKlass org/apache/maven/model/profile/activation/FileProfileActivator
|
||||
instanceKlass org/apache/maven/model/profile/activation/ProfileActivator
|
||||
instanceKlass org/apache/maven/model/profile/DefaultProfileSelector
|
||||
instanceKlass org/apache/maven/model/profile/ProfileSelector
|
||||
instanceKlass org/apache/maven/model/profile/DefaultProfileInjector
|
||||
instanceKlass org/apache/maven/model/profile/ProfileInjector
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultReportingConverter
|
||||
instanceKlass org/apache/maven/model/plugin/ReportingConverter
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultReportConfigurationExpander
|
||||
instanceKlass org/apache/maven/model/plugin/ReportConfigurationExpander
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultPluginConfigurationExpander
|
||||
instanceKlass org/apache/maven/model/plugin/PluginConfigurationExpander
|
||||
instanceKlass org/apache/maven/model/path/ProfileActivationFilePathInterpolator
|
||||
instanceKlass org/apache/maven/model/path/DefaultUrlNormalizer
|
||||
instanceKlass org/apache/maven/model/path/UrlNormalizer
|
||||
instanceKlass org/apache/maven/model/path/DefaultPathTranslator
|
||||
instanceKlass org/apache/maven/model/path/PathTranslator
|
||||
instanceKlass org/apache/maven/model/path/DefaultModelUrlNormalizer
|
||||
instanceKlass org/apache/maven/model/path/ModelUrlNormalizer
|
||||
instanceKlass org/apache/maven/model/path/DefaultModelPathTranslator
|
||||
instanceKlass org/apache/maven/model/path/ModelPathTranslator
|
||||
instanceKlass org/apache/maven/model/normalization/DefaultModelNormalizer
|
||||
instanceKlass org/apache/maven/model/normalization/ModelNormalizer
|
||||
instanceKlass org/apache/maven/model/management/DefaultPluginManagementInjector
|
||||
instanceKlass org/apache/maven/model/management/PluginManagementInjector
|
||||
instanceKlass org/apache/maven/model/management/DefaultDependencyManagementInjector
|
||||
instanceKlass org/apache/maven/model/management/DependencyManagementInjector
|
||||
instanceKlass org/apache/maven/model/locator/DefaultModelLocator
|
||||
instanceKlass org/apache/maven/model/io/DefaultModelWriter
|
||||
instanceKlass org/apache/maven/model/io/ModelWriter
|
||||
instanceKlass org/apache/maven/model/io/DefaultModelReader
|
||||
instanceKlass org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator
|
||||
instanceKlass org/apache/maven/model/interpolation/ModelInterpolator
|
||||
instanceKlass org/apache/maven/model/interpolation/DefaultModelVersionProcessor
|
||||
instanceKlass org/apache/maven/model/interpolation/ModelVersionProcessor
|
||||
instanceKlass org/apache/maven/model/inheritance/DefaultInheritanceAssembler
|
||||
instanceKlass org/apache/maven/model/inheritance/InheritanceAssembler
|
||||
instanceKlass org/apache/maven/model/composition/DefaultDependencyManagementImporter
|
||||
instanceKlass org/apache/maven/model/composition/DependencyManagementImporter
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelProcessor
|
||||
instanceKlass org/apache/maven/model/building/ModelProcessor
|
||||
instanceKlass org/apache/maven/model/io/ModelReader
|
||||
instanceKlass org/apache/maven/model/locator/ModelLocator
|
||||
instanceKlass org/apache/maven/model/building/DefaultModelBuilder
|
||||
instanceKlass org/apache/maven/model/building/ModelBuilder
|
||||
instanceKlass org/apache/maven/repository/internal/VersionsMetadataGeneratorFactory
|
||||
instanceKlass org/apache/maven/repository/internal/SnapshotMetadataGeneratorFactory
|
||||
instanceKlass org/apache/maven/repository/internal/PluginsMetadataGeneratorFactory
|
||||
instanceKlass org/eclipse/aether/impl/MetadataGeneratorFactory
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionResolver
|
||||
instanceKlass org/eclipse/aether/impl/VersionResolver
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultVersionRangeResolver
|
||||
instanceKlass org/eclipse/aether/impl/VersionRangeResolver
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultModelCacheFactory
|
||||
instanceKlass org/apache/maven/repository/internal/ModelCacheFactory
|
||||
instanceKlass org/apache/maven/repository/internal/DefaultArtifactDescriptorReader
|
||||
instanceKlass org/eclipse/aether/impl/ArtifactDescriptorReader
|
||||
instanceKlass org/codehaus/plexus/component/configurator/AbstractComponentConfigurator
|
||||
instanceKlass org/codehaus/plexus/component/configurator/ComponentConfigurator
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/StaticNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/GAVNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileStaticNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAVNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAVNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NameMapper
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/providers/DiscriminatingNameMapperProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactoryImpl
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/legacy/DefaultSyncContextFactory
|
||||
instanceKlass org/eclipse/aether/impl/SyncContextFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/synccontext/DefaultSyncContextFactory
|
||||
instanceKlass org/eclipse/aether/spi/synccontext/SyncContextFactory
|
||||
instanceKlass java/lang/Deprecated
|
||||
instanceKlass org/eclipse/aether/internal/impl/slf4j/Slf4jLoggerFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/resolution/ArtifactResolverPostProcessorSupport
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/RemoteRepositoryFilterSourceSupport
|
||||
instanceKlass org/eclipse/aether/spi/connector/filter/RemoteRepositoryFilterSource
|
||||
instanceKlass org/eclipse/aether/spi/resolution/ArtifactResolverPostProcessor
|
||||
instanceKlass org/eclipse/aether/internal/impl/filter/DefaultRemoteRepositoryFilterManager
|
||||
instanceKlass org/eclipse/aether/impl/RemoteRepositoryFilterManager
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate
|
||||
instanceKlass org/eclipse/aether/internal/impl/collect/DefaultDependencyCollector
|
||||
instanceKlass org/eclipse/aether/impl/DependencyCollector
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/TrustedToProvidedChecksumsSourceAdapter
|
||||
instanceKlass org/eclipse/aether/spi/checksums/ProvidedChecksumsSource
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/FileTrustedChecksumsSourceSupport
|
||||
instanceKlass org/eclipse/aether/spi/checksums/TrustedChecksumsSource
|
||||
instanceKlass org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySupport
|
||||
instanceKlass org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector
|
||||
instanceKlass org/eclipse/aether/spi/connector/checksum/ChecksumAlgorithmFactorySelector
|
||||
instanceKlass org/eclipse/aether/internal/impl/SimpleLocalRepositoryManagerFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory
|
||||
instanceKlass org/eclipse/aether/spi/connector/layout/RepositoryLayoutFactory
|
||||
instanceKlass org/eclipse/aether/spi/log/LoggerFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/LoggerFactoryProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory
|
||||
instanceKlass org/eclipse/aether/spi/localrepo/LocalRepositoryManagerFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultUpdatePolicyAnalyzer
|
||||
instanceKlass org/eclipse/aether/impl/UpdatePolicyAnalyzer
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultUpdateCheckManager
|
||||
instanceKlass org/eclipse/aether/impl/UpdateCheckManager
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultTransporterProvider
|
||||
instanceKlass org/eclipse/aether/spi/connector/transport/TransporterProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultTrackingFileManager
|
||||
instanceKlass org/eclipse/aether/internal/impl/TrackingFileManager
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositorySystemLifecycle
|
||||
instanceKlass org/eclipse/aether/impl/RepositorySystemLifecycle
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositorySystem
|
||||
instanceKlass org/eclipse/aether/RepositorySystem
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryLayoutProvider
|
||||
instanceKlass org/eclipse/aether/spi/connector/layout/RepositoryLayoutProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryEventDispatcher
|
||||
instanceKlass org/eclipse/aether/impl/RepositoryEventDispatcher
|
||||
instanceKlass jdk/internal/reflect/ClassDefiner$1
|
||||
instanceKlass jdk/internal/reflect/ClassDefiner
|
||||
instanceKlass jdk/internal/reflect/MethodAccessorGenerator$1
|
||||
instanceKlass jdk/internal/reflect/Label$PatchInfo
|
||||
instanceKlass jdk/internal/reflect/Label
|
||||
instanceKlass jdk/internal/reflect/UTF8
|
||||
instanceKlass jdk/internal/reflect/ClassFileAssembler
|
||||
instanceKlass jdk/internal/reflect/ByteVectorImpl
|
||||
instanceKlass jdk/internal/reflect/ByteVector
|
||||
instanceKlass jdk/internal/reflect/ByteVectorFactory
|
||||
instanceKlass jdk/internal/reflect/AccessorGenerator
|
||||
instanceKlass jdk/internal/reflect/ClassFileConstants
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRepositoryConnectorProvider
|
||||
instanceKlass org/eclipse/aether/impl/RepositoryConnectorProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultRemoteRepositoryManager
|
||||
instanceKlass org/eclipse/aether/impl/RemoteRepositoryManager
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultOfflineController
|
||||
instanceKlass org/eclipse/aether/impl/OfflineController
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultMetadataResolver
|
||||
instanceKlass org/eclipse/aether/impl/MetadataResolver
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultLocalRepositoryProvider
|
||||
instanceKlass org/eclipse/aether/impl/LocalRepositoryProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/LocalPathPrefixComposerFactorySupport
|
||||
instanceKlass org/eclipse/aether/internal/impl/LocalPathPrefixComposerFactory
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultLocalPathComposer
|
||||
instanceKlass org/eclipse/aether/internal/impl/LocalPathComposer
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultInstaller
|
||||
instanceKlass org/eclipse/aether/impl/Installer
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultFileProcessor
|
||||
instanceKlass org/eclipse/aether/spi/io/FileProcessor
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultDeployer
|
||||
instanceKlass org/eclipse/aether/impl/Deployer
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultChecksumPolicyProvider
|
||||
instanceKlass org/eclipse/aether/spi/connector/checksum/ChecksumPolicyProvider
|
||||
instanceKlass org/eclipse/aether/internal/impl/DefaultArtifactResolver
|
||||
instanceKlass org/eclipse/aether/spi/locator/Service
|
||||
instanceKlass org/eclipse/aether/impl/ArtifactResolver
|
||||
instanceKlass org/eclipse/sisu/space/WildcardKey$QualifiedImpl
|
||||
instanceKlass org/eclipse/sisu/space/WildcardKey$Qualified
|
||||
instanceKlass org/eclipse/sisu/space/WildcardKey
|
||||
instanceKlass org/eclipse/sisu/Typed
|
||||
instanceKlass org/sonatype/inject/EagerSingleton
|
||||
instanceKlass org/eclipse/sisu/EagerSingleton
|
||||
instanceKlass org/sonatype/inject/Mediator
|
||||
instanceKlass org/eclipse/sisu/inject/TypeArguments
|
||||
instanceKlass org/eclipse/aether/named/support/NamedLockFactorySupport
|
||||
instanceKlass org/eclipse/aether/named/NamedLockFactory
|
||||
instanceKlass org/objectweb/asm/Context
|
||||
instanceKlass org/objectweb/asm/Attribute
|
||||
instanceKlass org/objectweb/asm/AnnotationVisitor
|
||||
instanceKlass org/objectweb/asm/ClassReader
|
||||
instanceKlass org/eclipse/sisu/space/IndexedClassFinder$1
|
||||
instanceKlass org/eclipse/sisu/inject/Logs$SLF4JSink
|
||||
instanceKlass org/eclipse/sisu/inject/Logs$Sink
|
||||
instanceKlass org/eclipse/sisu/inject/Logs
|
||||
instanceKlass org/eclipse/sisu/space/QualifierCache
|
||||
instanceKlass org/eclipse/sisu/space/QualifiedTypeVisitor
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusTypeVisitor$ComponentAnnotationVisitor
|
||||
instanceKlass org/eclipse/sisu/space/AnnotationVisitor
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusTypeVisitor
|
||||
instanceKlass org/eclipse/sisu/space/ClassVisitor
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusXmlBeanModule$PlexusXmlBeanSource
|
||||
instanceKlass org/eclipse/sisu/inject/DescriptionSource
|
||||
instanceKlass org/eclipse/sisu/inject/AnnotatedSource
|
||||
instanceKlass org/eclipse/sisu/Priority
|
||||
instanceKlass org/eclipse/sisu/Hidden
|
||||
instanceKlass org/eclipse/sisu/Description
|
||||
instanceKlass org/eclipse/sisu/inject/Sources
|
||||
instanceKlass com/google/inject/Key$AnnotationInstanceStrategy
|
||||
instanceKlass com/google/inject/name/NamedImpl
|
||||
instanceKlass com/google/inject/name/Named
|
||||
instanceKlass com/google/inject/name/Names
|
||||
instanceKlass com/google/inject/internal/MoreTypes$ParameterizedTypeImpl
|
||||
instanceKlass sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl
|
||||
instanceKlass sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator
|
||||
instanceKlass org/apache/maven/toolchain/ToolchainsBuilder
|
||||
instanceKlass org/apache/maven/toolchain/ToolchainManagerPrivate
|
||||
instanceKlass org/apache/maven/toolchain/ToolchainManager
|
||||
instanceKlass org/apache/maven/toolchain/ToolchainFactory
|
||||
instanceKlass org/apache/maven/settings/MavenSettingsBuilder
|
||||
instanceKlass org/apache/maven/rtinfo/RuntimeInformation
|
||||
instanceKlass org/apache/maven/project/artifact/ProjectArtifactsCache
|
||||
instanceKlass org/apache/maven/project/artifact/MavenMetadataCache
|
||||
instanceKlass org/apache/maven/project/ProjectRealmCache
|
||||
instanceKlass org/apache/maven/project/ProjectDependenciesResolver
|
||||
instanceKlass org/apache/maven/project/ProjectBuildingHelper
|
||||
instanceKlass org/apache/maven/project/ProjectBuilder
|
||||
instanceKlass org/apache/maven/project/MavenProjectHelper
|
||||
instanceKlass org/apache/maven/plugin/version/PluginVersionResolver
|
||||
instanceKlass org/apache/maven/plugin/prefix/PluginPrefixResolver
|
||||
instanceKlass org/apache/maven/plugin/internal/PluginDependenciesResolver
|
||||
instanceKlass org/apache/maven/plugin/PluginRealmCache
|
||||
instanceKlass org/apache/maven/plugin/PluginManager
|
||||
instanceKlass org/apache/maven/plugin/PluginDescriptorCache
|
||||
instanceKlass org/apache/maven/plugin/PluginArtifactsCache
|
||||
instanceKlass org/apache/maven/plugin/MavenPluginManager
|
||||
instanceKlass org/apache/maven/plugin/LegacySupport
|
||||
instanceKlass org/apache/maven/plugin/ExtensionRealmCache
|
||||
instanceKlass org/apache/maven/plugin/BuildPluginManager
|
||||
instanceKlass org/apache/maven/model/plugin/LifecycleBindingsInjector
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/BuilderCommon
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/Builder
|
||||
instanceKlass org/apache/maven/lifecycle/internal/MojoExecutor
|
||||
instanceKlass org/apache/maven/lifecycle/internal/MojoDescriptorCreator
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculator
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleStarter
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecyclePluginResolver
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleModuleBuilder
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculator
|
||||
instanceKlass org/apache/maven/lifecycle/internal/LifecycleDebugLogger
|
||||
instanceKlass org/apache/maven/lifecycle/internal/ExecutionEventCatapult
|
||||
instanceKlass org/apache/maven/lifecycle/internal/BuildListCalculator
|
||||
instanceKlass org/apache/maven/lifecycle/MojoExecutionConfigurator
|
||||
instanceKlass org/apache/maven/lifecycle/LifecycleMappingDelegate
|
||||
instanceKlass org/apache/maven/lifecycle/LifecycleExecutor
|
||||
instanceKlass org/apache/maven/lifecycle/LifeCyclePluginAnalyzer
|
||||
instanceKlass org/apache/maven/lifecycle/DefaultLifecycles
|
||||
instanceKlass org/apache/maven/graph/GraphBuilder
|
||||
instanceKlass org/apache/maven/eventspy/internal/EventSpyDispatcher
|
||||
instanceKlass org/apache/maven/configuration/BeanConfigurator
|
||||
instanceKlass org/apache/maven/bridge/MavenRepositorySystem
|
||||
instanceKlass org/apache/maven/artifact/resolver/ResolutionErrorHandler
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/io/MetadataReader
|
||||
instanceKlass org/apache/maven/artifact/metadata/ArtifactMetadataSource
|
||||
instanceKlass org/apache/maven/repository/legacy/metadata/ArtifactMetadataSource
|
||||
instanceKlass org/apache/maven/artifact/handler/manager/ArtifactHandlerManager
|
||||
instanceKlass org/apache/maven/artifact/factory/ArtifactFactory
|
||||
instanceKlass org/apache/maven/ProjectDependenciesResolver
|
||||
instanceKlass org/apache/maven/Maven
|
||||
instanceKlass org/apache/maven/artifact/handler/ArtifactHandler
|
||||
instanceKlass org/apache/maven/lifecycle/Lifecycle
|
||||
instanceKlass org/apache/maven/lifecycle/mapping/LifecycleMapping
|
||||
instanceKlass org/eclipse/sisu/space/CloningClassSpace$1
|
||||
instanceKlass org/apache/maven/wagon/Wagon
|
||||
instanceKlass org/apache/maven/repository/metadata/GraphConflictResolver
|
||||
instanceKlass org/apache/maven/repository/metadata/GraphConflictResolutionPolicy
|
||||
instanceKlass org/eclipse/sisu/plexus/ConfigurationImpl
|
||||
instanceKlass org/apache/maven/repository/metadata/ClasspathTransformation
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/transform/ArtifactTransformationManager
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/transform/ArtifactTransformation
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/ConflictResolverFactory
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/ConflictResolver
|
||||
instanceKlass jdk/internal/access/foreign/MemorySegmentProxy
|
||||
instanceKlass org/apache/maven/repository/legacy/repository/ArtifactRepositoryFactory
|
||||
instanceKlass org/apache/maven/repository/legacy/UpdateCheckManager
|
||||
instanceKlass org/apache/maven/repository/RepositorySystem
|
||||
instanceKlass org/apache/maven/repository/MirrorSelector
|
||||
instanceKlass org/apache/maven/project/validation/ModelValidator
|
||||
instanceKlass org/apache/maven/project/path/PathTranslator
|
||||
instanceKlass org/apache/maven/project/interpolation/ModelInterpolator
|
||||
instanceKlass org/apache/maven/project/inheritance/ModelInheritanceAssembler
|
||||
instanceKlass org/apache/maven/project/MavenProjectBuilder
|
||||
instanceKlass org/apache/maven/profiles/MavenProfilesBuilder
|
||||
instanceKlass org/apache/maven/execution/RuntimeInformation
|
||||
instanceKlass org/apache/maven/artifact/resolver/ArtifactResolver
|
||||
instanceKlass org/apache/maven/artifact/resolver/ArtifactCollector
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/LegacyArtifactCollector
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadataManager
|
||||
instanceKlass org/apache/maven/artifact/repository/layout/ArtifactRepositoryLayout
|
||||
instanceKlass org/apache/maven/artifact/repository/ArtifactRepositoryFactory
|
||||
instanceKlass org/apache/maven/artifact/manager/WagonManager
|
||||
instanceKlass org/apache/maven/repository/legacy/WagonManager
|
||||
instanceKlass org/apache/maven/artifact/installer/ArtifactInstaller
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusXmlMetadata
|
||||
instanceKlass org/eclipse/sisu/plexus/Roles
|
||||
instanceKlass org/apache/maven/artifact/deployer/ArtifactDeployer
|
||||
instanceKlass org/eclipse/sisu/plexus/Hints
|
||||
instanceKlass org/eclipse/sisu/space/AbstractDeferredClass
|
||||
instanceKlass org/eclipse/sisu/plexus/RequirementImpl
|
||||
instanceKlass org/codehaus/plexus/component/annotations/Requirement
|
||||
instanceKlass org/eclipse/sisu/space/Streams
|
||||
instanceKlass org/eclipse/sisu/plexus/ComponentImpl
|
||||
instanceKlass org/codehaus/plexus/component/annotations/Component
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusTypeRegistry
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusXmlScanner
|
||||
instanceKlass org/eclipse/sisu/space/QualifiedTypeBinder
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusTypeBinder
|
||||
instanceKlass com/google/inject/spi/InjectionRequest
|
||||
instanceKlass org/eclipse/sisu/bean/BeanProperty
|
||||
instanceKlass com/google/common/collect/ObjectArrays
|
||||
instanceKlass com/google/inject/internal/Nullability
|
||||
instanceKlass com/google/inject/internal/KotlinSupport$KotlinUnsupported
|
||||
instanceKlass com/google/inject/internal/KotlinSupport$KotlinSupportHolder
|
||||
instanceKlass com/google/inject/internal/KotlinSupportInterface
|
||||
instanceKlass com/google/inject/internal/KotlinSupport
|
||||
instanceKlass com/google/inject/spi/InjectionPoint$OverrideIndex
|
||||
instanceKlass org/eclipse/sisu/inject/RankedBindings
|
||||
instanceKlass org/eclipse/sisu/Mediator
|
||||
instanceKlass sun/reflect/generics/tree/TypeVariableSignature
|
||||
instanceKlass com/google/inject/Inject
|
||||
instanceKlass javax/inject/Inject
|
||||
instanceKlass java/lang/reflect/WildcardType
|
||||
instanceKlass com/google/inject/spi/InjectionPoint$InjectableMembers
|
||||
instanceKlass com/google/inject/spi/InjectionPoint$InjectableMember
|
||||
instanceKlass com/google/inject/spi/InjectionPoint
|
||||
instanceKlass java/lang/reflect/ParameterizedType
|
||||
instanceKlass com/google/inject/internal/MoreTypes$GenericArrayTypeImpl
|
||||
instanceKlass com/google/inject/internal/MoreTypes$CompositeType
|
||||
instanceKlass com/google/inject/Key$AnnotationTypeStrategy
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFuture$Failure
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFuture$Cancellation
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFuture$DelegatingToFuture
|
||||
instanceKlass com/google/common/util/concurrent/Platform
|
||||
instanceKlass com/google/common/util/concurrent/Uninterruptibles
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFuture$Listener
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFutureState$Waiter
|
||||
instanceKlass com/google/common/util/concurrent/LazyLogger
|
||||
instanceKlass java/util/concurrent/Executor
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFutureState$AtomicHelper
|
||||
instanceKlass com/google/common/util/concurrent/internal/InternalFutureFailureAccess
|
||||
instanceKlass com/google/common/util/concurrent/AbstractFuture$Trusted
|
||||
instanceKlass com/google/common/util/concurrent/ListenableFuture
|
||||
instanceKlass java/lang/invoke/VarHandle$AccessDescriptor
|
||||
instanceKlass java/lang/annotation/Documented
|
||||
instanceKlass java/lang/annotation/Target
|
||||
instanceKlass javax/inject/Named
|
||||
instanceKlass javax/inject/Qualifier
|
||||
instanceKlass com/google/inject/BindingAnnotation
|
||||
instanceKlass javax/inject/Scope
|
||||
instanceKlass com/google/inject/ScopeAnnotation
|
||||
instanceKlass com/google/inject/internal/Annotations$AnnotationChecker
|
||||
instanceKlass java/lang/reflect/Proxy$ProxyBuilder$1
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Edge
|
||||
instanceKlass java/lang/reflect/ProxyGenerator$PrimitiveTypeInfo
|
||||
instanceKlass java/util/StringJoiner
|
||||
instanceKlass java/lang/reflect/ProxyGenerator$ProxyMethod
|
||||
instanceKlass java/lang/WeakPairMap$Pair$Lookup
|
||||
instanceKlass java/lang/WeakPairMap$Pair
|
||||
instanceKlass java/lang/WeakPairMap
|
||||
instanceKlass java/lang/Module$ReflectionData
|
||||
instanceKlass jdk/internal/module/Checks
|
||||
instanceKlass java/lang/module/ModuleDescriptor$Builder
|
||||
instanceKlass java/lang/PublicMethods
|
||||
instanceKlass java/util/Collections$1
|
||||
instanceKlass java/lang/reflect/Proxy$ProxyBuilder
|
||||
instanceKlass java/lang/ClassValue$Version
|
||||
instanceKlass java/lang/ClassValue$Identity
|
||||
instanceKlass java/lang/ClassValue
|
||||
instanceKlass java/lang/reflect/Proxy
|
||||
instanceKlass sun/reflect/annotation/AnnotationInvocationHandler
|
||||
instanceKlass sun/reflect/annotation/AnnotationParser$1
|
||||
instanceKlass sun/reflect/annotation/ExceptionProxy
|
||||
instanceKlass java/lang/annotation/Inherited
|
||||
instanceKlass java/lang/annotation/Retention
|
||||
instanceKlass sun/reflect/annotation/AnnotationType$1
|
||||
instanceKlass sun/reflect/annotation/AnnotationType
|
||||
instanceKlass java/lang/reflect/GenericArrayType
|
||||
instanceKlass sun/reflect/generics/visitor/Reifier
|
||||
instanceKlass sun/reflect/generics/visitor/TypeTreeVisitor
|
||||
instanceKlass sun/reflect/generics/factory/CoreReflectionFactory
|
||||
instanceKlass sun/reflect/generics/factory/GenericsFactory
|
||||
instanceKlass sun/reflect/generics/scope/AbstractScope
|
||||
instanceKlass sun/reflect/generics/scope/Scope
|
||||
instanceKlass com/google/inject/internal/Annotations$TestAnnotation
|
||||
instanceKlass com/google/inject/internal/Annotations$AnnotationToStringConfig
|
||||
instanceKlass com/google/common/base/Joiner$MapJoiner
|
||||
instanceKlass com/google/common/base/Joiner
|
||||
instanceKlass java/lang/reflect/InvocationHandler
|
||||
instanceKlass com/google/inject/internal/Annotations
|
||||
instanceKlass org/eclipse/sisu/Parameters
|
||||
instanceKlass org/eclipse/sisu/wire/ParameterKeys
|
||||
instanceKlass com/google/inject/internal/util/StackTraceElements$InMemoryStackTraceElement
|
||||
instanceKlass com/google/inject/internal/util/StackTraceElements
|
||||
instanceKlass org/eclipse/sisu/wire/TypeConverterCache
|
||||
instanceKlass com/google/inject/internal/Scoping
|
||||
instanceKlass com/google/inject/internal/InternalFactory
|
||||
instanceKlass java/lang/StackTraceElement$HashedModules
|
||||
instanceKlass com/google/inject/internal/InternalFlags$1
|
||||
instanceKlass com/google/inject/internal/InternalFlags
|
||||
instanceKlass com/google/inject/spi/ConstructorBinding
|
||||
instanceKlass com/google/inject/spi/ProviderInstanceBinding
|
||||
instanceKlass com/google/inject/internal/DelayedInitialize
|
||||
instanceKlass com/google/inject/spi/ProviderKeyBinding
|
||||
instanceKlass com/google/inject/spi/InstanceBinding
|
||||
instanceKlass com/google/inject/spi/HasDependencies
|
||||
instanceKlass com/google/inject/spi/LinkedKeyBinding
|
||||
instanceKlass com/google/inject/spi/UntargettedBinding
|
||||
instanceKlass com/google/inject/internal/BindingImpl
|
||||
instanceKlass com/google/inject/Key$AnnotationStrategy
|
||||
instanceKlass org/eclipse/sisu/wire/ElementAnalyzer$1
|
||||
instanceKlass com/google/inject/util/Modules$EmptyModule
|
||||
instanceKlass com/google/inject/util/Modules$OverriddenModuleBuilder
|
||||
instanceKlass com/google/inject/util/Modules
|
||||
instanceKlass java/util/stream/Nodes$ArrayNode
|
||||
instanceKlass java/util/stream/Node$Builder
|
||||
instanceKlass java/util/stream/Node$OfDouble
|
||||
instanceKlass java/util/stream/Node$OfLong
|
||||
instanceKlass java/util/stream/Node$OfInt
|
||||
instanceKlass java/util/stream/Node$OfPrimitive
|
||||
instanceKlass java/util/stream/Nodes$EmptyNode
|
||||
instanceKlass java/util/stream/Node
|
||||
instanceKlass java/util/stream/Nodes
|
||||
instanceKlass java/util/function/IntFunction
|
||||
instanceKlass java/util/stream/SortedOps
|
||||
instanceKlass com/google/common/collect/Ordering
|
||||
instanceKlass com/google/inject/internal/DeclaredMembers
|
||||
instanceKlass com/google/common/base/ExtraObjectsMethodsForWeb
|
||||
instanceKlass com/google/common/collect/ImmutableMap$Builder
|
||||
instanceKlass com/google/inject/internal/MoreTypes
|
||||
instanceKlass com/google/inject/multibindings/ProvidesIntoOptional
|
||||
instanceKlass com/google/inject/multibindings/ProvidesIntoMap
|
||||
instanceKlass com/google/inject/multibindings/ProvidesIntoSet
|
||||
instanceKlass com/google/inject/Provides
|
||||
instanceKlass javax/inject/Singleton
|
||||
instanceKlass com/google/inject/spi/ElementSource
|
||||
instanceKlass com/google/inject/spi/ScopeBinding
|
||||
instanceKlass com/google/inject/Scopes$2
|
||||
instanceKlass com/google/inject/Scopes$1
|
||||
instanceKlass com/google/inject/internal/SingletonScope
|
||||
instanceKlass com/google/inject/Scopes
|
||||
instanceKlass com/google/inject/Singleton
|
||||
instanceKlass com/google/inject/spi/Elements$ModuleInfo
|
||||
instanceKlass com/google/inject/PrivateModule
|
||||
instanceKlass java/util/stream/Streams$2
|
||||
instanceKlass java/util/stream/Streams$ConcatSpliterator
|
||||
instanceKlass sun/reflect/annotation/AnnotatedTypeFactory$AnnotatedTypeBaseImpl
|
||||
instanceKlass java/lang/reflect/AnnotatedType
|
||||
instanceKlass sun/reflect/annotation/AnnotatedTypeFactory
|
||||
instanceKlass sun/reflect/annotation/TypeAnnotation$LocationInfo$Location
|
||||
instanceKlass sun/reflect/annotation/TypeAnnotation$LocationInfo
|
||||
instanceKlass sun/reflect/generics/tree/ClassSignature
|
||||
instanceKlass sun/reflect/generics/tree/Signature
|
||||
instanceKlass sun/reflect/generics/tree/ClassTypeSignature
|
||||
instanceKlass sun/reflect/generics/tree/SimpleClassTypeSignature
|
||||
instanceKlass sun/reflect/generics/tree/FieldTypeSignature
|
||||
instanceKlass sun/reflect/generics/tree/BaseType
|
||||
instanceKlass sun/reflect/generics/tree/TypeSignature
|
||||
instanceKlass sun/reflect/generics/tree/ReturnType
|
||||
instanceKlass sun/reflect/generics/tree/TypeArgument
|
||||
instanceKlass sun/reflect/generics/tree/FormalTypeParameter
|
||||
instanceKlass sun/reflect/generics/tree/TypeTree
|
||||
instanceKlass sun/reflect/generics/tree/Tree
|
||||
instanceKlass sun/reflect/generics/parser/SignatureParser
|
||||
instanceKlass java/lang/reflect/TypeVariable
|
||||
instanceKlass sun/reflect/generics/repository/AbstractRepository
|
||||
instanceKlass sun/reflect/annotation/TypeAnnotation
|
||||
instanceKlass sun/reflect/annotation/TypeAnnotationParser
|
||||
instanceKlass java/lang/Class$AnnotationData
|
||||
instanceKlass com/google/inject/RestrictedBindingSource
|
||||
instanceKlass com/google/inject/spi/BindingSourceRestriction
|
||||
instanceKlass com/google/inject/spi/ModuleSource
|
||||
instanceKlass com/google/inject/internal/ProviderMethodsModule
|
||||
instanceKlass com/google/inject/spi/BindingSourceRestriction$PermitMapConstruction$PermitMapImpl
|
||||
instanceKlass com/google/inject/spi/BindingSourceRestriction$PermitMap
|
||||
instanceKlass com/google/inject/spi/BindingSourceRestriction$PermitMapConstruction
|
||||
instanceKlass com/google/common/collect/Hashing
|
||||
instanceKlass com/google/common/math/IntMath$1
|
||||
instanceKlass com/google/common/math/MathPreconditions
|
||||
instanceKlass com/google/common/math/IntMath
|
||||
instanceKlass com/google/inject/internal/AbstractBindingBuilder
|
||||
instanceKlass com/google/inject/binder/ConstantBindingBuilder
|
||||
instanceKlass com/google/inject/binder/AnnotatedElementBuilder
|
||||
instanceKlass com/google/inject/spi/Elements$RecordingBinder
|
||||
instanceKlass com/google/inject/Binding
|
||||
instanceKlass com/google/inject/spi/DefaultBindingTargetVisitor
|
||||
instanceKlass com/google/inject/spi/BindingTargetVisitor
|
||||
instanceKlass com/google/inject/spi/Elements
|
||||
instanceKlass com/google/inject/internal/InjectorShell$RootModule
|
||||
instanceKlass com/google/common/collect/ListMultimap
|
||||
instanceKlass com/google/inject/internal/InjectorBindingData
|
||||
instanceKlass java/util/concurrent/atomic/AtomicReferenceArray
|
||||
instanceKlass java/util/concurrent/Future
|
||||
instanceKlass com/google/common/cache/LocalCache$LoadingValueReference
|
||||
instanceKlass java/lang/invoke/VarForm
|
||||
instanceKlass java/lang/invoke/VarHandleGuards
|
||||
instanceKlass jdk/internal/util/Preconditions$1
|
||||
instanceKlass java/lang/invoke/VarHandle$1
|
||||
instanceKlass java/lang/invoke/VarHandles
|
||||
instanceKlass java/util/concurrent/ConcurrentLinkedQueue$Node
|
||||
instanceKlass com/google/common/cache/Weigher
|
||||
instanceKlass com/google/common/base/Predicate
|
||||
instanceKlass com/google/common/base/Equivalence
|
||||
instanceKlass java/util/function/BiPredicate
|
||||
instanceKlass com/google/common/base/MoreObjects
|
||||
instanceKlass com/google/common/cache/LocalCache$1
|
||||
instanceKlass com/google/common/cache/ReferenceEntry
|
||||
instanceKlass com/google/common/cache/CacheLoader
|
||||
instanceKlass com/google/common/cache/LocalCache$LocalManualCache
|
||||
instanceKlass java/util/AbstractMap$SimpleImmutableEntry
|
||||
instanceKlass com/google/common/cache/RemovalListener
|
||||
instanceKlass com/google/common/cache/LocalCache$StrongValueReference
|
||||
instanceKlass com/google/common/cache/LocalCache$ValueReference
|
||||
instanceKlass com/google/common/cache/CacheBuilder$2
|
||||
instanceKlass com/google/common/cache/CacheStats
|
||||
instanceKlass com/google/common/base/Suppliers$SupplierOfInstance
|
||||
instanceKlass com/google/common/base/Suppliers
|
||||
instanceKlass com/google/common/cache/CacheBuilder$1
|
||||
instanceKlass com/google/common/cache/AbstractCache$StatsCounter
|
||||
instanceKlass com/google/common/cache/LoadingCache
|
||||
instanceKlass com/google/common/cache/Cache
|
||||
instanceKlass com/google/common/base/Supplier
|
||||
instanceKlass com/google/common/cache/CacheBuilder
|
||||
instanceKlass com/google/inject/internal/WeakKeySet
|
||||
instanceKlass com/google/common/collect/Sets
|
||||
instanceKlass com/google/inject/internal/InjectorJitBindingData
|
||||
instanceKlass java/util/Arrays$ArrayItr
|
||||
instanceKlass com/google/inject/internal/ProcessedBindingData
|
||||
instanceKlass com/google/inject/spi/DefaultElementVisitor
|
||||
instanceKlass com/google/inject/internal/InjectorShell$Builder
|
||||
instanceKlass com/google/common/collect/Lists
|
||||
instanceKlass com/google/common/collect/CollectPreconditions
|
||||
instanceKlass com/google/common/collect/LinkedHashMultimap$MultimapIterationChain
|
||||
instanceKlass java/lang/StrictMath
|
||||
instanceKlass com/google/common/collect/Platform
|
||||
instanceKlass com/google/common/collect/Multiset
|
||||
instanceKlass com/google/common/collect/AbstractMultimap
|
||||
instanceKlass com/google/common/collect/SetMultimap
|
||||
instanceKlass com/google/common/base/Converter
|
||||
instanceKlass com/google/common/base/Function
|
||||
instanceKlass com/google/common/collect/ImmutableMap
|
||||
instanceKlass com/google/common/collect/BiMap
|
||||
instanceKlass com/google/common/collect/SortedMapDifference
|
||||
instanceKlass com/google/common/collect/MapDifference
|
||||
instanceKlass com/google/common/collect/Maps
|
||||
instanceKlass com/google/inject/internal/CycleDetectingLock
|
||||
instanceKlass com/google/common/collect/Multimap
|
||||
instanceKlass com/google/inject/internal/CycleDetectingLock$CycleDetectingLockFactory
|
||||
instanceKlass com/google/inject/internal/Initializable
|
||||
instanceKlass com/google/inject/internal/Initializer
|
||||
instanceKlass com/google/common/collect/PeekingIterator
|
||||
instanceKlass com/google/common/collect/UnmodifiableIterator
|
||||
instanceKlass com/google/common/collect/Iterators
|
||||
instanceKlass com/google/common/collect/ImmutableCollection$Builder
|
||||
instanceKlass com/google/common/collect/ImmutableSet$SetBuilderImpl
|
||||
instanceKlass com/google/inject/internal/util/SourceProvider
|
||||
instanceKlass com/google/inject/spi/ErrorDetail
|
||||
instanceKlass com/google/inject/internal/Errors
|
||||
instanceKlass com/google/common/base/Preconditions
|
||||
instanceKlass java/time/Duration
|
||||
instanceKlass java/time/temporal/TemporalAmount
|
||||
instanceKlass java/time/temporal/TemporalUnit
|
||||
instanceKlass java/util/concurrent/TimeUnit$1
|
||||
instanceKlass jdk/internal/logger/DefaultLoggerFinder$1
|
||||
instanceKlass java/util/logging/Logger$SystemLoggerHelper$1
|
||||
instanceKlass java/util/logging/Logger$SystemLoggerHelper
|
||||
instanceKlass java/util/logging/LogManager$4
|
||||
instanceKlass jdk/internal/logger/BootstrapLogger$BootstrapExecutors
|
||||
instanceKlass jdk/internal/logger/BootstrapLogger$RedirectedLoggers
|
||||
instanceKlass java/util/Spliterators$1Adapter
|
||||
instanceKlass java/util/Spliterators$ArraySpliterator
|
||||
instanceKlass java/util/Spliterator$OfDouble
|
||||
instanceKlass java/util/Spliterator$OfLong
|
||||
instanceKlass java/util/Spliterators$EmptySpliterator
|
||||
instanceKlass java/util/Spliterators
|
||||
instanceKlass jdk/internal/logger/BootstrapLogger$DetectBackend$1
|
||||
instanceKlass jdk/internal/logger/BootstrapLogger$DetectBackend
|
||||
instanceKlass jdk/internal/logger/BootstrapLogger
|
||||
instanceKlass sun/util/logging/PlatformLogger$ConfigurableBridge
|
||||
instanceKlass sun/util/logging/PlatformLogger$Bridge
|
||||
instanceKlass java/lang/System$Logger
|
||||
instanceKlass java/util/stream/Streams
|
||||
instanceKlass java/util/stream/Stream$Builder
|
||||
instanceKlass java/util/stream/Streams$AbstractStreamBuilderImpl
|
||||
instanceKlass java/util/Hashtable$Enumerator
|
||||
instanceKlass java/util/logging/LogManager$LoggerContext$1
|
||||
instanceKlass java/util/logging/LogManager$VisitedLoggers
|
||||
instanceKlass java/util/logging/LogManager$2
|
||||
instanceKlass java/lang/System$LoggerFinder
|
||||
instanceKlass java/util/logging/LogManager$LoggingProviderAccess
|
||||
instanceKlass sun/util/logging/internal/LoggingProviderImpl$LogManagerAccess
|
||||
instanceKlass java/util/Collections$SynchronizedMap
|
||||
instanceKlass java/util/logging/LogManager$LogNode
|
||||
instanceKlass java/util/logging/LogManager$LoggerContext
|
||||
instanceKlass java/util/logging/LogManager$1
|
||||
instanceKlass java/util/logging/LogManager
|
||||
instanceKlass java/util/logging/Logger$ConfigurationData
|
||||
instanceKlass java/util/logging/Logger$LoggerBundle
|
||||
instanceKlass java/util/logging/Level
|
||||
instanceKlass java/util/logging/Handler
|
||||
instanceKlass java/util/logging/Logger
|
||||
instanceKlass com/google/common/base/Ticker
|
||||
instanceKlass com/google/common/base/Stopwatch
|
||||
instanceKlass com/google/inject/internal/util/ContinuousStopwatch
|
||||
instanceKlass com/google/inject/Injector
|
||||
instanceKlass com/google/inject/internal/InternalInjectorCreator
|
||||
instanceKlass com/google/inject/Guice
|
||||
instanceKlass org/eclipse/sisu/wire/Wiring
|
||||
instanceKlass org/eclipse/sisu/wire/WireModule$Strategy$1
|
||||
instanceKlass org/eclipse/sisu/wire/WireModule$Strategy
|
||||
instanceKlass org/eclipse/sisu/wire/AbstractTypeConverter
|
||||
instanceKlass com/google/inject/spi/ElementVisitor
|
||||
instanceKlass org/eclipse/sisu/wire/WireModule
|
||||
instanceKlass org/eclipse/sisu/bean/BeanBinder
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBindingModule
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$BootModule
|
||||
instanceKlass org/codehaus/plexus/component/annotations/Configuration
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusAnnotatedMetadata
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBeanMetadata
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusAnnotatedBeanModule$PlexusAnnotatedBeanSource
|
||||
instanceKlass org/eclipse/sisu/space/SpaceModule$2
|
||||
instanceKlass org/eclipse/sisu/space/SpaceModule$Strategy$2
|
||||
instanceKlass org/eclipse/sisu/space/SpaceModule$Strategy$1
|
||||
instanceKlass org/eclipse/sisu/space/DefaultClassFinder
|
||||
instanceKlass org/objectweb/asm/ClassVisitor
|
||||
instanceKlass org/eclipse/sisu/space/SpaceScanner
|
||||
instanceKlass org/eclipse/sisu/space/IndexedClassFinder
|
||||
instanceKlass org/eclipse/sisu/space/ClassFinder
|
||||
instanceKlass org/eclipse/sisu/space/SpaceModule
|
||||
instanceKlass org/eclipse/sisu/space/SpaceVisitor
|
||||
instanceKlass jdk/internal/misc/ScopedMemoryAccess$Scope
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusTypeListener
|
||||
instanceKlass org/eclipse/sisu/space/QualifiedTypeListener
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusAnnotatedBeanModule$1
|
||||
instanceKlass org/eclipse/sisu/space/SpaceModule$Strategy
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusAnnotatedBeanModule
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBeanSource
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusXmlBeanModule
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBeanModule
|
||||
instanceKlass org/eclipse/sisu/space/URLClassSpace
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$SLF4JLoggerFactoryProvider
|
||||
instanceKlass com/google/inject/util/Providers$ConstantProvider
|
||||
instanceKlass com/google/inject/util/Providers
|
||||
instanceKlass org/codehaus/plexus/personality/plexus/lifecycle/phase/Disposable
|
||||
instanceKlass org/codehaus/plexus/personality/plexus/lifecycle/phase/Startable
|
||||
instanceKlass org/codehaus/plexus/personality/plexus/lifecycle/phase/Initializable
|
||||
instanceKlass org/codehaus/plexus/personality/plexus/lifecycle/phase/Contextualizable
|
||||
instanceKlass org/codehaus/plexus/logging/LogEnabled
|
||||
instanceKlass org/eclipse/sisu/bean/PropertyBinding
|
||||
instanceKlass javax/annotation/PreDestroy
|
||||
instanceKlass javax/annotation/PostConstruct
|
||||
instanceKlass org/eclipse/sisu/bean/LifecycleBuilder
|
||||
instanceKlass org/eclipse/sisu/bean/BeanScheduler$1
|
||||
instanceKlass com/google/inject/spi/DefaultBindingScopingVisitor
|
||||
instanceKlass com/google/inject/spi/BindingScopingVisitor
|
||||
instanceKlass org/eclipse/sisu/bean/BeanScheduler$CycleActivator
|
||||
instanceKlass com/google/inject/spi/ModuleAnnotatedMethodScanner
|
||||
instanceKlass com/google/inject/PrivateBinder
|
||||
instanceKlass com/google/inject/spi/TypeListener
|
||||
instanceKlass com/google/inject/MembersInjector
|
||||
instanceKlass org/aopalliance/intercept/MethodInterceptor
|
||||
instanceKlass org/aopalliance/intercept/Interceptor
|
||||
instanceKlass org/aopalliance/aop/Advice
|
||||
instanceKlass com/google/inject/spi/Message
|
||||
instanceKlass com/google/inject/spi/Element
|
||||
instanceKlass com/google/inject/binder/AnnotatedConstantBindingBuilder
|
||||
instanceKlass com/google/inject/Scope
|
||||
instanceKlass com/google/inject/spi/Dependency
|
||||
instanceKlass com/google/inject/Key
|
||||
instanceKlass com/google/inject/binder/AnnotatedBindingBuilder
|
||||
instanceKlass com/google/inject/binder/LinkedBindingBuilder
|
||||
instanceKlass com/google/inject/binder/ScopedBindingBuilder
|
||||
instanceKlass com/google/inject/TypeLiteral
|
||||
instanceKlass com/google/inject/spi/ProvisionListener
|
||||
instanceKlass com/google/inject/Binder
|
||||
instanceKlass org/eclipse/sisu/bean/BeanScheduler
|
||||
instanceKlass org/eclipse/sisu/plexus/DefaultPlexusBeanLocator
|
||||
instanceKlass org/eclipse/sisu/plexus/RealmManager
|
||||
instanceKlass org/codehaus/plexus/context/ContextMapAdapter
|
||||
instanceKlass org/codehaus/plexus/context/DefaultContext
|
||||
instanceKlass org/codehaus/plexus/logging/AbstractLogger
|
||||
instanceKlass org/codehaus/plexus/logging/AbstractLoggerManager
|
||||
instanceKlass java/util/Date
|
||||
instanceKlass java/text/DigitList
|
||||
instanceKlass java/text/FieldPosition
|
||||
instanceKlass java/lang/StringUTF16$CharsSpliterator
|
||||
instanceKlass java/util/stream/Sink$ChainedInt
|
||||
instanceKlass java/util/OptionalInt
|
||||
instanceKlass java/util/stream/Sink$OfInt
|
||||
instanceKlass java/util/function/IntConsumer
|
||||
instanceKlass java/util/function/IntPredicate
|
||||
instanceKlass java/util/stream/IntStream
|
||||
instanceKlass java/lang/StringLatin1$CharsSpliterator
|
||||
instanceKlass java/util/Spliterator$OfInt
|
||||
instanceKlass java/util/Spliterator$OfPrimitive
|
||||
instanceKlass java/text/DecimalFormatSymbols
|
||||
instanceKlass java/text/DateFormatSymbols
|
||||
instanceKlass sun/util/calendar/CalendarUtils
|
||||
instanceKlass sun/util/calendar/CalendarDate
|
||||
instanceKlass sun/util/resources/Bundles$CacheKeyReference
|
||||
instanceKlass java/util/ResourceBundle$ResourceBundleProviderHelper
|
||||
instanceKlass sun/util/resources/Bundles$CacheKey
|
||||
instanceKlass java/util/ResourceBundle$1
|
||||
instanceKlass jdk/internal/access/JavaUtilResourceBundleAccess
|
||||
instanceKlass sun/util/resources/Bundles
|
||||
instanceKlass sun/util/resources/LocaleData$LocaleDataStrategy
|
||||
instanceKlass sun/util/resources/Bundles$Strategy
|
||||
instanceKlass sun/util/resources/LocaleData$1
|
||||
instanceKlass sun/util/resources/LocaleData
|
||||
instanceKlass sun/util/locale/provider/LocaleResources
|
||||
instanceKlass java/util/ResourceBundle
|
||||
instanceKlass java/util/ResourceBundle$Control
|
||||
instanceKlass sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter
|
||||
instanceKlass sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
|
||||
instanceKlass sun/util/locale/provider/LocaleServiceProviderPool
|
||||
instanceKlass java/util/Locale$Builder
|
||||
instanceKlass sun/util/locale/provider/CalendarDataUtility
|
||||
instanceKlass sun/util/calendar/CalendarSystem$GregorianHolder
|
||||
instanceKlass sun/util/calendar/CalendarSystem
|
||||
instanceKlass java/util/Calendar$Builder
|
||||
instanceKlass java/util/StringTokenizer
|
||||
instanceKlass sun/util/locale/provider/AvailableLanguageTags
|
||||
instanceKlass java/util/ServiceLoader$ProviderImpl
|
||||
instanceKlass java/util/ServiceLoader$Provider
|
||||
instanceKlass java/util/ServiceLoader$1
|
||||
instanceKlass sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo
|
||||
instanceKlass jdk/internal/module/ModulePatcher$PatchedModuleReader
|
||||
instanceKlass java/util/ServiceLoader$3
|
||||
instanceKlass java/util/ServiceLoader$2
|
||||
instanceKlass java/util/ServiceLoader$LazyClassPathLookupIterator
|
||||
instanceKlass java/util/concurrent/CopyOnWriteArrayList$COWIterator
|
||||
instanceKlass java/util/ServiceLoader$ModuleServicesLookupIterator
|
||||
instanceKlass java/util/ServiceLoader
|
||||
instanceKlass sun/util/locale/LocaleObjectCache
|
||||
instanceKlass sun/util/locale/BaseLocale$Key
|
||||
instanceKlass sun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar
|
||||
instanceKlass sun/util/locale/InternalLocaleBuilder
|
||||
instanceKlass sun/util/locale/StringTokenIterator
|
||||
instanceKlass sun/util/locale/ParseStatus
|
||||
instanceKlass sun/util/locale/LanguageTag
|
||||
instanceKlass sun/util/cldr/CLDRBaseLocaleDataMetaInfo
|
||||
instanceKlass sun/util/locale/provider/LocaleDataMetaInfo
|
||||
instanceKlass sun/util/locale/provider/ResourceBundleBasedAdapter
|
||||
instanceKlass sun/util/locale/provider/LocaleProviderAdapter$1
|
||||
instanceKlass sun/util/locale/provider/LocaleProviderAdapter
|
||||
instanceKlass java/util/spi/LocaleServiceProvider
|
||||
instanceKlass sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
|
||||
instanceKlass sun/util/calendar/ZoneInfoFile$1
|
||||
instanceKlass sun/util/calendar/ZoneInfoFile
|
||||
instanceKlass java/util/TimeZone
|
||||
instanceKlass java/util/Calendar
|
||||
instanceKlass java/text/AttributedCharacterIterator$Attribute
|
||||
instanceKlass com/google/inject/matcher/AbstractMatcher
|
||||
instanceKlass com/google/inject/matcher/Matcher
|
||||
instanceKlass com/google/inject/spi/TypeConverter
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$LoggerProvider
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$DefaultsModule
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$ContainerModule
|
||||
instanceKlass java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock
|
||||
instanceKlass java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock
|
||||
instanceKlass java/util/concurrent/locks/ReentrantReadWriteLock
|
||||
instanceKlass java/util/concurrent/locks/ReadWriteLock
|
||||
instanceKlass org/eclipse/sisu/inject/ImplicitBindings
|
||||
instanceKlass org/eclipse/sisu/inject/MildValues$InverseMapping
|
||||
instanceKlass org/eclipse/sisu/inject/MildValues
|
||||
instanceKlass org/eclipse/sisu/inject/Weak
|
||||
instanceKlass sun/reflect/misc/ReflectUtil
|
||||
instanceKlass java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
|
||||
instanceKlass java/util/concurrent/atomic/AtomicReferenceFieldUpdater
|
||||
instanceKlass org/eclipse/sisu/inject/RankedSequence$Content
|
||||
instanceKlass org/eclipse/sisu/inject/RankedSequence
|
||||
instanceKlass org/eclipse/sisu/inject/BindingSubscriber
|
||||
instanceKlass org/eclipse/sisu/inject/DefaultBeanLocator
|
||||
instanceKlass org/eclipse/sisu/inject/DeferredClass
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer$LoggerManagerProvider
|
||||
instanceKlass org/eclipse/sisu/inject/DeferredProvider
|
||||
instanceKlass com/google/inject/Provider
|
||||
instanceKlass com/google/inject/AbstractModule
|
||||
instanceKlass org/codehaus/plexus/context/Context
|
||||
instanceKlass org/eclipse/sisu/inject/BindingPublisher
|
||||
instanceKlass org/eclipse/sisu/inject/RankingFunction
|
||||
instanceKlass org/eclipse/sisu/space/ClassSpace
|
||||
instanceKlass javax/inject/Provider
|
||||
instanceKlass org/eclipse/sisu/bean/BeanManager
|
||||
instanceKlass org/eclipse/sisu/plexus/PlexusBeanLocator
|
||||
instanceKlass org/codehaus/plexus/classworlds/ClassWorldListener
|
||||
instanceKlass com/google/inject/Module
|
||||
instanceKlass org/eclipse/sisu/inject/MutableBeanLocator
|
||||
instanceKlass org/eclipse/sisu/inject/BeanLocator
|
||||
instanceKlass org/codehaus/plexus/DefaultPlexusContainer
|
||||
instanceKlass org/codehaus/plexus/MutablePlexusContainer
|
||||
instanceKlass java/util/stream/ReduceOps$AccumulatingSink
|
||||
instanceKlass java/util/stream/ReduceOps$Box
|
||||
instanceKlass java/util/stream/ReduceOps$ReduceOp
|
||||
instanceKlass java/util/stream/ReduceOps
|
||||
instanceKlass java/util/function/BinaryOperator
|
||||
instanceKlass java/util/stream/Collectors$CollectorImpl
|
||||
instanceKlass java/util/stream/Collector
|
||||
instanceKlass java/util/stream/Collectors
|
||||
instanceKlass sun/invoke/util/VerifyAccess$1
|
||||
instanceKlass java/util/HashMap$HashMapSpliterator
|
||||
instanceKlass org/apache/maven/extension/internal/CoreExports
|
||||
instanceKlass java/util/Collections$UnmodifiableCollection$1
|
||||
instanceKlass org/codehaus/plexus/DefaultContainerConfiguration
|
||||
instanceKlass org/codehaus/plexus/ContainerConfiguration
|
||||
instanceKlass org/codehaus/plexus/util/BaseIOUtil
|
||||
instanceKlass org/codehaus/plexus/util/xml/XMLWriter
|
||||
instanceKlass org/codehaus/plexus/util/xml/Xpp3Dom
|
||||
instanceKlass org/codehaus/plexus/util/xml/pull/MXParser
|
||||
instanceKlass org/codehaus/plexus/util/xml/pull/XmlPullParser
|
||||
instanceKlass org/codehaus/plexus/util/xml/Xpp3DomBuilder
|
||||
instanceKlass java/util/regex/ASCII
|
||||
instanceKlass org/codehaus/plexus/util/ReaderFactory
|
||||
instanceKlass org/apache/maven/project/ExtensionDescriptor
|
||||
instanceKlass org/apache/maven/project/ExtensionDescriptorBuilder
|
||||
instanceKlass org/apache/maven/extension/internal/CoreExtensionEntry
|
||||
instanceKlass org/codehaus/plexus/logging/Logger
|
||||
instanceKlass org/apache/maven/cli/logging/Slf4jLoggerManager
|
||||
instanceKlass org/slf4j/impl/MavenSlf4jSimpleFriend
|
||||
instanceKlass org/slf4j/MavenSlf4jFriend
|
||||
instanceKlass java/lang/Class$1
|
||||
instanceKlass org/apache/maven/cli/logging/BaseSlf4jConfiguration
|
||||
instanceKlass org/codehaus/plexus/util/PropertyUtils
|
||||
instanceKlass org/apache/maven/cli/logging/Slf4jConfiguration
|
||||
instanceKlass org/apache/maven/cli/logging/Slf4jConfigurationFactory
|
||||
instanceKlass org/slf4j/impl/OutputChoice
|
||||
instanceKlass sun/net/DefaultProgressMeteringPolicy
|
||||
instanceKlass sun/net/ProgressMeteringPolicy
|
||||
instanceKlass sun/net/ProgressMonitor
|
||||
instanceKlass org/slf4j/impl/SimpleLoggerConfiguration$1
|
||||
instanceKlass java/text/Format
|
||||
instanceKlass org/slf4j/impl/SimpleLoggerConfiguration
|
||||
instanceKlass org/slf4j/helpers/NamedLoggerBase
|
||||
instanceKlass org/slf4j/impl/SimpleLoggerFactory
|
||||
instanceKlass org/slf4j/impl/StaticLoggerBinder
|
||||
instanceKlass org/slf4j/spi/LoggerFactoryBinder
|
||||
instanceKlass java/util/Collections$3
|
||||
instanceKlass java/net/URLClassLoader$3$1
|
||||
instanceKlass java/net/URLClassLoader$3
|
||||
instanceKlass jdk/internal/loader/URLClassPath$1
|
||||
instanceKlass java/lang/CompoundEnumeration
|
||||
instanceKlass jdk/internal/loader/BuiltinClassLoader$1
|
||||
instanceKlass java/util/Collections$EmptyEnumeration
|
||||
instanceKlass org/slf4j/helpers/Util
|
||||
instanceKlass org/slf4j/helpers/NOPLoggerFactory
|
||||
instanceKlass java/util/concurrent/LinkedBlockingQueue$Node
|
||||
instanceKlass java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
|
||||
instanceKlass java/util/concurrent/locks/Condition
|
||||
instanceKlass java/util/concurrent/BlockingQueue
|
||||
instanceKlass org/slf4j/helpers/SubstituteLoggerFactory
|
||||
instanceKlass org/slf4j/ILoggerFactory
|
||||
instanceKlass org/slf4j/event/LoggingEvent
|
||||
instanceKlass org/slf4j/LoggerFactory
|
||||
instanceKlass java/util/LinkedList$ListItr
|
||||
instanceKlass org/codehaus/plexus/util/StringUtils
|
||||
instanceKlass org/apache/maven/cli/CLIReportingUtils
|
||||
instanceKlass java/util/function/BiConsumer
|
||||
instanceKlass org/codehaus/plexus/interpolation/SimpleRecursionInterceptor
|
||||
instanceKlass org/codehaus/plexus/interpolation/AbstractValueSource
|
||||
instanceKlass org/codehaus/plexus/interpolation/RecursionInterceptor
|
||||
instanceKlass org/codehaus/plexus/interpolation/StringSearchInterpolator
|
||||
instanceKlass org/codehaus/plexus/interpolation/Interpolator
|
||||
instanceKlass org/codehaus/plexus/interpolation/BasicInterpolator
|
||||
instanceKlass org/apache/maven/properties/internal/SystemProperties
|
||||
instanceKlass java/util/Collections$SynchronizedCollection
|
||||
instanceKlass java/util/Properties$EntrySet
|
||||
instanceKlass java/lang/ProcessEnvironment$StringEntry
|
||||
instanceKlass java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry
|
||||
instanceKlass java/lang/ProcessEnvironment$StringEntrySet$1
|
||||
instanceKlass java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1
|
||||
instanceKlass org/codehaus/plexus/util/Os
|
||||
instanceKlass org/apache/maven/properties/internal/EnvironmentUtils
|
||||
instanceKlass java/util/stream/Sink$ChainedReference
|
||||
instanceKlass java/util/stream/FindOps$FindOp
|
||||
instanceKlass java/util/stream/TerminalOp
|
||||
instanceKlass java/util/stream/FindOps$FindSink
|
||||
instanceKlass java/util/stream/TerminalSink
|
||||
instanceKlass java/util/stream/Sink
|
||||
instanceKlass java/util/stream/FindOps
|
||||
instanceKlass java/util/function/Predicate
|
||||
instanceKlass sun/reflect/annotation/AnnotationParser
|
||||
instanceKlass java/lang/Class$3
|
||||
instanceKlass java/util/EnumMap$1
|
||||
instanceKlass java/util/stream/StreamOpFlag$MaskBuilder
|
||||
instanceKlass java/util/stream/Stream
|
||||
instanceKlass java/util/stream/BaseStream
|
||||
instanceKlass java/util/stream/PipelineHelper
|
||||
instanceKlass java/util/stream/StreamSupport
|
||||
instanceKlass java/util/ArrayList$ArrayListSpliterator
|
||||
instanceKlass java/util/Spliterator
|
||||
instanceKlass java/util/AbstractList$Itr
|
||||
instanceKlass org/apache/commons/cli/DefaultParser
|
||||
instanceKlass org/apache/commons/cli/Util
|
||||
instanceKlass org/apache/commons/cli/CommandLine$Builder
|
||||
instanceKlass org/apache/commons/cli/CommandLine
|
||||
instanceKlass java/util/Collections$UnmodifiableCollection
|
||||
instanceKlass java/util/LinkedHashMap$LinkedHashIterator
|
||||
instanceKlass java/util/function/Consumer
|
||||
instanceKlass org/apache/commons/cli/Parser
|
||||
instanceKlass org/apache/maven/cli/CleanArgument
|
||||
instanceKlass org/apache/commons/cli/OptionValidator
|
||||
instanceKlass org/apache/commons/cli/Option$Builder
|
||||
instanceKlass org/apache/commons/cli/Option
|
||||
instanceKlass org/apache/commons/cli/Options
|
||||
instanceKlass org/apache/commons/cli/CommandLineParser
|
||||
instanceKlass org/apache/maven/cli/CLIManager
|
||||
instanceKlass org/apache/maven/cli/logging/Slf4jStdoutLogger
|
||||
instanceKlass org/eclipse/aether/DefaultRepositoryCache
|
||||
instanceKlass org/apache/maven/project/ProjectBuildingRequest
|
||||
instanceKlass org/apache/maven/execution/DefaultMavenExecutionRequest
|
||||
instanceKlass org/apache/maven/execution/MavenExecutionRequest
|
||||
instanceKlass java/lang/ApplicationShutdownHooks$1
|
||||
instanceKlass java/lang/ApplicationShutdownHooks
|
||||
instanceKlass org/fusesource/jansi/AnsiConsole$2
|
||||
instanceKlass java/lang/ProcessEnvironment$ExternalData
|
||||
instanceKlass java/lang/ProcessEnvironment
|
||||
instanceKlass jdk/internal/loader/NativeLibraries$Unloader
|
||||
instanceKlass java/lang/Shutdown$Lock
|
||||
instanceKlass java/lang/Shutdown
|
||||
instanceKlass java/io/DeleteOnExitHook$1
|
||||
instanceKlass java/io/DeleteOnExitHook
|
||||
instanceKlass sun/nio/fs/UnixChannelFactory$1
|
||||
instanceKlass java/io/FileOutputStream$1
|
||||
instanceKlass java/util/IdentityHashMap$IdentityHashMapIterator
|
||||
instanceKlass java/util/regex/IntHashSet
|
||||
instanceKlass java/util/regex/Matcher
|
||||
instanceKlass java/util/regex/MatchResult
|
||||
instanceKlass sun/nio/fs/UnixFileKey
|
||||
instanceKlass sun/net/www/protocol/jar/JarFileFactory
|
||||
instanceKlass sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
|
||||
instanceKlass java/util/Random
|
||||
instanceKlass java/util/random/RandomGenerator
|
||||
instanceKlass java/net/URLClassLoader$2
|
||||
instanceKlass jdk/internal/jimage/ImageLocation
|
||||
instanceKlass jdk/internal/jimage/decompressor/Decompressor
|
||||
instanceKlass jdk/internal/jimage/ImageStringsReader
|
||||
instanceKlass jdk/internal/jimage/ImageStrings
|
||||
instanceKlass java/util/Formattable
|
||||
instanceKlass java/util/Formatter$Flags
|
||||
instanceKlass java/util/Formatter$FormatSpecifier
|
||||
instanceKlass java/util/Formatter$Conversion
|
||||
instanceKlass java/util/Formatter$FixedString
|
||||
instanceKlass java/util/Formatter$FormatString
|
||||
instanceKlass jdk/internal/jimage/ImageHeader
|
||||
instanceKlass jdk/internal/jimage/NativeImageBuffer$1
|
||||
instanceKlass jdk/internal/jimage/NativeImageBuffer
|
||||
instanceKlass java/util/Formatter
|
||||
instanceKlass jdk/internal/jimage/BasicImageReader$1
|
||||
instanceKlass java/util/LinkedList$Node
|
||||
instanceKlass jdk/internal/jimage/BasicImageReader
|
||||
instanceKlass jdk/internal/jimage/ImageReader
|
||||
instanceKlass jdk/internal/jimage/ImageReaderFactory$1
|
||||
instanceKlass jdk/internal/jimage/ImageReaderFactory
|
||||
instanceKlass jdk/internal/module/SystemModuleFinders$SystemImage
|
||||
instanceKlass org/fusesource/jansi/internal/OSInfo
|
||||
instanceKlass jdk/internal/module/SystemModuleFinders$SystemModuleReader
|
||||
instanceKlass java/lang/module/ModuleReader
|
||||
instanceKlass jdk/internal/loader/BuiltinClassLoader$5
|
||||
instanceKlass jdk/internal/loader/BuiltinClassLoader$2
|
||||
instanceKlass jdk/internal/module/Resources
|
||||
instanceKlass org/fusesource/jansi/internal/JansiLoader$1
|
||||
instanceKlass org/fusesource/jansi/internal/JansiLoader
|
||||
instanceKlass org/fusesource/jansi/internal/CLibrary
|
||||
instanceKlass org/fusesource/jansi/io/AnsiProcessor
|
||||
instanceKlass org/fusesource/jansi/io/AnsiOutputStream$WidthSupplier
|
||||
instanceKlass org/fusesource/jansi/AnsiConsole
|
||||
instanceKlass java/util/concurrent/Callable
|
||||
instanceKlass org/fusesource/jansi/Ansi
|
||||
instanceKlass org/apache/maven/shared/utils/logging/LoggerLevelRenderer
|
||||
instanceKlass org/apache/maven/shared/utils/logging/MessageBuilder
|
||||
instanceKlass org/apache/maven/shared/utils/logging/MessageUtils
|
||||
instanceKlass java/util/regex/CharPredicates
|
||||
instanceKlass java/util/regex/Pattern$BitClass
|
||||
instanceKlass java/util/regex/Pattern$TreeInfo
|
||||
instanceKlass java/util/regex/Pattern$BmpCharPredicate
|
||||
instanceKlass java/util/regex/Pattern$CharPredicate
|
||||
instanceKlass java/util/regex/Pattern$Node
|
||||
instanceKlass java/util/regex/Pattern
|
||||
instanceKlass org/apache/maven/cli/CliRequest
|
||||
instanceKlass org/codehaus/plexus/interpolation/ValueSource
|
||||
instanceKlass org/apache/maven/execution/ExecutionListener
|
||||
instanceKlass org/eclipse/aether/transfer/TransferListener
|
||||
instanceKlass org/apache/maven/toolchain/building/ToolchainsBuildingRequest
|
||||
instanceKlass org/apache/maven/building/Source
|
||||
instanceKlass org/codehaus/plexus/logging/LoggerManager
|
||||
instanceKlass org/slf4j/Logger
|
||||
instanceKlass org/apache/maven/eventspy/EventSpy$Context
|
||||
instanceKlass org/codehaus/plexus/PlexusContainer
|
||||
instanceKlass org/apache/maven/exception/ExceptionHandler
|
||||
instanceKlass org/eclipse/aether/RepositoryCache
|
||||
instanceKlass org/apache/maven/cli/MavenCli
|
||||
instanceKlass java/io/FilePermissionCollection$1
|
||||
instanceKlass java/util/function/BiFunction
|
||||
instanceKlass java/security/Security$2
|
||||
instanceKlass jdk/internal/access/JavaSecurityPropertiesAccess
|
||||
instanceKlass java/util/concurrent/ConcurrentHashMap$MapEntry
|
||||
instanceKlass java/io/FileInputStream$1
|
||||
instanceKlass java/util/Properties$LineReader
|
||||
instanceKlass java/security/Security$1
|
||||
instanceKlass java/security/Security
|
||||
instanceKlass sun/security/util/SecurityProperties
|
||||
instanceKlass sun/security/util/FilePermCompat
|
||||
instanceKlass java/io/FilePermission$1
|
||||
instanceKlass jdk/internal/access/JavaIOFilePermissionAccess
|
||||
instanceKlass sun/net/www/MessageHeader
|
||||
instanceKlass java/net/URLConnection
|
||||
instanceKlass java/util/TreeMap$Entry
|
||||
instanceKlass java/io/RandomAccessFile$1
|
||||
instanceKlass java/net/URLClassLoader$1
|
||||
instanceKlass java/util/TreeMap$PrivateEntryIterator
|
||||
instanceKlass java/util/TimSort
|
||||
instanceKlass java/util/Arrays$LegacyMergeSort
|
||||
instanceKlass java/lang/invoke/LambdaFormBuffer
|
||||
instanceKlass java/lang/invoke/LambdaFormEditor$TransformKey
|
||||
instanceKlass java/lang/invoke/LambdaFormEditor
|
||||
instanceKlass sun/invoke/util/Wrapper$1
|
||||
instanceKlass java/lang/invoke/DelegatingMethodHandle$Holder
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle$2
|
||||
instanceKlass java/lang/invoke/ClassSpecializer$Factory
|
||||
instanceKlass java/lang/invoke/ClassSpecializer$SpeciesData
|
||||
instanceKlass java/lang/invoke/ClassSpecializer$1
|
||||
instanceKlass java/lang/invoke/ClassSpecializer
|
||||
instanceKlass java/lang/invoke/InnerClassLambdaMetafactory$1
|
||||
instanceKlass jdk/internal/org/objectweb/asm/ClassReader
|
||||
instanceKlass java/lang/invoke/LambdaProxyClassArchive
|
||||
instanceKlass java/lang/invoke/InfoFromMemberName
|
||||
instanceKlass java/lang/invoke/MethodHandleInfo
|
||||
instanceKlass jdk/internal/org/objectweb/asm/ConstantDynamic
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Handle
|
||||
instanceKlass sun/security/action/GetBooleanAction
|
||||
instanceKlass java/lang/invoke/AbstractValidatingLambdaMetafactory
|
||||
instanceKlass java/lang/invoke/MethodHandleImpl$1
|
||||
instanceKlass jdk/internal/access/JavaLangInvokeAccess
|
||||
instanceKlass java/lang/invoke/Invokers$Holder
|
||||
instanceKlass java/lang/invoke/BootstrapMethodInvoker
|
||||
instanceKlass java/lang/invoke/MethodHandles$Lookup$ClassDefiner
|
||||
instanceKlass java/lang/invoke/MethodHandles$Lookup$ClassFile
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Handler
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Attribute
|
||||
instanceKlass jdk/internal/org/objectweb/asm/FieldVisitor
|
||||
instanceKlass sun/invoke/empty/Empty
|
||||
instanceKlass sun/invoke/util/VerifyType
|
||||
instanceKlass java/lang/invoke/InvokerBytecodeGenerator$ClassData
|
||||
instanceKlass jdk/internal/org/objectweb/asm/AnnotationVisitor
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Frame
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Label
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Type
|
||||
instanceKlass jdk/internal/org/objectweb/asm/MethodVisitor
|
||||
instanceKlass sun/invoke/util/BytecodeDescriptor
|
||||
instanceKlass jdk/internal/org/objectweb/asm/ByteVector
|
||||
instanceKlass jdk/internal/org/objectweb/asm/Symbol
|
||||
instanceKlass jdk/internal/org/objectweb/asm/SymbolTable
|
||||
instanceKlass jdk/internal/org/objectweb/asm/ClassVisitor
|
||||
instanceKlass java/io/FilenameFilter
|
||||
instanceKlass java/lang/invoke/InvokerBytecodeGenerator$2
|
||||
instanceKlass java/lang/invoke/InvokerBytecodeGenerator
|
||||
instanceKlass java/lang/invoke/LambdaForm$Holder
|
||||
instanceKlass java/lang/invoke/LambdaForm$Name
|
||||
instanceKlass java/lang/reflect/Array
|
||||
instanceKlass java/lang/invoke/Invokers
|
||||
instanceKlass java/lang/invoke/MethodHandleImpl
|
||||
instanceKlass sun/invoke/util/ValueConversions
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle$Holder
|
||||
instanceKlass java/lang/invoke/LambdaForm$NamedFunction
|
||||
instanceKlass sun/invoke/util/Wrapper$Format
|
||||
instanceKlass java/lang/invoke/MethodTypeForm
|
||||
instanceKlass java/lang/invoke/MethodType$ConcurrentWeakInternSet
|
||||
instanceKlass java/lang/invoke/LambdaMetafactory
|
||||
instanceKlass java/util/ArrayList$Itr
|
||||
instanceKlass org/codehaus/plexus/classworlds/strategy/AbstractStrategy
|
||||
instanceKlass org/codehaus/plexus/classworlds/strategy/Strategy
|
||||
instanceKlass org/codehaus/plexus/classworlds/strategy/StrategyFactory
|
||||
instanceKlass java/util/NavigableMap
|
||||
instanceKlass java/util/SortedMap
|
||||
instanceKlass java/util/NavigableSet
|
||||
instanceKlass java/util/SortedSet
|
||||
instanceKlass java/lang/StringUTF16
|
||||
instanceKlass sun/nio/ch/IOStatus
|
||||
instanceKlass java/nio/DirectByteBuffer$Deallocator
|
||||
instanceKlass sun/nio/ch/Util$BufferCache
|
||||
instanceKlass sun/nio/ch/Util
|
||||
instanceKlass sun/nio/ch/NativeThread
|
||||
instanceKlass java/nio/charset/CoderResult
|
||||
instanceKlass java/nio/charset/CharsetDecoder
|
||||
instanceKlass java/nio/charset/StandardCharsets
|
||||
instanceKlass java/io/Reader
|
||||
instanceKlass java/lang/Readable
|
||||
instanceKlass org/codehaus/plexus/classworlds/launcher/ConfigurationParser
|
||||
instanceKlass org/codehaus/plexus/classworlds/launcher/Configurator
|
||||
instanceKlass org/codehaus/plexus/classworlds/launcher/ConfigurationHandler
|
||||
instanceKlass java/nio/channels/Channels
|
||||
instanceKlass sun/nio/ch/FileChannelImpl$Closer
|
||||
instanceKlass sun/nio/ch/NativeDispatcher
|
||||
instanceKlass sun/nio/ch/NativeThreadSet
|
||||
instanceKlass sun/nio/ch/IOUtil
|
||||
instanceKlass java/nio/channels/spi/AbstractInterruptibleChannel
|
||||
instanceKlass java/nio/channels/InterruptibleChannel
|
||||
instanceKlass java/nio/channels/ScatteringByteChannel
|
||||
instanceKlass java/nio/channels/GatheringByteChannel
|
||||
instanceKlass java/nio/channels/SeekableByteChannel
|
||||
instanceKlass java/nio/channels/ByteChannel
|
||||
instanceKlass java/nio/channels/WritableByteChannel
|
||||
instanceKlass java/nio/channels/ReadableByteChannel
|
||||
instanceKlass java/nio/channels/Channel
|
||||
instanceKlass java/util/Collections$EmptyIterator
|
||||
instanceKlass sun/nio/fs/UnixChannelFactory$Flags
|
||||
instanceKlass sun/nio/fs/UnixChannelFactory
|
||||
instanceKlass sun/nio/fs/UnixFileModeAttribute
|
||||
instanceKlass java/nio/file/attribute/FileAttribute
|
||||
instanceKlass java/net/URI$Parser
|
||||
instanceKlass java/nio/file/FileSystems$DefaultFileSystemHolder$1
|
||||
instanceKlass java/nio/file/FileSystems$DefaultFileSystemHolder
|
||||
instanceKlass java/nio/file/FileSystems
|
||||
instanceKlass java/nio/file/Paths
|
||||
instanceKlass java/lang/Void
|
||||
instanceKlass java/lang/PublicMethods$Key
|
||||
instanceKlass java/lang/PublicMethods$MethodList
|
||||
instanceKlass org/codehaus/plexus/classworlds/ClassWorld
|
||||
instanceKlass java/lang/Class$Atomic
|
||||
instanceKlass java/lang/Class$ReflectionData
|
||||
instanceKlass org/codehaus/plexus/classworlds/launcher/Launcher
|
||||
instanceKlass java/security/SecureClassLoader$DebugHolder
|
||||
instanceKlass java/security/PermissionCollection
|
||||
instanceKlass java/security/SecureClassLoader$1
|
||||
instanceKlass java/security/SecureClassLoader$CodeSourceKey
|
||||
instanceKlass java/util/zip/Checksum$1
|
||||
instanceKlass java/util/zip/CRC32
|
||||
instanceKlass java/util/zip/Checksum
|
||||
instanceKlass sun/nio/ByteBuffered
|
||||
instanceKlass java/lang/Package$VersionInfo
|
||||
instanceKlass java/lang/NamedPackage
|
||||
instanceKlass java/util/jar/Attributes
|
||||
instanceKlass jdk/internal/loader/Resource
|
||||
instanceKlass sun/security/action/GetIntegerAction
|
||||
instanceKlass sun/security/util/Debug
|
||||
instanceKlass sun/security/util/SignatureFileVerifier
|
||||
instanceKlass java/util/zip/ZipFile$InflaterCleanupAction
|
||||
instanceKlass java/util/zip/Inflater$InflaterZStreamRef
|
||||
instanceKlass java/util/zip/Inflater
|
||||
instanceKlass java/util/zip/ZipEntry
|
||||
instanceKlass jdk/internal/util/jar/JarIndex
|
||||
instanceKlass java/nio/Bits$1
|
||||
instanceKlass jdk/internal/misc/VM$BufferPool
|
||||
instanceKlass java/nio/Bits
|
||||
instanceKlass sun/nio/ch/DirectBuffer
|
||||
instanceKlass jdk/internal/perf/PerfCounter$CoreCounters
|
||||
instanceKlass jdk/internal/perf/Perf
|
||||
instanceKlass jdk/internal/perf/Perf$GetPerfAction
|
||||
instanceKlass jdk/internal/perf/PerfCounter
|
||||
instanceKlass java/nio/file/attribute/FileTime
|
||||
instanceKlass java/util/zip/ZipUtils
|
||||
instanceKlass java/util/zip/ZipFile$Source$End
|
||||
instanceKlass java/io/RandomAccessFile$2
|
||||
instanceKlass jdk/internal/access/JavaIORandomAccessFileAccess
|
||||
instanceKlass java/io/RandomAccessFile
|
||||
instanceKlass java/io/DataInput
|
||||
instanceKlass java/io/DataOutput
|
||||
instanceKlass sun/nio/fs/UnixFileAttributes$UnixAsBasicFileAttributes
|
||||
instanceKlass sun/nio/fs/NativeBuffer$Deallocator
|
||||
instanceKlass sun/nio/fs/NativeBuffer
|
||||
instanceKlass java/lang/ThreadLocal$ThreadLocalMap
|
||||
instanceKlass sun/nio/fs/NativeBuffers
|
||||
instanceKlass sun/nio/fs/AbstractBasicFileAttributeView
|
||||
instanceKlass sun/nio/fs/DynamicFileAttributeView
|
||||
instanceKlass sun/nio/fs/UnixFileAttributeViews
|
||||
instanceKlass java/nio/file/attribute/UserDefinedFileAttributeView
|
||||
instanceKlass java/nio/file/attribute/DosFileAttributeView
|
||||
instanceKlass java/nio/file/attribute/BasicFileAttributeView
|
||||
instanceKlass java/nio/file/attribute/FileAttributeView
|
||||
instanceKlass java/nio/file/attribute/AttributeView
|
||||
instanceKlass java/nio/file/attribute/DosFileAttributes
|
||||
instanceKlass java/nio/file/Files
|
||||
instanceKlass java/nio/file/CopyOption
|
||||
instanceKlass java/util/zip/ZipFile$Source$Key
|
||||
instanceKlass sun/nio/fs/UnixMountEntry
|
||||
instanceKlass sun/nio/fs/UnixFileStoreAttributes
|
||||
instanceKlass sun/nio/fs/UnixFileAttributes
|
||||
instanceKlass java/nio/file/attribute/PosixFileAttributes
|
||||
instanceKlass java/nio/file/attribute/BasicFileAttributes
|
||||
instanceKlass java/util/Enumeration
|
||||
instanceKlass java/util/concurrent/ConcurrentHashMap$Traverser
|
||||
instanceKlass java/util/concurrent/ConcurrentHashMap$CollectionView
|
||||
instanceKlass jdk/internal/loader/NativeLibraries$NativeLibraryImpl
|
||||
instanceKlass jdk/internal/loader/NativeLibrary
|
||||
instanceKlass java/util/ArrayDeque$DeqIterator
|
||||
instanceKlass jdk/internal/loader/NativeLibraries$1
|
||||
instanceKlass jdk/internal/loader/NativeLibraries$LibraryPaths
|
||||
instanceKlass sun/nio/fs/UnixNativeDispatcher
|
||||
instanceKlass sun/nio/fs/Util
|
||||
instanceKlass sun/nio/fs/UnixPath
|
||||
instanceKlass java/nio/file/Path
|
||||
instanceKlass java/nio/file/Watchable
|
||||
instanceKlass java/nio/file/FileSystem
|
||||
instanceKlass java/nio/file/OpenOption
|
||||
instanceKlass java/nio/file/spi/FileSystemProvider
|
||||
instanceKlass sun/nio/fs/DefaultFileSystemProvider
|
||||
instanceKlass java/util/zip/ZipFile$Source
|
||||
instanceKlass java/lang/ref/Cleaner$Cleanable
|
||||
instanceKlass jdk/internal/ref/CleanerImpl
|
||||
instanceKlass java/lang/ref/Cleaner$1
|
||||
instanceKlass java/lang/ref/Cleaner
|
||||
instanceKlass jdk/internal/ref/CleanerFactory$1
|
||||
instanceKlass java/util/concurrent/ThreadFactory
|
||||
instanceKlass jdk/internal/ref/CleanerFactory
|
||||
instanceKlass java/util/zip/ZipCoder
|
||||
instanceKlass java/util/zip/ZipFile$CleanableResource
|
||||
instanceKlass java/lang/Runtime$Version
|
||||
instanceKlass java/util/jar/JavaUtilJarAccessImpl
|
||||
instanceKlass jdk/internal/access/JavaUtilJarAccess
|
||||
instanceKlass jdk/internal/loader/FileURLMapper
|
||||
instanceKlass jdk/internal/loader/URLClassPath$JarLoader$1
|
||||
instanceKlass java/util/zip/ZipFile$1
|
||||
instanceKlass jdk/internal/access/JavaUtilZipFileAccess
|
||||
instanceKlass java/util/zip/ZipFile
|
||||
instanceKlass java/util/zip/ZipConstants
|
||||
instanceKlass jdk/internal/loader/URLClassPath$Loader
|
||||
instanceKlass jdk/internal/loader/URLClassPath$3
|
||||
instanceKlass java/security/PrivilegedExceptionAction
|
||||
instanceKlass sun/util/locale/LocaleUtils
|
||||
instanceKlass java/util/Locale
|
||||
instanceKlass sun/net/util/URLUtil
|
||||
instanceKlass java/lang/StringCoding
|
||||
instanceKlass sun/launcher/LauncherHelper
|
||||
instanceKlass java/lang/invoke/StringConcatFactory$3
|
||||
instanceKlass java/lang/invoke/StringConcatFactory$2
|
||||
instanceKlass java/lang/invoke/StringConcatFactory$1
|
||||
instanceKlass java/lang/invoke/StringConcatFactory
|
||||
instanceKlass java/lang/ModuleLayer$Controller
|
||||
instanceKlass java/util/concurrent/CopyOnWriteArrayList
|
||||
instanceKlass jdk/internal/module/ServicesCatalog$ServiceProvider
|
||||
instanceKlass jdk/internal/loader/AbstractClassLoaderValue$Memoizer
|
||||
instanceKlass jdk/internal/module/ModuleLoaderMap
|
||||
instanceKlass java/util/ImmutableCollections$ListItr
|
||||
instanceKlass java/util/ListIterator
|
||||
instanceKlass java/util/ImmutableCollections$Set12$1
|
||||
instanceKlass java/util/ImmutableCollections$SetN$SetNIterator
|
||||
instanceKlass jdk/internal/loader/BuiltinClassLoader$LoadedModule
|
||||
instanceKlass jdk/internal/loader/BootLoader
|
||||
instanceKlass java/util/Optional
|
||||
instanceKlass jdk/internal/loader/AbstractClassLoaderValue
|
||||
instanceKlass jdk/internal/module/ServicesCatalog
|
||||
instanceKlass jdk/internal/util/Preconditions
|
||||
instanceKlass sun/net/util/IPAddressUtil
|
||||
instanceKlass java/net/URLStreamHandler
|
||||
instanceKlass java/util/HexFormat
|
||||
instanceKlass sun/net/www/ParseUtil
|
||||
instanceKlass java/net/URL$3
|
||||
instanceKlass jdk/internal/access/JavaNetURLAccess
|
||||
instanceKlass java/net/URL$DefaultFactory
|
||||
instanceKlass java/net/URLStreamHandlerFactory
|
||||
instanceKlass jdk/internal/loader/URLClassPath
|
||||
instanceKlass java/util/Deque
|
||||
instanceKlass java/util/Queue
|
||||
instanceKlass jdk/internal/loader/ClassLoaderHelper
|
||||
instanceKlass jdk/internal/loader/NativeLibraries
|
||||
instanceKlass java/security/Principal
|
||||
instanceKlass java/security/ProtectionDomain$Key
|
||||
instanceKlass java/security/ProtectionDomain$JavaSecurityAccessImpl
|
||||
instanceKlass jdk/internal/access/JavaSecurityAccess
|
||||
instanceKlass java/lang/ClassLoader$ParallelLoaders
|
||||
instanceKlass java/security/cert/Certificate
|
||||
instanceKlass jdk/internal/loader/ArchivedClassLoaders
|
||||
instanceKlass java/net/URI$1
|
||||
instanceKlass jdk/internal/access/JavaNetUriAccess
|
||||
instanceKlass jdk/internal/module/ArchivedBootLayer
|
||||
instanceKlass jdk/internal/module/ModuleBootstrap$Counters
|
||||
instanceKlass jdk/internal/module/ModulePatcher
|
||||
instanceKlass jdk/internal/util/ArraysSupport
|
||||
instanceKlass java/io/FileSystem
|
||||
instanceKlass java/io/DefaultFileSystem
|
||||
instanceKlass java/io/File
|
||||
instanceKlass java/lang/module/ModuleDescriptor$1
|
||||
instanceKlass jdk/internal/access/JavaLangModuleAccess
|
||||
instanceKlass java/lang/reflect/Modifier
|
||||
instanceKlass sun/invoke/util/VerifyAccess
|
||||
instanceKlass jdk/internal/module/ModuleBootstrap
|
||||
instanceKlass sun/security/action/GetPropertyAction
|
||||
instanceKlass java/lang/invoke/MethodHandleStatics
|
||||
instanceKlass java/util/Collections
|
||||
instanceKlass jdk/internal/misc/OSEnvironment
|
||||
instanceKlass jdk/internal/misc/Signal$NativeHandler
|
||||
instanceKlass java/util/Hashtable$Entry
|
||||
instanceKlass jdk/internal/misc/Signal
|
||||
instanceKlass java/lang/Terminator$1
|
||||
instanceKlass jdk/internal/misc/Signal$Handler
|
||||
instanceKlass java/lang/Terminator
|
||||
instanceKlass java/nio/ByteOrder
|
||||
instanceKlass java/nio/Buffer$1
|
||||
instanceKlass jdk/internal/access/JavaNioAccess
|
||||
instanceKlass jdk/internal/misc/ScopedMemoryAccess
|
||||
instanceKlass java/nio/charset/CodingErrorAction
|
||||
instanceKlass java/nio/charset/CharsetEncoder
|
||||
instanceKlass java/io/Writer
|
||||
instanceKlass sun/nio/cs/HistoricallyNamedCharset
|
||||
instanceKlass java/lang/ThreadLocal
|
||||
instanceKlass java/nio/charset/spi/CharsetProvider
|
||||
instanceKlass java/nio/charset/Charset
|
||||
instanceKlass java/io/OutputStream
|
||||
instanceKlass java/io/Flushable
|
||||
instanceKlass java/io/FileDescriptor$1
|
||||
instanceKlass jdk/internal/access/JavaIOFileDescriptorAccess
|
||||
instanceKlass java/io/FileDescriptor
|
||||
instanceKlass jdk/internal/util/StaticProperty
|
||||
instanceKlass java/util/HashMap$HashIterator
|
||||
instanceKlass java/lang/CharacterData
|
||||
instanceKlass java/util/Arrays
|
||||
instanceKlass java/lang/VersionProps
|
||||
instanceKlass java/lang/StringConcatHelper
|
||||
instanceKlass jdk/internal/misc/VM
|
||||
instanceKlass jdk/internal/util/SystemProps$Raw
|
||||
instanceKlass jdk/internal/util/SystemProps
|
||||
instanceKlass java/lang/System$2
|
||||
instanceKlass jdk/internal/access/JavaLangAccess
|
||||
instanceKlass java/lang/ref/Reference$1
|
||||
instanceKlass jdk/internal/access/JavaLangRefAccess
|
||||
instanceKlass java/lang/ref/ReferenceQueue$Lock
|
||||
instanceKlass java/lang/ref/ReferenceQueue
|
||||
instanceKlass jdk/internal/reflect/ReflectionFactory
|
||||
instanceKlass jdk/internal/reflect/ReflectionFactory$GetReflectionFactoryAction
|
||||
instanceKlass java/security/PrivilegedAction
|
||||
instanceKlass java/util/concurrent/locks/LockSupport
|
||||
instanceKlass java/util/concurrent/ConcurrentHashMap$Node
|
||||
instanceKlass java/util/concurrent/ConcurrentHashMap$CounterCell
|
||||
instanceKlass java/util/concurrent/locks/ReentrantLock
|
||||
instanceKlass java/util/concurrent/locks/Lock
|
||||
instanceKlass java/lang/Runtime
|
||||
instanceKlass java/util/KeyValueHolder
|
||||
instanceKlass java/util/ImmutableCollections$MapN$MapNIterator
|
||||
instanceKlass java/lang/Math
|
||||
instanceKlass jdk/internal/reflect/Reflection
|
||||
instanceKlass java/lang/invoke/MethodHandles$Lookup
|
||||
instanceKlass java/lang/StringLatin1
|
||||
instanceKlass java/security/Permission
|
||||
instanceKlass java/security/Guard
|
||||
instanceKlass java/lang/invoke/MemberName$Factory
|
||||
instanceKlass java/lang/invoke/MethodHandles
|
||||
instanceKlass jdk/internal/access/SharedSecrets
|
||||
instanceKlass java/lang/reflect/ReflectAccess
|
||||
instanceKlass jdk/internal/access/JavaLangReflectAccess
|
||||
instanceKlass java/util/Objects
|
||||
instanceKlass jdk/internal/misc/CDS
|
||||
instanceKlass java/lang/Module$ArchivedData
|
||||
instanceKlass java/lang/String$CaseInsensitiveComparator
|
||||
instanceKlass java/util/Comparator
|
||||
instanceKlass java/io/ObjectStreamField
|
||||
instanceKlass jdk/internal/math/FDBigInteger
|
||||
instanceKlass java/lang/ModuleLayer
|
||||
instanceKlass java/util/ImmutableCollections
|
||||
instanceKlass jdk/internal/module/ModuleLoaderMap$Mapper
|
||||
instanceKlass java/util/function/Function
|
||||
instanceKlass java/lang/module/ResolvedModule
|
||||
instanceKlass java/lang/module/Configuration
|
||||
instanceKlass java/util/HashMap$Node
|
||||
instanceKlass java/util/Map$Entry
|
||||
instanceKlass java/util/Collections$UnmodifiableMap
|
||||
instanceKlass jdk/internal/module/ModuleHashes
|
||||
instanceKlass jdk/internal/module/ModuleTarget
|
||||
instanceKlass java/lang/module/ModuleDescriptor$Opens
|
||||
instanceKlass java/lang/module/ModuleDescriptor$Provides
|
||||
instanceKlass jdk/internal/module/SystemModuleFinders$3
|
||||
instanceKlass jdk/internal/module/ModuleHashes$HashSupplier
|
||||
instanceKlass jdk/internal/module/SystemModuleFinders$2
|
||||
instanceKlass java/util/function/Supplier
|
||||
instanceKlass java/net/URI
|
||||
instanceKlass java/lang/module/ModuleDescriptor$Exports
|
||||
instanceKlass java/lang/Enum
|
||||
instanceKlass java/lang/module/ModuleDescriptor$Requires
|
||||
instanceKlass java/lang/module/ModuleDescriptor$Version
|
||||
instanceKlass java/lang/module/ModuleDescriptor
|
||||
instanceKlass java/lang/module/ModuleReference
|
||||
instanceKlass java/util/Set
|
||||
instanceKlass jdk/internal/module/SystemModuleFinders$SystemModuleFinder
|
||||
instanceKlass java/lang/module/ModuleFinder
|
||||
instanceKlass jdk/internal/module/ArchivedModuleGraph
|
||||
instanceKlass sun/util/locale/BaseLocale
|
||||
instanceKlass java/util/jar/Attributes$Name
|
||||
instanceKlass java/lang/Character$CharacterCache
|
||||
instanceKlass java/lang/Short$ShortCache
|
||||
instanceKlass java/lang/Byte$ByteCache
|
||||
instanceKlass java/lang/Long$LongCache
|
||||
instanceKlass java/lang/Integer$IntegerCache
|
||||
instanceKlass jdk/internal/vm/vector/VectorSupport$VectorPayload
|
||||
instanceKlass jdk/internal/vm/vector/VectorSupport
|
||||
instanceKlass java/lang/reflect/RecordComponent
|
||||
instanceKlass java/util/Iterator
|
||||
instanceKlass java/lang/Number
|
||||
instanceKlass java/lang/Character
|
||||
instanceKlass java/lang/Boolean
|
||||
instanceKlass java/util/concurrent/locks/AbstractOwnableSynchronizer
|
||||
instanceKlass java/lang/LiveStackFrame
|
||||
instanceKlass java/lang/StackFrameInfo
|
||||
instanceKlass java/lang/StackWalker$StackFrame
|
||||
instanceKlass java/lang/StackStreamFactory$AbstractStackWalker
|
||||
instanceKlass java/lang/StackWalker
|
||||
instanceKlass java/nio/Buffer
|
||||
instanceKlass java/lang/StackTraceElement
|
||||
instanceKlass java/util/RandomAccess
|
||||
instanceKlass java/util/List
|
||||
instanceKlass java/util/AbstractCollection
|
||||
instanceKlass java/util/Collection
|
||||
instanceKlass java/lang/Iterable
|
||||
instanceKlass java/util/concurrent/ConcurrentMap
|
||||
instanceKlass java/util/AbstractMap
|
||||
instanceKlass java/security/CodeSource
|
||||
instanceKlass jdk/internal/loader/ClassLoaders
|
||||
instanceKlass java/util/jar/Manifest
|
||||
instanceKlass java/net/URL
|
||||
instanceKlass java/io/InputStream
|
||||
instanceKlass java/io/Closeable
|
||||
instanceKlass java/lang/AutoCloseable
|
||||
instanceKlass jdk/internal/module/Modules
|
||||
instanceKlass jdk/internal/misc/Unsafe
|
||||
instanceKlass jdk/internal/misc/UnsafeConstants
|
||||
instanceKlass java/lang/AbstractStringBuilder
|
||||
instanceKlass java/lang/Appendable
|
||||
instanceKlass java/lang/AssertionStatusDirectives
|
||||
instanceKlass java/lang/invoke/MethodHandleNatives$CallSiteContext
|
||||
instanceKlass jdk/internal/invoke/NativeEntryPoint
|
||||
instanceKlass java/lang/invoke/CallSite
|
||||
instanceKlass java/lang/invoke/MethodType
|
||||
instanceKlass java/lang/invoke/TypeDescriptor$OfMethod
|
||||
instanceKlass java/lang/invoke/LambdaForm
|
||||
instanceKlass java/lang/invoke/MethodHandleNatives
|
||||
instanceKlass java/lang/invoke/ResolvedMethodName
|
||||
instanceKlass java/lang/invoke/MemberName
|
||||
instanceKlass java/lang/invoke/VarHandle
|
||||
instanceKlass java/lang/invoke/MethodHandle
|
||||
instanceKlass jdk/internal/reflect/CallerSensitive
|
||||
instanceKlass java/lang/annotation/Annotation
|
||||
instanceKlass jdk/internal/reflect/FieldAccessor
|
||||
instanceKlass jdk/internal/reflect/ConstantPool
|
||||
instanceKlass jdk/internal/reflect/ConstructorAccessor
|
||||
instanceKlass jdk/internal/reflect/MethodAccessor
|
||||
instanceKlass jdk/internal/reflect/MagicAccessorImpl
|
||||
instanceKlass java/lang/reflect/Parameter
|
||||
instanceKlass java/lang/reflect/Member
|
||||
instanceKlass java/lang/reflect/AccessibleObject
|
||||
instanceKlass java/lang/Module
|
||||
instanceKlass java/util/Map
|
||||
instanceKlass java/util/Dictionary
|
||||
instanceKlass java/lang/ThreadGroup
|
||||
instanceKlass java/lang/Thread$UncaughtExceptionHandler
|
||||
instanceKlass java/lang/Thread
|
||||
instanceKlass java/lang/Runnable
|
||||
instanceKlass java/lang/ref/Reference
|
||||
instanceKlass java/lang/Record
|
||||
instanceKlass java/security/AccessController
|
||||
instanceKlass java/security/AccessControlContext
|
||||
instanceKlass java/security/ProtectionDomain
|
||||
instanceKlass java/lang/SecurityManager
|
||||
instanceKlass java/lang/Throwable
|
||||
instanceKlass java/lang/System
|
||||
instanceKlass java/lang/ClassLoader
|
||||
instanceKlass java/lang/Cloneable
|
||||
instanceKlass java/lang/Class
|
||||
instanceKlass java/lang/invoke/TypeDescriptor$OfField
|
||||
instanceKlass java/lang/invoke/TypeDescriptor
|
||||
instanceKlass java/lang/reflect/Type
|
||||
instanceKlass java/lang/reflect/GenericDeclaration
|
||||
instanceKlass java/lang/reflect/AnnotatedElement
|
||||
instanceKlass java/lang/String
|
||||
instanceKlass java/lang/constant/ConstantDesc
|
||||
instanceKlass java/lang/constant/Constable
|
||||
instanceKlass java/lang/CharSequence
|
||||
instanceKlass java/lang/Comparable
|
||||
instanceKlass java/io/Serializable
|
||||
ciInstanceKlass java/lang/Object 1 1 92 7 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 8 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 1 100 1 8 1 10 12 1 3 8 1 100 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 7 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1
|
||||
ciMethod java/lang/Object equals (Ljava/lang/Object;)Z 580 0 6166 0 -1
|
||||
ciMethod java/lang/Object hashCode ()I 256 0 128 0 -1
|
||||
ciInstanceKlass java/lang/Class 1 1 1600 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 7 1 10 10 12 1 1 8 1 10 12 1 8 1 8 1 10 12 1 1 10 12 1 1 10 12 1 10 10 12 1 10 12 1 1 10 12 1 1 10 7 12 1 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 8 1 10 12 1 8 1 8 1 10 12 1 1 10 100 12 1 1 1 18 12 1 1 11 100 12 1 1 1 8 1 8 1 8 1 10 100 12 1 1 1 11 12 1 1 7 1 8 1 10 12 1 11 100 12 1 1 1 10 12 1 1 11 8 1 18 8 1 10 12 1 10 7 12 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 10 7 12 1 1 1 10 12 1 1 18 12 1 1 10 7 12 1 1 1 10 7 12 1 1 10 12 1 1 10 7 1 100 1 10 12 1 1 9 12 1 1 100 1 8 1 10 12 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 7 1 10 12 1 7 1 100 1 10 10 12 1 1 10 12 1 1 100 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 10 12 1 10 12 1 1 9 12 1 1 9 12 1 1 10 12 1 1 10 7 1 10 12 1 10 12 1 10 12 1 1 10 9 12 1 10 12 1 8 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 9 7 12 1 1 1 10 7 12 1 1 10 12 10 12 1 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 7 1 10 10 10 12 1 1 10 12 1 1 10 12 10 12 1 1 100 1 8 1 10 10 12 1 1 10 12 1 100 1 11 12 1 10 100 12 1 1 10 12 1 10 12 1 10 100 12 1 1 10 10 12 1 1 8 1 10 12 1 10 12 1 1 8 1 9 12 1 10 12 1 10 12 1 10 12 1 10 12 100 1 9 12 1 10 12 1 9 12 1 10 12 1 10 12 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 100 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 100 1 10 10 12 1 1 10 12 1 1 10 12 1 1 10 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 11 100 12 1 1 10 12 1 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 10 12 1 1 100 1 10 10 12 1 1 10 100 12 1 1 1 100 1 100 1 10 12 1 1 10 12 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 11 7 12 1 1 10 12 1 10 12 1 9 12 1 10 12 1 1 10 12 1 9 100 12 1 1 1 9 12 1 10 100 12 1 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 10 12 10 12 1 1 100 1 10 8 1 10 12 1 11 11 12 1 1 11 7 12 1 1 11 12 1 8 1 10 12 1 10 12 1 1 9 12 1 9 12 1 1 10 7 12 1 1 9 12 1 10 12 1 1 10 10 12 1 10 7 12 1 1 1 10 7 12 1 1 10 7 12 1 1 9 12 1 1 10 12 1 9 12 1 10 12 1 10 12 1 1 9 12 1 1 9 12 1 10 12 1 10 12 1 1 9 12 1 100 1 10 10 12 1 1 7 1 10 12 1 1 100 11 100 1 9 12 1 1 9 12 1 100 1 10 12 1 9 12 1 1 9 12 1 10 12 1 10 12 1 1 9 12 1 7 1 10 10 12 1 1 10 10 12 1 1 10 12 10 10 12 1 9 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 8 10 7 8 1 18 8 1 8 1 10 12 1 9 12 1 9 12 1 1 10 12 1 7 1 100 1 10 12 1 9 12 1 1 7 1 10 10 12 1 10 7 1 9 12 1 8 1 10 12 1 7 1 10 12 1 10 12 1 1 9 12 1 100 1 8 1 10 7 1 4 10 10 12 11 7 12 1 1 1 10 12 1 100 1 10 12 1 1 10 8 1 8 1 10 12 1 1 9 7 12 1 1 11 12 7 1 11 7 12 1 1 9 12 1 10 100 12 1 1 1 10 7 12 1 1 10 12 1 1 9 12 1 9 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 11 12 1 7 1 11 12 1 10 7 12 1 1 1 10 12 1 7 1 11 12 1 10 7 12 1 1 1 10 12 1 10 11 12 1 11 12 1 1 10 12 1 10 12 1 1 9 12 1 1 9 7 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 11 100 12 1 1 1 10 12 1 1 10 12 1 18 12 1 1 11 12 1 1 18 11 12 1 18 12 1 11 12 1 10 12 1 1 10 12 1 10 12 1 10 12 10 12 1 8 1 10 12 1 7 1 9 12 1 1 100 1 100 1 100 1 100 1 100 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 100 12 1 1 1 16 15 10 12 16 15 11 12 16 1 16 15 16 15 10 12 16 16 15 10 12 16 15 16 1 15 10 12 16 1 1 1 1 1 1 1 1 1 100 1 1 100 1 100 1 1 100 1 100 1 1
|
||||
staticfield java/lang/Class EMPTY_CLASS_ARRAY [Ljava/lang/Class; 0 [Ljava/lang/Class;
|
||||
staticfield java/lang/Class serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField;
|
||||
ciInstanceKlass java/io/Serializable 1 0 7 100 1 100 1 1 1
|
||||
instanceKlass jdk/internal/vm/vector/VectorSupport$VectorShuffle
|
||||
instanceKlass jdk/internal/vm/vector/VectorSupport$VectorMask
|
||||
instanceKlass jdk/internal/vm/vector/VectorSupport$Vector
|
||||
ciInstanceKlass jdk/internal/vm/vector/VectorSupport$VectorPayload 0 0 32 10 100 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/vm/vector/VectorSupport$VectorShuffle 0 0 28 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/vm/vector/VectorSupport$VectorMask 0 0 28 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/vm/vector/VectorSupport$Vector 0 0 28 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/vm/vector/VectorSupport 0 0 487 100 1 10 100 12 1 1 1 9 12 1 1 10 12 1 1 100 1 10 12 1 11 100 12 1 1 1 11 100 12 1 1 1 11 100 12 1 1 11 100 12 1 1 1 11 100 1 100 1 10 12 1 1 11 100 12 1 1 11 100 12 1 1 100 1 11 100 12 1 1 11 100 12 1 1 11 100 12 1 1 1 11 100 12 1 1 1 11 100 12 1 1 1 11 100 12 1 1 1 100 1 10 12 1 1 11 100 12 1 1 100 1 11 100 12 1 1 11 100 12 1 1 11 100 12 1 1 11 100 1 100 1 9 12 1 1 10 100 12 1 1 11 100 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 1 1 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 1 1 1 1 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/reflect/RecordComponent 0 0 196 10 100 12 1 1 1 9 100 12 1 1 1 9 12 1 1 9 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 100 12 1 1 10 100 12 1 1 9 12 1 1 10 100 12 1 1 1 11 100 12 1 1 1 10 9 100 12 1 1 1 10 100 12 1 1 1 9 12 1 1 10 100 12 1 1 1 10 12 1 1 11 100 12 1 1 10 100 12 1 1 100 1 9 12 1 9 12 1 1 9 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 100 1 10 10 12 1 10 12 1 1 8 1 10 12 1 10 12 1 9 12 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1
|
||||
ciInstanceKlass java/util/Iterator 1 1 53 100 1 8 1 10 12 1 1 10 7 12 1 1 1 11 7 12 1 1 1 11 12 1 1 11 7 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/System 1 1 803 10 100 12 1 1 1 9 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 1 10 7 12 1 1 1 11 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 100 1 8 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 18 12 1 1 10 100 12 1 1 1 100 1 10 12 1 1 10 100 12 1 1 1 10 12 1 10 7 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 11 7 12 1 1 1 10 12 1 1 10 100 12 1 1 1 100 1 10 10 12 1 1 8 1 10 12 1 8 1 10 12 1 9 12 1 1 8 1 10 7 12 1 1 1 10 12 1 1 100 1 8 1 10 9 12 1 1 8 1 10 12 1 1 10 100 12 1 1 1 8 1 10 12 1 100 1 10 12 1 8 1 10 12 1 10 12 1 1 100 1 10 12 10 12 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 100 1 100 1 8 1 10 12 1 10 12 1 1 7 1 10 12 1 100 1 8 1 10 10 12 1 100 1 8 1 10 8 1 10 7 12 1 1 8 1 10 12 100 1 8 1 10 10 12 1 1 10 100 12 1 1 1 100 1 18 12 1 100 1 9 100 12 1 1 1 10 12 1 100 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 7 1 10 12 1 10 12 1 100 1 10 12 1 10 7 12 1 1 1 100 1 8 1 10 9 12 1 9 12 1 10 12 1 10 100 12 1 1 10 12 1 10 12 1 1 8 1 10 12 1 1 8 1 11 12 1 10 12 11 12 1 1 11 7 12 1 1 1 11 7 12 1 1 11 12 1 1 7 1 11 12 1 10 12 1 8 1 10 12 1 1 8 1 8 1 8 1 8 1 11 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 8 1 7 1 9 7 12 1 1 1 10 12 1 7 1 9 12 10 9 12 7 1 10 12 8 1 10 12 1 1 8 1 10 7 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 10 12 10 7 12 1 1 1 9 12 1 1 100 1 8 1 10 12 1 1 10 7 12 1 1 1 7 1 10 12 1 1 8 1 10 8 1 8 1 8 1 8 1 10 10 7 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 100 12 1 1 1 10 100 1 8 1 10 10 10 12 1 1 10 12 1 1 8 1 10 12 1 8 1 10 12 1 10 12 1 1 7 1 10 10 12 1 10 12 1 9 12 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 15 10 100 12 1 1 1 16 15 10 12 1 1 16 15 10 12 16 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/System in Ljava/io/InputStream; java/io/BufferedInputStream
|
||||
staticfield java/lang/System out Ljava/io/PrintStream; org/fusesource/jansi/AnsiPrintStream
|
||||
staticfield java/lang/System err Ljava/io/PrintStream; org/fusesource/jansi/AnsiPrintStream
|
||||
instanceKlass com/google/inject/internal/aop/ChildClassDefiner$ChildLoader
|
||||
instanceKlass org/eclipse/sisu/space/CloningClassSpace$CloningClassLoader
|
||||
instanceKlass jdk/internal/reflect/DelegatingClassLoader
|
||||
instanceKlass java/security/SecureClassLoader
|
||||
ciInstanceKlass java/lang/ClassLoader 1 1 1098 9 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 7 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 1 100 1 10 12 1 10 12 1 1 10 7 12 1 1 1 100 1 8 1 10 12 1 10 7 12 1 1 1 10 100 12 1 10 7 1 10 7 1 7 1 7 1 10 12 1 10 12 1 9 12 1 1 10 10 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 1 7 1 10 12 1 9 12 1 1 10 12 1 1 10 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 10 12 1 1 9 12 10 12 1 1 7 1 10 8 1 10 12 1 1 10 12 1 10 7 1 7 1 10 12 1 1 10 7 12 1 1 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 7 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 10 12 1 10 12 1 10 100 12 1 1 10 12 1 1 10 12 1 1 10 12 1 100 1 10 12 1 100 1 10 12 1 10 100 12 1 1 1 10 10 12 1 1 10 12 1 1 100 1 8 1 10 8 1 10 12 1 10 12 1 100 1 8 1 10 12 1 1 10 12 1 1 10 10 12 1 1 10 12 1 1 10 12 1 1 10 7 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 8 1 9 12 1 10 12 1 1 8 1 8 1 10 7 12 1 1 100 1 10 10 12 10 12 1 10 12 1 10 12 1 10 12 1 1 10 7 12 1 1 10 12 1 10 7 1 7 1 10 12 1 1 10 12 1 10 7 1 10 12 1 100 1 18 12 1 10 100 12 1 1 1 10 100 12 1 1 1 10 7 12 1 1 10 12 1 1 10 12 1 10 12 1 1 100 1 10 12 1 10 12 1 1 10 7 12 1 1 10 12 1 8 1 100 1 10 10 12 1 9 12 1 10 7 12 1 1 10 12 1 100 1 8 1 10 12 1 10 8 1 8 1 10 12 1 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 100 1 100 1 10 12 1 1 100 1 100 1 10 100 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 8 1 10 12 1 7 1 18 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 18 12 1 11 100 12 1 1 1 100 1 10 12 1 1 10 12 1 10 11 12 1 1 10 18 10 12 1 1 11 100 12 1 18 12 1 11 12 1 1 10 12 10 12 1 1 10 12 1 1 100 1 8 1 10 10 12 1 8 1 8 1 10 100 12 1 1 10 12 1 100 1 10 10 12 1 8 1 8 1 8 1 10 12 1 10 12 1 1 10 12 1 10 100 12 1 1 1 11 100 12 1 1 100 1 10 11 10 12 1 10 12 1 10 12 1 1 9 100 12 1 1 9 12 1 1 9 12 9 12 1 9 12 1 9 12 1 8 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 10 10 12 1 11 12 1 1 10 100 12 1 1 1 100 1 10 12 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 100 12 1 1 1 16 1 15 10 12 16 1 16 15 10 12 16 1 16 1 15 10 12 16 15 10 12 16 15 10 12 16 1 1 100 1 100 1 1
|
||||
staticfield java/lang/ClassLoader nocerts [Ljava/security/cert/Certificate; 0 [Ljava/security/cert/Certificate;
|
||||
staticfield java/lang/ClassLoader $assertionsDisabled Z 1
|
||||
ciInstanceKlass jdk/internal/reflect/DelegatingClassLoader 1 1 18 10 7 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/net/URLClassLoader
|
||||
instanceKlass jdk/internal/loader/BuiltinClassLoader
|
||||
ciInstanceKlass java/security/SecureClassLoader 1 1 102 10 7 12 1 1 1 7 1 10 12 1 9 7 12 1 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 7 1 10 7 1 10 12 1 7 1 10 12 1 11 7 12 1 1 1 7 1 11 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
instanceKlass jdk/internal/loader/ClassLoaders$BootClassLoader
|
||||
instanceKlass jdk/internal/loader/ClassLoaders$PlatformClassLoader
|
||||
instanceKlass jdk/internal/loader/ClassLoaders$AppClassLoader
|
||||
ciInstanceKlass jdk/internal/loader/BuiltinClassLoader 1 1 737 9 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 9 12 1 1 7 1 10 12 1 9 12 1 10 12 1 9 12 1 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 11 7 12 1 1 1 100 1 100 1 10 10 12 1 1 8 1 10 12 1 10 12 7 1 10 12 1 10 12 1 1 11 7 12 1 1 1 11 7 12 1 1 1 11 12 1 1 7 1 8 1 8 1 10 9 12 1 1 10 7 12 1 1 11 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 100 12 1 1 1 10 12 1 1 11 7 12 1 1 1 10 7 12 1 1 100 1 10 7 12 1 1 1 10 12 1 100 1 8 1 10 12 1 1 10 8 1 10 12 1 1 10 12 1 1 10 12 1 1 11 7 12 1 1 11 12 1 7 1 10 11 12 1 1 11 10 12 1 1 7 1 10 12 1 10 7 12 1 10 12 1 7 1 10 12 1 10 7 12 1 1 1 100 1 10 12 1 1 11 12 1 100 1 100 1 10 12 1 10 12 1 1 100 1 100 1 10 12 1 10 12 1 18 12 1 1 10 12 1 10 12 1 1 18 100 1 10 7 12 1 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 1 100 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 18 12 1 7 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 100 1 10 12 1 7 1 10 12 1 10 7 12 1 1 1 10 12 1 11 12 1 7 1 10 12 1 7 1 100 1 10 12 1 10 12 1 11 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 1 10 7 12 1 1 10 12 1 100 1 8 1 8 1 10 10 12 1 8 1 8 1 10 7 12 1 1 1 11 7 12 1 1 1 9 7 12 1 1 1 10 7 12 1 1 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 10 7 12 1 1 1 8 1 10 12 1 7 1 10 12 1 1 10 12 1 7 1 10 11 12 1 1 10 12 10 12 1 10 12 1 100 1 10 12 1 10 12 1 10 10 12 1 10 7 12 1 1 8 1 10 7 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 15 10 100 12 1 1 1 16 15 10 12 16 15 10 12 16 15 10 12 16 1 1 1 100 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield jdk/internal/loader/BuiltinClassLoader packageToModule Ljava/util/Map; java/util/concurrent/ConcurrentHashMap
|
||||
staticfield jdk/internal/loader/BuiltinClassLoader $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/security/AccessController 1 1 295 10 100 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 100 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 7 1 7 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 9 100 12 1 1 1 10 100 12 1 1 1 10 12 1 10 12 1 9 100 12 1 1 1 10 12 1 10 12 1 1 9 12 1 1 10 100 1 10 11 7 12 1 1 1 10 7 12 1 1 11 7 1 7 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 1 8 1 10 100 12 1 1 1 8 1 100 1 10 10 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 8 1 10 100 12 1 1 8 1 8 1 10 12 1 8 1 10 12 1 10 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 3 1 1 1
|
||||
staticfield java/security/AccessController $assertionsDisabled Z 1
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor7
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor6
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor5
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor4
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor3
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor2
|
||||
instanceKlass jdk/internal/reflect/BootstrapConstructorAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/GeneratedConstructorAccessor1
|
||||
instanceKlass jdk/internal/reflect/DelegatingConstructorAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/NativeConstructorAccessorImpl
|
||||
ciInstanceKlass jdk/internal/reflect/ConstructorAccessorImpl 1 1 27 10 7 12 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 1 1
|
||||
instanceKlass jdk/internal/reflect/FieldAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/ConstructorAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/MethodAccessorImpl
|
||||
ciInstanceKlass jdk/internal/reflect/MagicAccessorImpl 1 1 16 10 7 12 1 1 1 100 1 1 1 1 1 1 1 1
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor16
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor15
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor14
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor13
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor12
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor11
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor10
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor9
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor8
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor7
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor6
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor5
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor4
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor3
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor2
|
||||
instanceKlass jdk/internal/reflect/GeneratedMethodAccessor1
|
||||
instanceKlass jdk/internal/reflect/DelegatingMethodAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/NativeMethodAccessorImpl
|
||||
ciInstanceKlass jdk/internal/reflect/MethodAccessorImpl 1 1 25 10 7 12 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1
|
||||
ciInstanceKlass java/lang/Module 1 1 959 10 7 12 1 1 1 9 7 12 1 1 1 10 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 7 12 1 1 1 7 1 10 7 12 1 1 1 10 12 1 1 11 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 10 12 1 8 1 10 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 9 12 1 1 10 12 1 9 12 1 1 11 12 1 9 7 12 1 1 10 7 12 1 1 1 10 100 12 1 1 1 10 12 1 1 100 1 100 1 10 10 12 1 1 8 1 10 12 1 10 12 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 9 7 12 1 1 1 10 12 1 1 10 12 1 1 9 12 1 10 12 1 10 12 1 9 12 1 1 11 7 12 1 1 10 12 1 1 9 12 1 9 12 1 10 12 1 10 12 1 100 1 8 1 10 10 12 1 1 10 12 1 8 1 10 12 1 1 8 1 8 1 10 12 1 1 10 12 1 10 12 1 1 18 12 1 1 10 12 1 1 11 12 1 9 12 1 11 12 10 100 12 1 1 100 1 8 1 10 7 1 11 12 1 1 10 12 1 10 12 1 10 12 1 1 11 12 1 1 11 7 12 1 1 11 12 1 1 9 12 1 11 12 1 10 12 1 1 10 12 1 1 9 12 1 10 12 10 7 12 1 1 10 7 12 1 1 10 7 1 18 12 1 1 11 100 12 1 1 1 18 12 1 11 12 1 1 10 100 12 1 1 1 11 12 1 1 10 7 12 1 1 4 7 1 11 12 1 7 1 7 1 10 10 7 12 1 1 1 10 11 7 12 1 8 1 10 10 12 1 1 10 7 12 1 1 10 12 1 10 12 1 7 1 10 12 1 10 11 12 1 1 10 12 10 12 1 1 9 12 1 100 1 10 10 12 1 1 11 100 1 10 12 1 1 11 12 1 10 10 12 1 11 10 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 10 12 1 10 12 1 1 10 10 12 1 1 10 12 1 18 12 1 11 12 1 18 12 1 10 12 1 10 12 1 10 12 7 1 10 12 1 10 12 1 10 12 1 9 12 1 7 1 10 10 10 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 18 12 1 1 10 100 12 1 1 1 100 1 8 1 10 12 1 1 10 12 1 1 10 100 12 1 1 100 1 10 12 1 1 100 1 8 1 100 1 10 100 1 100 1 3 10 12 1 100 1 10 12 1 10 12 1 1 10 12 1 1 100 1 10 12 1 10 12 1 1 100 1 100 1 10 12 8 1 10 12 1 1 10 12 1 1 10 100 12 1 1 10 12 1 1 10 12 1 10 12 10 12 1 1 100 1 10 10 12 1 1 10 100 12 1 1 1 100 1 8 1 10 12 1 1 10 100 12 1 1 8 1 10 12 1 8 1 10 12 1 10 12 10 12 1 8 1 10 10 100 12 1 1 7 1 10 10 12 1 10 7 12 1 1 9 12 1 9 12 1 9 12 1 9 12 1 10 12 11 12 1 10 12 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 7 12 1 1 1 16 15 10 12 16 16 15 10 12 16 16 15 10 16 1 15 10 12 16 1 15 10 12 16 1 16 15 10 12 16 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/Module ALL_UNNAMED_MODULE Ljava/lang/Module; java/lang/Module
|
||||
staticfield java/lang/Module ALL_UNNAMED_MODULE_SET Ljava/util/Set; java/util/ImmutableCollections$Set12
|
||||
staticfield java/lang/Module EVERYONE_MODULE Ljava/lang/Module; java/lang/Module
|
||||
staticfield java/lang/Module EVERYONE_SET Ljava/util/Set; java/util/ImmutableCollections$Set12
|
||||
staticfield java/lang/Module $assertionsDisabled Z 1
|
||||
instanceKlass org/apache/maven/artifact/versioning/ComparableVersion$ListItem
|
||||
instanceKlass org/eclipse/sisu/bean/BeanScheduler$Pending
|
||||
ciInstanceKlass java/util/ArrayList 1 1 492 10 7 12 1 1 1 7 1 9 7 12 1 1 1 9 12 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 9 12 1 11 7 12 1 1 1 9 12 1 1 10 12 1 1 7 10 7 12 1 1 1 9 12 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 100 1 100 1 10 12 1 10 7 12 1 1 1 10 7 12 1 1 10 12 1 10 12 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 12 1 1 10 12 1 1 10 12 1 100 1 10 11 12 1 1 11 100 12 1 1 1 11 12 1 10 12 1 10 12 1 10 12 1 1 100 1 10 12 1 1 10 10 12 1 1 10 12 1 8 1 8 1 8 1 8 1 10 12 1 1 10 12 1 1 11 12 1 100 1 10 100 12 1 1 10 12 1 10 12 1 1 10 100 12 1 1 10 12 1 10 100 12 1 1 1 11 100 12 1 1 1 10 12 1 100 1 8 1 10 7 1 10 12 1 7 1 10 12 1 10 12 1 1 7 1 10 12 1 10 12 1 1 11 7 12 1 1 7 1 10 12 1 10 12 1 1 11 7 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 11 100 12 1 1 10 12 1 1 100 1 100 1 100 1 1 1 1 5 0 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1
|
||||
staticfield java/util/ArrayList EMPTY_ELEMENTDATA [Ljava/lang/Object; 0 [Ljava/lang/Object;
|
||||
staticfield java/util/ArrayList DEFAULTCAPACITY_EMPTY_ELEMENTDATA [Ljava/lang/Object; 0 [Ljava/lang/Object;
|
||||
ciInstanceKlass java/util/concurrent/ConcurrentHashMap 1 1 1210 7 1 7 1 3 10 12 1 1 3 100 1 10 7 12 1 1 1 100 1 10 100 12 1 1 1 100 1 11 12 1 1 11 12 1 11 12 1 1 9 12 1 1 9 12 1 1 9 12 1 10 7 12 1 1 1 7 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 4 10 12 1 9 12 1 10 12 1 1 100 1 10 5 0 10 12 1 10 12 1 1 5 0 10 12 1 1 10 12 1 9 12 1 1 10 12 1 1 9 12 1 9 12 1 1 10 12 1 1 9 12 1 10 12 1 1 9 12 1 1 10 12 1 1 100 1 10 7 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 100 1 10 12 1 1 7 1 100 1 8 1 10 12 1 10 12 1 1 10 12 1 1 11 7 12 1 1 10 12 1 1 11 12 1 1 11 7 12 1 1 1 11 7 12 1 1 1 11 12 1 7 1 11 12 1 11 12 1 10 12 1 1 10 12 1 1 9 12 1 1 10 100 12 1 1 1 9 10 12 1 1 9 12 1 10 12 1 1 5 0 9 12 1 1 7 1 10 12 1 9 12 1 1 7 1 10 12 1 9 12 1 7 1 10 100 1 10 10 12 1 1 8 1 10 12 1 10 12 1 1 11 100 1 10 12 1 10 100 12 1 1 1 8 1 10 100 12 1 1 1 8 1 10 12 1 8 1 10 12 1 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 10 12 1 9 12 1 9 10 12 1 9 12 1 1 11 7 12 1 1 1 11 7 12 1 1 1 100 1 10 12 11 100 12 1 1 10 11 7 12 1 10 12 1 100 1 10 12 1 100 1 10 10 9 7 12 1 1 1 10 12 3 10 100 12 1 1 9 12 1 10 12 1 1 9 12 1 1 9 12 1 10 12 1 1 10 100 12 1 1 9 12 1 9 7 12 1 1 10 12 1 1 10 12 1 3 9 12 1 9 12 1 10 12 1 1 7 1 9 3 9 12 1 100 1 10 12 1 9 12 1 10 12 1 9 12 1 10 12 1 9 12 1 10 100 12 1 1 1 100 10 12 1 100 1 5 0 10 100 12 1 1 100 1 10 12 1 1 10 12 1 10 12 1 100 1 10 12 1 10 100 1 100 1 10 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 1 100 1 10 12 1 10 10 12 1 100 1 10 12 1 10 10 12 1 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 10 100 1 10 10 100 1 10 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 10 100 1 10 10 100 1 10 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 10 12 1 10 7 12 1 1 1 10 12 1 7 1 7 1 10 12 1 9 12 1 1 9 12 1 1 10 12 1 1 8 10 12 1 1 8 8 8 8 7 10 12 1 1 10 12 1 100 1 8 1 10 7 1 100 1 100 1 1 1 5 0 1 1 3 1 3 1 1 1 1 3 1 3 1 3 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/util/concurrent/ConcurrentHashMap NCPU I 12
|
||||
staticfield java/util/concurrent/ConcurrentHashMap serialPersistentFields [Ljava/io/ObjectStreamField; 3 [Ljava/io/ObjectStreamField;
|
||||
staticfield java/util/concurrent/ConcurrentHashMap U Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
staticfield java/util/concurrent/ConcurrentHashMap SIZECTL J 20
|
||||
staticfield java/util/concurrent/ConcurrentHashMap TRANSFERINDEX J 32
|
||||
staticfield java/util/concurrent/ConcurrentHashMap BASECOUNT J 24
|
||||
staticfield java/util/concurrent/ConcurrentHashMap CELLSBUSY J 36
|
||||
staticfield java/util/concurrent/ConcurrentHashMap CELLVALUE J 144
|
||||
staticfield java/util/concurrent/ConcurrentHashMap ABASE I 16
|
||||
staticfield java/util/concurrent/ConcurrentHashMap ASHIFT I 2
|
||||
ciInstanceKlass java/lang/String 1 1 1396 10 7 12 1 1 1 8 1 9 7 12 1 1 1 9 12 1 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 1 9 12 1 1 10 7 12 1 1 1 10 7 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 1 9 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 9 7 12 1 1 10 12 9 7 12 1 1 3 10 7 12 1 1 1 100 1 11 12 1 1 11 12 1 11 12 1 1 10 100 12 1 1 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 10 12 1 11 12 1 1 10 12 1 1 10 12 10 12 1 1 10 100 12 1 1 1 10 7 12 1 1 1 10 12 1 1 100 1 100 1 10 12 1 10 12 1 10 12 1 1 100 1 10 12 1 1 100 1 10 12 1 1 10 12 1 1 10 10 12 1 100 1 100 1 7 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 100 1 11 11 12 1 11 12 1 10 12 1 1 10 12 1 10 12 10 12 1 1 10 10 100 12 1 1 1 10 100 12 1 1 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 100 1 10 12 1 1 10 12 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 3 3 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 1 10 8 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 12 10 12 1 8 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 10 100 1 10 10 12 1 10 12 1 10 12 1 10 10 12 1 10 12 1 1 10 12 1 100 1 10 10 12 1 100 1 10 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 10 12 1 1 10 100 1 10 10 12 1 10 12 1 1 10 12 1 1 10 100 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 11 7 1 11 12 10 12 1 10 12 1 1 10 12 1 1 10 10 12 1 10 12 1 9 12 1 1 11 100 12 1 1 1 10 10 12 1 10 12 1 1 10 10 12 1 10 12 1 10 12 1 1 9 12 1 10 12 1 1 10 10 12 1 1 10 12 10 10 12 1 10 12 10 10 12 10 10 12 1 10 12 1 10 12 10 10 12 10 12 1 10 12 10 12 10 10 12 1 10 12 1 1 10 12 1 10 10 12 1 10 7 12 1 1 1 10 12 1 1 10 10 7 12 1 1 1 11 10 12 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 100 12 1 1 10 12 1 100 1 100 1 8 1 10 10 10 12 1 8 1 10 12 1 3 3 7 1 10 10 12 1 10 12 1 10 12 1 1 10 12 1 1 11 7 12 1 1 1 7 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 8 1 10 12 1 1 10 12 1 11 100 12 1 1 1 11 100 12 1 1 11 12 1 1 10 12 1 10 12 1 1 10 10 7 12 1 1 1 10 12 1 10 12 1 10 10 12 10 12 1 1 10 10 12 1 10 10 12 1 10 10 12 1 10 10 12 1 10 12 1 1 10 10 12 1 8 1 10 12 1 1 18 12 1 1 11 100 12 1 1 1 7 1 3 18 12 1 18 12 1 8 1 10 100 12 1 1 1 11 12 1 1 10 12 10 10 12 1 10 11 12 1 1 10 12 1 1 11 12 1 18 3 11 10 12 1 11 11 10 12 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 10 10 12 1 11 100 12 1 7 1 100 1 10 12 1 7 1 10 10 7 12 1 1 1 100 1 10 7 1 10 10 12 1 10 10 12 1 8 1 10 10 12 1 8 1 8 1 10 12 1 10 12 1 10 10 12 10 100 12 1 1 10 7 12 1 1 10 100 12 1 1 8 1 10 12 1 10 12 1 1 10 10 12 8 1 8 1 10 8 1 8 1 8 1 8 1 10 12 1 10 12 1 8 1 10 100 12 1 1 1 10 12 10 12 1 1 10 12 10 10 12 10 12 7 1 9 12 1 1 7 1 10 100 1 100 1 100 1 100 1 1 1 1 1 1 5 0 1 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 100 12 1 1 1 16 15 10 12 16 15 10 12 15 10 12 15 10 12 1 1 1 1 100 1 100 1 1 1
|
||||
staticfield java/lang/String COMPACT_STRINGS Z 1
|
||||
staticfield java/lang/String serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField;
|
||||
staticfield java/lang/String CASE_INSENSITIVE_ORDER Ljava/util/Comparator; java/lang/String$CaseInsensitiveComparator
|
||||
ciInstanceKlass java/security/ProtectionDomain 1 1 324 10 7 12 1 1 1 9 7 12 1 1 1 7 1 10 9 12 1 1 9 12 1 1 9 12 1 1 10 7 12 1 1 7 1 9 12 1 9 12 1 1 7 1 9 12 1 1 9 12 1 10 100 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 9 12 1 9 100 12 1 1 10 12 1 1 10 100 1 10 12 1 1 8 1 100 1 8 1 10 12 1 10 10 100 12 1 1 1 10 12 1 1 8 1 11 8 1 10 12 1 8 1 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 8 1 10 12 1 8 1 8 1 10 100 12 1 1 1 9 100 12 1 1 1 10 12 1 1 9 100 12 1 1 1 10 100 12 1 1 1 100 1 100 1 10 12 1 10 100 12 1 1 1 10 100 1 10 12 1 10 12 1 1 11 100 12 1 1 11 12 1 100 1 11 100 12 1 1 1 10 12 1 10 11 12 1 1 11 12 1 1 10 12 1 10 7 12 1 1 10 100 12 1 1 11 12 1 10 12 8 1 8 1 10 7 12 1 1 1 7 1 10 10 7 12 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 100 1 1 1 1 1
|
||||
staticfield java/security/ProtectionDomain filePermCompatInPD Z 0
|
||||
ciInstanceKlass java/security/CodeSource 1 1 395 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 10 100 12 1 1 10 100 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 100 1 10 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 100 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 10 10 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 100 1 10 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 8 1 8 1 9 12 1 1 100 1 8 1 10 12 1 10 12 1 1 8 1 10 12 1 8 1 8 1 8 1 10 100 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 100 1 100 1 10 12 1 10 12 10 12 1 1 10 100 12 1 1 10 12 1 100 1 10 12 10 8 1 10 12 1 10 12 1 10 12 1 1 100 1 10 12 1 1 100 1 100 1 8 1 8 1 10 10 12 1 1 10 100 12 1 1 1 100 1 10 12 10 12 1 1 11 100 12 1 1 10 10 12 1 11 10 12 1 8 1 100 1 10 12 1 10 12 1 1 10 12 1 11 12 1 1 11 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/StringBuilder 1 1 409 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 10 12 1 1 10 12 1 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 10 7 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 10 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 1 100 1 100 1 8 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 10 12 10 12 1 10 12 1 10 12 1 10 12 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 10 12 1 10 12 1 100 1 100 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/loader/ClassLoaders 1 1 183 10 100 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 100 12 1 1 1 9 7 12 1 1 1 9 12 1 1 9 12 1 1 7 1 11 100 12 1 1 1 100 1 11 12 1 1 11 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 100 1 100 1 10 7 12 1 1 1 9 12 1 1 10 12 1 1 7 1 10 12 1 1 10 12 1 7 1 8 1 10 7 12 1 1 1 10 12 1 1 7 1 10 12 1 10 12 1 10 12 1 8 1 10 7 12 1 1 8 1 8 1 10 12 1 7 1 10 12 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield jdk/internal/loader/ClassLoaders JLA Ljdk/internal/access/JavaLangAccess; java/lang/System$2
|
||||
staticfield jdk/internal/loader/ClassLoaders BOOT_LOADER Ljdk/internal/loader/ClassLoaders$BootClassLoader; jdk/internal/loader/ClassLoaders$BootClassLoader
|
||||
staticfield jdk/internal/loader/ClassLoaders PLATFORM_LOADER Ljdk/internal/loader/ClassLoaders$PlatformClassLoader; jdk/internal/loader/ClassLoaders$PlatformClassLoader
|
||||
staticfield jdk/internal/loader/ClassLoaders APP_LOADER Ljdk/internal/loader/ClassLoaders$AppClassLoader; jdk/internal/loader/ClassLoaders$AppClassLoader
|
||||
ciInstanceKlass jdk/internal/misc/Unsafe 1 1 1285 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 100 1 10 10 12 1 1 10 12 1 1 5 0 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 5 0 5 0 5 0 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 100 1 8 1 10 100 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 9 7 12 1 1 9 12 1 100 1 10 10 12 1 1 8 1 10 8 1 8 1 10 12 1 1 9 7 12 1 1 1 9 100 1 9 7 1 9 100 1 9 9 100 1 9 100 1 9 100 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 5 0 5 0 9 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 8 1 3 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 100 1 10 100 1 10 9 12 1 5 0 10 12 1 1 5 0 10 12 1 5 0 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 5 0 5 0 5 0 10 12 1 1 10 12 1 10 12 1 10 12 10 100 12 1 1 8 1 100 1 11 12 1 1 8 1 11 12 1 1 10 100 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 1 10 12 1 9 12 1 7 1 9 12 1 7 1 9 12 1 7 1 9 12 1 7 1 9 12 1 7 1 9 12 1 7 1 9 12 1 7 1 9 12 1 7 1 9 12 1 10 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield jdk/internal/misc/Unsafe theUnsafe Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_BOOLEAN_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_BYTE_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_SHORT_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_CHAR_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_INT_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_LONG_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_FLOAT_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_DOUBLE_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_OBJECT_BASE_OFFSET I 16
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_BOOLEAN_INDEX_SCALE I 1
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_BYTE_INDEX_SCALE I 1
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_SHORT_INDEX_SCALE I 2
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_CHAR_INDEX_SCALE I 2
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_INT_INDEX_SCALE I 4
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_LONG_INDEX_SCALE I 8
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_FLOAT_INDEX_SCALE I 4
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_DOUBLE_INDEX_SCALE I 8
|
||||
staticfield jdk/internal/misc/Unsafe ARRAY_OBJECT_INDEX_SCALE I 4
|
||||
staticfield jdk/internal/misc/Unsafe ADDRESS_SIZE I 8
|
||||
ciInstanceKlass java/util/Map 1 1 259 11 7 12 1 1 1 11 12 1 1 10 7 12 1 1 11 12 1 1 11 100 12 1 1 1 11 100 12 1 1 1 11 12 1 1 7 1 11 12 1 11 12 1 100 1 100 1 10 12 1 1 11 100 12 1 1 1 11 100 12 1 1 1 11 12 1 11 12 1 10 12 1 1 11 12 1 11 7 12 1 9 7 12 1 1 1 100 1 10 12 7 1 7 1 10 12 1 7 1 10 100 1 11 12 1 1 100 1 11 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ThreadGroup 1 1 293 10 7 12 1 1 1 9 7 12 1 1 1 8 1 9 12 1 1 7 1 9 12 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 9 12 1 1 10 12 1 1 10 12 1 9 12 1 10 100 12 1 1 1 9 12 1 9 12 1 1 10 7 12 1 1 1 100 10 12 1 1 10 7 12 1 1 1 10 100 12 1 9 12 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 10 12 1 10 12 1 10 100 1 10 10 12 1 10 12 1 10 12 1 7 10 12 1 9 12 1 1 10 12 1 1 8 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 11 100 1 100 1 9 12 1 100 1 10 8 1 10 12 1 1 10 12 1 1 8 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 100 1 8 1 10 8 1 10 12 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/security/Provider
|
||||
ciInstanceKlass java/util/Properties 1 1 709 10 7 12 1 1 1 100 1 10 7 12 1 1 7 1 10 12 1 9 12 1 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 10 12 1 1 8 1 10 7 12 1 1 1 7 1 10 12 1 10 12 1 1 8 1 10 12 1 7 1 10 12 10 12 1 1 9 12 1 1 10 12 1 1 7 1 10 12 1 10 12 1 10 12 1 1 100 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 100 1 3 10 10 100 12 1 1 1 10 12 1 10 12 1 1 8 1 10 12 1 10 12 1 1 8 1 10 100 12 1 1 10 12 1 1 10 12 1 10 12 1 1 100 1 10 12 1 10 12 1 1 100 1 9 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 11 7 12 1 1 1 11 7 12 1 1 1 11 12 1 1 7 1 11 12 1 11 12 1 10 12 1 1 8 1 10 12 1 10 12 1 100 1 10 10 12 1 1 10 100 12 1 1 9 100 12 1 1 10 12 1 1 10 100 12 1 1 1 100 1 100 1 100 1 10 8 1 8 1 10 12 1 10 12 1 10 12 1 1 10 10 12 1 1 10 12 1 1 100 1 10 10 12 1 11 7 12 1 1 10 7 12 1 1 1 8 1 10 100 12 1 1 11 8 1 10 100 1 11 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 10 12 1 1 10 12 1 1 7 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 100 1 10 11 100 12 1 1 4 11 10 12 1 1 10 100 12 1 1 11 12 1 10 12 1 1 10 100 12 1 1 10 12 1 100 1 8 1 10 12 1 10 10 100 12 1 1 1 100 1 6 0 10 12 1 1 11 100 12 1 1 1 10 12 1 100 1 10 12 1 10 100 12 1 1 1 100 1 10 10 100 1 8 1 9 100 12 1 1 1 10 12 1 8 1 10 100 12 1 1 1 10 12 1 1 5 0 10 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
staticfield java/util/Properties UNSAFE Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
instanceKlass java/util/Hashtable
|
||||
ciInstanceKlass java/util/Dictionary 1 1 36 10 7 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/util/Properties
|
||||
ciInstanceKlass java/util/Hashtable 1 1 512 100 1 10 7 12 1 1 1 9 7 12 1 1 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 1 8 1 10 12 1 9 12 1 1 7 1 9 12 1 1 4 10 7 12 1 1 1 9 12 1 4 10 12 1 11 100 12 1 1 1 10 12 1 1 10 12 1 1 9 12 1 10 12 1 1 100 1 10 9 12 1 1 10 7 12 1 1 1 9 12 1 1 10 12 1 10 12 1 3 9 12 1 9 12 1 3 10 12 1 10 12 1 10 12 1 1 11 12 1 1 11 100 12 1 1 1 11 100 12 1 1 1 11 12 1 100 1 11 12 1 11 12 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 1 9 12 9 12 1 1 10 100 1 100 1 10 12 1 10 8 1 10 10 12 1 8 1 10 8 1 10 100 12 1 1 1 7 1 10 12 1 10 12 1 100 1 10 12 1 10 12 1 1 100 1 10 100 1 10 10 12 1 1 11 12 1 1 11 12 1 100 1 10 10 10 100 12 1 1 11 100 12 1 1 1 100 1 10 11 100 12 1 1 11 100 12 1 10 12 1 10 12 1 1 10 100 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 8 10 100 12 1 1 100 1 8 1 10 4 10 12 4 10 12 1 8 1 10 12 10 100 12 1 1 1 100 1 11 100 12 1 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 100 1 100 1 1 1 1 1 1 5 0 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/lang/ProcessBuilder$NullInputStream
|
||||
instanceKlass sun/nio/ch/ChannelInputStream
|
||||
instanceKlass java/util/zip/ZipFile$ZipFileInputStream
|
||||
instanceKlass java/io/FilterInputStream
|
||||
instanceKlass java/io/FileInputStream
|
||||
instanceKlass java/io/ByteArrayInputStream
|
||||
ciInstanceKlass java/io/InputStream 1 1 184 100 1 10 7 12 1 1 1 100 1 10 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 100 1 3 10 12 1 1 100 1 8 1 10 12 1 10 7 12 1 1 1 3 100 1 8 1 10 10 7 12 1 1 1 7 1 10 11 7 12 1 1 1 10 12 1 1 11 12 1 1 11 7 12 1 1 1 11 12 1 1 7 1 10 7 12 1 1 1 5 0 10 12 1 10 12 1 1 100 1 10 8 1 10 8 1 8 1 10 12 1 1 10 7 12 1 1 1 100 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/io/ByteArrayInputStream 1 1 117 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 10 100 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 100 12 1 1 1 10 12 1 1 3 10 100 1 10 100 12 1 1 1 9 12 1 1 100 1 10 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/io/ByteArrayInputStream $assertionsDisabled Z 1
|
||||
instanceKlass java/util/concurrent/ForkJoinWorkerThread
|
||||
instanceKlass java/util/logging/LogManager$Cleaner
|
||||
instanceKlass org/apache/maven/shared/utils/logging/MessageUtils$1
|
||||
instanceKlass jdk/internal/misc/InnocuousThread
|
||||
instanceKlass java/lang/ref/Finalizer$FinalizerThread
|
||||
instanceKlass java/lang/ref/Reference$ReferenceHandler
|
||||
ciInstanceKlass java/lang/Thread 1 1 612 9 7 12 1 1 1 9 12 1 1 10 12 1 1 9 12 1 1 9 12 1 1 100 1 8 1 10 12 1 1 3 8 1 100 1 5 0 10 12 1 1 10 7 12 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 100 1 8 1 10 9 12 1 1 10 7 12 1 1 1 10 100 12 1 1 1 10 10 7 12 1 1 10 12 1 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 10 12 1 9 12 1 1 10 12 1 1 10 12 1 1 9 12 1 10 12 1 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 9 12 1 1 10 12 1 1 10 7 12 1 1 1 9 12 1 10 12 1 1 9 12 1 100 1 10 7 1 10 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 9 12 1 100 1 10 10 12 1 1 10 12 1 10 12 1 100 1 11 7 12 1 1 9 7 12 1 1 1 10 12 1 10 12 1 10 12 9 12 1 1 10 9 12 1 10 12 1 100 1 10 10 12 1 1 9 12 1 10 12 1 11 100 12 1 1 10 12 1 9 12 1 10 12 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 100 1 10 10 12 1 10 12 1 10 12 1 9 100 12 1 1 1 10 12 1 1 10 12 1 100 1 8 1 10 10 12 1 10 12 8 1 10 12 1 8 1 10 8 1 8 1 10 100 12 1 1 10 100 12 1 1 1 100 1 8 1 10 9 12 1 9 12 1 1 10 12 1 1 10 10 12 1 1 9 12 1 10 12 1 1 100 1 10 12 11 100 12 1 1 1 9 100 12 1 1 1 9 12 1 1 10 12 1 1 100 1 10 12 1 11 100 12 1 1 1 100 1 10 12 1 10 12 1 1 11 12 1 10 12 1 100 1 10 12 1 10 12 1 1 10 7 12 1 1 1 8 1 9 12 1 10 12 1 1 11 100 12 1 1 1 10 100 12 1 1 1 11 12 1 10 12 1 7 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1 100 1 1 1 1 1 1
|
||||
staticfield java/lang/Thread EMPTY_STACK_TRACE [Ljava/lang/StackTraceElement; 0 [Ljava/lang/StackTraceElement;
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadataDeploymentException
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadataInstallationException
|
||||
instanceKlass java/lang/Exception
|
||||
instanceKlass java/lang/Error
|
||||
ciInstanceKlass java/lang/Throwable 1 1 393 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 100 1 100 1 10 8 1 10 12 1 1 8 1 10 100 12 1 1 10 10 12 1 100 1 8 1 10 10 12 1 1 10 7 12 1 1 10 12 1 8 1 9 100 12 1 1 1 10 12 1 1 100 1 10 12 10 12 1 100 1 10 10 7 12 1 1 1 11 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 8 1 10 12 1 10 12 1 1 8 1 8 1 10 12 1 1 10 12 1 8 1 8 1 9 12 1 1 10 100 12 1 1 100 1 10 11 12 1 8 1 8 1 10 7 12 1 1 8 1 10 12 1 8 1 100 1 10 12 1 9 12 1 1 10 12 1 10 7 12 1 9 12 1 1 10 12 1 1 100 1 8 1 10 12 1 10 100 12 1 1 10 12 1 1 100 1 10 100 12 1 1 1 10 12 1 11 100 12 1 1 1 11 100 12 1 1 1 11 12 1 8 1 10 12 1 1 8 1 10 10 9 100 12 1 1 1 8 1 10 12 1 1 10 100 1 8 1 10 11 12 1 1 8 1 9 12 1 10 100 12 1 1 11 9 12 1 1 11 12 1 1 100 10 12 1 10 12 1 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/Throwable UNASSIGNED_STACK [Ljava/lang/StackTraceElement; 0 [Ljava/lang/StackTraceElement;
|
||||
staticfield java/lang/Throwable SUPPRESSED_SENTINEL Ljava/util/List; java/util/Collections$EmptyList
|
||||
staticfield java/lang/Throwable EMPTY_THROWABLE_ARRAY [Ljava/lang/Throwable; 0 [Ljava/lang/Throwable;
|
||||
staticfield java/lang/Throwable $assertionsDisabled Z 1
|
||||
instanceKlass javax/management/JMException
|
||||
instanceKlass org/apache/maven/shared/artifact/filter/collection/ArtifactFilterException
|
||||
instanceKlass org/codehaus/plexus/util/cli/CommandLineException
|
||||
instanceKlass org/codehaus/plexus/compiler/util/scan/InclusionScanException
|
||||
instanceKlass org/codehaus/plexus/compiler/CompilerException
|
||||
instanceKlass org/codehaus/plexus/compiler/manager/NoSuchCompilerException
|
||||
instanceKlass org/codehaus/plexus/interpolation/InterpolationException
|
||||
instanceKlass org/apache/maven/artifact/DependencyResolutionRequiredException
|
||||
instanceKlass org/codehaus/plexus/util/introspection/MethodMap$AmbiguousException
|
||||
instanceKlass java/net/URISyntaxException
|
||||
instanceKlass org/apache/maven/shared/filtering/MavenFilteringException
|
||||
instanceKlass org/xml/sax/SAXException
|
||||
instanceKlass javax/xml/parsers/ParserConfigurationException
|
||||
instanceKlass org/codehaus/plexus/interpolation/reflection/MethodMap$AmbiguousException
|
||||
instanceKlass org/apache/maven/cli/internal/ExtensionResolutionException
|
||||
instanceKlass org/sonatype/plexus/components/sec/dispatcher/SecDispatcherException
|
||||
instanceKlass org/apache/maven/toolchain/building/ToolchainsBuildingException
|
||||
instanceKlass org/apache/maven/execution/MavenExecutionRequestPopulationException
|
||||
instanceKlass org/sonatype/plexus/components/cipher/PlexusCipherException
|
||||
instanceKlass org/apache/maven/model/resolution/UnresolvableModelException
|
||||
instanceKlass org/apache/maven/model/resolution/InvalidRepositoryException
|
||||
instanceKlass org/apache/maven/repository/ArtifactDoesNotExistException
|
||||
instanceKlass org/apache/maven/repository/ArtifactTransferFailedException
|
||||
instanceKlass org/codehaus/plexus/component/configurator/expression/ExpressionEvaluationException
|
||||
instanceKlass org/codehaus/plexus/component/composition/CycleDetectedInComponentGraphException
|
||||
instanceKlass org/codehaus/plexus/configuration/PlexusConfigurationException
|
||||
instanceKlass org/apache/maven/repository/metadata/MetadataGraphTransformationException
|
||||
instanceKlass org/apache/maven/repository/legacy/resolver/conflict/ConflictResolverNotFoundException
|
||||
instanceKlass org/apache/maven/plugin/version/PluginVersionNotFoundException
|
||||
instanceKlass org/apache/maven/plugin/InvalidPluginException
|
||||
instanceKlass org/apache/maven/repository/metadata/GraphConflictResolutionException
|
||||
instanceKlass org/apache/maven/repository/metadata/MetadataResolutionException
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadataReadException
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadataStoreException
|
||||
instanceKlass org/codehaus/plexus/component/repository/exception/ComponentLifecycleException
|
||||
instanceKlass java/security/GeneralSecurityException
|
||||
instanceKlass org/apache/maven/project/DependencyResolutionException
|
||||
instanceKlass org/apache/maven/model/building/ModelBuildingException
|
||||
instanceKlass org/apache/maven/artifact/versioning/InvalidVersionSpecificationException
|
||||
instanceKlass org/apache/http/HttpException
|
||||
instanceKlass org/apache/maven/wagon/WagonException
|
||||
instanceKlass org/apache/maven/plugin/PluginConfigurationException
|
||||
instanceKlass org/apache/maven/configuration/BeanConfigurationException
|
||||
instanceKlass org/codehaus/plexus/component/configurator/ComponentConfigurationException
|
||||
instanceKlass org/apache/maven/project/interpolation/ModelInterpolationException
|
||||
instanceKlass org/apache/maven/BuildFailureException
|
||||
instanceKlass org/codehaus/plexus/util/dag/CycleDetectedException
|
||||
instanceKlass org/apache/maven/MavenExecutionException
|
||||
instanceKlass org/apache/maven/project/DuplicateProjectException
|
||||
instanceKlass org/apache/maven/project/ProjectBuildingException
|
||||
instanceKlass org/apache/maven/artifact/InvalidRepositoryException
|
||||
instanceKlass org/codehaus/plexus/personality/plexus/lifecycle/phase/InitializationException
|
||||
instanceKlass org/apache/maven/repository/legacy/metadata/ArtifactMetadataRetrievalException
|
||||
instanceKlass org/apache/maven/artifact/deployer/ArtifactDeploymentException
|
||||
instanceKlass org/apache/maven/artifact/installer/ArtifactInstallationException
|
||||
instanceKlass org/apache/maven/plugin/PluginManagerException
|
||||
instanceKlass org/apache/maven/settings/building/SettingsBuildingException
|
||||
instanceKlass org/eclipse/aether/RepositoryException
|
||||
instanceKlass org/apache/maven/lifecycle/LifecycleExecutionException
|
||||
instanceKlass org/apache/maven/plugin/version/PluginVersionResolutionException
|
||||
instanceKlass org/apache/maven/lifecycle/LifecycleNotFoundException
|
||||
instanceKlass org/apache/maven/plugin/prefix/NoPluginFoundForPrefixException
|
||||
instanceKlass org/apache/maven/plugin/InvalidPluginDescriptorException
|
||||
instanceKlass org/apache/maven/plugin/MojoNotFoundException
|
||||
instanceKlass org/apache/maven/plugin/PluginDescriptorParsingException
|
||||
instanceKlass org/apache/maven/lifecycle/LifecyclePhaseNotFoundException
|
||||
instanceKlass org/apache/maven/plugin/PluginResolutionException
|
||||
instanceKlass org/apache/maven/artifact/repository/metadata/RepositoryMetadataResolutionException
|
||||
instanceKlass org/apache/maven/artifact/resolver/AbstractArtifactResolutionException
|
||||
instanceKlass org/apache/maven/lifecycle/internal/builder/BuilderNotFoundException
|
||||
instanceKlass org/apache/maven/lifecycle/NoGoalSpecifiedException
|
||||
instanceKlass org/apache/maven/lifecycle/MissingProjectException
|
||||
instanceKlass org/apache/maven/toolchain/MisconfiguredToolchainException
|
||||
instanceKlass org/apache/maven/plugin/AbstractMojoExecutionException
|
||||
instanceKlass java/util/concurrent/TimeoutException
|
||||
instanceKlass com/google/common/collect/RegularImmutableMap$BucketOverflowException
|
||||
instanceKlass java/util/concurrent/ExecutionException
|
||||
instanceKlass java/lang/InterruptedException
|
||||
instanceKlass com/google/inject/internal/ErrorsException
|
||||
instanceKlass com/google/inject/internal/InternalProvisionException
|
||||
instanceKlass org/codehaus/plexus/context/ContextException
|
||||
instanceKlass java/text/ParseException
|
||||
instanceKlass org/codehaus/plexus/PlexusContainerException
|
||||
instanceKlass org/codehaus/plexus/component/repository/exception/ComponentLookupException
|
||||
instanceKlass org/codehaus/plexus/util/xml/pull/XmlPullParserException
|
||||
instanceKlass java/lang/CloneNotSupportedException
|
||||
instanceKlass sun/nio/fs/UnixException
|
||||
instanceKlass org/apache/commons/cli/ParseException
|
||||
instanceKlass org/codehaus/plexus/interpolation/InterpolationException
|
||||
instanceKlass org/apache/maven/cli/MavenCli$ExitException
|
||||
instanceKlass java/security/PrivilegedActionException
|
||||
instanceKlass org/codehaus/plexus/classworlds/ClassWorldException
|
||||
instanceKlass org/codehaus/plexus/classworlds/launcher/ConfigurationException
|
||||
instanceKlass java/io/IOException
|
||||
instanceKlass java/lang/ReflectiveOperationException
|
||||
instanceKlass java/lang/RuntimeException
|
||||
ciInstanceKlass java/lang/Exception 1 1 40 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/lang/InstantiationException
|
||||
instanceKlass java/lang/NoSuchFieldException
|
||||
instanceKlass java/lang/IllegalAccessException
|
||||
instanceKlass java/lang/reflect/InvocationTargetException
|
||||
instanceKlass java/lang/NoSuchMethodException
|
||||
instanceKlass java/lang/ClassNotFoundException
|
||||
ciInstanceKlass java/lang/ReflectiveOperationException 1 1 34 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/util/ServiceConfigurationError
|
||||
instanceKlass com/google/common/util/concurrent/ExecutionError
|
||||
instanceKlass java/lang/AssertionError
|
||||
instanceKlass java/io/IOError
|
||||
instanceKlass org/apache/maven/BuildAbort
|
||||
instanceKlass java/lang/VirtualMachineError
|
||||
instanceKlass java/lang/LinkageError
|
||||
instanceKlass java/lang/ThreadDeath
|
||||
ciInstanceKlass java/lang/Error 1 1 40 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ThreadDeath 0 0 21 10 100 12 1 1 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ClassNotFoundException 1 1 96 7 1 10 7 12 1 1 1 10 12 1 10 12 1 1 10 100 12 1 1 1 8 1 10 100 12 1 1 1 10 7 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 7 1 10 12 1 9 12 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/ClassNotFoundException serialPersistentFields [Ljava/io/ObjectStreamField; 1 [Ljava/io/ObjectStreamField;
|
||||
instanceKlass java/lang/ClassFormatError
|
||||
instanceKlass java/lang/UnsatisfiedLinkError
|
||||
instanceKlass java/lang/IncompatibleClassChangeError
|
||||
instanceKlass java/lang/BootstrapMethodError
|
||||
instanceKlass java/lang/NoClassDefFoundError
|
||||
ciInstanceKlass java/lang/LinkageError 1 1 31 10 7 12 1 1 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/Record 0 0 22 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/StringLatin1 1 1 380 7 1 10 100 12 1 1 1 100 1 10 12 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 10 12 1 10 12 1 1 10 9 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 10 12 10 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 1 9 12 1 1 100 1 10 10 100 12 1 1 1 10 7 12 1 1 1 10 12 1 10 12 1 100 1 100 1 8 1 10 12 1 8 1 10 12 100 1 10 10 10 7 12 1 1 1 8 1 8 1 8 1 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 10 12 10 12 1 10 12 10 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
staticfield java/lang/StringLatin1 $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/util/Arrays 1 1 988 10 7 12 1 1 1 10 100 12 1 1 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 8 1 10 12 1 1 10 12 1 100 1 10 12 1 9 100 12 1 1 1 10 7 12 1 1 100 1 10 12 1 1 10 7 12 1 1 10 7 12 1 1 1 100 1 10 12 1 10 12 1 1 7 1 9 7 12 1 1 1 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 7 1 11 12 1 1 10 12 1 10 7 12 1 1 1 10 12 10 12 1 10 12 1 10 12 10 12 1 11 7 12 1 1 1 10 7 12 1 1 1 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 100 1 10 12 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 10 100 12 1 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 8 1 7 1 10 12 10 12 1 10 12 1 1 10 12 1 1 9 100 12 1 1 1 100 1 10 12 1 9 100 1 100 1 10 12 1 9 100 1 100 1 10 12 1 9 100 1 100 1 10 12 1 9 100 1 100 1 10 12 1 9 100 1 100 1 10 12 1 9 100 1 10 12 1 100 1 10 12 1 10 12 1 9 12 1 100 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 3 10 100 1 10 10 12 1 1 11 100 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 11 12 1 8 1 10 11 12 1 11 7 12 1 1 1 11 100 12 1 1 1 11 12 1 1 18 12 1 1 11 12 1 1 11 100 12 1 1 1 18 12 1 11 100 12 1 1 1 18 12 1 11 100 12 1 1 1 18 12 1 100 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 10 12 1 10 12 10 12 10 12 1 10 12 10 12 1 10 12 1 10 12 1 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 15 10 100 12 1 1 1 16 15 10 12 15 10 12 15 10 12 15 10 12 1 1 100 1 100 1 1 1 1 100 1 1 1 1 1 1 100 1 1 100 1 1 100 1 1 1 100 1 100 1 1
|
||||
staticfield java/util/Arrays $assertionsDisabled Z 1
|
||||
ciMethod java/lang/StringLatin1 equals ([B[B)Z 326 1478 5241 0 -1
|
||||
ciMethod java/lang/StringLatin1 hashCode ([B)I 64 1238 929 0 352
|
||||
ciMethod java/lang/StringLatin1 regionMatchesCI ([BI[BII)Z 540 1624 3797 0 1120
|
||||
ciMethod java/lang/StringLatin1 regionMatchesCI_UTF16 ([BI[BII)Z 0 0 1 0 -1
|
||||
ciInstanceKlass java/lang/StringUTF16 1 1 598 100 1 7 1 10 100 12 1 1 1 100 1 10 7 1 3 100 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 12 1 9 12 1 1 10 12 1 1 100 1 8 1 10 12 1 9 12 1 1 9 12 1 10 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 100 1 10 12 1 10 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 1 10 100 12 1 1 1 10 12 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 3 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 9 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 10 12 10 12 10 10 100 12 1 1 1 10 7 12 1 1 1 10 12 1 10 12 1 100 1 8 1 8 1 10 12 1 1 100 1 10 10 100 12 1 1 1 10 100 12 1 1 8 1 8 1 8 1 10 12 1 1 10 12 1 1 10 12 10 12 1 10 100 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 10 12 10 12 1 10 12 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 11 100 12 1 1 10 12 1 10 12 1 10 12 1 1 9 12 1 1 9 12 1 5 0 5 0 10 12 1 10 12 10 12 10 7 12 1 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1
|
||||
staticfield java/lang/StringUTF16 HI_BYTE_SHIFT I 0
|
||||
staticfield java/lang/StringUTF16 LO_BYTE_SHIFT I 8
|
||||
staticfield java/lang/StringUTF16 $assertionsDisabled Z 1
|
||||
ciMethod java/lang/StringUTF16 hashCode ([B)I 0 0 1 0 -1
|
||||
ciMethod java/lang/StringUTF16 regionMatchesCI ([BI[BII)Z 0 0 1 0 -1
|
||||
ciMethod java/lang/StringUTF16 regionMatchesCI_Latin1 ([BI[BII)Z 0 0 1 0 -1
|
||||
ciInstanceKlass java/lang/Boolean 1 1 151 10 7 12 1 1 1 9 7 12 1 1 1 10 12 1 1 10 12 1 8 1 10 7 12 1 1 9 12 1 1 9 12 1 8 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 100 1 100 1 10 12 1 1 9 100 12 1 1 9 12 10 100 12 1 1 1 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 100 1 100 1 100 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/Boolean TRUE Ljava/lang/Boolean; java/lang/Boolean
|
||||
staticfield java/lang/Boolean FALSE Ljava/lang/Boolean; java/lang/Boolean
|
||||
staticfield java/lang/Boolean TYPE Ljava/lang/Class; java/lang/Class
|
||||
instanceKlass java/util/concurrent/locks/AbstractQueuedSynchronizer
|
||||
ciInstanceKlass java/util/concurrent/locks/AbstractOwnableSynchronizer 1 1 32 10 7 12 1 1 1 9 7 12 1 1 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/math/BigInteger
|
||||
instanceKlass java/util/concurrent/atomic/AtomicLong
|
||||
instanceKlass java/util/concurrent/atomic/AtomicInteger
|
||||
instanceKlass java/lang/Long
|
||||
instanceKlass java/lang/Integer
|
||||
instanceKlass java/lang/Short
|
||||
instanceKlass java/lang/Byte
|
||||
instanceKlass java/lang/Double
|
||||
instanceKlass java/lang/Float
|
||||
ciInstanceKlass java/lang/Number 1 1 37 10 7 12 1 1 1 10 100 12 1 1 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/lang/LiveStackFrameInfo
|
||||
ciInstanceKlass java/lang/StackFrameInfo 0 0 132 10 100 12 1 1 1 9 100 12 1 1 1 9 100 1 9 12 1 1 11 100 12 1 1 1 9 12 1 1 11 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 11 12 1 11 12 1 1 11 12 1 10 12 1 1 9 12 1 1 10 12 1 1 10 100 12 1 1 10 12 1 1 11 12 1 1 10 12 1 9 12 1 1 10 12 1 1 100 1 8 1 10 12 1 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/LiveStackFrameInfo 0 0 97 10 100 12 1 1 1 9 100 12 1 1 1 9 12 1 9 12 1 9 12 1 9 12 1 1 100 1 10 12 1 1 10 12 1 8 1 10 12 1 1 8 1 8 1 8 1 10 100 1 10 12 1 100 1 10 12 1 100 1 100 1 1 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1
|
||||
ciMethod java/lang/Boolean parseBoolean (Ljava/lang/String;)Z 48 0 3604 0 0
|
||||
ciInstanceKlass java/lang/Character 1 1 576 7 1 100 1 100 1 9 12 1 1 8 1 9 12 1 1 100 1 9 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 100 12 1 1 1 9 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 10 7 12 1 1 10 12 1 1 3 3 3 3 3 10 12 1 1 10 12 1 3 11 7 12 1 1 1 11 12 1 1 10 12 1 1 10 12 1 1 100 1 10 10 12 1 3 10 12 1 1 10 12 1 10 12 1 1 100 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 10 10 12 1 10 10 12 1 10 12 1 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 10 10 12 10 10 12 1 10 10 12 1 10 10 12 1 10 10 12 1 10 10 12 1 10 10 12 1 10 10 12 1 1 10 10 12 1 10 5 0 10 12 1 10 12 1 10 10 12 1 10 10 12 1 1 10 10 12 1 10 10 12 1 9 12 1 1 100 1 10 10 12 1 10 12 1 1 3 10 100 12 1 1 1 10 12 1 10 100 12 1 1 100 1 10 10 12 1 1 10 12 1 1 10 12 1 1 8 1 10 12 1 9 100 12 1 1 1 10 12 1 10 10 12 1 10 12 1 1 10 12 1 10 10 12 1 1 10 10 12 1 1 100 1 8 1 10 12 1 1 10 7 12 1 1 1 8 1 10 12 1 1 9 12 1 1 100 1 100 1 100 1 1 1 1 3 1 3 1 3 1 3 1 1 1 1 1 3 1 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 3 1 1 1 1 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1
|
||||
staticfield java/lang/Character TYPE Ljava/lang/Class; java/lang/Class
|
||||
staticfield java/lang/Character $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/Byte 1 1 215 7 1 100 1 10 100 12 1 1 1 9 12 1 1 8 1 9 12 1 1 100 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 9 100 12 1 1 1 10 12 1 1 7 1 100 1 10 12 1 1 8 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 8 1 8 1 10 7 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 5 0 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 100 1 100 1 1 1 3 1 3 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/Byte TYPE Ljava/lang/Class; java/lang/Class
|
||||
ciInstanceKlass java/lang/Short 1 1 224 7 1 100 1 100 1 10 100 12 1 1 1 10 12 1 1 7 1 100 1 10 12 1 1 8 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 1 8 1 9 12 1 1 100 1 10 12 1 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 9 100 12 1 1 1 10 12 1 10 12 1 1 10 8 1 8 1 10 100 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 3 3 5 0 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 100 1 100 1 1 1 3 1 3 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/Short TYPE Ljava/lang/Class; java/lang/Class
|
||||
ciMethod java/lang/Character toLowerCase (I)I 280 0 1087 0 0
|
||||
ciInstanceKlass java/lang/CharacterDataLatin1 1 1 130 9 7 12 1 1 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 1 3 3 3 10 12 1 9 12 1 100 1 3 3 9 12 1 1 10 7 12 1 1 1 10 9 12 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
staticfield java/lang/CharacterDataLatin1 DIGITS [B 256
|
||||
staticfield java/lang/CharacterDataLatin1 instance Ljava/lang/CharacterDataLatin1; java/lang/CharacterDataLatin1
|
||||
staticfield java/lang/CharacterDataLatin1 A [I 256
|
||||
staticfield java/lang/CharacterDataLatin1 B [B 256
|
||||
instanceKlass java/lang/CharacterData00
|
||||
instanceKlass java/lang/CharacterDataLatin1
|
||||
ciInstanceKlass java/lang/CharacterData 1 1 80 10 7 12 1 1 1 10 100 12 1 1 1 9 7 12 1 1 1 9 7 12 1 1 9 100 12 1 1 9 100 1 9 100 1 9 100 1 9 100 1 9 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/CharacterData00 1 1 250 9 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 10 12 1 1 10 12 1 10 12 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 10 12 1 100 1 3 3 3 3 10 12 1 9 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 10 9 12 1 1 8 1 10 7 12 1 1 1 8 1 8 1 7 1 7 3 3 3 3 3 3 3 3 3 3 3 3 8 1 100 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/CharacterData00 instance Ljava/lang/CharacterData00; java/lang/CharacterData00
|
||||
staticfield java/lang/CharacterData00 charMap [[[C 103 [[[C
|
||||
staticfield java/lang/CharacterData00 X [C 2048
|
||||
staticfield java/lang/CharacterData00 Y [C 5856
|
||||
staticfield java/lang/CharacterData00 A [I 972
|
||||
staticfield java/lang/CharacterData00 B [C 972
|
||||
staticfield java/lang/CharacterData00 $assertionsDisabled Z 1
|
||||
ciMethod java/lang/CharacterData toLowerCase (I)I 0 0 1 0 -1
|
||||
ciMethod java/lang/CharacterData of (I)Ljava/lang/CharacterData; 506 0 6417 0 128
|
||||
ciMethod java/lang/CharacterDataLatin1 toUpperCase (I)I 268 0 9065 0 192
|
||||
ciMethod java/lang/CharacterDataLatin1 getProperties (I)I 546 0 41832 0 96
|
||||
ciInstanceKlass java/lang/Float 1 1 223 7 1 100 1 10 7 12 1 1 1 10 100 12 1 1 1 4 100 1 10 12 1 1 10 12 1 1 8 1 8 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 4 4 4 10 7 12 1 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 3 10 12 1 1 10 12 1 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 100 1 100 1 100 1 1 1 1 1 4 1 1 1 4 1 1 3 1 3 1 3 1 3 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/Float TYPE Ljava/lang/Class; java/lang/Class
|
||||
ciMethod java/lang/Float isNaN (F)Z 514 0 12055 0 0
|
||||
ciInstanceKlass java/lang/Double 1 1 285 7 1 100 1 10 7 12 1 1 1 10 12 1 1 10 12 1 100 1 10 12 1 1 10 100 12 1 1 1 6 0 8 1 10 12 1 1 8 1 10 12 1 1 8 1 6 0 10 12 1 1 100 1 5 0 5 0 8 1 8 1 10 100 12 1 1 1 10 100 12 1 1 1 8 1 10 12 1 1 8 1 8 1 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 6 0 6 0 6 0 10 7 12 1 1 9 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 5 0 10 12 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 100 1 100 1 100 1 1 1 1 1 6 0 1 1 1 6 0 1 1 3 1 3 1 3 1 3 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/Double TYPE Ljava/lang/Class; java/lang/Class
|
||||
ciInstanceKlass java/lang/Integer 1 1 445 7 1 100 1 7 1 7 1 10 12 1 1 9 12 1 1 9 12 1 1 10 100 12 1 1 1 10 12 1 1 10 100 12 1 1 1 10 10 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 10 12 1 9 12 1 1 9 12 1 7 1 8 1 10 12 1 100 1 10 12 1 8 1 10 12 1 1 10 12 1 8 1 10 12 1 8 1 10 12 1 1 3 10 12 1 1 3 10 12 1 1 10 12 1 1 10 7 12 1 1 1 11 7 1 100 1 10 11 10 12 1 1 8 1 10 12 1 1 8 1 100 1 10 12 1 1 10 12 1 1 5 0 8 1 10 12 1 10 12 1 10 12 1 10 12 1 1 7 1 9 12 1 1 9 12 1 1 10 12 1 10 7 1 9 12 1 10 12 1 10 12 1 10 12 1 1 10 7 12 1 1 1 100 1 100 1 10 12 1 1 10 12 1 1 8 1 8 1 10 12 1 1 8 1 8 1 8 1 8 1 8 1 8 1 10 12 1 10 12 1 10 12 1 5 0 3 3 3 3 10 12 1 3 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 3 3 3 3 3 3 9 12 1 1 100 1 100 1 100 1 1 1 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/Integer TYPE Ljava/lang/Class; java/lang/Class
|
||||
staticfield java/lang/Integer digits [C 36
|
||||
staticfield java/lang/Integer DigitTens [B 100
|
||||
staticfield java/lang/Integer DigitOnes [B 100
|
||||
staticfield java/lang/Integer sizeTable [I 10
|
||||
ciMethod java/lang/Integer numberOfLeadingZeros (I)I 32 0 5157 0 -1
|
||||
ciInstanceKlass java/lang/Long 1 1 506 7 1 100 1 7 1 7 1 10 12 1 1 9 12 1 1 9 7 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 100 12 1 1 1 10 10 12 10 12 1 10 12 1 10 12 1 5 0 5 0 100 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 100 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 10 12 1 5 0 5 0 9 12 1 1 9 12 1 5 0 7 1 8 1 10 12 1 8 1 10 12 1 8 1 8 1 10 12 1 1 5 0 10 12 1 1 5 0 10 12 1 1 10 12 1 1 10 100 12 1 1 1 11 100 1 100 1 10 11 10 12 1 1 8 1 10 12 1 1 8 1 100 1 10 12 1 1 10 12 1 8 1 8 1 11 12 1 1 10 12 1 10 12 1 10 12 1 5 0 5 0 9 7 12 1 1 1 10 12 1 10 12 1 1 8 1 8 1 10 12 1 1 8 1 8 1 8 1 8 1 8 1 8 1 10 12 1 10 12 1 10 12 1 1 10 7 1 9 12 1 1 10 12 1 10 12 1 1 10 100 12 1 1 1 100 1 100 1 10 12 1 1 10 12 1 1 5 0 10 12 1 10 12 1 5 0 5 0 5 0 10 12 1 1 5 0 5 0 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 8 1 10 7 12 1 1 1 9 12 1 1 100 1 100 1 100 1 1 1 1 5 0 1 1 1 1 3 1 3 1 5 0 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/Long TYPE Ljava/lang/Class; java/lang/Class
|
||||
instanceKlass java/lang/ref/PhantomReference
|
||||
instanceKlass java/lang/ref/FinalReference
|
||||
instanceKlass java/lang/ref/WeakReference
|
||||
instanceKlass java/lang/ref/SoftReference
|
||||
ciInstanceKlass java/lang/ref/Reference 1 1 195 9 7 12 1 1 1 9 7 12 1 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 1 9 12 1 1 9 12 1 1 7 1 10 12 1 10 7 12 1 1 10 12 1 10 12 1 1 10 12 1 9 12 1 10 12 1 1 10 12 1 10 12 1 9 12 1 100 1 100 1 10 12 1 9 12 1 9 12 1 100 1 10 10 12 1 10 10 7 12 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 7 1 8 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 7 1 10 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/ref/Reference processPendingLock Ljava/lang/Object; java/lang/Object
|
||||
staticfield java/lang/ref/Reference $assertionsDisabled Z 1
|
||||
instanceKlass jdk/internal/ref/PhantomCleanable
|
||||
instanceKlass jdk/internal/ref/Cleaner
|
||||
ciInstanceKlass java/lang/ref/PhantomReference 1 1 39 10 100 12 1 1 1 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/lang/ref/Finalizer
|
||||
ciInstanceKlass java/lang/ref/FinalReference 1 1 47 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 100 1 8 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ref/Finalizer 1 1 152 9 7 12 1 1 1 10 100 12 1 1 1 9 12 1 1 9 12 1 1 9 12 1 9 12 1 10 12 1 10 12 1 1 9 12 1 1 100 1 10 12 1 100 1 11 100 12 1 1 100 1 10 12 1 100 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 100 1 10 10 12 1 10 7 12 1 1 1 7 1 10 7 1 10 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 7 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/ref/Finalizer lock Ljava/lang/Object; java/lang/Object
|
||||
staticfield java/lang/ref/Finalizer $assertionsDisabled Z 1
|
||||
instanceKlass sun/nio/ch/FileLockTable$FileLockReference
|
||||
instanceKlass sun/security/provider/FileInputStreamPool$StreamRef
|
||||
instanceKlass org/eclipse/sisu/inject/MildElements$Weak
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap$AbstractWeakKeyEntry
|
||||
instanceKlass com/google/common/cache/LocalCache$WeakEntry
|
||||
instanceKlass java/lang/WeakPairMap$WeakRefPeer
|
||||
instanceKlass java/lang/ClassValue$Entry
|
||||
instanceKlass com/google/common/cache/LocalCache$WeakValueReference
|
||||
instanceKlass java/util/logging/LogManager$LoggerWeakRef
|
||||
instanceKlass java/util/logging/Level$KnownLevel
|
||||
instanceKlass org/eclipse/sisu/inject/MildKeys$Weak
|
||||
instanceKlass java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
|
||||
instanceKlass java/lang/ThreadLocal$ThreadLocalMap$Entry
|
||||
instanceKlass java/util/WeakHashMap$Entry
|
||||
ciInstanceKlass java/lang/ref/WeakReference 1 1 31 10 7 12 1 1 1 10 12 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass org/eclipse/sisu/inject/MildElements$Soft
|
||||
instanceKlass com/google/common/cache/LocalCache$SoftValueReference
|
||||
instanceKlass sun/util/locale/provider/LocaleResources$ResourceReference
|
||||
instanceKlass sun/util/resources/Bundles$BundleReference
|
||||
instanceKlass sun/util/locale/LocaleObjectCache$CacheEntry
|
||||
instanceKlass org/eclipse/sisu/inject/MildKeys$Soft
|
||||
instanceKlass java/lang/invoke/LambdaFormEditor$Transform
|
||||
ciInstanceKlass java/lang/ref/SoftReference 1 1 47 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/IllegalMonitorStateException 1 1 26 10 100 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass com/sun/tools/javac/util/ClientCodeException
|
||||
instanceKlass com/sun/tools/javac/util/PropagatedException
|
||||
instanceKlass org/apache/maven/project/DuplicateArtifactAttachmentException
|
||||
instanceKlass java/time/DateTimeException
|
||||
instanceKlass org/eclipse/aether/named/support/LockUpgradeNotSupportedException
|
||||
instanceKlass java/util/ConcurrentModificationException
|
||||
instanceKlass com/google/inject/internal/aop/GlueException
|
||||
instanceKlass java/io/UncheckedIOException
|
||||
instanceKlass org/apache/maven/artifact/InvalidArtifactRTException
|
||||
instanceKlass com/google/inject/OutOfScopeException
|
||||
instanceKlass java/lang/annotation/IncompleteAnnotationException
|
||||
instanceKlass java/lang/reflect/UndeclaredThrowableException
|
||||
instanceKlass com/google/common/util/concurrent/UncheckedExecutionException
|
||||
instanceKlass com/google/common/cache/CacheLoader$InvalidCacheLoadException
|
||||
instanceKlass java/util/NoSuchElementException
|
||||
instanceKlass com/google/inject/CreationException
|
||||
instanceKlass com/google/inject/ConfigurationException
|
||||
instanceKlass com/google/inject/ProvisionException
|
||||
instanceKlass java/lang/TypeNotPresentException
|
||||
instanceKlass java/lang/IndexOutOfBoundsException
|
||||
instanceKlass java/lang/UnsupportedOperationException
|
||||
instanceKlass java/lang/SecurityException
|
||||
instanceKlass java/lang/IllegalStateException
|
||||
instanceKlass java/lang/IllegalArgumentException
|
||||
instanceKlass java/lang/ArithmeticException
|
||||
instanceKlass java/lang/NullPointerException
|
||||
instanceKlass java/lang/IllegalMonitorStateException
|
||||
instanceKlass java/lang/ArrayStoreException
|
||||
instanceKlass java/lang/ClassCastException
|
||||
ciInstanceKlass java/lang/RuntimeException 1 1 40 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass org/springframework/boot/loader/tools/BuildPropertiesWriter$NullAdditionalPropertyValueException
|
||||
instanceKlass java/nio/charset/UnsupportedCharsetException
|
||||
instanceKlass java/lang/NumberFormatException
|
||||
instanceKlass org/apache/maven/cli/MavenCli$IllegalUseOfUndefinedProperty
|
||||
ciInstanceKlass java/lang/IllegalArgumentException 1 1 35 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ArithmeticException 1 1 26 10 100 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ArrayStoreException 1 1 26 10 100 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/ClassCastException 1 1 26 10 100 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/NoClassDefFoundError 1 1 26 10 7 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/StackOverflowError 1 1 26 10 100 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/lang/StackOverflowError
|
||||
instanceKlass java/lang/OutOfMemoryError
|
||||
instanceKlass java/lang/InternalError
|
||||
ciInstanceKlass java/lang/VirtualMachineError 1 1 34 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/OutOfMemoryError 1 1 26 10 100 12 1 1 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/InternalError 0 0 34 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass org/apache/maven/project/DefaultProjectBuilder$1
|
||||
instanceKlass java/util/Collections$SingletonMap
|
||||
instanceKlass org/eclipse/sisu/wire/EntryMapAdapter
|
||||
instanceKlass com/google/common/collect/Maps$ViewCachingAbstractMap
|
||||
instanceKlass com/google/common/collect/MapMakerInternalMap
|
||||
instanceKlass org/eclipse/sisu/wire/MergedProperties
|
||||
instanceKlass com/google/common/cache/LocalCache
|
||||
instanceKlass java/util/EnumMap
|
||||
instanceKlass java/lang/ProcessEnvironment$StringEnvironment
|
||||
instanceKlass java/util/TreeMap
|
||||
instanceKlass java/util/IdentityHashMap
|
||||
instanceKlass java/util/WeakHashMap
|
||||
instanceKlass java/util/Collections$EmptyMap
|
||||
instanceKlass java/util/HashMap
|
||||
instanceKlass java/util/ImmutableCollections$AbstractImmutableMap
|
||||
instanceKlass java/util/concurrent/ConcurrentHashMap
|
||||
ciInstanceKlass java/util/AbstractMap 1 1 192 10 7 12 1 1 1 10 7 12 1 1 1 11 7 12 1 1 1 10 11 12 1 1 11 7 12 1 1 1 11 12 1 1 7 1 11 12 1 10 12 1 1 11 12 1 100 1 10 11 12 1 11 7 1 10 12 1 1 11 12 1 9 12 1 1 7 1 10 12 1 9 12 1 1 7 1 10 11 11 12 1 1 11 12 1 100 1 100 1 11 12 1 8 1 100 1 10 10 12 1 1 8 1 10 12 1 10 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 100 1 1 1 1 1
|
||||
instanceKlass java/lang/reflect/Executable
|
||||
instanceKlass java/lang/reflect/Field
|
||||
ciInstanceKlass java/lang/reflect/AccessibleObject 1 1 398 10 7 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 10 7 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 9 12 1 1 100 1 10 7 12 1 1 1 11 12 1 100 1 10 12 1 7 1 100 1 10 12 1 10 12 1 1 7 1 10 7 12 1 1 1 10 12 1 1 100 1 10 12 1 1 100 1 10 10 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 8 1 100 1 10 10 12 1 1 8 1 10 12 1 10 12 1 8 1 8 1 8 1 8 1 8 1 8 1 100 1 10 12 1 10 12 1 9 12 1 1 10 12 1 1 10 12 1 10 11 100 1 100 1 8 1 10 10 12 1 10 12 1 1 8 1 10 12 1 8 1 10 12 1 1 10 100 1 8 1 10 11 7 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 9 12 1 1 100 1 10 12 1 7 1 10 12 1 10 12 1 1 10 100 1 10 12 1 10 12 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 9 12 1 10 100 12 1 1 8 1 10 100 12 1 1 1 8 1 10 100 12 1 1 1 9 12 1 100 1 10 7 1 10 10 7 12 1 1 1 7 1 10 10 7 12 1 1 1 7 1 9 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/reflect/AccessibleObject reflectionFactory Ljdk/internal/reflect/ReflectionFactory; jdk/internal/reflect/ReflectionFactory
|
||||
instanceKlass java/lang/reflect/Constructor
|
||||
instanceKlass java/lang/reflect/Method
|
||||
ciInstanceKlass java/lang/reflect/Executable 1 1 548 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 11 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 8 1 10 10 12 1 1 10 12 1 1 10 100 12 1 1 1 18 12 1 1 11 100 12 1 1 1 8 1 8 1 8 1 10 100 12 1 1 1 11 12 1 1 100 1 8 1 8 1 10 12 1 100 1 8 1 10 12 1 8 1 11 100 12 1 1 1 100 1 10 12 1 1 11 12 1 8 1 18 8 1 10 12 1 10 12 1 1 18 8 1 10 12 1 100 1 10 12 1 10 12 1 11 100 12 1 1 10 12 1 1 8 1 8 1 10 12 1 1 10 12 1 1 10 10 12 1 100 1 10 10 12 1 10 12 1 1 10 7 12 1 1 10 12 1 10 12 1 10 12 1 1 10 7 12 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 8 1 10 12 1 10 12 1 3 100 1 8 1 10 12 1 10 12 1 10 10 12 1 10 12 1 1 8 1 8 1 8 1 9 12 1 10 12 1 100 1 8 1 9 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 10 12 1 7 1 10 12 1 10 12 1 1 100 1 10 100 12 1 1 1 7 1 10 7 12 1 1 1 10 12 1 1 11 7 12 1 1 10 7 12 1 1 10 100 12 1 1 1 10 12 1 1 9 12 1 10 12 1 1 10 12 1 10 12 1 1 9 7 12 1 1 1 10 7 12 1 1 1 10 12 1 10 12 1 1 9 12 1 10 10 10 10 100 12 1 1 1 10 12 1 9 12 1 10 12 1 1 9 12 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 15 10 100 12 1 1 1 16 15 16 1 16 1 15 10 12 16 1 100 1 1 100 1 100 1 1
|
||||
ciInstanceKlass java/lang/reflect/Constructor 1 1 433 10 7 12 1 1 1 10 7 12 1 1 9 7 12 1 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 1 9 12 1 100 1 8 1 10 12 1 10 12 1 9 12 1 1 10 7 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 7 1 100 1 8 1 10 10 12 1 10 12 1 10 12 1 1 10 12 1 1 9 100 12 1 1 1 10 7 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 100 12 1 1 10 12 1 1 10 12 1 10 100 12 1 1 1 8 1 10 10 12 1 100 1 8 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 8 1 10 12 1 1 11 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 9 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 9 100 12 1 1 10 12 1 10 12 1 10 12 1 100 1 8 1 10 10 12 1 1 10 12 1 10 10 12 1 1 10 12 1 1 10 100 12 1 1 1 11 100 12 1 1 1 10 12 1 1 9 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1
|
||||
ciInstanceKlass java/lang/reflect/Method 1 1 450 9 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 10 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 9 12 1 1 100 1 8 1 10 12 1 10 12 1 9 12 1 1 8 1 10 7 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 9 7 12 1 1 1 10 12 1 1 10 12 10 7 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 7 1 10 100 12 1 1 1 10 7 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 10 8 1 10 12 1 10 12 1 7 1 8 1 8 1 8 1 10 12 1 10 12 1 1 10 12 1 1 10 10 12 1 1 10 12 1 11 100 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 11 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 9 12 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 11 7 12 1 1 1 10 7 12 1 1 1 7 1 100 1 100 1 10 12 1 10 12 1 1 10 12 1 100 1 8 1 10 12 1 10 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 8 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/reflect/Field 1 1 437 9 7 12 1 1 1 10 12 1 1 10 100 12 1 1 1 10 100 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 10 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 9 12 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 1 100 1 8 1 10 12 1 10 12 1 9 12 1 1 9 12 1 10 12 1 10 7 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 7 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 7 1 10 7 12 1 1 100 1 10 8 1 10 12 1 1 10 12 1 1 8 1 10 12 10 12 1 8 1 8 1 10 11 100 1 9 12 1 10 12 1 1 10 12 1 1 11 7 12 1 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 1 10 12 1 10 100 12 1 1 10 12 1 10 12 1 1 10 12 9 12 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 10 12 1 1 11 7 1 10 12 1 7 1 10 100 12 1 1 1 10 7 12 1 1 1 9 12 1 10 7 12 1 1 1 11 7 12 1 1 1 10 12 1 1 10 12 1 1 9 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 1 1
|
||||
ciInstanceKlass java/lang/reflect/Parameter 1 1 226 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 9 12 1 1 9 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 100 1 10 10 12 1 1 11 100 12 1 1 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 10 12 1 8 1 8 1 10 100 12 1 1 1 10 12 1 10 12 10 12 1 8 1 10 12 1 9 12 1 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 10 12 1 10 100 12 1 1 1 10 12 1 1 11 100 12 1 1 10 100 12 1 1 100 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 9 12 1 100 1 10 11 12 1 1 11 12 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
ciInstanceKlass java/lang/StringBuffer 1 1 470 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 1 9 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 10 12 1 1 10 12 1 1 9 12 1 1 10 7 12 1 1 1 10 100 1 10 10 100 12 1 1 1 10 10 12 1 10 8 10 100 12 1 1 1 8 10 12 1 8 1 10 12 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 7 1 10 12 100 1 8 1 10 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 10 12 10 12 1 10 12 1 10 12 1 10 12 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 7 1 10 12 1 9 7 12 1 1 1 9 7 1 9 12 1 1 100 1 100 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/StringBuffer serialPersistentFields [Ljava/io/ObjectStreamField; 3 [Ljava/io/ObjectStreamField;
|
||||
instanceKlass java/lang/StringBuilder
|
||||
instanceKlass java/lang/StringBuffer
|
||||
ciInstanceKlass java/lang/AbstractStringBuilder 1 1 547 7 1 7 1 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 10 12 1 1 3 3 10 12 1 10 12 1 1 11 7 1 100 1 100 1 10 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 9 12 1 1 10 12 1 1 10 7 12 1 1 1 10 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 100 1 8 1 10 10 12 1 1 100 1 10 12 10 12 1 1 10 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 100 1 10 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 10 12 1 1 10 10 12 1 1 10 12 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 10 12 1 1 10 12 1 10 12 1 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 10 12 1 1 18 12 1 1 100 1 10 100 12 1 1 1 18 10 12 1 1 10 12 1 10 12 1 1 11 12 1 10 12 1 10 12 1 10 10 12 1 10 8 1 8 1 8 1 10 10 100 1 10 12 1 100 1 10 100 1 10 100 1 1 1 3 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1 1 1 100 1 1 1 1 1 1 15 10 100 12 1 1 1 16 1 15 10 12 16 15 10 12 1 1 1 1 100 1 100 1 1
|
||||
staticfield java/lang/AbstractStringBuilder EMPTYVALUE [B 0
|
||||
ciInstanceKlass java/lang/SecurityManager 0 0 576 10 100 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 100 1 8 1 10 12 1 10 12 1 1 10 100 12 1 1 1 10 100 1 10 100 1 10 9 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 100 12 1 1 100 1 8 1 10 9 12 1 1 9 12 1 8 1 9 12 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 1 100 1 10 10 12 1 1 100 1 8 1 10 12 1 8 1 8 1 8 1 8 1 8 1 8 1 10 12 1 8 1 8 1 8 1 8 1 8 1 10 100 12 1 1 1 10 12 1 1 8 1 100 1 8 1 10 8 1 8 1 8 1 8 1 8 1 10 100 12 1 1 8 1 100 1 8 1 8 1 10 8 1 10 12 1 100 1 8 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 10 100 12 1 1 11 100 12 1 1 1 18 12 1 1 11 100 12 1 1 1 18 12 1 1 11 12 1 1 18 18 11 12 1 18 12 1 11 12 1 1 9 12 1 1 9 12 1 9 12 1 9 12 1 100 1 10 100 12 1 1 10 12 1 10 12 1 18 12 1 18 10 100 12 1 1 1 18 12 1 10 12 1 18 18 8 1 10 12 1 9 12 1 1 11 100 12 1 1 1 8 1 100 1 10 12 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 10 12 1 1 8 1 100 1 10 9 12 1 8 1 10 12 1 8 1 100 1 10 10 100 12 1 1 10 100 1 9 100 12 1 1 1 11 12 1 1 10 12 1 11 12 1 10 12 1 100 1 10 10 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 100 12 1 1 1 16 15 10 100 12 1 1 1 16 1 16 15 10 12 16 1 15 10 12 16 15 11 100 1 16 1 16 1 15 10 12 16 15 10 12 16 15 10 12 1 16 1 15 11 12 1 15 10 12 16 15 10 16 1 1 1 1 100 1 100 1 1
|
||||
ciInstanceKlass java/security/AccessControlContext 1 1 373 9 7 12 1 1 1 9 12 1 1 10 100 12 1 1 1 8 1 10 100 12 1 1 1 10 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 1 10 7 12 1 1 100 1 10 12 1 11 100 12 1 1 1 11 12 1 11 12 1 11 12 1 1 7 1 11 12 1 1 10 12 1 10 7 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 11 100 12 1 1 1 10 7 1 100 1 8 1 10 12 1 10 12 1 1 7 1 10 7 12 1 1 1 9 12 1 9 12 1 9 12 1 9 12 1 1 9 12 1 1 9 12 1 9 12 1 10 7 12 1 1 1 9 12 1 10 12 1 1 10 12 1 1 8 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 100 1 10 10 12 1 1 10 100 12 1 1 1 10 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 8 1 10 12 1 8 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 8 1 8 1 100 1 10 12 1 10 12 1 1 100 1 10 12 1 8 1 10 12 1 10 12 1 10 8 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 10 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1
|
||||
ciInstanceKlass java/net/URL 1 1 743 10 7 12 1 1 1 10 12 1 10 7 12 1 1 9 12 1 1 9 12 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 9 12 1 1 10 7 12 1 1 1 8 1 10 12 1 1 100 1 10 10 12 1 1 8 1 10 12 1 1 9 12 1 100 1 8 1 10 12 1 10 12 1 8 1 9 12 1 10 12 1 1 9 12 1 10 12 1 10 12 1 9 12 1 9 12 1 8 1 9 12 1 10 12 1 1 8 1 9 12 1 1 10 12 1 1 10 7 12 1 1 1 8 1 10 12 1 7 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 8 1 10 12 1 1 10 12 1 8 1 9 12 1 8 1 10 12 1 10 7 12 1 1 1 100 1 10 12 1 10 12 1 1 10 7 12 1 1 1 100 1 8 1 10 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 10 10 7 12 1 1 1 10 12 1 9 100 12 1 1 1 10 100 12 1 1 1 9 12 1 1 10 12 1 10 100 12 1 1 1 100 1 100 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 10 10 10 12 1 100 1 10 12 1 10 12 1 1 8 1 9 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 100 1 10 12 1 10 12 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 12 1 9 12 1 1 9 12 1 1 100 1 8 1 10 10 12 1 9 12 1 1 10 7 12 1 1 8 1 10 7 12 1 1 8 1 10 12 1 1 10 12 1 8 1 8 1 10 7 12 1 1 1 100 1 10 100 12 1 1 1 10 12 1 10 12 1 7 1 10 9 12 1 1 10 7 12 1 1 8 1 10 12 1 1 7 1 10 10 7 12 1 1 1 8 9 100 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 11 7 12 1 1 10 12 1 10 12 1 9 12 1 10 12 1 1 10 100 12 1 1 10 100 12 1 1 1 8 10 100 12 1 1 100 1 10 8 8 10 12 1 8 8 8 100 1 10 12 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 10 12 1 1 10 12 1 1 10 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 10 12 1 100 1 8 1 10 10 10 12 1 1 10 12 1 10 12 1 1 8 1 7 1 10 10 10 7 1 10 12 1 9 7 12 1 1 1 9 12 1 1 7 1 10 10 7 12 1 1 1 100 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/net/URL defaultFactory Ljava/net/URLStreamHandlerFactory; java/net/URL$DefaultFactory
|
||||
staticfield java/net/URL streamHandlerLock Ljava/lang/Object; java/lang/Object
|
||||
staticfield java/net/URL serialPersistentFields [Ljava/io/ObjectStreamField; 7 [Ljava/io/ObjectStreamField;
|
||||
ciInstanceKlass java/util/jar/Manifest 1 1 336 10 7 12 1 1 1 7 1 10 9 7 12 1 1 1 7 1 10 9 12 1 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 11 7 1 11 12 1 1 10 12 1 1 10 100 12 1 1 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 11 100 1 10 12 1 10 12 1 1 11 12 1 1 10 12 1 11 12 1 1 11 100 12 1 1 1 11 100 12 1 1 11 12 1 1 100 1 10 12 1 8 1 11 12 1 7 1 10 12 1 1 11 12 1 10 12 1 10 12 1 10 100 12 1 1 1 8 1 10 12 1 1 10 9 7 12 1 1 1 10 12 1 1 10 100 12 1 10 12 1 10 12 1 9 100 12 1 1 1 8 1 10 12 1 8 1 8 1 7 1 10 12 1 10 12 1 10 12 1 1 100 1 8 1 10 12 1 1 8 1 10 10 12 1 1 8 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 11 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 11 10 12 1 11 10 12 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/util/Collection 1 1 115 11 100 12 1 1 1 100 1 11 7 12 1 1 1 10 100 12 1 1 1 11 12 1 1 11 100 12 1 1 1 11 12 1 1 11 100 12 1 1 1 11 12 1 1 10 100 12 1 1 1 11 12 1 10 7 12 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/util/concurrent/ConcurrentLinkedDeque
|
||||
instanceKlass java/util/AbstractMap$2
|
||||
instanceKlass org/eclipse/sisu/inject/MildElements
|
||||
instanceKlass org/eclipse/sisu/inject/MildValues$1
|
||||
instanceKlass com/google/common/collect/Maps$Values
|
||||
instanceKlass com/google/common/collect/AbstractMultimap$Values
|
||||
instanceKlass java/util/TreeMap$Values
|
||||
instanceKlass com/google/common/collect/AbstractMapBasedMultimap$WrappedCollection
|
||||
instanceKlass com/google/common/collect/ImmutableCollection
|
||||
instanceKlass java/util/IdentityHashMap$Values
|
||||
instanceKlass java/util/HashMap$Values
|
||||
instanceKlass java/util/AbstractQueue
|
||||
instanceKlass java/util/LinkedHashMap$LinkedValues
|
||||
instanceKlass java/util/ArrayDeque
|
||||
instanceKlass java/util/AbstractSet
|
||||
instanceKlass java/util/ImmutableCollections$AbstractImmutableCollection
|
||||
instanceKlass java/util/AbstractList
|
||||
ciInstanceKlass java/util/AbstractCollection 1 1 160 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 11 7 12 1 1 1 11 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 100 12 1 1 10 100 12 1 1 1 100 1 10 100 12 1 1 1 10 100 12 1 1 1 100 1 10 11 12 1 11 7 1 10 12 1 10 12 1 10 7 12 1 1 1 11 8 1 7 1 10 10 12 1 1 8 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/util/List 1 1 217 10 100 12 1 1 1 11 100 12 1 1 1 11 100 12 1 1 1 11 12 1 1 11 100 12 1 1 11 12 1 1 11 12 1 1 10 100 12 1 1 1 100 1 100 1 10 12 1 1 100 1 10 100 12 1 1 1 9 7 12 1 1 1 7 1 10 12 10 12 1 7 1 10 12 1 1 10 12 1 10 12 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1
|
||||
ciMethod java/util/AbstractCollection <init> ()V 512 0 170776 0 64
|
||||
instanceKlass org/eclipse/aether/util/graph/visitor/Stack
|
||||
instanceKlass org/apache/maven/project/MavenProject$LoggingList
|
||||
instanceKlass org/apache/maven/model/merge/ModelMerger$MergingList
|
||||
instanceKlass java/util/ArrayList$SubList
|
||||
instanceKlass sun/security/jca/ProviderList$3
|
||||
instanceKlass java/util/Collections$SingletonList
|
||||
instanceKlass com/google/common/collect/Lists$Partition
|
||||
instanceKlass com/google/common/collect/Lists$TransformingRandomAccessList
|
||||
instanceKlass java/util/Arrays$ArrayList
|
||||
instanceKlass java/util/AbstractSequentialList
|
||||
instanceKlass java/util/Vector
|
||||
instanceKlass java/util/Collections$EmptyList
|
||||
instanceKlass java/util/ArrayList
|
||||
ciInstanceKlass java/util/AbstractList 1 1 218 10 7 12 1 1 1 9 7 12 1 1 1 10 12 1 1 10 12 1 1 100 1 10 10 12 1 1 11 7 12 1 1 1 11 12 1 1 11 12 1 10 7 12 1 1 1 10 12 1 11 12 1 11 12 1 11 12 1 10 12 1 1 10 12 1 1 11 100 12 1 1 1 11 7 1 11 7 1 10 12 1 7 1 10 12 1 10 12 1 1 100 1 100 1 10 12 1 100 1 10 100 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 8 1 100 1 8 1 8 1 8 1 10 7 1 11 10 10 12 1 11 12 1 10 12 1 1 8 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/AssertionStatusDirectives 0 0 24 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/invoke/MethodHandleNatives$CallSiteContext 1 1 49 10 7 12 1 1 1 7 1 10 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1
|
||||
ciInstanceKlass jdk/internal/invoke/NativeEntryPoint 0 0 92 10 100 12 1 1 1 9 100 12 1 1 1 10 100 12 1 1 1 100 1 9 12 1 9 12 1 9 12 1 1 9 12 1 1 9 12 1 1 100 1 8 1 10 12 1 11 100 12 1 1 1 10 12 1 1 10 12 1 11 100 12 1 1 11 12 1 10 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/lang/invoke/VolatileCallSite
|
||||
instanceKlass java/lang/invoke/MutableCallSite
|
||||
instanceKlass java/lang/invoke/ConstantCallSite
|
||||
ciInstanceKlass java/lang/invoke/CallSite 1 1 302 10 7 12 1 1 1 10 7 12 1 1 1 9 7 12 1 1 1 10 12 1 1 9 12 1 1 10 7 12 1 1 1 10 12 1 100 1 10 12 1 1 10 12 1 1 9 100 12 1 1 1 10 100 12 1 1 10 12 1 1 100 1 100 1 10 10 100 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 10 100 12 1 1 10 12 1 1 9 12 1 9 100 12 1 1 1 8 1 10 7 12 1 1 1 10 12 1 1 100 1 10 12 1 1 9 12 1 8 1 100 1 10 12 1 10 12 1 100 1 8 1 10 10 12 1 10 12 1 1 100 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 9 12 1 1 8 10 12 1 1 9 12 1 1 100 1 10 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 10 7 12 1 1 1 100 1 8 1 10 10 12 10 12 1 1 100 1 100 1 100 1 8 1 10 12 1 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/invoke/CallSite $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/invoke/VolatileCallSite 0 0 37 10 100 12 1 1 1 10 12 1 10 100 12 1 1 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/invoke/MethodType 1 1 771 7 1 10 7 12 1 1 1 9 12 1 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 9 7 12 1 1 8 1 10 100 12 1 1 1 9 7 1 9 7 1 10 12 1 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 1 100 1 8 1 10 12 1 100 1 10 10 12 1 10 12 1 1 10 12 1 1 11 7 12 1 1 1 9 12 1 11 12 1 1 7 7 1 10 7 12 1 1 1 10 12 1 9 12 1 1 10 7 12 1 1 10 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 9 12 1 1 10 12 1 1 100 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 8 1 8 1 10 12 1 1 9 12 1 1 100 1 10 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 9 12 1 10 12 1 10 10 12 1 1 10 12 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 12 10 12 1 10 12 1 100 1 8 1 8 1 8 1 10 12 1 10 12 1 10 12 1 10 11 12 1 1 11 12 1 10 100 12 1 1 1 9 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 9 12 1 1 7 1 10 12 1 10 12 1 1 9 100 12 1 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 8 1 10 7 12 1 1 1 11 12 1 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 100 1 10 12 1 1 11 100 12 1 1 1 18 12 1 1 11 12 1 1 18 12 1 11 12 1 100 1 11 100 12 1 1 10 12 1 100 1 10 12 1 10 100 12 1 1 10 12 1 1 9 12 1 1 9 100 12 1 1 1 10 100 12 1 1 1 9 12 1 10 100 12 1 1 10 12 1 100 10 12 1 1 10 12 1 10 7 1 7 1 9 12 1 1 100 1 100 1 100 1 1 1 5 0 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 100 12 1 1 1 16 15 10 12 16 16 15 10 12 16 1 1 1 1 100 1 1 100 1 1 100 1 100 1 1
|
||||
staticfield java/lang/invoke/MethodType internTable Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet; java/lang/invoke/MethodType$ConcurrentWeakInternSet
|
||||
staticfield java/lang/invoke/MethodType NO_PTYPES [Ljava/lang/Class; 0 [Ljava/lang/Class;
|
||||
staticfield java/lang/invoke/MethodType objectOnlyTypes [Ljava/lang/invoke/MethodType; 20 [Ljava/lang/invoke/MethodType;
|
||||
staticfield java/lang/invoke/MethodType METHOD_HANDLE_ARRAY [Ljava/lang/Class; 1 [Ljava/lang/Class;
|
||||
staticfield java/lang/invoke/MethodType serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField;
|
||||
staticfield java/lang/invoke/MethodType $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/BootstrapMethodError 0 0 45 10 100 12 1 1 1 10 12 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
ciInstanceKlass jdk/internal/loader/ClassLoaders$AppClassLoader 1 1 119 8 1 10 7 12 1 1 1 10 7 12 1 1 1 10 100 12 1 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 7 1 8 1 10 12 10 7 12 1 1 1 10 100 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 100 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
ciInstanceKlass jdk/internal/loader/ClassLoaders$PlatformClassLoader 1 1 42 8 1 10 7 12 1 1 1 10 7 12 1 1 1 100 1 10 12 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1
|
||||
ciInstanceKlass java/lang/NullPointerException 1 1 52 10 7 12 1 1 1 10 12 1 9 7 12 1 1 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 1 1 5 0 1 1 1 1 1 1 1 1 100 1 100 1 100 1 1 1
|
||||
ciInstanceKlass java/lang/StackTraceElement 1 1 224 10 7 12 1 1 1 10 7 12 1 1 9 12 1 1 9 12 1 1 9 12 1 9 12 1 8 1 10 100 12 1 1 1 7 1 9 12 1 8 1 9 12 1 9 12 1 9 12 1 1 8 1 10 12 1 1 10 12 1 7 1 10 10 12 1 1 8 1 10 12 1 1 10 12 1 8 1 8 1 8 1 10 12 1 8 1 8 1 10 12 1 8 1 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 9 12 1 1 10 7 12 1 1 1 10 12 1 1 7 1 10 12 1 1 10 7 12 1 1 10 7 12 1 1 1 10 7 12 1 1 10 7 12 1 1 10 10 12 1 1 10 12 1 10 12 1 1 100 1 1 1 1 1 3 1 3 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1
|
||||
instanceKlass java/nio/IntBuffer
|
||||
instanceKlass java/nio/CharBuffer
|
||||
instanceKlass java/nio/LongBuffer
|
||||
instanceKlass java/nio/ByteBuffer
|
||||
ciInstanceKlass java/nio/Buffer 1 1 224 100 1 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 100 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 8 1 10 12 1 1 10 12 1 8 1 9 12 1 1 100 1 8 1 10 12 1 8 1 8 1 9 12 10 12 1 8 1 8 1 8 1 10 12 1 8 1 8 1 8 1 100 1 10 100 1 10 100 1 10 100 1 10 10 100 12 1 1 1 10 11 100 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 7 1 10 10 7 12 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/nio/Buffer UNSAFE Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
staticfield java/nio/Buffer SCOPED_MEMORY_ACCESS Ljdk/internal/misc/ScopedMemoryAccess; jdk/internal/misc/ScopedMemoryAccess
|
||||
staticfield java/nio/Buffer $assertionsDisabled Z 1
|
||||
ciInstanceKlass jdk/internal/misc/UnsafeConstants 1 1 34 10 100 12 1 1 1 9 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 1 1 1 1 1 1 1 1
|
||||
staticfield jdk/internal/misc/UnsafeConstants ADDRESS_SIZE0 I 8
|
||||
staticfield jdk/internal/misc/UnsafeConstants PAGE_SIZE I 4096
|
||||
staticfield jdk/internal/misc/UnsafeConstants BIG_ENDIAN Z 0
|
||||
staticfield jdk/internal/misc/UnsafeConstants UNALIGNED_ACCESS Z 1
|
||||
staticfield jdk/internal/misc/UnsafeConstants DATA_CACHE_LINE_FLUSH_SIZE I 64
|
||||
instanceKlass java/lang/invoke/DelegatingMethodHandle
|
||||
instanceKlass java/lang/invoke/BoundMethodHandle
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle
|
||||
ciInstanceKlass java/lang/invoke/MethodHandle 1 1 641 100 1 9 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 7 1 7 1 10 12 1 1 9 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 11 100 12 1 1 1 10 12 1 1 10 12 1 10 12 1 9 12 1 1 10 12 1 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 7 12 1 1 1 10 100 12 1 1 1 7 1 10 12 1 1 10 12 1 1 10 12 1 1 8 1 10 7 12 1 1 1 8 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 8 1 10 12 1 1 8 1 10 12 1 8 1 10 100 12 1 1 1 9 12 1 1 100 1 10 9 100 12 1 1 1 9 100 1 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 8 1 10 12 1 1 8 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 11 12 1 10 12 1 10 12 1 1 10 100 12 1 1 1 100 1 11 12 1 10 100 1 11 12 1 100 1 10 12 1 11 12 1 9 100 12 1 1 1 11 12 1 1 11 100 12 1 1 1 10 12 1 1 9 12 1 11 12 1 9 12 1 9 12 1 9 12 1 11 12 1 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 10 7 12 1 1 10 12 1 1 100 1 8 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 100 1 10 100 12 1 1 1 10 12 1 9 7 12 1 1 1 10 12 1 1 10 12 1 1 8 1 9 12 1 9 12 1 1 9 12 1 1 10 12 1 7 1 10 12 1 10 12 1 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 11 7 12 1 1 9 12 1 10 12 1 1 9 12 1 10 12 1 8 10 12 1 1 8 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 100 1 1 1 1
|
||||
staticfield java/lang/invoke/MethodHandle FORM_OFFSET J 20
|
||||
staticfield java/lang/invoke/MethodHandle UPDATE_OFFSET J 13
|
||||
staticfield java/lang/invoke/MethodHandle $assertionsDisabled Z 1
|
||||
instanceKlass org/apache/maven/artifact/versioning/ManagedVersionMap
|
||||
instanceKlass java/util/LinkedHashMap
|
||||
ciInstanceKlass java/util/HashMap 1 1 610 10 7 12 1 1 1 100 1 10 12 1 1 100 1 10 7 12 1 1 1 100 1 11 12 1 1 11 12 1 11 12 1 1 10 7 12 1 1 1 7 1 3 10 7 12 1 1 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 1 8 1 10 12 1 9 12 1 1 10 12 1 9 12 1 1 4 10 12 1 10 12 1 1 11 7 12 1 1 9 12 1 1 4 10 12 1 1 11 12 1 1 11 7 12 1 1 1 11 7 12 1 1 1 11 12 1 1 7 1 11 12 1 11 12 1 10 12 1 10 12 1 1 9 12 10 12 1 1 9 7 12 1 1 1 9 12 9 12 1 10 12 1 1 9 12 1 7 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 9 12 1 10 12 1 1 3 10 12 1 1 10 12 1 1 9 12 1 1 9 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 1 7 1 10 12 1 10 12 1 10 7 12 1 1 1 7 1 9 12 1 1 7 1 10 9 12 7 1 10 100 1 10 11 7 12 1 1 1 100 1 10 11 100 12 1 1 11 100 12 1 1 1 10 12 1 100 1 100 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 8 10 100 12 1 1 1 100 1 10 4 10 100 12 1 1 1 4 10 12 1 10 100 12 1 1 1 10 12 1 8 1 4 10 100 12 1 1 1 100 1 11 100 12 1 1 1 10 12 1 10 12 1 10 10 12 1 1 100 1 100 1 1 1 1 5 0 1 3 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/util/LinkedHashMap 1 1 289 9 7 12 1 1 1 9 12 1 9 7 12 1 1 9 12 1 10 7 12 1 1 1 10 12 1 1 10 12 1 1 9 12 1 1 9 12 1 1 9 12 1 10 12 1 1 100 1 10 10 12 1 1 10 12 1 10 12 1 1 9 12 1 1 9 12 1 10 100 12 1 1 1 10 12 1 10 12 1 10 12 10 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 9 7 1 10 12 1 9 12 1 1 7 1 10 12 1 9 12 1 1 7 1 10 9 12 1 7 1 10 100 1 10 11 100 12 1 1 1 100 1 10 11 100 12 1 1 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 100 1 1 1 1 1 100 1 1 1 1 1 1 1 1
|
||||
ciMethod java/util/HashMap put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 1024 0 13685 0 256
|
||||
ciMethod java/util/HashMap newNode (ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Node;)Ljava/util/HashMap$Node; 796 0 7914 0 -1
|
||||
ciMethod java/util/HashMap afterNodeAccess (Ljava/util/HashMap$Node;)V 36 0 182 0 -1
|
||||
ciMethod java/util/HashMap afterNodeInsertion (Z)V 842 0 1453 0 -1
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle$Special
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle$Interface
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle$Accessor
|
||||
instanceKlass java/lang/invoke/DirectMethodHandle$Constructor
|
||||
ciInstanceKlass java/lang/invoke/DirectMethodHandle 1 1 940 7 1 7 1 100 1 7 1 7 1 10 7 12 1 1 1 10 7 12 1 1 1 100 1 10 12 1 10 12 1 1 10 7 12 1 1 10 12 1 1 10 12 1 10 12 1 7 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 9 12 1 1 100 1 10 9 12 1 1 9 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 10 12 1 1 8 1 10 12 1 1 7 1 10 12 1 7 1 10 10 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 1 100 1 10 12 1 10 12 1 7 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 8 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 9 7 12 1 1 1 7 1 10 12 1 10 7 12 1 1 1 10 12 1 10 12 1 1 9 12 1 1 100 1 10 8 1 10 12 1 1 10 12 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 10 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 8 1 9 7 12 1 1 1 8 1 9 12 1 9 12 1 8 1 9 12 1 9 12 1 8 1 9 12 1 9 12 1 8 1 10 12 1 10 12 1 1 9 12 1 1 7 1 10 12 1 1 100 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 1 7 1 10 12 1 1 10 12 1 10 12 1 1 7 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 9 12 1 1 10 7 1 9 12 9 12 1 10 7 12 1 1 1 10 12 1 7 1 7 1 7 1 9 12 1 1 10 7 12 1 10 12 1 1 10 12 1 100 1 10 12 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 100 1 10 100 12 1 1 1 10 12 1 10 12 1 8 1 9 12 1 9 12 1 10 12 1 9 12 1 1 10 100 12 1 1 1 9 12 1 1 9 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 9 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 9 12 1 1 10 12 1 1 9 7 12 1 1 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 9 12 1 8 1 9 12 1 1 9 12 1 1 10 12 1 10 12 1 1 9 7 1 10 12 1 9 12 1 1 10 12 10 12 1 10 12 1 10 12 1 10 8 1 8 1 8 1 8 1 10 12 1 1 9 12 1 1 10 12 1 10 100 12 1 1 1 8 9 12 1 1 10 12 1 1 8 1 8 8 9 12 1 8 1 8 8 8 8 8 1 8 10 12 1 10 12 1 8 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 1 7 1 1 1 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/invoke/DirectMethodHandle IMPL_NAMES Ljava/lang/invoke/MemberName$Factory; java/lang/invoke/MemberName$Factory
|
||||
staticfield java/lang/invoke/DirectMethodHandle FT_UNCHECKED_REF I 8
|
||||
staticfield java/lang/invoke/DirectMethodHandle ACCESSOR_FORMS [Ljava/lang/invoke/LambdaForm; 132 [Ljava/lang/invoke/LambdaForm;
|
||||
staticfield java/lang/invoke/DirectMethodHandle ALL_WRAPPERS [Lsun/invoke/util/Wrapper; 10 [Lsun/invoke/util/Wrapper;
|
||||
staticfield java/lang/invoke/DirectMethodHandle NFS [Ljava/lang/invoke/LambdaForm$NamedFunction; 12 [Ljava/lang/invoke/LambdaForm$NamedFunction;
|
||||
staticfield java/lang/invoke/DirectMethodHandle OBJ_OBJ_TYPE Ljava/lang/invoke/MethodType; java/lang/invoke/MethodType
|
||||
staticfield java/lang/invoke/DirectMethodHandle LONG_OBJ_TYPE Ljava/lang/invoke/MethodType; java/lang/invoke/MethodType
|
||||
staticfield java/lang/invoke/DirectMethodHandle $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/invoke/LambdaForm 1 1 1052 100 1 9 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 9 12 1 1 9 12 1 1 10 12 1 1 100 1 10 9 12 1 10 12 1 1 9 12 1 10 7 12 1 1 1 9 12 1 9 12 1 9 12 1 1 9 12 1 10 12 1 1 7 1 10 12 1 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 10 12 1 1 9 100 12 1 1 1 10 12 1 1 9 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 7 1 10 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 7 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 1 9 12 1 1 9 12 1 9 12 1 1 10 12 1 9 12 1 10 100 12 1 1 1 10 12 1 1 10 12 1 9 12 1 1 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 8 1 10 12 1 10 12 1 8 1 8 1 9 12 1 9 12 1 9 12 1 1 10 12 1 1 10 12 1 9 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 9 12 1 10 12 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 10 12 1 9 12 1 7 1 10 12 1 1 9 12 1 10 12 1 10 12 1 1 10 12 10 12 1 10 12 1 1 10 12 1 1 10 10 12 1 1 10 12 1 1 7 1 8 1 10 12 1 1 10 12 1 10 12 1 1 10 8 1 10 12 1 1 8 1 8 1 8 1 10 12 1 9 12 1 1 10 12 1 1 10 12 1 1 100 1 10 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 1 9 12 1 1 8 1 10 100 12 1 1 1 10 7 12 1 1 10 12 10 10 12 1 1 9 12 1 8 10 12 1 1 100 1 10 12 1 1 10 12 1 9 7 12 1 1 9 12 1 1 8 1 10 100 12 1 1 10 12 1 1 100 1 100 1 10 10 12 1 1 10 12 1 1 8 1 8 1 100 1 8 1 10 12 10 12 1 10 12 1 10 12 1 1 8 1 8 1 9 100 12 1 1 1 10 12 1 10 12 1 1 8 1 8 1 8 1 100 1 8 1 100 1 8 1 100 1 8 1 10 12 1 8 1 9 10 7 12 1 1 1 10 12 1 9 12 1 1 10 12 1 10 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 8 1 100 10 12 1 10 12 1 9 12 1 1 10 7 12 1 1 8 1 8 1 100 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 8 1 8 1 8 1 10 12 1 8 1 10 12 1 8 1 8 1 8 1 8 1 8 1 10 12 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 9 12 1 1 8 1 10 12 1 1 9 12 1 1 10 12 1 1 9 12 1 9 12 1 1 9 12 1 9 12 1 1 7 1 10 7 12 1 1 1 9 12 1 10 12 1 10 12 1 8 1 10 12 1 9 12 1 1 7 1 10 7 12 1 1 1 8 1 100 1 10 12 1 9 12 1 9 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 9 7 12 1 1 10 12 1 1 10 12 1 10 12 1 9 12 10 12 1 10 10 12 1 9 9 12 1 7 9 12 1 1 10 12 1 1 9 12 1 10 12 1 10 7 1 9 1 1 1 1 3 1 3 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1 100 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/invoke/LambdaForm COMPILE_THRESHOLD I 0
|
||||
staticfield java/lang/invoke/LambdaForm INTERNED_ARGUMENTS [[Ljava/lang/invoke/LambdaForm$Name; 5 [[Ljava/lang/invoke/LambdaForm$Name;
|
||||
staticfield java/lang/invoke/LambdaForm IMPL_NAMES Ljava/lang/invoke/MemberName$Factory; java/lang/invoke/MemberName$Factory
|
||||
staticfield java/lang/invoke/LambdaForm LF_identity [Ljava/lang/invoke/LambdaForm; 6 [Ljava/lang/invoke/LambdaForm;
|
||||
staticfield java/lang/invoke/LambdaForm LF_zero [Ljava/lang/invoke/LambdaForm; 6 [Ljava/lang/invoke/LambdaForm;
|
||||
staticfield java/lang/invoke/LambdaForm NF_identity [Ljava/lang/invoke/LambdaForm$NamedFunction; 6 [Ljava/lang/invoke/LambdaForm$NamedFunction;
|
||||
staticfield java/lang/invoke/LambdaForm NF_zero [Ljava/lang/invoke/LambdaForm$NamedFunction; 6 [Ljava/lang/invoke/LambdaForm$NamedFunction;
|
||||
staticfield java/lang/invoke/LambdaForm createFormsLock Ljava/lang/Object; java/lang/Object
|
||||
staticfield java/lang/invoke/LambdaForm DEBUG_NAME_COUNTERS Ljava/util/HashMap; null
|
||||
staticfield java/lang/invoke/LambdaForm DEBUG_NAMES Ljava/util/HashMap; null
|
||||
staticfield java/lang/invoke/LambdaForm TRACE_INTERPRETER Z 0
|
||||
staticfield java/lang/invoke/LambdaForm $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/invoke/MethodHandleNatives 1 1 684 100 1 10 7 12 1 1 1 9 7 12 1 1 1 10 12 1 1 100 1 10 10 12 1 1 10 12 1 10 12 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 8 1 10 12 1 1 7 1 10 7 12 1 1 1 10 100 12 1 1 1 7 1 10 10 12 1 1 8 1 10 12 1 8 1 10 12 1 1 8 1 10 12 1 1 9 100 12 1 1 1 8 1 10 100 12 1 1 1 100 1 10 12 100 1 100 1 8 1 7 1 10 10 12 1 7 1 9 7 12 1 1 10 12 1 1 10 12 1 10 7 12 1 1 1 7 1 10 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 9 12 1 8 1 10 12 1 8 1 10 12 1 8 1 8 1 8 1 100 1 10 12 1 8 1 10 12 1 1 10 12 1 10 100 12 1 1 1 100 1 8 1 10 100 12 1 1 1 7 1 8 1 10 12 1 8 1 8 1 8 1 8 1 8 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 7 1 10 12 1 100 1 100 1 10 12 1 10 12 1 8 1 8 1 10 10 12 1 1 10 12 1 1 8 1 10 100 12 1 1 1 8 1 8 1 10 12 1 1 10 7 12 1 1 1 100 1 10 12 1 1 7 1 9 12 1 1 10 7 12 1 1 1 10 10 12 1 9 12 1 10 12 1 1 9 12 1 9 12 1 10 12 1 1 10 12 1 10 12 1 1 7 1 7 1 10 12 1 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 1 10 12 1 1 100 1 8 1 10 9 7 12 1 1 1 10 12 1 1 10 12 1 1 100 1 10 12 1 1 10 12 1 1 100 1 100 1 10 10 100 1 100 1 10 100 1 10 10 12 1 1 10 100 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 8 1 100 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 11 7 12 1 1 1 10 12 1 10 12 1 10 10 12 1 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 100 1 1 1
|
||||
staticfield java/lang/invoke/MethodHandleNatives JLA Ljdk/internal/access/JavaLangAccess; java/lang/System$2
|
||||
staticfield java/lang/invoke/MethodHandleNatives $assertionsDisabled Z 1
|
||||
ciInstanceKlass jdk/internal/reflect/CallerSensitive 0 0 17 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/reflect/ConstantPool 1 1 142 10 100 12 1 1 1 9 7 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 100 12 1 1 1 8 11 7 12 1 1 1 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass jdk/internal/reflect/UnsafeQualifiedStaticFieldAccessorImpl
|
||||
ciInstanceKlass jdk/internal/reflect/UnsafeStaticFieldAccessorImpl 1 1 47 10 7 12 1 1 1 9 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 8 11 7 12 1 1 1 10 7 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass jdk/internal/reflect/UnsafeFieldAccessorImpl
|
||||
ciInstanceKlass jdk/internal/reflect/FieldAccessorImpl 1 1 59 10 7 12 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass jdk/internal/reflect/UnsafeIntegerFieldAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/UnsafeBooleanFieldAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/UnsafeObjectFieldAccessorImpl
|
||||
instanceKlass jdk/internal/reflect/UnsafeStaticFieldAccessorImpl
|
||||
ciInstanceKlass jdk/internal/reflect/UnsafeFieldAccessorImpl 1 1 254 10 7 12 1 1 1 9 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 10 12 1 10 12 1 9 12 1 10 12 1 1 10 7 12 1 1 10 7 12 1 1 1 10 12 1 1 100 1 10 10 12 1 1 10 12 1 1 8 1 10 10 12 1 100 1 8 1 10 12 1 8 1 10 12 1 8 1 10 12 1 100 1 10 12 1 1 10 8 1 10 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 8 1 10 100 12 1 1 10 12 1 1 8 1 8 1 8 1 8 1 8 1 8 1 10 100 12 1 1 1 8 1 8 1 8 1 10 12 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield jdk/internal/reflect/UnsafeFieldAccessorImpl unsafe Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
ciInstanceKlass jdk/internal/reflect/NativeConstructorAccessorImpl 1 1 126 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 9 12 1 9 12 1 1 9 12 1 1 10 7 12 1 1 1 7 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 1 9 12 1 1 10 7 12 1 1 1 100 1 10 12 1 1 10 12 1 1 8 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 1 1 1 1 1 1
|
||||
staticfield jdk/internal/reflect/NativeConstructorAccessorImpl U Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
staticfield jdk/internal/reflect/NativeConstructorAccessorImpl GENERATED_OFFSET J 16
|
||||
ciInstanceKlass java/lang/invoke/ConstantCallSite 1 1 65 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 10 12 1 100 1 10 12 9 12 1 1 100 1 10 10 12 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/invoke/ConstantCallSite UNSAFE Ljdk/internal/misc/Unsafe; jdk/internal/misc/Unsafe
|
||||
ciInstanceKlass java/lang/invoke/MutableCallSite 0 0 63 10 100 12 1 1 1 10 12 1 9 100 12 1 1 1 10 12 1 10 12 1 1 9 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
instanceKlass java/lang/invoke/VarHandleInts$FieldStaticReadOnly
|
||||
instanceKlass java/lang/invoke/VarHandleLongs$FieldInstanceReadOnly
|
||||
instanceKlass java/lang/invoke/VarHandleInts$FieldInstanceReadOnly
|
||||
instanceKlass java/lang/invoke/VarHandleReferences$Array
|
||||
instanceKlass java/lang/invoke/VarHandleReferences$FieldInstanceReadOnly
|
||||
ciInstanceKlass java/lang/invoke/VarHandle 1 1 390 10 7 12 1 1 1 10 7 12 1 1 9 12 1 1 9 12 1 1 100 1 10 8 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 100 12 1 1 1 9 100 12 1 1 1 10 12 1 1 10 100 12 1 1 1 10 12 1 1 9 12 1 10 12 1 9 12 1 1 10 100 12 1 1 10 12 1 9 100 12 1 1 1 9 12 1 1 10 12 1 1 100 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 9 100 12 1 1 1 10 12 1 10 12 1 1 10 12 1 10 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 100 12 1 1 1 9 12 1 1 10 9 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 100 12 1 1 1 9 12 1 1 10 12 1 1 9 12 1 10 12 1 10 12 1 10 100 12 1 1 100 1 10 9 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 7 1 10 10 7 12 1 1 1 9 12 1 1 8 10 12 1 1 7 1 10 12 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 100 1 1 1 1 1 1 1 100 1 1 1
|
||||
staticfield java/lang/invoke/VarHandle AIOOBE_SUPPLIER Ljava/util/function/BiFunction; jdk/internal/util/Preconditions$1
|
||||
staticfield java/lang/invoke/VarHandle VFORM_OFFSET J 16
|
||||
staticfield java/lang/invoke/VarHandle $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/invoke/MemberName 1 1 757 7 1 7 1 100 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 7 12 1 1 1 10 12 1 9 100 12 1 1 10 12 1 100 1 100 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 9 12 1 1 8 1 10 100 12 1 1 1 7 1 10 10 12 1 1 100 1 100 1 10 12 1 1 9 12 1 1 100 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 8 1 8 1 8 1 10 100 12 1 1 1 10 12 1 9 12 1 1 3 10 12 1 10 12 1 10 12 1 10 10 7 12 1 1 1 10 12 1 10 12 1 10 12 1 10 12 1 7 1 8 10 12 1 1 10 12 1 1 8 1 9 100 1 8 9 100 1 10 12 1 1 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 100 1 10 12 1 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 1 100 1 10 12 1 1 10 12 8 1 8 1 100 1 10 12 1 10 100 12 1 1 1 100 1 10 12 10 12 1 10 12 1 10 12 1 10 12 1 10 10 12 1 10 12 1 10 12 1 3 10 12 1 3 10 12 1 3 3 3 3 3 3 3 100 1 10 12 1 10 7 12 1 1 1 10 12 1 3 9 12 1 10 12 1 1 3 10 12 1 10 10 7 12 1 1 1 10 12 1 1 10 100 1 10 10 12 1 10 12 1 10 12 1 10 10 12 1 1 10 12 1 10 12 1 10 12 1 100 1 10 10 10 12 100 1 10 10 10 12 1 1 10 12 1 1 10 10 12 1 8 10 100 1 10 12 1 10 100 1 10 12 1 10 12 1 10 12 1 10 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 100 1 10 12 1 1 100 1 8 1 10 7 1 10 12 1 10 12 10 12 1 1 10 12 1 10 12 1 8 1 8 1 8 1 8 1 10 12 1 10 12 1 10 12 1 1 8 1 8 1 10 12 1 8 1 10 10 12 1 10 12 1 8 1 8 1 10 10 12 1 8 1 10 100 12 1 1 1 8 1 10 12 1 10 12 1 1 10 12 1 8 1 8 1 8 1 8 1 100 1 10 8 1 8 1 8 1 8 1 10 12 1 100 1 100 1 100 1 10 100 1 10 100 1 10 100 12 1 1 1 9 7 12 1 1 1 100 1 100 1 1 1 1 1 1 1 3 1 3 1 3 1 3 1 3 1 3 1 1 1 1 1 1 1 1 3 1 3 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield java/lang/invoke/MemberName $assertionsDisabled Z 1
|
||||
ciInstanceKlass java/lang/invoke/ResolvedMethodName 1 1 16 10 100 12 1 1 1 100 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/lang/StackWalker 0 0 235 9 100 12 1 1 1 10 100 12 1 1 1 100 1 10 100 12 1 1 1 10 12 1 1 11 100 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 100 1 8 1 10 12 1 10 12 1 10 12 1 10 100 12 1 1 9 12 1 1 9 12 1 1 9 12 1 1 9 12 1 1 10 12 1 1 9 12 1 1 10 100 12 1 1 1 11 12 1 1 100 1 8 1 10 10 100 12 1 1 9 12 1 1 10 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 18 12 1 1 100 1 8 1 10 10 12 1 1 10 100 12 1 1 1 9 100 12 1 1 11 100 12 1 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 15 10 100 12 1 1 1 16 15 10 12 16 1 1 1 1 1 1 1 100 1 100 1 1
|
||||
ciInstanceKlass java/lang/StackStreamFactory$AbstractStackWalker 1 0 306 100 1 100 1 3 10 100 12 1 1 1 10 100 12 1 1 10 100 12 1 1 1 9 12 1 1 10 12 1 1 9 12 1 1 9 12 1 1 9 12 1 1 9 12 1 9 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 9 12 1 1 10 100 12 1 1 1 10 12 1 1 9 12 1 1 9 100 12 1 1 1 100 1 10 8 1 10 12 1 1 10 12 1 8 1 10 12 1 1 10 100 12 1 1 1 100 1 8 1 10 12 1 8 1 10 12 9 100 12 1 1 1 10 100 12 1 1 9 12 1 8 1 5 0 8 1 8 1 9 12 1 1 10 12 1 1 10 12 1 1 10 12 1 9 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 1 8 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 100 12 1 1 1 9 12 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass jdk/internal/module/Modules 1 1 504 10 100 12 1 1 1 9 7 12 1 1 1 11 7 12 1 1 1 11 12 1 1 11 12 1 1 11 12 1 1 11 12 1 11 12 1 11 12 1 11 12 1 11 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 18 12 1 1 10 100 12 1 1 1 100 1 10 100 12 1 1 1 10 100 12 1 1 1 10 100 12 1 1 10 12 1 1 11 12 1 9 12 1 1 11 100 12 1 1 1 10 12 1 1 10 10 12 1 10 9 12 1 1 10 100 12 1 1 10 12 1 1 10 100 12 1 1 100 1 11 100 12 1 1 1 10 100 12 1 1 1 11 100 12 1 1 10 12 1 1 10 100 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 11 12 1 1 18 12 1 1 11 100 12 1 1 10 100 12 1 1 1 11 100 12 1 1 1 100 1 11 12 1 1 11 100 12 1 1 1 11 12 1 1 10 12 1 1 10 100 12 1 1 18 12 1 1 11 12 1 1 18 12 1 1 11 12 1 1 10 12 1 18 18 10 12 1 1 9 12 1 1 11 100 12 1 1 1 100 1 10 11 12 1 11 12 1 1 11 12 1 1 10 100 1 10 12 1 1 10 100 12 1 1 10 12 1 1 11 12 10 12 1 1 100 1 10 18 12 1 10 12 1 1 100 1 8 1 10 12 1 10 100 12 1 1 18 12 1 11 11 12 10 12 1 10 10 100 1 18 12 1 10 10 10 7 12 1 1 10 7 12 1 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 15 10 100 12 1 1 1 16 15 10 12 1 16 16 15 10 12 1 16 1 16 1 15 10 12 1 16 1 16 1 15 10 12 16 1 15 10 16 1 15 10 12 16 1 15 10 12 16 15 10 12 16 15 10 12 1 1 1 100 1 100 1 1
|
||||
staticfield jdk/internal/module/Modules JLA Ljdk/internal/access/JavaLangAccess; java/lang/System$2
|
||||
staticfield jdk/internal/module/Modules JLMA Ljdk/internal/access/JavaLangModuleAccess; java/lang/module/ModuleDescriptor$1
|
||||
staticfield jdk/internal/module/Modules $assertionsDisabled Z 1
|
||||
instanceKlass java/util/LinkedHashMap$Entry
|
||||
ciInstanceKlass java/util/HashMap$Node 1 1 95 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 9 12 1 9 12 1 1 100 1 10 10 12 1 1 8 1 10 12 1 10 12 1 1 10 7 12 1 1 1 100 1 11 12 1 1 10 12 1 1 11 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 100 1 1
|
||||
instanceKlass java/util/HashMap$TreeNode
|
||||
ciInstanceKlass java/util/LinkedHashMap$Entry 1 1 41 10 7 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1
|
||||
ciInstanceKlass java/util/HashMap$TreeNode 0 0 250 100 1 10 100 12 1 1 1 9 100 12 1 1 1 9 12 1 1 9 12 1 9 12 1 1 9 12 1 1 10 12 1 1 100 1 10 12 1 9 12 1 9 12 1 9 12 1 1 10 100 12 1 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 100 12 1 1 1 10 100 12 1 1 1 10 100 12 1 1 1 9 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 9 100 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1
|
||||
instanceKlass java/util/ArrayList$ListItr
|
||||
ciInstanceKlass java/util/ArrayList$Itr 1 1 103 9 7 12 1 1 1 10 7 12 1 1 1 9 12 1 1 9 7 12 1 1 9 12 1 9 12 1 9 12 1 10 12 1 100 1 10 9 12 1 1 100 1 10 100 1 10 10 12 1 1 100 1 10 100 12 1 1 1 10 12 1 1 11 100 12 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciMethod java/util/ArrayList$Itr hasNext ()Z 514 0 5381 0 96
|
||||
ciMethod java/util/ArrayList$Itr next ()Ljava/lang/Object; 512 0 9263 0 288
|
||||
ciMethod java/util/ArrayList$Itr <init> (Ljava/util/ArrayList;)V 1356 0 15023 0 0
|
||||
ciMethod java/util/ArrayList$Itr checkForComodification ()V 514 0 11857 0 128
|
||||
ciInstanceKlass java/util/zip/ZipFile$Source$Key 1 1 84 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 1 10 7 12 1 1 1 9 12 1 1 100 1 5 0 11 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 11 12 1 1 10 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 100 1 1 1
|
||||
ciMethod java/util/HashMap$TreeNode getTreeNode (ILjava/lang/Object;)Ljava/util/HashMap$TreeNode; 0 0 1 0 -1
|
||||
ciMethod java/util/HashMap$TreeNode putTreeVal (Ljava/util/HashMap;[Ljava/util/HashMap$Node;ILjava/lang/Object;Ljava/lang/Object;)Ljava/util/HashMap$TreeNode; 0 0 1 0 -1
|
||||
ciMethod java/util/HashMap getNode (Ljava/lang/Object;)Ljava/util/HashMap$Node; 1024 32 46399 0 704
|
||||
ciMethod java/util/HashMap resize ()[Ljava/util/HashMap$Node; 170 456 5050 0 -1
|
||||
ciMethod java/util/HashMap treeifyBin ([Ljava/util/HashMap$Node;I)V 0 0 1 0 -1
|
||||
ciMethod java/util/HashMap putVal (ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; 804 34 35182 0 7840
|
||||
ciMethod java/util/HashMap tableSizeFor (I)I 512 0 17291 0 0
|
||||
ciMethod java/util/HashMap hash (Ljava/lang/Object;)I 1024 0 86118 0 0
|
||||
ciMethod java/util/HashMap <init> (IF)V 40 0 10864 0 0
|
||||
ciMethod java/util/HashMap <init> (I)V 40 0 9449 0 0
|
||||
ciMethod java/util/LinkedHashMap values ()Ljava/util/Collection; 514 0 6577 0 0
|
||||
ciMethod java/util/LinkedHashMap get (Ljava/lang/Object;)Ljava/lang/Object; 512 0 20161 0 1216
|
||||
ciMethod java/util/LinkedHashMap <init> (I)V 34 0 6949 0 0
|
||||
ciMethod java/util/LinkedHashMap afterNodeAccess (Ljava/util/HashMap$Node;)V 0 0 498 0 -1
|
||||
ciMethod java/util/AbstractList <init> ()V 266 0 131834 0 64
|
||||
ciMethod java/util/List isEmpty ()Z 0 0 1 0 -1
|
||||
ciMethod java/util/List size ()I 0 0 1 0 -1
|
||||
ciMethod java/util/List iterator ()Ljava/util/Iterator; 0 0 1 0 -1
|
||||
ciMethod java/util/Collection toArray ()[Ljava/lang/Object; 0 0 1 0 -1
|
||||
ciMethod java/util/AbstractMap <init> ()V 768 0 64305 0 64
|
||||
ciMethod java/util/Arrays copyOf ([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object; 418 0 7900 0 -1
|
||||
ciMethod java/util/Map values ()Ljava/util/Collection; 0 0 1 0 -1
|
||||
ciMethod java/util/Map put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 0 0 1 0 -1
|
||||
ciMethod java/util/Map get (Ljava/lang/Object;)Ljava/lang/Object; 0 0 1 0 -1
|
||||
ciMethod java/lang/String length ()I 512 0 593741 0 96
|
||||
ciMethod java/lang/String equals (Ljava/lang/Object;)Z 512 0 6410 0 416
|
||||
ciMethod java/lang/String hashCode ()I 602 0 5624 0 480
|
||||
ciMethod java/lang/String coder ()B 584 0 740389 0 64
|
||||
ciMethod java/lang/String isLatin1 ()Z 304 0 863599 0 96
|
||||
ciMethod java/lang/String regionMatches (ZILjava/lang/String;II)Z 696 0 8915 0 0
|
||||
ciMethod java/lang/String regionMatches (ILjava/lang/String;II)Z 0 0 6 0 -1
|
||||
ciMethod java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 1024 0 5657 0 1536
|
||||
ciMethod java/util/ArrayList iterator ()Ljava/util/Iterator; 4104 0 8384 0 192
|
||||
ciMethod java/util/ArrayList size ()I 268 0 134 0 0
|
||||
ciMethod java/util/ArrayList isEmpty ()Z 768 0 5841 0 96
|
||||
ciMethod java/util/ArrayList <init> (Ljava/util/Collection;)V 758 0 8178 0 0
|
||||
ciMethod java/util/ArrayList <init> ()V 216 0 112781 0 288
|
||||
ciMethod java/util/Iterator hasNext ()Z 0 0 1 0 -1
|
||||
ciMethod java/util/Iterator next ()Ljava/lang/Object; 0 0 1 0 -1
|
||||
ciMethod java/lang/Object getClass ()Ljava/lang/Class; 256 0 128 0 -1
|
||||
ciMethod java/lang/Object <init> ()V 794 0 840737 0 128
|
||||
ciInstanceKlass org/codehaus/plexus/util/xml/Xpp3Dom 1 1 371 7 1 10 7 12 1 1 1 9 12 1 1 7 1 10 9 12 1 1 10 12 1 9 12 1 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 9 12 1 9 12 1 1 11 7 12 1 1 1 9 12 1 1 11 12 1 1 11 7 12 1 1 1 7 11 12 1 1 7 1 10 100 12 1 1 11 12 1 100 1 8 1 10 8 1 7 1 10 11 12 1 1 11 7 12 1 1 11 12 1 11 12 1 1 11 7 12 1 1 11 12 1 1 10 12 1 1 10 12 1 11 12 1 11 9 12 1 1 11 7 10 12 1 1 10 7 12 1 1 1 11 12 1 1 11 7 12 1 1 11 12 1 10 11 12 11 12 9 12 1 1 100 1 10 12 1 10 100 12 1 1 1 10 12 1 100 1 8 1 8 1 10 10 12 1 10 12 1 1 11 10 100 12 1 1 8 1 8 1 10 12 1 1 11 12 1 11 12 1 8 10 12 1 10 12 1 1 11 11 10 12 1 11 11 100 1 10 100 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
staticfield org/codehaus/plexus/util/xml/Xpp3Dom EMPTY_STRING_ARRAY [Ljava/lang/String; 0 [Ljava/lang/String;
|
||||
staticfield org/codehaus/plexus/util/xml/Xpp3Dom EMPTY_DOM_ARRAY [Lorg/codehaus/plexus/util/xml/Xpp3Dom; 0 [Lorg/codehaus/plexus/util/xml/Xpp3Dom;
|
||||
ciInstanceKlass java/lang/ProcessEnvironment$Variable 1 1 69 10 7 12 1 1 1 7 1 10 7 12 1 1 1 10 12 1 1 10 10 100 12 1 1 1 10 12 1 10 10 12 1 1 10 12 1 1 10 12 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/util/LinkedHashMap$LinkedValues 1 1 116 9 7 12 1 1 1 10 7 12 1 1 1 9 7 12 1 1 1 10 12 1 7 1 10 12 1 10 12 1 1 100 1 10 100 12 1 1 1 7 1 10 12 1 1 10 12 1 100 1 10 9 12 1 9 12 1 1 9 100 12 1 1 1 11 100 12 1 1 1 9 12 1 100 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/util/NoSuchElementException 0 0 34 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass java/util/ConcurrentModificationException 0 0 34 10 100 12 1 1 1 10 12 1 10 12 1 10 12 1 100 1 1 1 1 5 0 1 1 1 1 1 1 1 1 1 1 1
|
||||
instanceKlass org/apache/maven/model/ReportSet
|
||||
instanceKlass org/apache/maven/model/ReportPlugin
|
||||
instanceKlass org/apache/maven/model/PluginExecution
|
||||
instanceKlass org/apache/maven/model/Plugin
|
||||
ciInstanceKlass org/apache/maven/model/ConfigurationContainer 1 1 167 10 7 12 1 1 1 9 7 12 1 1 1 10 12 1 1 9 12 1 1 7 1 10 12 1 9 12 1 1 7 1 10 12 1 100 1 100 1 100 1 10 10 12 1 1 10 100 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 100 1 9 12 1 1 7 1 10 12 1 1 8 1 10 12 1 1 8 8 9 12 1 1 9 12 1 9 12 1 10 12 1 1 10 12 1 1 10 11 7 12 1 1 1 11 12 1 1 7 1 10 7 12 1 1 1 10 12 1 1 10 12 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
ciInstanceKlass org/apache/maven/model/Plugin 1 1 269 10 7 12 1 1 1 8 1 9 7 12 1 1 1 9 12 1 1 10 12 1 1 11 7 12 1 1 1 10 12 1 10 12 1 1 9 12 1 1 7 1 10 11 12 1 1 11 7 12 1 1 1 11 12 1 1 7 1 10 12 1 9 12 1 7 1 10 12 1 9 12 1 1 100 1 10 12 1 100 1 100 1 7 1 10 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 100 1 9 12 1 9 12 1 9 12 1 11 12 1 10 100 12 1 1 1 10 7 12 1 1 1 100 1 10 10 12 1 11 100 12 1 1 100 1 8 1 8 1 10 12 1 8 1 10 11 12 1 1 10 12 1 10 12 1 8 1 8 1 10 12 1 8 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 1 8 1 8 1 10 12 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
ciInstanceKlass org/apache/maven/model/PluginExecution 1 1 131 10 7 12 1 1 1 8 1 9 7 12 1 1 1 9 12 1 1 10 12 1 1 11 7 12 1 1 1 10 12 1 1 9 12 1 1 7 1 10 11 12 1 1 100 1 100 1 100 1 10 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 100 1 9 12 1 11 12 1 10 12 1 10 12 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
ciInstanceKlass org/apache/maven/model/ReportPlugin 1 1 172 10 7 12 1 1 1 8 1 9 7 12 1 1 1 9 12 1 1 10 12 1 1 11 7 12 1 1 1 10 12 1 1 9 12 1 1 7 1 10 11 12 1 1 11 7 12 1 1 1 11 12 1 1 7 1 10 12 1 100 1 100 1 7 1 10 10 100 12 1 1 1 10 100 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 100 1 9 12 1 9 12 1 11 12 1 100 1 10 10 12 1 11 100 12 1 1 1 10 12 1 1 8 1 10 12 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
instanceKlass org/apache/maven/model/merge/MavenModelMerger
|
||||
ciInstanceKlass org/apache/maven/model/merge/ModelMerger 1 1 1971 10 7 12 1 1 1 8 1 10 7 12 1 1 1 7 1 10 11 7 12 1 1 1 10 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 1 10 12 1 1 8 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 1 100 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 100 1 10 10 12 1 10 12 1 100 1 10 10 12 1 10 12 1 100 1 10 10 12 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 1 100 1 10 10 12 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 100 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 11 7 12 1 1 1 7 1 11 12 1 1 10 12 1 11 12 1 1 10 12 1 10 12 1 7 1 10 10 12 1 10 12 1 100 1 10 10 12 1 10 12 1 10 12 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 7 1 10 10 12 1 1 10 10 12 1 1 8 1 10 10 7 12 1 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 1 100 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 100 1 10 10 10 10 10 10 10 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 8 1 10 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 10 10 10 10 12 1 1 10 12 1 10 12 1 10 7 12 1 1 1 100 1 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 1 10 10 10 10 10 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 1 10 10 10 10 10 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 100 1 10 10 12 1 10 12 1 1 10 12 1 10 100 1 10 10 10 10 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 100 1 10 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 7 1 10 10 10 10 10 10 10 10 12 1 100 1 10 10 12 1 10 12 1 1 10 12 1 10 7 1 10 10 10 10 12 1 10 12 1 8 1 10 100 12 1 1 1 10 10 10 12 1 10 10 10 12 1 10 12 1 10 12 1 10 12 1 10 10 10 10 10 10 10 10 10 12 1 8 1 10 12 1 10 12 1 10 10 10 10 10 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 100 1 10 10 10 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 1 10 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 100 1 10 10 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 1 10 10 10 10 12 1 10 12 1 8 1 10 10 10 12 10 12 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 10 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 10 10 10 10 10 10 10 12 1 7 1 10 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 100 1 10 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 7 1 10 10 12 1 10 12 1 1 10 12 1 10 12 1 10 100 1 10 10 10 10 10 10 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 7 1 10 10 12 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 7 12 1 1 1 7 1 10 10 12 1 1 10 12 1 1 10 12 1 10 100 1 100 1 10 10 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 1 10 10 10 10 10 10 10 10 12 10 12 8 1 10 10 10 12 1 100 1 10 10 12 1 10 12 1 10 12 1 10 7 12 1 1 10 12 1 8 1 10 10 10 12 1 7 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 7 1 10 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 100 12 1 1 10 12 1 8 1 10 10 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 100 1 10 10 10 10 12 1 10 12 1 10 100 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 1 7 1 10 12 10 12 1 7 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1
|
||||
instanceKlass org/apache/maven/model/profile/DefaultProfileInjector$ProfileModelMerger
|
||||
instanceKlass org/apache/maven/model/normalization/DefaultModelNormalizer$DuplicateMerger
|
||||
instanceKlass org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger
|
||||
instanceKlass org/apache/maven/model/management/DefaultDependencyManagementInjector$ManagementModelMerger
|
||||
instanceKlass org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger
|
||||
instanceKlass org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector$LifecycleBindingsMerger
|
||||
ciInstanceKlass org/apache/maven/model/merge/MavenModelMerger 1 1 596 10 7 12 1 1 1 7 1 8 1 10 7 12 1 1 1 11 7 12 1 1 1 10 12 1 1 10 12 1 10 12 1 1 8 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 8 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 8 1 10 10 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 10 10 12 1 1 10 12 1 1 10 12 1 1 7 1 10 10 10 10 12 1 1 10 12 1 1 10 12 1 1 11 7 12 1 1 7 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 10 7 1 10 11 12 1 1 10 12 1 11 12 1 1 10 7 12 1 1 1 11 12 1 1 11 12 1 1 7 1 11 7 12 1 1 10 12 1 8 1 10 10 7 12 1 1 1 10 10 12 1 7 1 10 11 12 1 1 11 7 12 1 1 11 12 1 1 7 1 10 12 1 1 11 12 1 11 12 1 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 10 7 12 1 1 1 7 1 10 10 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 1 7 1 10 10 10 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 10 10 10 10 12 1 10 7 1 10 10 10 10 12 1 10 12 1 10 12 1 8 1 10 12 1 10 12 1 10 12 1 8 1 10 12 1 10 7 12 1 1 7 1 10 12 1 10 12 1 10 10 12 1 1 11 12 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 7 12 1 1 7 1 10 10 10 10 12 1 1 10 12 1 1 10 12 1 10 7 12 1 1 10 12 1 10 10 10 10 7 1 7 1 10 10 7 12 1 1 10 12 1 1 10 12 1 10 10 12 1 10 100 1 10 1 1 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector$LifecycleBindingsMerger 1 1 187 10 7 12 1 1 1 10 7 12 1 1 1 7 1 10 10 12 1 1 7 1 8 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 10 7 12 1 1 1 11 7 12 1 1 1 7 1 11 12 1 1 10 12 1 11 12 1 1 11 7 12 1 1 11 12 1 1 7 1 10 12 1 1 11 7 12 1 1 1 10 11 12 1 1 10 12 1 1 11 7 1 10 10 12 1 1 10 12 1 1 7 1 11 12 1 1 10 12 1 10 12 1 1 10 12 1 1 10 100 12 1 1 10 100 12 1 1 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 100 1 1
|
||||
ciInstanceKlass org/apache/maven/model/inheritance/DefaultInheritanceAssembler$InheritanceModelMerger 1 1 333 100 1 10 7 12 1 1 1 8 1 11 7 12 1 1 1 8 1 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 7 1 10 7 12 1 1 1 10 12 1 10 12 1 1 10 12 1 1 10 10 10 12 1 1 10 10 12 1 10 12 1 8 1 10 12 1 7 1 10 10 7 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 1 8 1 10 12 1 1 10 7 12 1 1 1 10 12 1 1 11 12 1 1 11 7 12 1 1 1 11 7 12 1 1 1 11 12 1 1 7 1 11 12 1 10 12 1 1 11 12 1 11 12 1 1 10 7 12 1 1 1 11 7 12 1 1 7 1 11 12 1 10 11 7 1 10 12 1 10 12 1 10 8 1 10 10 10 12 1 1 10 12 1 1 10 12 1 1 10 7 1 10 11 12 1 10 11 12 1 1 10 12 1 1 10 12 1 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 12 1 10 7 1 7 1 10 12 1 1 10 10 10 10 10 10 12 1 1 11 12 1 1 10 12 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
|
||||
ciInstanceKlass org/apache/maven/model/management/DefaultPluginManagementInjector$ManagementModelMerger 1 1 165 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 10 7 12 1 1 1 11 7 12 1 1 1 7 1 11 12 1 1 10 12 1 10 7 12 1 1 1 11 12 1 1 11 7 12 1 1 11 12 1 1 7 1 10 12 1 1 11 7 12 1 1 1 11 12 1 1 10 12 1 1 10 12 1 7 1 10 12 1 1 10 12 1 1 10 12 1 1 7 1 11 12 1 1 10 12 1 10 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 100 1 1
|
||||
ciInstanceKlass org/apache/maven/model/InputLocation 1 1 217 10 7 12 1 1 1 9 7 12 1 1 1 9 12 1 9 12 1 1 10 12 1 1 9 12 1 1 7 1 10 12 1 100 1 100 1 100 1 10 10 12 1 1 10 100 12 1 1 1 10 12 1 1 8 1 10 12 1 10 12 1 10 12 1 1 100 1 7 1 10 12 1 1 8 1 10 12 1 1 9 12 1 1 10 12 1 1 10 12 1 1 10 11 7 12 1 1 1 11 12 1 1 10 12 1 10 12 1 10 12 1 1 10 12 1 10 12 1 1 11 12 1 10 12 1 11 100 12 1 1 1 11 100 12 1 1 1 11 12 1 100 1 10 12 1 10 12 1 1 11 12 1 10 12 1 8 1 8 1 10 12 1 10 12 1 100 1 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 1 1 1 1 100 1 1
|
||||
compile org/apache/maven/model/merge/MavenModelMerger mergePlugin_Executions (Lorg/apache/maven/model/Plugin;Lorg/apache/maven/model/Plugin;ZLjava/util/Map;)V -1 4 inline 111 0 -1 org/apache/maven/model/merge/MavenModelMerger mergePlugin_Executions (Lorg/apache/maven/model/Plugin;Lorg/apache/maven/model/Plugin;ZLjava/util/Map;)V 1 1 org/apache/maven/model/Plugin getExecutions ()Ljava/util/List; 2 12 java/util/ArrayList <init> ()V 3 1 java/util/AbstractList <init> ()V 4 1 java/util/AbstractCollection <init> ()V 5 1 java/lang/Object <init> ()V 1 8 java/util/ArrayList isEmpty ()Z 1 17 org/apache/maven/model/Plugin getExecutions ()Ljava/util/List; 2 12 java/util/ArrayList <init> ()V 3 1 java/util/AbstractList <init> ()V 4 1 java/util/AbstractCollection <init> ()V 5 1 java/lang/Object <init> ()V 1 28 java/util/ArrayList size ()I 1 35 java/util/ArrayList size ()I 1 43 java/util/LinkedHashMap <init> (I)V 2 2 java/util/HashMap <init> (I)V 3 4 java/util/HashMap <init> (IF)V 4 1 java/util/AbstractMap <init> ()V 5 1 java/lang/Object <init> ()V 4 51 java/lang/Float isNaN (F)Z 4 91 java/util/HashMap tableSizeFor (I)I 1 50 java/util/ArrayList iterator ()Ljava/util/Iterator; 2 5 java/util/ArrayList$Itr <init> (Ljava/util/ArrayList;)V 3 6 java/lang/Object <init> ()V 1 59 java/util/ArrayList$Itr hasNext ()Z 1 69 java/util/ArrayList$Itr next ()Ljava/lang/Object; 2 1 java/util/ArrayList$Itr checkForComodification ()V 1 85 org/apache/maven/model/ConfigurationContainer getInherited ()Ljava/lang/String; 1 93 org/apache/maven/model/ConfigurationContainer isInherited ()Z 2 11 java/lang/Boolean parseBoolean (Ljava/lang/String;)Z 3 3 java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 4 14 java/lang/String length ()I 5 6 java/lang/String coder ()B 4 18 java/lang/String length ()I 5 6 java/lang/String coder ()B 4 30 java/lang/String length ()I 5 6 java/lang/String coder ()B 4 33 java/lang/String regionMatches (ZILjava/lang/String;II)Z 5 27 java/lang/String length ()I 6 6 java/lang/String coder ()B 5 43 java/lang/String length ()I 6 6 java/lang/String coder ()B 5 70 java/lang/String coder ()B 5 78 java/lang/String coder ()B 5 98 java/lang/StringLatin1 regionMatchesCI ([BI[BII)Z 6 53 java/lang/CharacterDataLatin1 toUpperCase (I)I 7 4 java/lang/CharacterDataLatin1 getProperties (I)I 6 63 java/lang/CharacterDataLatin1 toUpperCase (I)I 7 4 java/lang/CharacterDataLatin1 getProperties (I)I 6 80 java/lang/Character toLowerCase (I)I 6 85 java/lang/Character toLowerCase (I)I 1 103 org/apache/maven/model/ConfigurationContainer isInherited ()Z 2 11 java/lang/Boolean parseBoolean (Ljava/lang/String;)Z 3 3 java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 4 14 java/lang/String length ()I 5 6 java/lang/String coder ()B 4 18 java/lang/String length ()I 5 6 java/lang/String coder ()B 4 30 java/lang/String length ()I 5 6 java/lang/String coder ()B 4 33 java/lang/String regionMatches (ZILjava/lang/String;II)Z 5 27 java/lang/String length ()I 6 6 java/lang/String coder ()B 5 43 java/lang/String length ()I 6 6 java/lang/String coder ()B 5 70 java/lang/String coder ()B 5 78 java/lang/String coder ()B 5 98 java/lang/StringLatin1 regionMatchesCI ([BI[BII)Z 6 53 java/lang/CharacterDataLatin1 toUpperCase (I)I 7 4 java/lang/CharacterDataLatin1 getProperties (I)I 6 63 java/lang/CharacterDataLatin1 toUpperCase (I)I 7 4 java/lang/CharacterDataLatin1 getProperties (I)I 6 80 java/lang/Character toLowerCase (I)I 6 85 java/lang/Character toLowerCase (I)I 1 112 org/apache/maven/model/merge/MavenModelMerger getPluginExecutionKey (Lorg/apache/maven/model/PluginExecution;)Ljava/lang/Object; 2 1 org/apache/maven/model/PluginExecution getId ()Ljava/lang/String; 1 123 java/util/HashMap put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 2 2 java/util/HashMap hash (Ljava/lang/Object;)I 3 9 java/lang/String hashCode ()I 4 17 java/lang/String isLatin1 ()Z 4 27 java/lang/StringLatin1 hashCode ([B)I 1 134 java/util/ArrayList iterator ()Ljava/util/Iterator; 2 5 java/util/ArrayList$Itr <init> (Ljava/util/ArrayList;)V 3 6 java/lang/Object <init> ()V 1 143 java/util/ArrayList$Itr hasNext ()Z 1 153 java/util/ArrayList$Itr next ()Ljava/lang/Object; 2 1 java/util/ArrayList$Itr checkForComodification ()V 1 166 org/apache/maven/model/merge/MavenModelMerger getPluginExecutionKey (Lorg/apache/maven/model/PluginExecution;)Ljava/lang/Object; 2 1 org/apache/maven/model/PluginExecution getId ()Ljava/lang/String; 1 175 java/util/LinkedHashMap get (Ljava/lang/Object;)Ljava/lang/Object; 2 2 java/util/HashMap getNode (Ljava/lang/Object;)Ljava/util/HashMap$Node; 3 23 java/util/HashMap hash (Ljava/lang/Object;)I 4 9 java/lang/String hashCode ()I 5 17 java/lang/String isLatin1 ()Z 5 27 java/lang/StringLatin1 hashCode ([B)I 3 63 java/lang/String equals (Ljava/lang/Object;)Z 3 128 java/lang/String equals (Ljava/lang/Object;)Z 1 207 java/util/HashMap put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 2 2 java/util/HashMap hash (Ljava/lang/Object;)I 3 9 java/lang/String hashCode ()I 4 17 java/lang/String isLatin1 ()Z 4 27 java/lang/StringLatin1 hashCode ([B)I 1 223 java/util/LinkedHashMap values ()Ljava/util/Collection; 2 14 java/util/LinkedHashMap$LinkedValues <init> (Ljava/util/LinkedHashMap;)V 3 6 java/util/AbstractCollection <init> ()V 4 1 java/lang/Object <init> ()V 1 228 java/util/ArrayList <init> (Ljava/util/Collection;)V 2 1 java/util/AbstractList <init> ()V 3 1 java/util/AbstractCollection <init> ()V 4 1 java/lang/Object <init> ()V 1 231 org/apache/maven/model/Plugin setExecutions (Ljava/util/List;)V
|
||||
@@ -0,0 +1,284 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.agent.AgentApprovalRequest;
|
||||
import com.ims.api.dto.agent.AgentConfigRequest;
|
||||
import com.ims.api.dto.agent.AgentExecuteRequest;
|
||||
import com.ims.api.dto.agent.AgentExecuteResponse;
|
||||
import com.ims.api.dto.agent.AgentMemoryRequest;
|
||||
import com.ims.api.dto.agent.AgentSuggestFieldsRequest;
|
||||
import com.ims.api.dto.agent.AgentSuggestRequest;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.agent.AgentConfigService;
|
||||
import com.ims.service.agent.AgentOrchestratorService;
|
||||
import com.ims.service.agent.MemoryService;
|
||||
import com.ims.service.agent.tool.ToolRegistry;
|
||||
import com.ims.service.entity.AgentMemory;
|
||||
import com.ims.service.entity.AgentPlan;
|
||||
import com.ims.service.entity.ToolExecution;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.AgentPlanRepository;
|
||||
import com.ims.service.repository.ToolExecutionRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/agent")
|
||||
public class AgentControllerImpl {
|
||||
|
||||
private final AgentOrchestratorService orchestratorService;
|
||||
private final AgentConfigService agentConfigService;
|
||||
private final MemoryService memoryService;
|
||||
private final UserRepository userRepository;
|
||||
private final AgentPlanRepository planRepository;
|
||||
private final ToolExecutionRepository toolExecutionRepository;
|
||||
private final ToolRegistry toolRegistry;
|
||||
|
||||
public AgentControllerImpl(AgentOrchestratorService orchestratorService,
|
||||
AgentConfigService agentConfigService,
|
||||
MemoryService memoryService,
|
||||
UserRepository userRepository,
|
||||
AgentPlanRepository planRepository,
|
||||
ToolExecutionRepository toolExecutionRepository,
|
||||
ToolRegistry toolRegistry) {
|
||||
this.orchestratorService = orchestratorService;
|
||||
this.agentConfigService = agentConfigService;
|
||||
this.memoryService = memoryService;
|
||||
this.userRepository = userRepository;
|
||||
this.planRepository = planRepository;
|
||||
this.toolExecutionRepository = toolExecutionRepository;
|
||||
this.toolRegistry = toolRegistry;
|
||||
}
|
||||
|
||||
@PostMapping("/execute")
|
||||
public ApiResponse<AgentExecuteResponse> execute(@Valid @RequestBody AgentExecuteRequest request,
|
||||
Authentication authentication) {
|
||||
Long userId = requireUserId(authentication);
|
||||
AgentExecuteResponse resp = orchestratorService.execute(request.getIssueId(), request.getGoal(), userId);
|
||||
return ApiResponse.success(resp);
|
||||
}
|
||||
|
||||
@GetMapping("/plan/{planId}/status")
|
||||
public ApiResponse<Map<String, Object>> status(@PathVariable Long planId) {
|
||||
return ApiResponse.success(orchestratorService.getStatus(planId));
|
||||
}
|
||||
|
||||
@GetMapping(value = "/plan/{planId}/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
|
||||
public SseEmitter stream(@PathVariable Long planId) {
|
||||
return orchestratorService.stream(planId);
|
||||
}
|
||||
|
||||
@PostMapping("/approval/{planId}/approve")
|
||||
public ApiResponse<Map<String, Object>> approve(@PathVariable Long planId,
|
||||
@RequestBody(required = false) AgentApprovalRequest request,
|
||||
Authentication authentication) {
|
||||
String comment = request == null ? null : request.getComment();
|
||||
return ApiResponse.success(orchestratorService.approve(planId, comment, requireUserId(authentication)));
|
||||
}
|
||||
|
||||
@PostMapping("/approval/{planId}/reject")
|
||||
public ApiResponse<Map<String, Object>> reject(@PathVariable Long planId,
|
||||
@RequestBody(required = false) AgentApprovalRequest request) {
|
||||
String comment = request == null ? null : request.getComment();
|
||||
return ApiResponse.success(orchestratorService.reject(planId, comment));
|
||||
}
|
||||
|
||||
@PostMapping("/suggest")
|
||||
public ApiResponse<String> suggest(@Valid @RequestBody AgentSuggestRequest request,
|
||||
Authentication authentication) {
|
||||
return ApiResponse.success(orchestratorService.suggest(request.getIssueId(), request.getGoal(),
|
||||
requireUserId(authentication)));
|
||||
}
|
||||
|
||||
@PostMapping("/suggest-fields")
|
||||
public ApiResponse<Map<String, Object>> suggestFields(@Valid @RequestBody AgentSuggestFieldsRequest request) {
|
||||
return ApiResponse.success(orchestratorService.suggestFields(request.getTitle(), request.getDescription()));
|
||||
}
|
||||
|
||||
@GetMapping("/memories")
|
||||
public ApiResponse<PageResult<Map<String, Object>>> memories(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize) {
|
||||
Page<AgentMemory> result = memoryService.list(page, pageSize);
|
||||
PageResult<Map<String, Object>> pageResult = new PageResult<>(
|
||||
result.getContent().stream().map(this::toMemoryMap).toList(),
|
||||
result.getTotalElements(), page, pageSize);
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@PostMapping("/memories")
|
||||
public ApiResponse<Map<String, Object>> createMemory(@Valid @RequestBody AgentMemoryRequest request) {
|
||||
AgentMemory memory = memoryService.add(request.getIssueSummary(), request.getSolutionSteps());
|
||||
return ApiResponse.success(toMemoryMap(memory));
|
||||
}
|
||||
|
||||
@DeleteMapping("/memories/{id}")
|
||||
public ApiResponse<Void> deleteMemory(@PathVariable Long id) {
|
||||
memoryService.delete(id);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PutMapping("/memories/{id}")
|
||||
public ApiResponse<Map<String, Object>> updateMemory(@PathVariable Long id,
|
||||
@Valid @RequestBody AgentMemoryRequest request) {
|
||||
AgentMemory memory = memoryService.update(id, request.getIssueSummary(), request.getSolutionSteps());
|
||||
return ApiResponse.success(toMemoryMap(memory));
|
||||
}
|
||||
|
||||
@GetMapping("/config")
|
||||
public ApiResponse<Map<String, Object>> getConfig() {
|
||||
return ApiResponse.success(agentConfigService.getConfig());
|
||||
}
|
||||
|
||||
@PutMapping("/config")
|
||||
public ApiResponse<Void> updateConfig(@RequestBody AgentConfigRequest request) {
|
||||
agentConfigService.updateConfig(request);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@GetMapping("/overview")
|
||||
public ApiResponse<Map<String, Object>> overview() {
|
||||
LocalDateTime todayStart = LocalDate.now().atStartOfDay();
|
||||
LocalDateTime yesterdayStart = LocalDate.now().minusDays(1).atStartOfDay();
|
||||
long todayExecutions = toolExecutionRepository.countByCreatedAtAfter(todayStart);
|
||||
long yesterdayExecutions = toolExecutionRepository.countByCreatedAtBetween(yesterdayStart, todayStart);
|
||||
long todayPlans = planRepository.countByCreatedAtAfter(todayStart);
|
||||
long totalTools = toolExecutionRepository.count();
|
||||
long successTools = toolExecutionRepository.countByStatus("success");
|
||||
long pendingApprovals = planRepository.countByApprovalStatus("requested");
|
||||
|
||||
// 计算增长率
|
||||
double growthRate = yesterdayExecutions == 0 ? 0 :
|
||||
Math.round((todayExecutions - yesterdayExecutions) * 100.0 / yesterdayExecutions);
|
||||
|
||||
List<Map<String, Object>> latestExecutions = new ArrayList<>();
|
||||
for (ToolExecution t : toolExecutionRepository.findTop15ByOrderByCreatedAtDesc()) {
|
||||
latestExecutions.add(toExecutionMap(t));
|
||||
}
|
||||
|
||||
// 趋势图数据:最近7天每小时的调用次数
|
||||
List<Map<String, Object>> trendData = new ArrayList<>();
|
||||
DateTimeFormatter hourFormatter = DateTimeFormatter.ofPattern("HH:00");
|
||||
for (int hour = 0; hour < 24; hour++) {
|
||||
LocalDateTime hourStart = todayStart.withHour(hour);
|
||||
LocalDateTime hourEnd = hourStart.plusHours(1);
|
||||
long count = toolExecutionRepository.countBetween(hourStart, hourEnd);
|
||||
Map<String, Object> point = new LinkedHashMap<>();
|
||||
point.put("hour", hourFormatter.format(hourStart));
|
||||
point.put("count", count);
|
||||
trendData.add(point);
|
||||
}
|
||||
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
result.put("todayExecutions", todayExecutions);
|
||||
result.put("yesterdayExecutions", yesterdayExecutions);
|
||||
result.put("growthRate", growthRate);
|
||||
result.put("todayPlans", todayPlans);
|
||||
result.put("toolTotalCount", totalTools);
|
||||
result.put("toolSuccessCount", successTools);
|
||||
result.put("toolSuccessRate", totalTools == 0 ? 0.0 : Math.round(successTools * 1000.0 / totalTools) / 10.0);
|
||||
result.put("pendingApprovals", pendingApprovals);
|
||||
result.put("latestExecutions", latestExecutions);
|
||||
result.put("trendData", trendData);
|
||||
return ApiResponse.success(result);
|
||||
}
|
||||
|
||||
@GetMapping("/plans")
|
||||
public ApiResponse<PageResult<Map<String, Object>>> plans(
|
||||
@RequestParam(defaultValue = "requested") String approvalStatus,
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize) {
|
||||
Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize);
|
||||
Page<AgentPlan> result = planRepository.findByApprovalStatusOrderByCreatedAtDesc(approvalStatus, pageable);
|
||||
PageResult<Map<String, Object>> pageResult = new PageResult<>(
|
||||
result.getContent().stream().map(this::toPlanMap).toList(),
|
||||
result.getTotalElements(), page, pageSize);
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/tools")
|
||||
public ApiResponse<List<Map<String, Object>>> tools() {
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
for (Map.Entry<String, String> entry : toolRegistry.descriptions().entrySet()) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("name", entry.getKey());
|
||||
m.put("description", entry.getValue());
|
||||
m.put("isWrite", toolRegistry.isWrite(entry.getKey()));
|
||||
result.add(m);
|
||||
}
|
||||
return ApiResponse.success(result);
|
||||
}
|
||||
|
||||
private Map<String, Object> toPlanMap(AgentPlan plan) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("planId", plan.getId());
|
||||
m.put("issueId", plan.getIssue() != null ? plan.getIssue().getId() : null);
|
||||
m.put("issueNo", plan.getIssue() != null ? plan.getIssue().getIssueNo() : null);
|
||||
m.put("issueTitle", plan.getIssue() != null ? plan.getIssue().getTitle() : null);
|
||||
m.put("goal", plan.getGoal());
|
||||
m.put("status", plan.getStatus());
|
||||
m.put("requiresApproval", plan.getRequiresApproval());
|
||||
m.put("approvalStatus", plan.getApprovalStatus());
|
||||
m.put("approvalComment", plan.getApprovalComment());
|
||||
m.put("createdAt", plan.getCreatedAt() == null ? null : plan.getCreatedAt().toString());
|
||||
|
||||
ToolExecution pending = toolExecutionRepository.findByPlanId(plan.getId()).stream()
|
||||
.filter(t -> "pending".equals(t.getStatus()))
|
||||
.findFirst().orElse(null);
|
||||
m.put("toolName", pending != null ? pending.getToolName() : null);
|
||||
m.put("toolParams", pending != null ? pending.getInputParams() : null);
|
||||
m.put("approvalReason", pending != null ? pending.getOutputResult() : null);
|
||||
return m;
|
||||
}
|
||||
|
||||
private Map<String, Object> toExecutionMap(ToolExecution t) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("id", t.getId());
|
||||
m.put("planId", t.getPlan() != null ? t.getPlan().getId() : null);
|
||||
m.put("toolName", t.getToolName());
|
||||
m.put("status", t.getStatus());
|
||||
m.put("executionTimeMs", t.getExecutionTimeMs());
|
||||
m.put("outputResult", t.getOutputResult());
|
||||
m.put("createdAt", t.getCreatedAt() == null ? null : t.getCreatedAt().toString());
|
||||
return m;
|
||||
}
|
||||
|
||||
private Map<String, Object> toMemoryMap(AgentMemory memory) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("id", memory.getId());
|
||||
m.put("issueSummary", memory.getIssueSummary());
|
||||
m.put("solutionSteps", memory.getSolutionSteps());
|
||||
m.put("effectivenessScore", memory.getEffectivenessScore() == null ? BigDecimal.ZERO : memory.getEffectivenessScore());
|
||||
m.put("createdAt", memory.getCreatedAt() == null ? null : memory.getCreatedAt().toString());
|
||||
m.put("updatedAt", memory.getUpdatedAt() == null ? null : memory.getUpdatedAt().toString());
|
||||
return m;
|
||||
}
|
||||
|
||||
private Long requireUserId(Authentication authentication) {
|
||||
if (authentication == null || !authentication.isAuthenticated()) {
|
||||
throw new BusinessException("未登录");
|
||||
}
|
||||
String username = authentication.getName();
|
||||
User user = userRepository.findByUsername(username)
|
||||
.or(() -> userRepository.findByUserid(username))
|
||||
.orElseThrow(() -> new BusinessException("用户不存在: " + username));
|
||||
return user.getId();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.ai.AiAnalysisRequest;
|
||||
import com.ims.api.dto.ai.AiAnalysisResponse;
|
||||
import com.ims.api.dto.ai.AiFeedbackRequest;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.ai.AiAnalysisService;
|
||||
import com.ims.service.entity.AiCallLog;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.AiAnalysisRepository;
|
||||
import com.ims.service.repository.AiCallLogRepository;
|
||||
import com.ims.service.repository.IssueRepository;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/ai")
|
||||
public class AiAnalysisControllerImpl {
|
||||
|
||||
private final AiAnalysisService aiAnalysisService;
|
||||
private final UserRepository userRepository;
|
||||
private final AiCallLogRepository aiCallLogRepository;
|
||||
private final AiAnalysisRepository aiAnalysisRepository;
|
||||
private final IssueRepository issueRepository;
|
||||
|
||||
public AiAnalysisControllerImpl(AiAnalysisService aiAnalysisService, UserRepository userRepository,
|
||||
AiCallLogRepository aiCallLogRepository,
|
||||
AiAnalysisRepository aiAnalysisRepository,
|
||||
IssueRepository issueRepository) {
|
||||
this.aiAnalysisService = aiAnalysisService;
|
||||
this.userRepository = userRepository;
|
||||
this.aiCallLogRepository = aiCallLogRepository;
|
||||
this.aiAnalysisRepository = aiAnalysisRepository;
|
||||
this.issueRepository = issueRepository;
|
||||
}
|
||||
|
||||
@PostMapping("/batch-generate")
|
||||
public ApiResponse<Map<String, Object>> batchGenerate(@RequestBody AiAnalysisRequest request,
|
||||
Authentication authentication) {
|
||||
int count = aiAnalysisService.batchGenerate(request, requireUserId(authentication));
|
||||
return ApiResponse.success(Map.of("submitted", count));
|
||||
}
|
||||
|
||||
@GetMapping("/records")
|
||||
public ApiResponse<PageResult<AiAnalysisResponse>> records(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize,
|
||||
@RequestParam(required = false) Long id,
|
||||
@RequestParam(required = false) Long issueId,
|
||||
@RequestParam(required = false) Long departmentId,
|
||||
@RequestParam(required = false) String status,
|
||||
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
|
||||
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
|
||||
Page<AiAnalysisResponse> result = aiAnalysisService.records(id, page, pageSize, issueId, departmentId, status, startDate, endDate);
|
||||
PageResult<AiAnalysisResponse> pageResult = new PageResult<>(
|
||||
result.getContent(), result.getTotalElements(), page, pageSize);
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/records/running")
|
||||
public ApiResponse<List<AiAnalysisResponse>> running() {
|
||||
return ApiResponse.success(aiAnalysisService.running());
|
||||
}
|
||||
|
||||
@GetMapping("/call-logs")
|
||||
public ApiResponse<List<Map<String, Object>>> callLogs() {
|
||||
List<Map<String, Object>> result = new ArrayList<>();
|
||||
for (AiCallLog log : aiCallLogRepository.findTop20ByOrderByCreatedAtDesc()) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("id", log.getId());
|
||||
m.put("provider", log.getProvider());
|
||||
m.put("model", log.getModel());
|
||||
m.put("status", log.getStatus());
|
||||
m.put("latencyMs", log.getLatencyMs());
|
||||
m.put("responseSnippet", log.getResponseSnippet());
|
||||
m.put("errorMessage", log.getErrorMessage());
|
||||
m.put("createdAt", log.getCreatedAt() == null ? null : log.getCreatedAt().toString());
|
||||
result.add(m);
|
||||
}
|
||||
return ApiResponse.success(result);
|
||||
}
|
||||
|
||||
@GetMapping("/overview-stats")
|
||||
public ApiResponse<Map<String, Object>> overviewStats(
|
||||
@RequestParam(defaultValue = "14") int days) {
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
|
||||
long totalIssues = issueRepository.count();
|
||||
long analyzedCount = aiAnalysisRepository.countAnalyzedIssues();
|
||||
long unanalyzedCount = totalIssues - analyzedCount;
|
||||
double coverageRate = totalIssues == 0 ? 0 : Math.round(analyzedCount * 1000.0 / totalIssues) / 10.0;
|
||||
|
||||
List<Object[]> statusRows = aiAnalysisRepository.countByStatusGroup();
|
||||
long totalAnalyses = 0;
|
||||
long completedAnalyses = 0;
|
||||
for (Object[] row : statusRows) {
|
||||
String status = (String) row[0];
|
||||
Long count = (Long) row[1];
|
||||
totalAnalyses += count;
|
||||
if ("completed".equals(status)) {
|
||||
completedAnalyses = count;
|
||||
}
|
||||
}
|
||||
double successRate = totalAnalyses == 0 ? 0 : Math.round(completedAnalyses * 1000.0 / totalAnalyses) / 10.0;
|
||||
|
||||
List<Map<String, Object>> statusDistribution = new ArrayList<>();
|
||||
for (Object[] row : statusRows) {
|
||||
Map<String, Object> item = new LinkedHashMap<>();
|
||||
item.put("name", row[0]);
|
||||
item.put("value", row[1]);
|
||||
statusDistribution.add(item);
|
||||
}
|
||||
|
||||
List<Map<String, Object>> categoryDistribution = new ArrayList<>();
|
||||
for (Object[] row : aiAnalysisRepository.countByCategoryGroup()) {
|
||||
Map<String, Object> item = new LinkedHashMap<>();
|
||||
item.put("name", row[0]);
|
||||
item.put("value", row[1]);
|
||||
categoryDistribution.add(item);
|
||||
}
|
||||
|
||||
List<Map<String, Object>> departmentDistribution = new ArrayList<>();
|
||||
for (Object[] row : aiAnalysisRepository.countByDepartmentGroup()) {
|
||||
Map<String, Object> item = new LinkedHashMap<>();
|
||||
item.put("name", row[0]);
|
||||
item.put("value", row[1]);
|
||||
departmentDistribution.add(item);
|
||||
}
|
||||
|
||||
List<Map<String, Object>> dailyTrend = new ArrayList<>();
|
||||
LocalDateTime since = java.time.LocalDate.now().minusDays(days).atStartOfDay();
|
||||
List<Object[]> trendRows = aiAnalysisRepository.dailyTrendGroup(since);
|
||||
Map<String, Map<String, Long>> dateMap = new LinkedHashMap<>();
|
||||
for (Object[] row : trendRows) {
|
||||
String date = String.valueOf(row[0]);
|
||||
String status = (String) row[1];
|
||||
Long count = (Long) row[2];
|
||||
dateMap.computeIfAbsent(date, k -> {
|
||||
Map<String, Long> m = new LinkedHashMap<>();
|
||||
m.put("completed", 0L);
|
||||
m.put("failed", 0L);
|
||||
return m;
|
||||
}).put(status, count);
|
||||
}
|
||||
for (Map.Entry<String, Map<String, Long>> entry : dateMap.entrySet()) {
|
||||
Map<String, Object> item = new LinkedHashMap<>();
|
||||
item.put("date", entry.getKey());
|
||||
item.put("completed", entry.getValue().getOrDefault("completed", 0L));
|
||||
item.put("failed", entry.getValue().getOrDefault("failed", 0L));
|
||||
dailyTrend.add(item);
|
||||
}
|
||||
|
||||
result.put("totalIssues", totalIssues);
|
||||
result.put("analyzedCount", analyzedCount);
|
||||
result.put("unanalyzedCount", unanalyzedCount);
|
||||
result.put("coverageRate", coverageRate);
|
||||
result.put("successRate", successRate);
|
||||
result.put("dailyTrend", dailyTrend);
|
||||
result.put("statusDistribution", statusDistribution);
|
||||
result.put("categoryDistribution", categoryDistribution);
|
||||
result.put("departmentDistribution", departmentDistribution);
|
||||
return ApiResponse.success(result);
|
||||
}
|
||||
|
||||
@PostMapping("/records/{id}/feedback")
|
||||
public ApiResponse<Void> feedback(@PathVariable Long id,
|
||||
@Valid @RequestBody AiFeedbackRequest body,
|
||||
Authentication authentication) {
|
||||
aiAnalysisService.feedback(id, requireUserId(authentication), body.getIsHelpful(), body.getComment());
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@GetMapping("/records/export")
|
||||
public void export(@RequestParam(required = false) Long id,
|
||||
@RequestParam(required = false) Long issueId,
|
||||
@RequestParam(required = false) Long departmentId,
|
||||
@RequestParam(required = false) String status,
|
||||
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
|
||||
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
|
||||
jakarta.servlet.http.HttpServletResponse response) throws java.io.IOException {
|
||||
Page<AiAnalysisResponse> page = aiAnalysisService.records(id, 1, 10000, issueId, departmentId, status, startDate, endDate);
|
||||
StringBuilder csv = new StringBuilder();
|
||||
csv.append('\uFEFF'); // UTF-8 BOM,兼容 Excel
|
||||
csv.append("ID,指摘编号,指摘标题,问题分类,提取关键词,根因分析,整改建议,分析状态,模型,分析时间\n");
|
||||
for (AiAnalysisResponse r : page.getContent()) {
|
||||
csv.append(r.getId()).append(',')
|
||||
.append(csvCell(r.getIssueNo())).append(',')
|
||||
.append(csvCell(r.getIssueTitle())).append(',')
|
||||
.append(csvCell(r.getCategory())).append(',')
|
||||
.append(csvCell(r.getKeywords())).append(',')
|
||||
.append(csvCell(r.getRootCause())).append(',')
|
||||
.append(csvCell(r.getSuggestion())).append(',')
|
||||
.append(csvCell(r.getStatus())).append(',')
|
||||
.append(csvCell(r.getModelProvider() + "/" + r.getModelName())).append(',')
|
||||
.append(r.getCreatedAt() == null ? "" : r.getCreatedAt().toString())
|
||||
.append('\n');
|
||||
}
|
||||
response.setContentType("text/csv; charset=UTF-8");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=ai-analysis.csv");
|
||||
response.getWriter().write(csv.toString());
|
||||
}
|
||||
|
||||
private String csvCell(String value) {
|
||||
if (value == null) {
|
||||
return "";
|
||||
}
|
||||
return "\"" + value.replace("\"", "\"\"") + "\"";
|
||||
}
|
||||
|
||||
private Long requireUserId(Authentication authentication) {
|
||||
if (authentication == null || !authentication.isAuthenticated()) {
|
||||
throw new BusinessException("未登录");
|
||||
}
|
||||
String username = authentication.getName();
|
||||
User user = userRepository.findByUsername(username)
|
||||
.or(() -> userRepository.findByUserid(username))
|
||||
.orElseThrow(() -> new BusinessException("用户不存在: " + username));
|
||||
return user.getId();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.ai.AiConfigRequest;
|
||||
import com.ims.api.dto.ai.AiConfigResponse;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.service.ai.ModelRoutingService;
|
||||
import com.ims.service.knowledge.AiConfigService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/ai/config")
|
||||
public class AiConfigControllerImpl {
|
||||
|
||||
private final AiConfigService aiConfigService;
|
||||
private final ModelRoutingService modelRoutingService;
|
||||
|
||||
public AiConfigControllerImpl(AiConfigService aiConfigService, ModelRoutingService modelRoutingService) {
|
||||
this.aiConfigService = aiConfigService;
|
||||
this.modelRoutingService = modelRoutingService;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<AiConfigResponse> getConfig() {
|
||||
return ApiResponse.success(aiConfigService.getConfig());
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
public ApiResponse<Void> updateConfig(@RequestBody AiConfigRequest request) {
|
||||
aiConfigService.updateConfig(request);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PostMapping("/test")
|
||||
public ApiResponse<Map<String, Object>> test() {
|
||||
return ApiResponse.success(modelRoutingService.test());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.common.util.JwtUtil;
|
||||
import com.ims.api.dto.auth.LoginRequest;
|
||||
import com.ims.api.dto.auth.LoginResponse;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import com.ims.service.repository.UserRoleRepository;
|
||||
import com.ims.service.repository.RoleRepository;
|
||||
import io.jsonwebtoken.Claims;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/auth")
|
||||
public class AuthControllerImpl {
|
||||
|
||||
private final UserRepository userRepository;
|
||||
private final UserRoleRepository userRoleRepository;
|
||||
private final RoleRepository roleRepository;
|
||||
private final JwtUtil jwtUtil;
|
||||
private final PasswordEncoder passwordEncoder;
|
||||
|
||||
public AuthControllerImpl(UserRepository userRepository, UserRoleRepository userRoleRepository,
|
||||
RoleRepository roleRepository, JwtUtil jwtUtil, PasswordEncoder passwordEncoder) {
|
||||
this.userRepository = userRepository;
|
||||
this.userRoleRepository = userRoleRepository;
|
||||
this.roleRepository = roleRepository;
|
||||
this.jwtUtil = jwtUtil;
|
||||
this.passwordEncoder = passwordEncoder;
|
||||
}
|
||||
|
||||
@PostMapping("/login")
|
||||
public ApiResponse<LoginResponse> login(@Valid @RequestBody LoginRequest request) {
|
||||
User user = userRepository.findByUserid(request.getUsername())
|
||||
.or(() -> userRepository.findByUsername(request.getUsername()))
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.UNAUTHORIZED.getCode(), "账号或密码错误"));
|
||||
|
||||
if (!passwordEncoder.matches(request.getPassword(), user.getPasswordHash())) {
|
||||
throw new BusinessException(ResultCode.UNAUTHORIZED.getCode(), "账号或密码错误");
|
||||
}
|
||||
|
||||
if (user.getIsActive() == null || !user.getIsActive()) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN.getCode(), "账号已被禁用");
|
||||
}
|
||||
|
||||
String accessToken = jwtUtil.generateAccessToken(user.getId(), user.getUsername());
|
||||
String refreshToken = jwtUtil.generateRefreshToken(user.getId(), user.getUsername());
|
||||
|
||||
return ApiResponse.success(new LoginResponse(accessToken, refreshToken, user.getId(), user.getUsername(),
|
||||
resolveRoleName(user.getId())));
|
||||
}
|
||||
|
||||
private String resolveRoleName(Long userId) {
|
||||
return userRoleRepository.findByUserId(userId).stream()
|
||||
.map(ur -> roleRepository.findById(ur.getRoleId()).map(r -> r.getName()).orElse(""))
|
||||
.filter(n -> !n.isEmpty())
|
||||
.collect(Collectors.joining(","));
|
||||
}
|
||||
|
||||
@GetMapping("/me")
|
||||
public ApiResponse<Map<String, Object>> me(Authentication authentication) {
|
||||
if (authentication == null || !authentication.isAuthenticated()) {
|
||||
throw new BusinessException(ResultCode.UNAUTHORIZED.getCode(), "未登录");
|
||||
}
|
||||
String username = authentication.getName();
|
||||
User user = userRepository.findByUsername(username)
|
||||
.or(() -> userRepository.findByUserid(username))
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.UNAUTHORIZED.getCode(), "用户不存在"));
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
result.put("userId", user.getId());
|
||||
result.put("username", user.getUsername());
|
||||
result.put("userid", user.getUserid());
|
||||
result.put("departmentId", user.getDepartment() != null ? user.getDepartment().getId() : null);
|
||||
result.put("departmentName", user.getDepartment() != null ? user.getDepartment().getName() : null);
|
||||
result.put("isActive", user.getIsActive());
|
||||
result.put("agentAutoExecute", user.getAgentAutoExecute());
|
||||
result.put("roleName", resolveRoleName(user.getId()));
|
||||
return ApiResponse.success(result);
|
||||
}
|
||||
|
||||
@PostMapping("/refresh")
|
||||
public ApiResponse<LoginResponse> refresh(@RequestBody Map<String, String> body) {
|
||||
String refreshToken = body.get("refreshToken");
|
||||
if (refreshToken == null || !jwtUtil.validateToken(refreshToken)) {
|
||||
throw new BusinessException(ResultCode.UNAUTHORIZED.getCode(), "refresh token 无效或已过期,请重新登录");
|
||||
}
|
||||
Claims claims = jwtUtil.parseToken(refreshToken);
|
||||
Long userId = claims.get("userId", Long.class);
|
||||
String username = claims.getSubject();
|
||||
|
||||
String newAccessToken = jwtUtil.generateAccessToken(userId, username);
|
||||
String newRefreshToken = jwtUtil.generateRefreshToken(userId, username);
|
||||
|
||||
return ApiResponse.success(new LoginResponse(newAccessToken, newRefreshToken, userId, username, ""));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.dashboard.DashboardStatsResponse;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.service.dashboard.DashboardService;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/dashboard")
|
||||
public class DashboardControllerImpl {
|
||||
|
||||
private final DashboardService dashboardService;
|
||||
|
||||
public DashboardControllerImpl(DashboardService dashboardService) {
|
||||
this.dashboardService = dashboardService;
|
||||
}
|
||||
|
||||
@GetMapping("/stats")
|
||||
public ApiResponse<DashboardStatsResponse> stats() {
|
||||
return ApiResponse.success(dashboardService.stats());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.service.entity.Department;
|
||||
import com.ims.service.repository.DepartmentRepository;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/departments")
|
||||
public class DepartmentControllerImpl {
|
||||
|
||||
private final DepartmentRepository departmentRepository;
|
||||
|
||||
public DepartmentControllerImpl(DepartmentRepository departmentRepository) {
|
||||
this.departmentRepository = departmentRepository;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<List<Map<String, Object>>> list() {
|
||||
return ApiResponse.success(departmentRepository.findAll().stream()
|
||||
.sorted((a, b) -> {
|
||||
int ao = a.getSortOrder() == null ? 0 : a.getSortOrder();
|
||||
int bo = b.getSortOrder() == null ? 0 : b.getSortOrder();
|
||||
return Integer.compare(ao, bo);
|
||||
})
|
||||
.map(this::toMap)
|
||||
.toList());
|
||||
}
|
||||
|
||||
private Map<String, Object> toMap(Department d) {
|
||||
Map<String, Object> m = new LinkedHashMap<>();
|
||||
m.put("id", d.getId());
|
||||
m.put("name", d.getName());
|
||||
m.put("parentId", d.getParent() == null ? null : d.getParent().getId());
|
||||
return m;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.common.constant.ResultCode;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.security.access.AccessDeniedException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||
import org.springframework.web.multipart.MaxUploadSizeExceededException;
|
||||
|
||||
@RestControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
|
||||
|
||||
@ExceptionHandler(BusinessException.class)
|
||||
public ApiResponse<Void> handleBusinessException(BusinessException e, HttpServletResponse response) {
|
||||
int status = e.getCode() >= 400 && e.getCode() < 600 ? e.getCode() : HttpStatus.BAD_REQUEST.value();
|
||||
response.setStatus(status);
|
||||
return ApiResponse.error(status, e.getMessage());
|
||||
}
|
||||
|
||||
@ExceptionHandler(AccessDeniedException.class)
|
||||
@ResponseStatus(HttpStatus.FORBIDDEN)
|
||||
public ApiResponse<Void> handleAccessDeniedException(AccessDeniedException e) {
|
||||
return ApiResponse.error(ResultCode.FORBIDDEN);
|
||||
}
|
||||
|
||||
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResponse<Void> handleTypeMismatch(MethodArgumentTypeMismatchException e) {
|
||||
return ApiResponse.error(400, "参数格式不正确:" + e.getName() + " 必须为数字");
|
||||
}
|
||||
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||
public ApiResponse<Void> handleValidation(MethodArgumentNotValidException e) {
|
||||
String msg = e.getBindingResult().getFieldErrors().stream()
|
||||
.findFirst()
|
||||
.map(err -> err.getDefaultMessage())
|
||||
.orElse("参数校验失败");
|
||||
return ApiResponse.error(400, msg);
|
||||
}
|
||||
|
||||
@ExceptionHandler(MaxUploadSizeExceededException.class)
|
||||
@ResponseStatus(HttpStatus.PAYLOAD_TOO_LARGE)
|
||||
public ApiResponse<Void> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
|
||||
return ApiResponse.error(413, "文件大小超过限制,最大允许 50MB");
|
||||
}
|
||||
|
||||
@ExceptionHandler(Exception.class)
|
||||
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
public ApiResponse<Void> handleException(Exception e) {
|
||||
log.error("Unexpected error", e);
|
||||
return ApiResponse.error(ResultCode.INTERNAL_ERROR);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.ims.web;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.domain.EntityScan;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableScheduling
|
||||
@ComponentScan(basePackages = "com.ims")
|
||||
@EntityScan(basePackages = "com.ims.service.entity")
|
||||
@EnableJpaRepositories(basePackages = "com.ims.service.repository")
|
||||
public class IMSApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(IMSApplication.class, args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.imports.AgentValidateResponse;
|
||||
import com.ims.api.dto.imports.ImportConfirmRequest;
|
||||
import com.ims.api.dto.imports.ImportPreviewResponse;
|
||||
import com.ims.api.dto.imports.ImportRecordQueryRequest;
|
||||
import com.ims.api.dto.imports.ImportRecordResponse;
|
||||
import com.ims.api.dto.imports.ImportRow;
|
||||
import com.ims.api.service.system.ImportService;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/import")
|
||||
public class ImportExportControllerImpl {
|
||||
|
||||
private final ImportService importService;
|
||||
|
||||
public ImportExportControllerImpl(ImportService importService) {
|
||||
this.importService = importService;
|
||||
}
|
||||
|
||||
@GetMapping("/template")
|
||||
public void template(HttpServletResponse response) throws IOException {
|
||||
byte[] data = importService.generateTemplate();
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
String fileName = java.net.URLEncoder.encode("レビュー記録表.xlsx", java.nio.charset.StandardCharsets.UTF_8)
|
||||
.replace("+", "%20");
|
||||
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
|
||||
response.getOutputStream().write(data);
|
||||
}
|
||||
|
||||
@PostMapping("/excel")
|
||||
public ApiResponse<ImportPreviewResponse> uploadExcel(@RequestParam("file") MultipartFile file) {
|
||||
return ApiResponse.success(importService.preview(file));
|
||||
}
|
||||
|
||||
@PostMapping("/ai-validate")
|
||||
public ApiResponse<AgentValidateResponse> aiValidate(@RequestBody List<ImportRow> rows) {
|
||||
return ApiResponse.success(importService.aiValidate(rows));
|
||||
}
|
||||
|
||||
@PostMapping("/confirm")
|
||||
public ApiResponse<ImportRecordResponse> confirm(@RequestBody ImportConfirmRequest request,
|
||||
Authentication authentication) {
|
||||
return ApiResponse.success(importService.confirm(request, authentication.getName()));
|
||||
}
|
||||
|
||||
@GetMapping("/records")
|
||||
public ApiResponse<PageResult<ImportRecordResponse>> records(ImportRecordQueryRequest request) {
|
||||
return ApiResponse.success(importService.records(request.getPage(), request.getPageSize()));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.issue.AttachmentResponse;
|
||||
import com.ims.api.dto.issue.BatchAgentRequest;
|
||||
import com.ims.api.dto.issue.BatchAssignRequest;
|
||||
import com.ims.api.dto.issue.BatchNotifyRequest;
|
||||
import com.ims.api.dto.issue.IssueCreateRequest;
|
||||
import com.ims.api.dto.issue.IssueListRequest;
|
||||
import com.ims.api.dto.issue.IssueResponse;
|
||||
import com.ims.api.dto.issue.IssueStatusRequest;
|
||||
import com.ims.api.dto.issue.IssueUpdateRequest;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.common.exception.BusinessException;
|
||||
import com.ims.service.agent.AgentService;
|
||||
import com.ims.service.entity.Issue;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.issue.AttachmentService;
|
||||
import com.ims.service.issue.IssueService;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/issues")
|
||||
public class IssueControllerImpl {
|
||||
|
||||
private final IssueService issueService;
|
||||
private final AttachmentService attachmentService;
|
||||
private final AgentService agentService;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public IssueControllerImpl(IssueService issueService,
|
||||
AttachmentService attachmentService,
|
||||
AgentService agentService,
|
||||
UserRepository userRepository) {
|
||||
this.issueService = issueService;
|
||||
this.attachmentService = attachmentService;
|
||||
this.agentService = agentService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
public ApiResponse<IssueResponse> create(@Valid @RequestBody IssueCreateRequest request, Authentication authentication) {
|
||||
return ApiResponse.success(issueService.create(request, currentUser(authentication)));
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<PageResult<IssueResponse>> list(@Valid IssueListRequest request) {
|
||||
return ApiResponse.success(issueService.list(request));
|
||||
}
|
||||
|
||||
@GetMapping("/{id}")
|
||||
public ApiResponse<IssueResponse> detail(@PathVariable Long id) {
|
||||
return ApiResponse.success(issueService.detail(id));
|
||||
}
|
||||
|
||||
@GetMapping("/{id}/logs")
|
||||
public ApiResponse<List<Map<String, Object>>> logs(@PathVariable Long id) {
|
||||
return ApiResponse.success(issueService.logs(id));
|
||||
}
|
||||
|
||||
@PutMapping("/{id}")
|
||||
public ApiResponse<IssueResponse> update(@PathVariable Long id, @RequestBody IssueUpdateRequest request, Authentication authentication) {
|
||||
return ApiResponse.success(issueService.update(id, request, currentUser(authentication)));
|
||||
}
|
||||
|
||||
@DeleteMapping("/{id}")
|
||||
public ApiResponse<Void> delete(@PathVariable Long id, Authentication authentication) {
|
||||
issueService.delete(id, currentUser(authentication));
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PatchMapping("/{id}/status")
|
||||
public ApiResponse<IssueResponse> changeStatus(@PathVariable Long id, @Valid @RequestBody IssueStatusRequest request, Authentication authentication) {
|
||||
return ApiResponse.success(issueService.changeStatus(id, request.getStatus(), request.getRemark(), currentUser(authentication)));
|
||||
}
|
||||
|
||||
@PostMapping("/{id}/agent-mode")
|
||||
public ApiResponse<Void> changeAgentMode(@PathVariable Long id, @RequestParam("mode") String mode, Authentication authentication) {
|
||||
issueService.changeAgentMode(id, mode, currentUser(authentication));
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PostMapping("/{id}/attachments")
|
||||
public ApiResponse<AttachmentResponse> uploadAttachment(@PathVariable Long id,
|
||||
@RequestParam("file") MultipartFile file,
|
||||
Authentication authentication) {
|
||||
return ApiResponse.success(attachmentService.upload(id, file, currentUser(authentication)));
|
||||
}
|
||||
|
||||
@GetMapping("/{id}/attachments")
|
||||
public ApiResponse<List<AttachmentResponse>> listAttachments(@PathVariable Long id) {
|
||||
return ApiResponse.success(attachmentService.listByIssue(id));
|
||||
}
|
||||
|
||||
@GetMapping("/{id}/attachments/{attachmentId}/download")
|
||||
public void downloadAttachment(@PathVariable Long id, @PathVariable Long attachmentId, HttpServletResponse response) {
|
||||
attachmentService.download(attachmentId, response);
|
||||
}
|
||||
|
||||
@DeleteMapping("/{id}/attachments/{attachmentId}")
|
||||
public ApiResponse<Void> deleteAttachment(@PathVariable Long id, @PathVariable Long attachmentId) {
|
||||
attachmentService.delete(attachmentId);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
private static final Map<String, String> STATUS_CN = Map.of(
|
||||
"draft", "草稿", "open", "待处理", "in_progress", "进行中",
|
||||
"resolved", "已解决", "verified", "已验证", "closed", "已关闭", "rejected", "已驳回");
|
||||
|
||||
private static final Map<String, String> PRIORITY_CN = Map.of(
|
||||
"urgent", "紧急", "high", "高", "medium", "中", "low", "低");
|
||||
|
||||
@GetMapping(value = "/export", produces = "text/csv; charset=UTF-8")
|
||||
public void export(IssueListRequest req, HttpServletResponse response) {
|
||||
List<Issue> issues = issueService.findAllFiltered(req);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("\uFEFFissueNo,title,status,priority,phase,subProject,category,impactLevel,assignee,deadline,createdAt\n");
|
||||
for (Issue i : issues) {
|
||||
sb.append(IssueService.escapeCsv(i.getIssueNo())).append(',')
|
||||
.append(IssueService.escapeCsv(i.getTitle())).append(',')
|
||||
.append(IssueService.escapeCsv(STATUS_CN.getOrDefault(i.getStatus(), i.getStatus()))).append(',')
|
||||
.append(IssueService.escapeCsv(PRIORITY_CN.getOrDefault(i.getPriority(), i.getPriority()))).append(',')
|
||||
.append(IssueService.escapeCsv(i.getPhase())).append(',')
|
||||
.append(IssueService.escapeCsv(i.getSubProject())).append(',')
|
||||
.append(IssueService.escapeCsv(i.getCategory())).append(',')
|
||||
.append(IssueService.escapeCsv(i.getImpactLevel())).append(',')
|
||||
.append(IssueService.escapeCsv(i.getAssignee() != null ? i.getAssignee().getUsername() : "")).append(',')
|
||||
.append(i.getDeadline() != null ? i.getDeadline().toLocalDate().toString() : "").append(',')
|
||||
.append(i.getCreatedAt()).append("\n");
|
||||
}
|
||||
try {
|
||||
byte[] bytes = sb.toString().getBytes(StandardCharsets.UTF_8);
|
||||
response.setContentType("text/csv; charset=UTF-8");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=issues.csv");
|
||||
response.getOutputStream().write(bytes);
|
||||
response.getOutputStream().flush();
|
||||
} catch (Exception e) {
|
||||
throw new BusinessException("CSV 导出失败");
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("/batch/assign")
|
||||
public ApiResponse<Map<String, Object>> batchAssign(@Valid @RequestBody BatchAssignRequest request,
|
||||
Authentication authentication) {
|
||||
List<Long> ids = request.getIssueIds() != null ? request.getIssueIds() : List.of();
|
||||
int count = issueService.batchAssign(ids, request.getAssigneeId(), currentUser(authentication));
|
||||
return ApiResponse.success(Map.of("count", count));
|
||||
}
|
||||
|
||||
@PostMapping("/batch/notify")
|
||||
public ApiResponse<Map<String, Object>> batchNotify(@RequestBody BatchNotifyRequest request,
|
||||
Authentication authentication) {
|
||||
List<Long> ids = request.getIssueIds() != null ? request.getIssueIds() : List.of();
|
||||
int count = issueService.batchNotify(ids, request.getContent(), currentUser(authentication));
|
||||
return ApiResponse.success(Map.of("count", count));
|
||||
}
|
||||
|
||||
@PostMapping("/batch/agent")
|
||||
public ApiResponse<Map<String, Object>> batchAgent(@RequestBody BatchAgentRequest request,
|
||||
Authentication authentication) {
|
||||
List<Long> ids = request.getIssueIds() != null ? request.getIssueIds() : List.of();
|
||||
if (ids.isEmpty()) {
|
||||
throw new BusinessException("请先选择指摘");
|
||||
}
|
||||
if (request.getGoal() == null || request.getGoal().isBlank()) {
|
||||
throw new BusinessException("请输入 Agent 指令");
|
||||
}
|
||||
User user = currentUser(authentication);
|
||||
List<Long> planIds = new ArrayList<>();
|
||||
for (Long id : ids) {
|
||||
Map<String, Object> exec = agentService.execute(id, request.getGoal(), user);
|
||||
planIds.add(((Number) exec.get("planId")).longValue());
|
||||
}
|
||||
return ApiResponse.success(Map.of("count", ids.size(), "planIds", planIds));
|
||||
}
|
||||
|
||||
private User currentUser(Authentication authentication) {
|
||||
String name = authentication.getName();
|
||||
return userRepository.findByUserid(name)
|
||||
.or(() -> userRepository.findByUsername(name))
|
||||
.orElseThrow(() -> new BusinessException("用户不存在"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.knowledge.KnowledgeDocResponse;
|
||||
import com.ims.api.dto.knowledge.KnowledgeLogQueryRequest;
|
||||
import com.ims.api.dto.knowledge.KnowledgeSearchRequest;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.service.entity.User;
|
||||
import com.ims.service.knowledge.KnowledgeService;
|
||||
import com.ims.service.knowledge.SearchLogService;
|
||||
import com.ims.service.knowledge.SearchService;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/knowledge")
|
||||
public class KnowledgeControllerImpl {
|
||||
|
||||
private final KnowledgeService knowledgeService;
|
||||
private final SearchService searchService;
|
||||
private final SearchLogService searchLogService;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public KnowledgeControllerImpl(KnowledgeService knowledgeService,
|
||||
SearchService searchService,
|
||||
SearchLogService searchLogService,
|
||||
UserRepository userRepository) {
|
||||
this.knowledgeService = knowledgeService;
|
||||
this.searchService = searchService;
|
||||
this.searchLogService = searchLogService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@GetMapping("/documents")
|
||||
public ApiResponse<PageResult<KnowledgeDocResponse>> documents(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize) {
|
||||
Page<KnowledgeDocResponse> result = knowledgeService.list(page, pageSize);
|
||||
PageResult<KnowledgeDocResponse> pageResult = new PageResult<>(
|
||||
result.getContent(), result.getTotalElements(), page, pageSize);
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@PostMapping("/documents")
|
||||
public ApiResponse<KnowledgeDocResponse> upload(@RequestParam("file") MultipartFile file,
|
||||
Authentication authentication) {
|
||||
String username = authentication.getName();
|
||||
User user = userRepository.findByUsername(username)
|
||||
.or(() -> userRepository.findByUserid(username))
|
||||
.orElseThrow(() -> new RuntimeException("User not found"));
|
||||
KnowledgeDocResponse doc = knowledgeService.upload(file, user);
|
||||
return ApiResponse.success(doc);
|
||||
}
|
||||
|
||||
@DeleteMapping("/documents/{id}")
|
||||
public ApiResponse<Void> delete(@PathVariable Long id) {
|
||||
knowledgeService.delete(id);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PostMapping("/documents/{id}/reindex")
|
||||
public ApiResponse<Void> reindex(@PathVariable Long id) {
|
||||
knowledgeService.reindex(id);
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@GetMapping("/search")
|
||||
public ApiResponse<PageResult<SearchService.SearchResult>> search(@Valid KnowledgeSearchRequest request) {
|
||||
java.util.List<SearchService.SearchResult> results = searchService.search(
|
||||
request.getQuery(), request.getTopK());
|
||||
PageResult<SearchService.SearchResult> pageResult = new PageResult<>(
|
||||
results, results.size(), 1, results.size());
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/logs")
|
||||
public ApiResponse<PageResult<?>> logs(@Valid KnowledgeLogQueryRequest request) {
|
||||
Page<?> result = searchLogService.list(request.getPage(), request.getPageSize());
|
||||
PageResult<?> pageResult = new PageResult<>(
|
||||
result.getContent(), result.getTotalElements(), request.getPage(), request.getPageSize());
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.notification.NotificationResponse;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.service.notification.NotificationService;
|
||||
import com.ims.service.repository.UserRepository;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/notifications")
|
||||
public class NotificationControllerImpl {
|
||||
|
||||
private final NotificationService notificationService;
|
||||
private final UserRepository userRepository;
|
||||
|
||||
public NotificationControllerImpl(NotificationService notificationService, UserRepository userRepository) {
|
||||
this.notificationService = notificationService;
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<PageResult<NotificationResponse>> list(@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize,
|
||||
Authentication authentication) {
|
||||
return ApiResponse.success(notificationService.list(currentUserId(authentication), page, pageSize));
|
||||
}
|
||||
|
||||
@GetMapping("/unread-count")
|
||||
public ApiResponse<Map<String, Long>> unreadCount(Authentication authentication) {
|
||||
return ApiResponse.success(Map.of("count", notificationService.unreadCount(currentUserId(authentication))));
|
||||
}
|
||||
|
||||
@PatchMapping("/{id}/read")
|
||||
public ApiResponse<Void> markRead(@PathVariable Long id, Authentication authentication) {
|
||||
notificationService.markRead(id, currentUserId(authentication));
|
||||
return ApiResponse.success(null);
|
||||
}
|
||||
|
||||
@PostMapping("/read-all")
|
||||
public ApiResponse<Integer> readAll(Authentication authentication) {
|
||||
return ApiResponse.success(notificationService.markAllRead(currentUserId(authentication)));
|
||||
}
|
||||
|
||||
private Long currentUserId(Authentication authentication) {
|
||||
String name = authentication.getName();
|
||||
return userRepository.findByUserid(name)
|
||||
.or(() -> userRepository.findByUsername(name))
|
||||
.orElseThrow().getId();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package com.ims.web;
|
||||
|
||||
import com.ims.api.dto.prompt.PromptRenderLogResponse;
|
||||
import com.ims.api.dto.prompt.PromptStatsResponse;
|
||||
import com.ims.api.dto.prompt.PromptTemplateRequest;
|
||||
import com.ims.api.dto.prompt.PromptTemplateResponse;
|
||||
import com.ims.api.dto.prompt.PromptTestRequest;
|
||||
import com.ims.common.dto.ApiResponse;
|
||||
import com.ims.common.dto.PageResult;
|
||||
import com.ims.service.prompt.PromptService;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/prompts")
|
||||
public class PromptControllerImpl {
|
||||
|
||||
private final PromptService promptService;
|
||||
|
||||
public PromptControllerImpl(PromptService promptService) {
|
||||
this.promptService = promptService;
|
||||
}
|
||||
|
||||
@GetMapping
|
||||
public ApiResponse<PageResult<PromptTemplateResponse>> list(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize) {
|
||||
Page<PromptTemplateResponse> result = promptService.list(page, pageSize);
|
||||
PageResult<PromptTemplateResponse> pageResult = new PageResult<>(
|
||||
result.getContent(), result.getTotalElements(), page, pageSize);
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/{templateId}")
|
||||
public ApiResponse<PromptTemplateResponse> detail(@PathVariable String templateId) {
|
||||
return ApiResponse.success(promptService.detail(templateId));
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
public ApiResponse<PromptTemplateResponse> create(@Valid @RequestBody PromptTemplateRequest request) {
|
||||
return ApiResponse.success(promptService.create(request));
|
||||
}
|
||||
|
||||
@PutMapping("/{templateId}")
|
||||
public ApiResponse<PromptTemplateResponse> update(@PathVariable String templateId,
|
||||
@RequestBody PromptTemplateRequest request) {
|
||||
return ApiResponse.success(promptService.update(templateId, request));
|
||||
}
|
||||
|
||||
@PostMapping("/{templateId}/rollback")
|
||||
public ApiResponse<PromptTemplateResponse> rollback(@PathVariable String templateId,
|
||||
@RequestParam int version) {
|
||||
return ApiResponse.success(promptService.rollback(templateId, version));
|
||||
}
|
||||
|
||||
@PostMapping("/{templateId}/test")
|
||||
public ApiResponse<Map<String, Object>> test(@PathVariable String templateId,
|
||||
@RequestBody(required = false) PromptTestRequest request) {
|
||||
PromptTestRequest body = request == null ? new PromptTestRequest() : request;
|
||||
body.setTemplateId(templateId);
|
||||
return ApiResponse.success(promptService.test(body));
|
||||
}
|
||||
|
||||
@GetMapping("/{templateId}/versions")
|
||||
public ApiResponse<List<Map<String, Object>>> versions(@PathVariable String templateId) {
|
||||
return ApiResponse.success(promptService.versions(templateId));
|
||||
}
|
||||
|
||||
@GetMapping("/logs")
|
||||
public ApiResponse<PageResult<PromptRenderLogResponse>> logs(
|
||||
@RequestParam(defaultValue = "1") int page,
|
||||
@RequestParam(defaultValue = "20") int pageSize) {
|
||||
Page<PromptRenderLogResponse> result = promptService.logs(page, pageSize);
|
||||
PageResult<PromptRenderLogResponse> pageResult = new PageResult<>(
|
||||
result.getContent(), result.getTotalElements(), page, pageSize);
|
||||
return ApiResponse.success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/stats")
|
||||
public ApiResponse<List<PromptStatsResponse>> stats() {
|
||||
return ApiResponse.success(promptService.stats());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
spring:
|
||||
jpa:
|
||||
show-sql: true
|
||||
flyway:
|
||||
enabled: true
|
||||
|
||||
logging:
|
||||
level:
|
||||
com.ims: DEBUG
|
||||
org.springframework.security: DEBUG
|
||||
@@ -0,0 +1,3 @@
|
||||
spring:
|
||||
jpa:
|
||||
show-sql: false
|
||||
@@ -0,0 +1,83 @@
|
||||
server:
|
||||
port: 8080
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: ims
|
||||
datasource:
|
||||
url: jdbc:postgresql://localhost:5432/ims
|
||||
username: ims
|
||||
password: ims123
|
||||
driver-class-name: org.postgresql.Driver
|
||||
jpa:
|
||||
hibernate:
|
||||
ddl-auto: update
|
||||
show-sql: false
|
||||
properties:
|
||||
hibernate:
|
||||
format_sql: true
|
||||
jdbc:
|
||||
batch_size: 20
|
||||
flyway:
|
||||
enabled: true
|
||||
locations: classpath:db/migration
|
||||
baseline-on-migrate: true
|
||||
validate-on-migrate: false
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
servlet:
|
||||
multipart:
|
||||
max-file-size: 50MB
|
||||
max-request-size: 50MB
|
||||
|
||||
jwt:
|
||||
secret: IMS_SECRET_KEY_2026_THIS_MUST_BE_CHANGED_IN_PRODUCTION_ENVIRONMENT
|
||||
access-token-expiration: 1800000
|
||||
refresh-token-expiration: 604800000
|
||||
|
||||
minio:
|
||||
endpoint: http://localhost:9000
|
||||
access-key: minioadmin
|
||||
secret-key: minioadmin
|
||||
bucket: ims-attachments
|
||||
|
||||
ai:
|
||||
provider: ollama
|
||||
auto-fallback-enabled: true
|
||||
|
||||
ollama:
|
||||
base-url: http://localhost:11434
|
||||
timeout:
|
||||
connect: 10000
|
||||
read: 1800000
|
||||
chat:
|
||||
model: llama3.1:8b
|
||||
options:
|
||||
temperature: 0.3
|
||||
num-predict: 4096
|
||||
embedding:
|
||||
model: nomic-embed-text
|
||||
|
||||
deepseek:
|
||||
api:
|
||||
key: ""
|
||||
model: deepseek-v4-pro
|
||||
embedding-model: text-embedding-3-small
|
||||
|
||||
agent:
|
||||
max-steps: 10
|
||||
auto-execute-high-risk: false
|
||||
user-rate-limit: 10
|
||||
|
||||
knowledge:
|
||||
chunk-size: 200
|
||||
chunk-overlap: 40
|
||||
max-upload-size: 52428800
|
||||
|
||||
prompt:
|
||||
template-cache-ttl: 3600
|
||||
render-log-retention-days: 30
|
||||
output-format-enforced: true
|
||||
query-rewrite-enabled: true
|
||||
Binary file not shown.
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.5.16</version>
|
||||
<relativePath/>
|
||||
</parent>
|
||||
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-backend</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<modules>
|
||||
<module>ims-common</module>
|
||||
<module>ims-api</module>
|
||||
<module>ims-service</module>
|
||||
<module>ims-web</module>
|
||||
</modules>
|
||||
|
||||
<properties>
|
||||
<java.version>17</java.version>
|
||||
<jjwt.version>0.12.6</jjwt.version>
|
||||
<spring-ai.version>1.0.0-M6</spring-ai.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>${jjwt.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>${jjwt.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>${jjwt.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.ai</groupId>
|
||||
<artifactId>spring-ai-bom</artifactId>
|
||||
<version>${spring-ai.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-common</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-api</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.ims</groupId>
|
||||
<artifactId>ims-service</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spring-milestones</id>
|
||||
<name>Spring Milestones</name>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>maven-central</id>
|
||||
<name>Maven Central</name>
|
||||
<url>https://repo.maven.apache.org/maven2</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
</project>
|
||||
Reference in New Issue
Block a user