From e2a4d40c9e69c1aa5e431d3f404d3a2d7a571114 Mon Sep 17 00:00:00 2001 From: xunhe Date: Thu, 27 Aug 2026 17:34:35 +0800 Subject: [PATCH] init: 2026Technology-Competition initial commit --- .gitignore | 33 + META-INF/MANIFEST.MF | 6 + README.md | 169 + _AI_USAGE_LOG.md | 7 + _DEVELOPMENT_GUIDE.md | 286 ++ agents.md | 70 + backend/ims-api/pom.xml | 31 + .../com/ims/api/controller/LogController.java | 24 + .../ims/api/controller/RoleController.java | 42 + .../ims/api/controller/UserController.java | 77 + .../api/dto/agent/AgentApprovalRequest.java | 12 + .../ims/api/dto/agent/AgentConfigRequest.java | 10 + .../api/dto/agent/AgentConfigResponse.java | 10 + .../api/dto/agent/AgentExecuteRequest.java | 12 + .../api/dto/agent/AgentExecuteResponse.java | 14 + .../ims/api/dto/agent/AgentMemoryRequest.java | 13 + .../api/dto/agent/AgentMemoryResponse.java | 14 + .../ims/api/dto/agent/AgentPlanResponse.java | 21 + .../dto/agent/AgentSuggestFieldsRequest.java | 14 + .../api/dto/agent/AgentSuggestRequest.java | 14 + .../com/ims/api/dto/ai/AiAnalysisRequest.java | 12 + .../ims/api/dto/ai/AiAnalysisResponse.java | 28 + .../com/ims/api/dto/ai/AiConfigRequest.java | 23 + .../com/ims/api/dto/ai/AiConfigResponse.java | 22 + .../com/ims/api/dto/ai/AiFeedbackRequest.java | 12 + .../com/ims/api/dto/auth/LoginRequest.java | 13 + .../com/ims/api/dto/auth/LoginResponse.java | 14 + .../dto/dashboard/DashboardStatsResponse.java | 72 + .../dto/imports/AgentValidateResponse.java | 13 + .../api/dto/imports/ImportConfirmRequest.java | 10 + .../dto/imports/ImportPreviewResponse.java | 13 + .../dto/imports/ImportRecordQueryRequest.java | 9 + .../api/dto/imports/ImportRecordResponse.java | 17 + .../com/ims/api/dto/imports/ImportRow.java | 25 + .../ims/api/dto/imports/ImportSuggestion.java | 14 + .../ims/api/dto/issue/AttachmentResponse.java | 15 + .../ims/api/dto/issue/BatchAgentRequest.java | 11 + .../ims/api/dto/issue/BatchAssignRequest.java | 11 + .../ims/api/dto/issue/BatchNotifyRequest.java | 11 + .../ims/api/dto/issue/IssueCreateRequest.java | 35 + .../ims/api/dto/issue/IssueListRequest.java | 20 + .../com/ims/api/dto/issue/IssueResponse.java | 44 + .../ims/api/dto/issue/IssueStatusRequest.java | 11 + .../ims/api/dto/issue/IssueUpdateRequest.java | 31 + .../dto/knowledge/KnowledgeDocResponse.java | 17 + .../knowledge/KnowledgeLogQueryRequest.java | 14 + .../dto/knowledge/KnowledgeSearchRequest.java | 13 + .../knowledge/KnowledgeSearchResponse.java | 11 + .../notification/NotificationResponse.java | 15 + .../ims/api/dto/prompt/PromptLogResponse.java | 17 + .../dto/prompt/PromptRenderLogResponse.java | 20 + .../api/dto/prompt/PromptStatsResponse.java | 17 + .../api/dto/prompt/PromptTemplateRequest.java | 22 + .../dto/prompt/PromptTemplateResponse.java | 20 + .../ims/api/dto/prompt/PromptTestRequest.java | 13 + .../api/dto/prompt/PromptTestResponse.java | 12 + .../api/dto/prompt/PromptVersionResponse.java | 15 + .../api/dto/system/DepartmentResponse.java | 13 + .../ims/api/dto/system/LogQueryRequest.java | 17 + .../com/ims/api/dto/system/LogResponse.java | 14 + .../api/dto/system/PermissionResponse.java | 11 + .../com/ims/api/dto/system/RoleRequest.java | 19 + .../com/ims/api/dto/system/RoleResponse.java | 16 + .../com/ims/api/dto/system/UserRequest.java | 26 + .../com/ims/api/dto/system/UserResponse.java | 21 + .../api/service/agent/AgentConfigService.java | 11 + .../com/ims/api/service/ai/ChatService.java | 6 + .../ims/api/service/prompt/PromptService.java | 33 + .../api/service/system/DepartmentService.java | 10 + .../ims/api/service/system/ImportService.java | 24 + .../ims/api/service/system/LogService.java | 10 + .../ims/api/service/system/RoleService.java | 18 + .../ims/api/service/system/UserService.java | 16 + backend/ims-common/pom.xml | 35 + .../com/ims/common/constant/ResultCode.java | 22 + .../java/com/ims/common/dto/ApiResponse.java | 37 + .../java/com/ims/common/dto/PageResult.java | 26 + .../common/exception/BusinessException.java | 19 + .../java/com/ims/common/util/JwtUtil.java | 58 + backend/ims-service/pom.xml | 89 + .../ims/service/agent/AgentConfigService.java | 37 + .../service/agent/AgentConfigServiceImpl.java | 63 + .../agent/AgentOrchestratorService.java | 795 +++ .../com/ims/service/agent/AgentService.java | 226 + .../agent/AgentToolPermissionService.java | 55 + .../com/ims/service/agent/MemoryService.java | 108 + .../ims/service/agent/OllamaChatService.java | 73 + .../tool/AgentFunctionCallbackAdapter.java | 90 + .../service/agent/tool/AiAnalysisTool.java | 282 + .../service/agent/tool/AssignPendingTool.java | 76 + .../service/agent/tool/IssueCreateTool.java | 95 + .../service/agent/tool/IssueQueryTool.java | 79 + .../service/agent/tool/IssueUpdateTool.java | 91 + .../agent/tool/KnowledgeSearchTool.java | 54 + .../service/agent/tool/NotifyOverdueTool.java | 67 + .../java/com/ims/service/agent/tool/Tool.java | 14 + .../ims/service/agent/tool/ToolRegistry.java | 51 + .../service/agent/tool/WeeklyReportTool.java | 118 + .../com/ims/service/ai/AiAnalysisService.java | 403 ++ .../com/ims/service/ai/AiProviderConfig.java | 83 + .../ims/service/ai/DeepSeekChatService.java | 68 + .../com/ims/service/ai/KeywordExtractor.java | 47 + .../ims/service/ai/ModelRoutingService.java | 225 + .../com/ims/service/ai/OllamaChatService.java | 86 + .../com/ims/service/ai/PromptFormatter.java | 117 + .../ims/service/ai/PromptTemplateEngine.java | 129 + .../ims/service/ai/RoutingChatService.java | 52 + .../ims/service/ai/SystemContextBuilder.java | 70 + .../com/ims/service/config/JacksonConfig.java | 19 + .../com/ims/service/config/JwtConfig.java | 24 + .../com/ims/service/config/MinioConfig.java | 27 + .../com/ims/service/config/RedisConfig.java | 15 + .../com/ims/service/config/WebConfig.java | 21 + .../service/dashboard/DashboardService.java | 206 + .../com/ims/service/entity/AgentMemory.java | 51 + .../com/ims/service/entity/AgentPlan.java | 65 + .../com/ims/service/entity/AiAnalysis.java | 73 + .../com/ims/service/entity/AiCallLog.java | 43 + .../com/ims/service/entity/AiFeedback.java | 39 + .../com/ims/service/entity/Attachment.java | 45 + .../com/ims/service/entity/Department.java | 44 + .../com/ims/service/entity/ImportRecord.java | 48 + .../java/com/ims/service/entity/Issue.java | 133 + .../java/com/ims/service/entity/IssueLog.java | 45 + .../ims/service/entity/KnowledgeChunk.java | 41 + .../ims/service/entity/KnowledgeDocument.java | 61 + .../service/entity/KnowledgeSearchLog.java | 49 + .../com/ims/service/entity/Notification.java | 49 + .../com/ims/service/entity/Permission.java | 28 + .../com/ims/service/entity/PhaseRule.java | 55 + .../ims/service/entity/PromptRenderLog.java | 59 + .../ims/service/entity/PromptTemplate.java | 73 + .../service/entity/PromptTemplateVersion.java | 41 + .../java/com/ims/service/entity/Role.java | 35 + .../ims/service/entity/RolePermission.java | 30 + .../com/ims/service/entity/TaskExecution.java | 55 + .../com/ims/service/entity/ToolExecution.java | 48 + .../java/com/ims/service/entity/User.java | 61 + .../java/com/ims/service/entity/UserRole.java | 30 + .../ims/service/issue/AttachmentService.java | 116 + .../com/ims/service/issue/IssueService.java | 468 ++ .../service/knowledge/AiConfigService.java | 253 + .../knowledge/DeepSeekEmbeddingService.java | 63 + .../knowledge/DocumentParserService.java | 123 + .../service/knowledge/EmbeddingService.java | 7 + .../service/knowledge/KnowledgeService.java | 217 + .../knowledge/OllamaEmbeddingService.java | 70 + .../knowledge/RoutingEmbeddingService.java | 34 + .../service/knowledge/SearchLogService.java | 39 + .../ims/service/knowledge/SearchService.java | 84 + .../service/notification/EmailService.java | 19 + .../notification/NotificationScheduler.java | 75 + .../notification/NotificationService.java | 119 + .../com/ims/service/prompt/PromptService.java | 220 + .../ims/service/prompt/PromptServiceImpl.java | 294 ++ .../repository/AgentMemoryRepository.java | 16 + .../repository/AgentPlanRepository.java | 21 + .../repository/AiAnalysisRepository.java | 69 + .../repository/AiCallLogRepository.java | 10 + .../repository/AiFeedbackRepository.java | 9 + .../repository/AttachmentRepository.java | 11 + .../repository/DepartmentRepository.java | 11 + .../repository/ImportRecordRepository.java | 9 + .../repository/IssueLogRepository.java | 11 + .../service/repository/IssueRepository.java | 56 + .../repository/KnowledgeChunkRepository.java | 12 + .../KnowledgeDocumentRepository.java | 9 + .../KnowledgeSearchLogRepository.java | 9 + .../repository/NotificationRepository.java | 22 + .../repository/PermissionRepository.java | 9 + .../repository/PhaseRuleRepository.java | 11 + .../repository/PromptRenderLogRepository.java | 20 + .../repository/PromptTemplateRepository.java | 17 + .../PromptTemplateVersionRepository.java | 11 + .../repository/RolePermissionRepository.java | 14 + .../service/repository/RoleRepository.java | 13 + .../repository/TaskExecutionRepository.java | 11 + .../repository/ToolExecutionRepository.java | 30 + .../service/repository/UserRepository.java | 16 + .../repository/UserRoleRepository.java | 14 + .../com/ims/service/security/DataScope.java | 11 + .../ims/service/security/DataScopeAspect.java | 77 + .../service/security/DataScopeContext.java | 27 + .../ims/service/security/JwtAuthFilter.java | 76 + .../ims/service/security/SecurityConfig.java | 68 + .../security/UserDetailsServiceImpl.java | 36 + .../service/system/DepartmentServiceImpl.java | 55 + .../ims/service/system/ImportServiceImpl.java | 562 ++ .../service/system/ImportSuggestService.java | 591 +++ .../ims/service/system/LogServiceImpl.java | 94 + .../ims/service/system/RoleServiceImpl.java | 138 + .../ims/service/system/UserServiceImpl.java | 171 + .../db/migration/V1.0__init_schema.sql | 56 + .../db/migration/V1.1__core_business.sql | 96 + .../db/migration/V1.2__ai_analysis.sql | 28 + .../db/migration/V1.3__agent_tables.sql | 43 + .../db/migration/V1.4__knowledge_tables.sql | 40 + .../db/migration/V1.5__prompt_tables.sql | 48 + .../db/migration/V1.6__seed_data.sql | 43 + .../db/migration/V1.7__fix_password_hash.sql | 2 + .../migration/V1.8__fix_vector_dimension.sql | 14 + .../migration/V1.9__seed_prompt_templates.sql | 44 + .../db/migration/V2.0__seed_demo_data.sql | 273 + .../migration/V2.10__add_role_data_scope.sql | 1 + .../V2.1__add_ai_analysis_error_message.sql | 2 + .../V2.2__add_ai_analysis_duration.sql | 2 + .../V2.3__ai_analysis_timestamps.sql | 4 + .../db/migration/V2.4__ai_call_logs.sql | 11 + .../V2.5__analysis_prompt_keywords.sql | 12 + .../V2.6__ai_analysis_extracted_keywords.sql | 1 + .../V2.7__agent_plan_issue_nullable.sql | 2 + .../db/migration/V2.8__agent_native_tools.sql | 39 + .../V2.9__fix_test_missing_tables.sql | 31 + backend/ims-web/pom.xml | 34 + backend/ims-web/replay_pid112402.log | 3651 +++++++++++++ .../java/com/ims/web/AgentControllerImpl.java | 284 + .../com/ims/web/AiAnalysisControllerImpl.java | 233 + .../com/ims/web/AiConfigControllerImpl.java | 39 + .../java/com/ims/web/AuthControllerImpl.java | 106 + .../com/ims/web/DashboardControllerImpl.java | 24 + .../com/ims/web/DepartmentControllerImpl.java | 41 + .../com/ims/web/GlobalExceptionHandler.java | 64 + .../main/java/com/ims/web/IMSApplication.java | 19 + .../ims/web/ImportExportControllerImpl.java | 60 + .../java/com/ims/web/IssueControllerImpl.java | 193 + .../com/ims/web/KnowledgeControllerImpl.java | 87 + .../ims/web/NotificationControllerImpl.java | 54 + .../com/ims/web/PromptControllerImpl.java | 87 + .../src/main/resources/application-dev.yml | 10 + .../src/main/resources/application-prod.yml | 3 + .../src/main/resources/application.yml | 83 + .../resources/templates/レビュー記録表.xlsx | Bin 0 -> 12613028 bytes backend/pom.xml | 88 + containerd-config.toml | 4 + daemon.json | 9 + docker-compose.yml | 78 + docs/IMS技术构成简要说明.md | 104 + docs/_MASTER_PLAN.md | 78 + docs/agent-management.html | 726 +++ docs/ai-analysis.html | 453 ++ docs/batch-input.html | 316 ++ docs/dashboard.html | 436 ++ docs/issue-detail.html | 456 ++ docs/issue-new.html | 341 ++ docs/issues.html | 411 ++ docs/knowledge-base.html | 320 ++ docs/roles.html | 317 ++ docs/users.html | 302 ++ docs/指摘管理系统_概要设计说明书_V6.0.md | 1587 ++++++ docs/概要设计说明书变更点.md | 14 + docs/知识库实施计划.md | 127 + docs/知识库模块使用说明.md | 104 + frontend/e2e/playwright.config.ts | 25 + frontend/e2e/tests/01-login.spec.ts | 31 + frontend/e2e/tests/02-issue-crud.spec.ts | 57 + frontend/e2e/tests/03-attachments.spec.ts | 35 + frontend/e2e/tests/04-agent-cockpit.spec.ts | 45 + frontend/e2e/tests/05-dashboard.spec.ts | 44 + frontend/e2e/tests/06-notifications.spec.ts | 30 + frontend/e2e/tests/07-agent-fill.spec.ts | 32 + frontend/e2e/tests/08-agent-sse.spec.ts | 41 + .../tests/09-dashboard-agent-stream.spec.ts | 22 + frontend/e2e/utils/api-helpers.ts | 69 + frontend/e2e/utils/auth.ts | 35 + frontend/index.html | 13 + frontend/package-lock.json | 4573 +++++++++++++++++ frontend/package.json | 36 + frontend/scripts/seed-7d-backdate.sql | 46 + frontend/scripts/seed-7d.mjs | 170 + frontend/scripts/seed-demo.mjs | 173 + frontend/scripts/seed-testdata.mjs | 244 + frontend/src/App.tsx | 9 + frontend/src/antdStatic.tsx | 17 + frontend/src/api/system.ts | 327 ++ frontend/src/constants/issue.ts | 59 + frontend/src/layouts/MainLayout.tsx | 188 + frontend/src/main.tsx | 25 + frontend/src/pages/ai-analysis/index.tsx | 508 ++ frontend/src/pages/ai-analysis/overview.tsx | 162 + frontend/src/pages/ai-analysis/services.ts | 166 + frontend/src/pages/ai-analysis/unanalyzed.tsx | 177 + frontend/src/pages/batch-input/index.tsx | 600 +++ frontend/src/pages/dashboard/index.tsx | 317 ++ frontend/src/pages/dashboard/services.ts | 50 + frontend/src/pages/issues/IssueForm.tsx | 285 + frontend/src/pages/issues/detail.tsx | 504 ++ frontend/src/pages/issues/edit.tsx | 196 + frontend/src/pages/issues/list.tsx | 327 ++ frontend/src/pages/issues/new.tsx | 71 + frontend/src/pages/issues/services.ts | 164 + frontend/src/pages/knowledge-base/index.tsx | 253 + frontend/src/pages/knowledge-base/services.ts | 74 + frontend/src/pages/login/index.tsx | 41 + .../src/pages/system/agent-admin-services.ts | 190 + frontend/src/pages/system/agent-admin.tsx | 1582 ++++++ frontend/src/pages/system/logs.tsx | 109 + frontend/src/pages/system/roles.tsx | 222 + frontend/src/pages/system/users.tsx | 247 + frontend/src/request.ts | 92 + frontend/src/routes.tsx | 96 + frontend/src/services/notification.ts | 23 + frontend/src/store/index.ts | 11 + frontend/src/store/slices/authSlice.ts | 75 + frontend/src/theme.ts | 11 + frontend/tsconfig.json | 24 + frontend/vite.config.ts | 15 + hosts.toml | 5 + init-pgvector.sql | 1 + pull-images.sh | 17 + pull-model.json | 1 + start-backend.sh | 3 + 311 files changed, 37037 insertions(+) create mode 100644 .gitignore create mode 100644 META-INF/MANIFEST.MF create mode 100644 README.md create mode 100644 _AI_USAGE_LOG.md create mode 100644 _DEVELOPMENT_GUIDE.md create mode 100644 agents.md create mode 100644 backend/ims-api/pom.xml create mode 100644 backend/ims-api/src/main/java/com/ims/api/controller/LogController.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/controller/RoleController.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/controller/UserController.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentApprovalRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentPlanResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestFieldsRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/ai/AiFeedbackRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/dashboard/DashboardStatsResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/AgentValidateResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportConfirmRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportPreviewResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordQueryRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRow.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportSuggestion.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/AttachmentResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAgentRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAssignRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchNotifyRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueCreateRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueListRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueStatusRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueUpdateRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeDocResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeLogQueryRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/notification/NotificationResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptLogResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptRenderLogResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptStatsResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptVersionResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/DepartmentResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/LogQueryRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/LogResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/PermissionResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/RoleRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/RoleResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/UserRequest.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/dto/system/UserResponse.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/agent/AgentConfigService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/ai/ChatService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/prompt/PromptService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/system/DepartmentService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/system/ImportService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/system/LogService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/system/RoleService.java create mode 100644 backend/ims-api/src/main/java/com/ims/api/service/system/UserService.java create mode 100644 backend/ims-common/pom.xml create mode 100644 backend/ims-common/src/main/java/com/ims/common/constant/ResultCode.java create mode 100644 backend/ims-common/src/main/java/com/ims/common/dto/ApiResponse.java create mode 100644 backend/ims-common/src/main/java/com/ims/common/dto/PageResult.java create mode 100644 backend/ims-common/src/main/java/com/ims/common/exception/BusinessException.java create mode 100644 backend/ims-common/src/main/java/com/ims/common/util/JwtUtil.java create mode 100644 backend/ims-service/pom.xml create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/AgentOrchestratorService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/AgentService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/AgentToolPermissionService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/MemoryService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/OllamaChatService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/AgentFunctionCallbackAdapter.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/AiAnalysisTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/AssignPendingTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueCreateTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueQueryTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueUpdateTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/KnowledgeSearchTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/NotifyOverdueTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/Tool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/ToolRegistry.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/agent/tool/WeeklyReportTool.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/AiAnalysisService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/AiProviderConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/DeepSeekChatService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/KeywordExtractor.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/ModelRoutingService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/OllamaChatService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/PromptFormatter.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/PromptTemplateEngine.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/RoutingChatService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/ai/SystemContextBuilder.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/config/JacksonConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/config/JwtConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/config/MinioConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/config/RedisConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/config/WebConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/dashboard/DashboardService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/AgentMemory.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/AgentPlan.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/AiAnalysis.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/AiCallLog.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/AiFeedback.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/Attachment.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/Department.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/ImportRecord.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/Issue.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/IssueLog.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeChunk.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeDocument.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeSearchLog.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/Notification.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/Permission.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/PhaseRule.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/PromptRenderLog.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplate.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplateVersion.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/Role.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/RolePermission.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/TaskExecution.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/ToolExecution.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/User.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/entity/UserRole.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/issue/AttachmentService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/issue/IssueService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/AiConfigService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/DeepSeekEmbeddingService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/DocumentParserService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/EmbeddingService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/KnowledgeService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/OllamaEmbeddingService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/RoutingEmbeddingService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/SearchLogService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/knowledge/SearchService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/notification/EmailService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/notification/NotificationScheduler.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/notification/NotificationService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/prompt/PromptService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/prompt/PromptServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/AgentMemoryRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/AgentPlanRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/AiAnalysisRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/AiCallLogRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/AiFeedbackRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/AttachmentRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/DepartmentRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/ImportRecordRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/IssueLogRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/IssueRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeChunkRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeDocumentRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeSearchLogRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/NotificationRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/PermissionRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/PhaseRuleRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/PromptRenderLogRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateVersionRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/RolePermissionRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/RoleRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/TaskExecutionRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/ToolExecutionRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/UserRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/repository/UserRoleRepository.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/security/DataScope.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/security/DataScopeAspect.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/security/DataScopeContext.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/security/JwtAuthFilter.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/security/SecurityConfig.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/security/UserDetailsServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/system/DepartmentServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/system/ImportServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/system/ImportSuggestService.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/system/LogServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/system/RoleServiceImpl.java create mode 100644 backend/ims-service/src/main/java/com/ims/service/system/UserServiceImpl.java create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.0__init_schema.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.1__core_business.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.2__ai_analysis.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.3__agent_tables.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.4__knowledge_tables.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.5__prompt_tables.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.6__seed_data.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.7__fix_password_hash.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.8__fix_vector_dimension.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V1.9__seed_prompt_templates.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.0__seed_demo_data.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.10__add_role_data_scope.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.1__add_ai_analysis_error_message.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.2__add_ai_analysis_duration.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.3__ai_analysis_timestamps.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.4__ai_call_logs.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.5__analysis_prompt_keywords.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.6__ai_analysis_extracted_keywords.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.7__agent_plan_issue_nullable.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.8__agent_native_tools.sql create mode 100644 backend/ims-service/src/main/resources/db/migration/V2.9__fix_test_missing_tables.sql create mode 100644 backend/ims-web/pom.xml create mode 100644 backend/ims-web/replay_pid112402.log create mode 100644 backend/ims-web/src/main/java/com/ims/web/AgentControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/AiAnalysisControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/AiConfigControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/AuthControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/DashboardControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/DepartmentControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/GlobalExceptionHandler.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/IMSApplication.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/ImportExportControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/IssueControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/KnowledgeControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/NotificationControllerImpl.java create mode 100644 backend/ims-web/src/main/java/com/ims/web/PromptControllerImpl.java create mode 100644 backend/ims-web/src/main/resources/application-dev.yml create mode 100644 backend/ims-web/src/main/resources/application-prod.yml create mode 100644 backend/ims-web/src/main/resources/application.yml create mode 100644 backend/ims-web/src/main/resources/templates/レビュー記録表.xlsx create mode 100644 backend/pom.xml create mode 100644 containerd-config.toml create mode 100644 daemon.json create mode 100644 docker-compose.yml create mode 100644 docs/IMS技术构成简要说明.md create mode 100644 docs/_MASTER_PLAN.md create mode 100644 docs/agent-management.html create mode 100644 docs/ai-analysis.html create mode 100644 docs/batch-input.html create mode 100644 docs/dashboard.html create mode 100644 docs/issue-detail.html create mode 100644 docs/issue-new.html create mode 100644 docs/issues.html create mode 100644 docs/knowledge-base.html create mode 100644 docs/roles.html create mode 100644 docs/users.html create mode 100644 docs/指摘管理系统_概要设计说明书_V6.0.md create mode 100644 docs/概要设计说明书变更点.md create mode 100644 docs/知识库实施计划.md create mode 100644 docs/知识库模块使用说明.md create mode 100644 frontend/e2e/playwright.config.ts create mode 100644 frontend/e2e/tests/01-login.spec.ts create mode 100644 frontend/e2e/tests/02-issue-crud.spec.ts create mode 100644 frontend/e2e/tests/03-attachments.spec.ts create mode 100644 frontend/e2e/tests/04-agent-cockpit.spec.ts create mode 100644 frontend/e2e/tests/05-dashboard.spec.ts create mode 100644 frontend/e2e/tests/06-notifications.spec.ts create mode 100644 frontend/e2e/tests/07-agent-fill.spec.ts create mode 100644 frontend/e2e/tests/08-agent-sse.spec.ts create mode 100644 frontend/e2e/tests/09-dashboard-agent-stream.spec.ts create mode 100644 frontend/e2e/utils/api-helpers.ts create mode 100644 frontend/e2e/utils/auth.ts create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/scripts/seed-7d-backdate.sql create mode 100644 frontend/scripts/seed-7d.mjs create mode 100644 frontend/scripts/seed-demo.mjs create mode 100644 frontend/scripts/seed-testdata.mjs create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/antdStatic.tsx create mode 100644 frontend/src/api/system.ts create mode 100644 frontend/src/constants/issue.ts create mode 100644 frontend/src/layouts/MainLayout.tsx create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/ai-analysis/index.tsx create mode 100644 frontend/src/pages/ai-analysis/overview.tsx create mode 100644 frontend/src/pages/ai-analysis/services.ts create mode 100644 frontend/src/pages/ai-analysis/unanalyzed.tsx create mode 100644 frontend/src/pages/batch-input/index.tsx create mode 100644 frontend/src/pages/dashboard/index.tsx create mode 100644 frontend/src/pages/dashboard/services.ts create mode 100644 frontend/src/pages/issues/IssueForm.tsx create mode 100644 frontend/src/pages/issues/detail.tsx create mode 100644 frontend/src/pages/issues/edit.tsx create mode 100644 frontend/src/pages/issues/list.tsx create mode 100644 frontend/src/pages/issues/new.tsx create mode 100644 frontend/src/pages/issues/services.ts create mode 100644 frontend/src/pages/knowledge-base/index.tsx create mode 100644 frontend/src/pages/knowledge-base/services.ts create mode 100644 frontend/src/pages/login/index.tsx create mode 100644 frontend/src/pages/system/agent-admin-services.ts create mode 100644 frontend/src/pages/system/agent-admin.tsx create mode 100644 frontend/src/pages/system/logs.tsx create mode 100644 frontend/src/pages/system/roles.tsx create mode 100644 frontend/src/pages/system/users.tsx create mode 100644 frontend/src/request.ts create mode 100644 frontend/src/routes.tsx create mode 100644 frontend/src/services/notification.ts create mode 100644 frontend/src/store/index.ts create mode 100644 frontend/src/store/slices/authSlice.ts create mode 100644 frontend/src/theme.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vite.config.ts create mode 100644 hosts.toml create mode 100644 init-pgvector.sql create mode 100644 pull-images.sh create mode 100644 pull-model.json create mode 100644 start-backend.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89ae8af --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# Java +backend/**/target/ +backend/**/*.class +*.jar +*.war + +# Node +frontend/node_modules/ +frontend/dist/ + +# IDE +.idea/ +*.iml +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Env +.env.local +.env.production.local + +# Logs & build artifacts +backend/*.log* +frontend/*.log* +backend-run.log +frontend/e2e/*.log* +frontend/tsconfig.tsbuildinfo +frontend/test-results/ +frontend/e2e/playwright-report/ diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000..f3231f1 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Created-By: Maven JAR Plugin 3.4.2 +Build-Jdk-Spec: 17 +Implementation-Title: ims-web +Implementation-Version: 1.0.0-SNAPSHOT + diff --git a/README.md b/README.md new file mode 100644 index 0000000..964359a --- /dev/null +++ b/README.md @@ -0,0 +1,169 @@ +# 指摘管理系统(IMS) + +基于 AI Agent 驱动的质量问题全生命周期管理系统。 + +## 技术栈 + +| 层级 | 技术选型 | +|------|---------| +| 前端 | React 19 + TypeScript + Vite + Ant Design 6 | +| 后端 | Java 17 + Spring Boot 3.5 + Spring Security | +| 数据库 | PostgreSQL 16 + pgvector | +| 缓存 | Redis 7 | +| 对象存储 | MinIO | +| AI 引擎 | Ollama(本地,默认)/ DeepSeek API(备选) | + +## 目录结构 + +``` +├── backend/ 后端(Maven 多模块) +│ ├── ims-common/ 公共模块(工具类、统一返回结构) +│ ├── ims-api/ API 模块(Controller 定义、DTO) +│ ├── ims-service/ 业务模块(Entity、Repository、Security) +│ └── ims-web/ Web 启动模块 +├── frontend/ 前端(Vite + React) +├── docs/ 设计文档 +└── docker-compose.yml 数据库层(PostgreSQL + Redis + MinIO) +``` + +## 快速启动 + +**说明**:数据库(PostgreSQL/Redis/MinIO)运行在 Docker 中,Docker 在 WSL2 (Ubuntu) 里。后端必须在 WSL2 里运行,前端可在 Windows 运行。 + +``` +┌─────────────────────────────────────────────┐ +│ Windows │ +│ ├─ WSL2 (Ubuntu) — Docker 数据库 │ +│ ├─ WSL2 (Ubuntu) — 后端 (Spring Boot 8080) │ +│ └─ Windows — 前端 (Vite 5173) │ +└─────────────────────────────────────────────┘ +``` + +### 环境要求 + +| 组件 | 版本要求 | 安装确认 | +|------|---------|---------| +| Java | 17+ | `java -version` | +| Maven | 3.8+ | `mvn -version` | +| Node.js | 18+ | `node -v` | +| npm | 9+ | `npm -v` | +| Docker | 24+ | `docker --version` | +| Docker Compose | V2 | `docker compose version` | +| WSL2 (Ubuntu) | 22.04+ | `wsl -l -v` | + +### 准备工作(只需做一次) + +#### 1. 启动基础设施(PostgreSQL + Redis + MinIO + Ollama) + +Ollama 作为 Docker 容器运行,无需单独安装。首次执行以下命令时,Docker 会自动从镜像仓库拉取所有服务。 + +在 WSL2 (Ubuntu) 终端执行: + +```bash +# 停掉 WSL2 自带的 Redis(避免端口冲突) +sudo systemctl stop redis-server 2>/dev/null + +# 进入项目目录(注意:你的项目路径可能不同,按实际修改) +cd /path/to/ims-master-test + +# 启动所有基础设施(含 Ollama) +docker compose up -d + +# 确认所有容器正常运行 +docker compose ps +``` + +#### 2. 初始化 MinIO Bucket(知识库上传需要) + +1. 浏览器打开 [http://localhost:9001](http://localhost:9001) +2. 账号:`minioadmin` / 密码:`minioadmin` +3. 左侧 Buckets → Create Bucket → 输入 `ims-attachments` → 确认 + +#### 3. 拉取 AI 模型(仅第一次需要) + +Ollama 容器启动时**不包含任何模型**,需要手动拉取。拉取的模型保存在 Docker 数据卷 `ollama_data` 中,后续重启容器无需重新拉取。 + +**第一次启动顺序:** +```bash +# 1. 启动所有服务(含 Ollama 容器) +docker compose up -d + +# 2. 拉取向量化模型(知识库检索需要) +docker exec ims-ollama ollama pull nomic-embed-text + +# 3. 拉取对话模型(AI Agent 分析需要) +docker exec ims-ollama ollama pull llama3.1:8b + +# 4. 确认模型已拉取 +docker exec ims-ollama ollama list +``` + +**后续启动:** 只需执行 `docker compose up -d`,之前拉取的模型自动可用,无需再执行 `docker exec ollama pull`。 + +> 模型文件较大(`llama3.1:8b` 约 4.9GB),拉取时间取决于网络,看到 `success` 即完成。 + +### 启动项目 + +需要同时开两个终端: + +**终端 1 — WSL2 (Ubuntu)**:启动后端 + +```bash +# 进入后端目录(路径按实际修改) +cd /path/to/ims-master-test/backend + +# 首次或改过代码后执行(编译打包) +mvn install -DskipTests -U + +# 启动后端 +cd ims-web && mvn spring-boot:run -Dspring-boot.run.profiles=dev +``` + +> 首次启动会下载大量依赖,可能需要几分钟。看到 `Started IMSApplication` 即启动成功。 + +**终端 2 — Windows PowerShell(或 WSL)**:启动前端 + +```powershell +cd /path/to/ims-master-test/frontend + +# 首次或改过 package.json 后执行 +npm install + +# 启动前端 +npm run dev +``` + +> 看到 `VITE v6.x.x ready in xxx ms` 即启动成功。 + +### 登录系统 + +浏览器访问 **http://localhost:5173**,使用以下账号登录: + +| 账号 | 密码 | 角色 | +|------|------|------| +| admin | Admin@2026 | 超级管理员 | + +### 验证启动是否正常 + +登录后: +1. 左侧菜单→**工作台**,页面正常显示即前后端通 +2. 左侧菜单→**知识库管理**,页面能正常打开 +3. 尝试上传一个 `.txt` 文件,状态变为 `completed` 即全链路正常 + +### 常见问题 + +| 问题 | 原因 | 解决 | +|------|------|------| +| 端口 6379 被占用 | WSL2 自带的 Redis 在运行 | `sudo systemctl stop redis-server` | +| 数据库连接失败 | 容器未就绪 | `docker compose ps` 检查,等几秒后再试 | +| MinIO bucket 不存在 | 未创建 | 打开 `http://localhost:9001` 创建 `ims-attachments` | +| Ollama 连不上 | Ollama 容器未运行或未就绪 | `docker compose ps` 检查 ollama 状态,`docker logs ims-ollama` 查看日志 | +| mvn: command not found | Java/Maven 未安装 | `sudo apt install openjdk-17-jdk maven -y` | +| npm: command not found | Node.js 未安装 | 从 [nodejs.org](https://nodejs.org) 下载安装 | +| Token 过期 403/跳登录 | 超过 30 分钟未操作 | 自动刷新 token,重新登录即可 | +| 上传文件报 500 | 依赖版本冲突 | 执行 `mvn install -DskipTests -U` 后重启 | + +## 分支说明 + +- `master` — 项目骨架,各组基于此分支创建功能分支 +- 各功能模块在独立分支上开发,完成后合并回 master diff --git a/_AI_USAGE_LOG.md b/_AI_USAGE_LOG.md new file mode 100644 index 0000000..e911f5e --- /dev/null +++ b/_AI_USAGE_LOG.md @@ -0,0 +1,7 @@ +# AI 使用日志 + +| 日期时间 | 范式步骤 | 修改摘要 | 涉及文件 | 使用模型 | +| --- | --- | --- | --- | --- | +| 2026-08-20 18:40 | Bug修复 | 修复 Spring Boot 循环依赖:ToolRegistry → AiAnalysisTool → ModelRoutingService → ToolRegistry,在 ModelRoutingService 构造器的 ToolRegistry 参数上添加 @Lazy 注解打破循环 | ModelRoutingService.java | mimo-v2.5-free | +| 2026-08-21 | Bug修复 | 从git历史恢复损坏的IssueRepository.java文件,解决100+个"IssueRepository cannot be resolved"编译错误;补充AiAnalysisControllerImpl.java缺失的LocalDateTime导入 | IssueRepository.java, AiAnalysisControllerImpl.java | mimo-v2.5-free | +| 2026-08-21 | 代码清理 | 清理11个文件中未使用的import(共13处)、1个未使用方法(vectorToString)、1个未使用字段(log)、1处不必要的@SuppressWarnings | AgentApprovalRequest.java, JwtUtil.java, ModelRoutingService.java, DocumentParserService.java, KnowledgeService.java, SearchLogService.java, SearchService.java, AgentControllerImpl.java, AuthControllerImpl.java, PromptService.java, RoutingEmbeddingService.java, DashboardService.java | mimo-v2.5-free | diff --git a/_DEVELOPMENT_GUIDE.md b/_DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000..7560e52 --- /dev/null +++ b/_DEVELOPMENT_GUIDE.md @@ -0,0 +1,286 @@ +# 指摘管理系统 · 开发指南 + +## 1. 当前已完成(master 骨架) + +### 后端 +| 组件 | 状态 | 说明 | +|------|------|------| +| Maven 多模块结构 | ✅ | ims-common / ims-api / ims-service / ims-web | +| 数据库表 & Flyway 迁移 | ✅ | 22 张表,7 个迁移脚本 | +| JPA Entity + Repository | ✅ | 22 Entity + 22 Repository | +| Spring Security + JWT | ✅ | 登录接口真实实现 | +| 所有 Controller 定义 | ✅ | 11 个 Controller,接口签名已定义 | +| 统一返回结构 | ✅ | ApiResponse / PageResult / 全局异常处理 | +| CRUD DTO 类 | ✅ | 26 个请求/响应类 | +| docker-compose | ✅ | PostgreSQL+pgvector / Redis / MinIO | +| 配置文件 | ✅ | application.yml / dev / prod | + +### 前端 +| 组件 | 状态 | 说明 | +|------|------|------| +| Vite + React + TypeScript | ✅ | 项目初始化 | +| Ant Design 主题 | ✅ | 品牌色、圆角已配置 | +| 路由表 | ✅ | 全部 13 个页面路由 + 懒加载 + 路由守卫 | +| 登录页 | ✅ | 表单 + API 调用 + token 存储 + 跳转 | +| 全局 Layout | ✅ | 侧边栏菜单树 + 顶栏(用户/通知) | +| axios 封装 | ✅ | 请求拦截器(自动带 token)+ 响应拦截器(401 跳登录) | +| Redux Store | ✅ | auth slice + 各模块 slice 空壳 | + +--- + +## 2. 开发流程 + +### 两阶段 + +``` +Phase 1(你 ─ 当前阶段) + master + └── 实现知识库模块(后端 Service + 前端页面) + 完成后合并到 master,通知其他组 + +Phase 2(各组 ─ 知识库完成后) + master(含知识库模块) + ├── feature/group1 指摘 CRUD + 工作台 + 驾驶舱 + ├── feature/group2 批量录入 + 系统管理 + └── feature/group3 AI 分析 + Prompt + Agent + 各组从 master 拉分支 → 独立开发 → PR → 合入 master +``` + +### 分支策略 +``` +master ── 骨架 + 知识库模块,各组以此为基线 + ├── feature/group1 + ├── feature/group2 + └── feature/group3 +``` + +### 合并规则 +| 阶段 | 操作 | +|------|------| +| 日常开发 | 各组在自己分支上提交,不往 master 推 | +| 功能完成 | 发起 Pull Request,指定 reviewer 审核 | +| 审核通过 | 通过 PR 合入 master,禁止直接 push | + +### 不冲突保障 +各组修改范围完全不重叠: + +``` +backend/ims-api/src/main/java/com/ims/api/controller/ + ├── IssueController.java ← 一组 + ├── UserController.java ← 二组 + ├── KnowledgeController.java ← 你 + ├── AiAnalysisController.java ← 三组 + └── ...其余 Controller 同理 ← 各组对应 + +frontend/src/pages/ + ├── issues/ ← 一组 + ├── dashboard/ ← 一组 + ├── batch-input/ ← 二组 + ├── ai-analysis/ ← 三组 + ├── knowledge-base/ ← 你 + └── system/ ← 二组 + +backend/ims-service/src/main/java/com/ims/service/ + ├── entity/ ← 仅 master 改,各组不能动 + ├── repository/ ← 仅 master 改,各组不能动 + └── security/ ← 仅 master 改,各组不能动 +``` + +**核心原则**:Entity 和 Repository 是共享契约,任何人不得修改 master 上的 Entity 字段和 Repository 方法签名。 + +--- + +## 3. 各组分工 + +### 高优先级功能定义 + +| 优先级 | 功能 | 说明 | +|--------|------|------| +| **P0** | 批量上传 | 历史评审数据与新增数据的快速录入 | +| **P0** | AI 自动分析 | 针对上传数据实时提取风险点、改进项 | +| **P1** | 问题一览管理 | 对 AI 分析结果统一管理,支持进度追踪 | +| **P1** | 基础仪表盘 | 图表展示质量趋势与风险分布 | +| **P1** | 对策状况登记 | 针对问题登记解决方案,含负责人与期限 | + +### 优先级 vs 现有模块映射 + +| 优先级 | 对应模块 | 归属 | +|--------|---------|------| +| P0 批量上传 | 批次录入 + 导入导出 | 二组 | +| P0 AI 自动分析 | AI 智能分析 | 三组 | +| P1 问题一览管理 | 指摘列表 + 详情 | 一组 | +| P1 基础仪表盘 | 工作台 | 一组 | +| P1 对策状况登记 | 指摘状态流转 + 编辑 | 一组 | + +### 你 — 知识库模块(Phase 1 实施人) + +**前置依赖**:无 + +| # | 任务 | 涉及文件 | 说明 | +|---|------|---------|------| +| 1 | 文档上传 API | KnowledgeController + KnowledgeService | 接收文件,存入 MinIO,记录到 knowledge_documents | +| 2 | 文档解析 + 切片 | DocumentParserService | 使用 Apache Tika 解析 PDF/Word/TXT,按 500 Token 切片 | +| 3 | 向量化 + 写入 pgvector | VectorizationService | 调用 Ollama nomic-embed-text 向量化,写入 knowledge_chunks | +| 4 | 语义检索 | SearchService | 向量化 → pgvector 余弦相似度检索 → 重排序 | +| 5 | 检索审计 | SearchLogService | 记录每次检索的 query、耗时、命中数 | +| 6 | 知识库管理页面 | frontend/pages/knowledge-base/ | 文档列表、上传、删除、重新向量化 | +| 7 | EmbeddingService 接口 | ims-service 新增 | **供三组调用** | + +**EmbeddingService 接口契约(供三组调用):** +```java +public interface EmbeddingService { + List embed(String text); + List search(String query, int topK); +} +``` + +### 一组 — 指摘 CRUD + 工作台 + 驾驶舱 + +**前置依赖**:等 master 含知识库后拉分支 + +| # | 任务 | 前端页面 | 后端接口 | +|---|------|---------|---------| +| 1 | 指摘列表查询 | issues/list.tsx | GET /api/v1/issues | +| 2 | 创建指摘 | issues/new.tsx | POST /api/v1/issues | +| 3 | 指摘详情 | issues/detail.tsx | GET /api/v1/issues/{id} | +| 4 | 编辑指摘 | issues/edit.tsx | PUT /api/v1/issues/{id} | +| 5 | 状态流转 | 详情页内 | PATCH /api/v1/issues/{id}/status | +| 6 | 附件管理 | 详情页内 | POST /issues/{id}/attachments | +| 7 | 工作台仪表盘 | dashboard/index.tsx | GET /api/v1/dashboard/stats | +| 8 | 通知 | 顶栏铃铛 | GET /api/v1/notifications | +| 9 | Agent 指令 | 工作台 + 详情页 | POST /api/v1/agent/execute | +| 10 | Agent 审批 | 详情页 | POST /api/v1/agent/approval/* | + +### 二组 — 批量录入 + 系统管理 + +**前置依赖**:等 master 含知识库后拉分支 + +| # | 任务 | 前端页面 | 后端接口 | +|---|------|---------|---------| +| 1 | 批量导入 Excel | batch-input/index.tsx | POST /api/v1/import/excel | +| 2 | 模板下载 | 批量录入页 | GET /api/v1/import/template | +| 3 | 用户管理 | system/users.tsx | GET/POST /api/v1/users | +| 4 | 部门树 | 用户管理页 | GET /api/v1/departments | +| 5 | 角色权限 | system/roles.tsx | GET/POST /api/v1/roles | +| 6 | 系统日志 | system/logs.tsx | GET /api/v1/logs | +| 7 | Agent 管理 | system/agent-admin.tsx | GET/PUT /api/v1/agent/config | +| 8 | Prompt 模板管理 | Agent 管理页内 | GET/POST /api/v1/prompts | +| 9 | AI 配置管理 | Agent 管理页内 | GET/PUT /api/v1/ai/config | + +### 三组 — AI 分析 + Prompt 引擎 + Agent 核心 + +**前置依赖**: +- 等知识库模块的 EmbeddingService 接口就绪后对接 +- 可以先写 Mock 实现,不阻塞开发 + +| # | 任务 | 前端页面 | 后端实现 | +|---|------|---------|---------| +| 1 | AI 分析列表 | ai-analysis/index.tsx | GET /api/v1/ai/records | +| 2 | 批量生成分析 | AI 分析页 | POST /api/v1/ai/batch-generate | +| 3 | 分析反馈 | 分析详情 | POST /api/v1/ai/records/{id}/feedback | +| 4 | Prompt 模板引擎 | — | PromptTemplateEngine | +| 5 | Prompt 格式适配 | — | PromptFormatter | +| 6 | Spring AI 集成 | — | AiProviderConfig | +| 7 | 模型切换 + 容错 | — | ModelRoutingService | +| 8 | Agent ReAct 循环 | — | AgentOrchestrator | +| 9 | Agent 长期记忆 | — | MemoryService | +| 10 | 工具注册中心 | — | ToolRegistry | + +--- + +## 4. 开发约定 + +### 后端 +- Service 类放在 `com.ims.service.{模块名}`,接口在 `ims-api`,实现在 `ims-service` +- 类名格式:`{模块名}Service` +- API 路径(已定义,不要修改): + ``` + /api/v1/issues ← 一组 + /api/v1/users ← 二组 + /api/v1/knowledge ← 你 + /api/v1/ai ← 三组 + /api/v1/agent ← 一组 + /api/v1/prompts ← 三组 + ``` + +### 前端 +- 统一使用 `src/request.ts` 的 axios 实例 +- 组件 PascalCase 命名 + +### 数据库 +- Entity 字段任何人不得修改 +- 如需新增字段,加 Flyway 迁移脚本(版本号格式 `V{版本}__{说明}.sql`),通知其他组 + +### 代码风格 +- Java:Lombok `@Data` / `@Builder`,不写注释 +- TypeScript:使用类型定义,避免 `any` + +--- + +## 5. 启动指南 + +```bash +# 1. 启动数据库 +docker compose up -d + +# 2. 编译后端 +cd backend +mvn install -DskipTests + +# 3. 启动后端(端口 8080) +mvn spring-boot:run -pl ims-web -am + +# 4. 启动前端(新开终端) +cd frontend +npm install && npm run dev + +# 5. 浏览器打开 http://localhost:5173,用 admin / Admin@2026 登录 +``` + +--- + +## 6. 知识库模块详细设计 + +### 6.1 数据流 +``` +用户上传文档 (PDF/Word/TXT/MD) + ↓ +KnowledgeController.upload() + ↓ +MinIO 存储源文件 → knowledge_documents 记录 + ↓ +DocumentParserService 解析文本 (Tika) + ↓ +TextSplitter 切片 (500 Token, 10% 重叠) + ↓ +VectorizationService + ├── Ollama nomic-embed-text 向量化 + └→ 每个切片写入 knowledge_chunks (content + embedding) + ↓ +knowledge_documents.status = 'completed' +``` + +### 6.2 检索流程 +``` +用户输入 query + ↓ +SearchService.search(query, topK) + ├── EmbeddingModel.embed() 将 query 转为向量 + ├── pgvector 余弦相似度检索 (IVFFlat) + └→ 返回 Top K 结果 + ↓ +SearchLogService 记录审计日志 +``` + +--- + +## 7. 常见问题 + +**Q: 我改了 Entity 字段,别人不知道怎么办?** +A: 不要改。如需加字段,在群里通知所有人后各自 rebase。 + +**Q: 前端页面路由冲突怎么办?** +A: 路由表已按路径隔离,各组只关心自己的页面路径。 + +**Q: 后端编译报错怎么办?** +A: 先 `mvn clean compile` 检查。确认是 master 问题则在群里反馈。 diff --git a/agents.md b/agents.md new file mode 100644 index 0000000..128635a --- /dev/null +++ b/agents.md @@ -0,0 +1,70 @@ +使用中文回答问题 + +## 日志规则(自动执行) +每次创建或修改代码文件后,在项目根目录的 `_AI_USAGE_LOG.md` 中追加一条记录,必须包含以下字段:日期时间、范式步骤、修改摘要、涉及文件、使用模型 + +**说明**: + +- AI自动填充"日期时间""修改摘要""涉及文件"和"使用模型",若AI无法获取当前使用模型,可以手动加上。 +- "范式步骤"列根据实际情况写,比如需求分析、设计方案、实施计划等开发范式。 + + + +## 1. 在编码前三思 + +**别妄下定论。不要掩饰困惑。表面权衡。** + +在实施之前: + +- 明确表达你的假设。如果不确定,可以问。 +- 如果存在多种解读,就提出来——不要默默选择。 +- 如果有更简单的方法,请说明。必要时反驳。 +- 如果有什么不清楚的地方,就停止。说出什么让人困惑。问吧。 + +## 2. 简洁优先 + +**只需解决问题的最低限度代码。不要做任何推测性的。** + +- 除了被要求的部分,没有其他特征。 +- 一次性代码不做抽象。 +- 没有没有“灵活性”或“可配置性”,这是他们主动要求的。 +- 不可能的情景没有错误处理。 +- 如果你写了200行,可能只有50行,那就重写。 + +问问自己:“高级工程师会说这太复杂了吗?”如果是,那就简化。 + +## 3. 手术变更 + +**只触碰你必须触碰的部分。只收拾你自己的烂摊子。** + +编辑现有代码时: + +- 不要“改进”相邻的代码、注释或格式。 +- 不要重构那些没有坏掉的东西。 +- 即使你会用不同的方式,也要匹配现有的风格。 +- 如果你发现了无关的死代码,要提一提——不要删除。 + +当你的更改产生孤儿时: + +- 移除那些是你自己改动导致没用到的导入/变量/函数。 +- 除非被要求,不要删除已有的死代码。 + +测试:每一行更改的线条都应直接追踪到用户的请求。 + +## 4. 目标驱动执行 + +**定义成功标准。循环直到确认。** + +将任务转化为可验证的目标: + +- “添加验证”→“为无效输入写测试,然后让它们通过” +- “修复bug”→“写一个复现它的测试,然后让它通过”。 +- “重构X”→“确保测试在前后通过” + +对于多步骤任务,请提出简要计划: + +``` +1. [Step] → verify: [check] +2. [Step] → verify: [check] +3. [Step] → verify: [check] +``` \ No newline at end of file diff --git a/backend/ims-api/pom.xml b/backend/ims-api/pom.xml new file mode 100644 index 0000000..68e9cdd --- /dev/null +++ b/backend/ims-api/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + com.ims + ims-backend + 1.0.0-SNAPSHOT + + ims-api + + + com.ims + ims-common + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.projectlombok + lombok + true + + + diff --git a/backend/ims-api/src/main/java/com/ims/api/controller/LogController.java b/backend/ims-api/src/main/java/com/ims/api/controller/LogController.java new file mode 100644 index 0000000..f5fbf78 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/controller/LogController.java @@ -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> list(@ModelAttribute LogQueryRequest request) { + return ApiResponse.success(logService.list(request)); + } +} diff --git a/backend/ims-api/src/main/java/com/ims/api/controller/RoleController.java b/backend/ims-api/src/main/java/com/ims/api/controller/RoleController.java new file mode 100644 index 0000000..a2590d2 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/controller/RoleController.java @@ -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() { + return ApiResponse.success(roleService.list()); + } + + @GetMapping("/permissions") + public ApiResponse> permissions() { + return ApiResponse.success(roleService.permissions()); + } + + @PostMapping + public ApiResponse create(@RequestBody @Valid RoleRequest request) { + return ApiResponse.success(roleService.create(request)); + } + + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody @Valid RoleRequest request) { + return ApiResponse.success(roleService.update(id, request)); + } +} diff --git a/backend/ims-api/src/main/java/com/ims/api/controller/UserController.java b/backend/ims-api/src/main/java/com/ims/api/controller/UserController.java new file mode 100644 index 0000000..f03a820 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/controller/UserController.java @@ -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> 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 create(@RequestBody @Valid UserRequest request) { + return ApiResponse.success(userService.create(request)); + } + + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody @Valid UserRequest request) { + return ApiResponse.success(userService.update(id, request)); + } + + @PutMapping("/{id}/status") + public ApiResponse 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 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; + } +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentApprovalRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentApprovalRequest.java new file mode 100644 index 0000000..37d12f2 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentApprovalRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigRequest.java new file mode 100644 index 0000000..32cf1e8 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigResponse.java new file mode 100644 index 0000000..d6f643b --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentConfigResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteRequest.java new file mode 100644 index 0000000..7207865 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteResponse.java new file mode 100644 index 0000000..65bea11 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentExecuteResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryRequest.java new file mode 100644 index 0000000..2e18fcd --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryResponse.java new file mode 100644 index 0000000..494388f --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentMemoryResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentPlanResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentPlanResponse.java new file mode 100644 index 0000000..dbbc333 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentPlanResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestFieldsRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestFieldsRequest.java new file mode 100644 index 0000000..2139c9b --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestFieldsRequest.java @@ -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; +} \ No newline at end of file diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestRequest.java new file mode 100644 index 0000000..373f0fe --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/agent/AgentSuggestRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisRequest.java new file mode 100644 index 0000000..a0be572 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisRequest.java @@ -0,0 +1,12 @@ +package com.ims.api.dto.ai; + +import lombok.Data; +import java.util.List; + +@Data +public class AiAnalysisRequest { + private List issueIds; + private String departmentId; + private String status; + private String phase; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisResponse.java new file mode 100644 index 0000000..06b5d73 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiAnalysisResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigRequest.java new file mode 100644 index 0000000..bb3ee8d --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigResponse.java new file mode 100644 index 0000000..71b9eb6 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiConfigResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiFeedbackRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiFeedbackRequest.java new file mode 100644 index 0000000..00527fa --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/ai/AiFeedbackRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginRequest.java new file mode 100644 index 0000000..c5caddb --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginResponse.java new file mode 100644 index 0000000..3a76658 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/auth/LoginResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/dashboard/DashboardStatsResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/dashboard/DashboardStatsResponse.java new file mode 100644 index 0000000..eb4060d --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/dashboard/DashboardStatsResponse.java @@ -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 cards; + private List trend; + private List statusDistribution; + private List recentActivities; + private List 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; + } +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/AgentValidateResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/AgentValidateResponse.java new file mode 100644 index 0000000..d31ccc5 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/AgentValidateResponse.java @@ -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 suggestions; + private String engine; + private long elapsedMs; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportConfirmRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportConfirmRequest.java new file mode 100644 index 0000000..405b078 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportConfirmRequest.java @@ -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 rows; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportPreviewResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportPreviewResponse.java new file mode 100644 index 0000000..dcab827 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportPreviewResponse.java @@ -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 rows; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordQueryRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordQueryRequest.java new file mode 100644 index 0000000..861dd11 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordQueryRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordResponse.java new file mode 100644 index 0000000..3e4833a --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRecordResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRow.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRow.java new file mode 100644 index 0000000..d2c53fb --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportRow.java @@ -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 errors; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportSuggestion.java b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportSuggestion.java new file mode 100644 index 0000000..4c38905 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/imports/ImportSuggestion.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/AttachmentResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/AttachmentResponse.java new file mode 100644 index 0000000..9af8ac1 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/AttachmentResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAgentRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAgentRequest.java new file mode 100644 index 0000000..b89a9a8 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAgentRequest.java @@ -0,0 +1,11 @@ +package com.ims.api.dto.issue; + +import lombok.Data; + +import java.util.List; + +@Data +public class BatchAgentRequest { + private List issueIds; + private String goal; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAssignRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAssignRequest.java new file mode 100644 index 0000000..6c4c352 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchAssignRequest.java @@ -0,0 +1,11 @@ +package com.ims.api.dto.issue; + +import lombok.Data; + +import java.util.List; + +@Data +public class BatchAssignRequest { + private List issueIds; + private Long assigneeId; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchNotifyRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchNotifyRequest.java new file mode 100644 index 0000000..7875a16 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/BatchNotifyRequest.java @@ -0,0 +1,11 @@ +package com.ims.api.dto.issue; + +import lombok.Data; + +import java.util.List; + +@Data +public class BatchNotifyRequest { + private List issueIds; + private String content; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueCreateRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueCreateRequest.java new file mode 100644 index 0000000..eed55ba --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueCreateRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueListRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueListRequest.java new file mode 100644 index 0000000..283b011 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueListRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueResponse.java new file mode 100644 index 0000000..b1159ce --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueStatusRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueStatusRequest.java new file mode 100644 index 0000000..acb5de1 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueStatusRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueUpdateRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueUpdateRequest.java new file mode 100644 index 0000000..960dd1d --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/issue/IssueUpdateRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeDocResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeDocResponse.java new file mode 100644 index 0000000..e09ce27 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeDocResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeLogQueryRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeLogQueryRequest.java new file mode 100644 index 0000000..ccb9121 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeLogQueryRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchRequest.java new file mode 100644 index 0000000..f81b693 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchResponse.java new file mode 100644 index 0000000..53dcc77 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/knowledge/KnowledgeSearchResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/notification/NotificationResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/notification/NotificationResponse.java new file mode 100644 index 0000000..9c5fc69 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/notification/NotificationResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptLogResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptLogResponse.java new file mode 100644 index 0000000..abf4529 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptLogResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptRenderLogResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptRenderLogResponse.java new file mode 100644 index 0000000..69c1c0d --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptRenderLogResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptStatsResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptStatsResponse.java new file mode 100644 index 0000000..8650cf7 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptStatsResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateRequest.java new file mode 100644 index 0000000..840ffe2 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateResponse.java new file mode 100644 index 0000000..17e6b0c --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTemplateResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestRequest.java new file mode 100644 index 0000000..f982838 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestRequest.java @@ -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 variables; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestResponse.java new file mode 100644 index 0000000..1f3aa71 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptTestResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptVersionResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptVersionResponse.java new file mode 100644 index 0000000..c3e8a14 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/prompt/PromptVersionResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/DepartmentResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/DepartmentResponse.java new file mode 100644 index 0000000..bbab44e --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/DepartmentResponse.java @@ -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 children; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/LogQueryRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/LogQueryRequest.java new file mode 100644 index 0000000..3100ae9 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/LogQueryRequest.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/LogResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/LogResponse.java new file mode 100644 index 0000000..35a1beb --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/LogResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/PermissionResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/PermissionResponse.java new file mode 100644 index 0000000..79a2b49 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/PermissionResponse.java @@ -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; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/RoleRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/RoleRequest.java new file mode 100644 index 0000000..8f01c63 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/RoleRequest.java @@ -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 permissionIds; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/RoleResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/RoleResponse.java new file mode 100644 index 0000000..18b1e39 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/RoleResponse.java @@ -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 permissionIds; + private LocalDateTime createdAt; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/UserRequest.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/UserRequest.java new file mode 100644 index 0000000..c9edef9 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/UserRequest.java @@ -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 roleIds; + + private Boolean isActive; + + private Boolean agentAutoExecute; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/dto/system/UserResponse.java b/backend/ims-api/src/main/java/com/ims/api/dto/system/UserResponse.java new file mode 100644 index 0000000..67bcf58 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/dto/system/UserResponse.java @@ -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 roleIds; + private List roles; + private LocalDateTime lastLoginAt; + private LocalDateTime createdAt; +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/agent/AgentConfigService.java b/backend/ims-api/src/main/java/com/ims/api/service/agent/AgentConfigService.java new file mode 100644 index 0000000..2aacf98 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/agent/AgentConfigService.java @@ -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); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/ai/ChatService.java b/backend/ims-api/src/main/java/com/ims/api/service/ai/ChatService.java new file mode 100644 index 0000000..bfa62d4 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/ai/ChatService.java @@ -0,0 +1,6 @@ +package com.ims.api.service.ai; + +public interface ChatService { + + String chat(String systemPrompt, String userPrompt); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/prompt/PromptService.java b/backend/ims-api/src/main/java/com/ims/api/service/prompt/PromptService.java new file mode 100644 index 0000000..91bb4ff --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/prompt/PromptService.java @@ -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 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 versions(String templateId); + + PageResult logs(int page, int pageSize); + + PromptStatsResponse stats(); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/system/DepartmentService.java b/backend/ims-api/src/main/java/com/ims/api/service/system/DepartmentService.java new file mode 100644 index 0000000..02fa7e4 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/system/DepartmentService.java @@ -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 tree(); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/system/ImportService.java b/backend/ims-api/src/main/java/com/ims/api/service/system/ImportService.java new file mode 100644 index 0000000..ff3b742 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/system/ImportService.java @@ -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 rows); + + ImportRecordResponse confirm(ImportConfirmRequest request, String operatorUsername); + + PageResult records(int page, int pageSize); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/system/LogService.java b/backend/ims-api/src/main/java/com/ims/api/service/system/LogService.java new file mode 100644 index 0000000..a5aef7d --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/system/LogService.java @@ -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 list(LogQueryRequest request); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/system/RoleService.java b/backend/ims-api/src/main/java/com/ims/api/service/system/RoleService.java new file mode 100644 index 0000000..64750de --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/system/RoleService.java @@ -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 list(); + + List permissions(); + + RoleResponse create(RoleRequest request); + + RoleResponse update(Long id, RoleRequest request); +} diff --git a/backend/ims-api/src/main/java/com/ims/api/service/system/UserService.java b/backend/ims-api/src/main/java/com/ims/api/service/system/UserService.java new file mode 100644 index 0000000..2624884 --- /dev/null +++ b/backend/ims-api/src/main/java/com/ims/api/service/system/UserService.java @@ -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 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); +} diff --git a/backend/ims-common/pom.xml b/backend/ims-common/pom.xml new file mode 100644 index 0000000..533c960 --- /dev/null +++ b/backend/ims-common/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + com.ims + ims-backend + 1.0.0-SNAPSHOT + + ims-common + + + org.projectlombok + lombok + true + + + com.fasterxml.jackson.core + jackson-databind + + + io.jsonwebtoken + jjwt-api + + + io.jsonwebtoken + jjwt-impl + + + io.jsonwebtoken + jjwt-jackson + + + diff --git a/backend/ims-common/src/main/java/com/ims/common/constant/ResultCode.java b/backend/ims-common/src/main/java/com/ims/common/constant/ResultCode.java new file mode 100644 index 0000000..3ee4ed7 --- /dev/null +++ b/backend/ims-common/src/main/java/com/ims/common/constant/ResultCode.java @@ -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; + } +} diff --git a/backend/ims-common/src/main/java/com/ims/common/dto/ApiResponse.java b/backend/ims-common/src/main/java/com/ims/common/dto/ApiResponse.java new file mode 100644 index 0000000..20529f0 --- /dev/null +++ b/backend/ims-common/src/main/java/com/ims/common/dto/ApiResponse.java @@ -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 { + private int code; + private String message; + private T data; + private String timestamp; + + public ApiResponse() { + this.timestamp = LocalDateTime.now().toString(); + } + + public static ApiResponse success(T data) { + ApiResponse response = new ApiResponse<>(); + response.setCode(ResultCode.SUCCESS.getCode()); + response.setMessage(ResultCode.SUCCESS.getMessage()); + response.setData(data); + return response; + } + + public static ApiResponse error(int code, String message) { + ApiResponse response = new ApiResponse<>(); + response.setCode(code); + response.setMessage(message); + return response; + } + + public static ApiResponse error(ResultCode resultCode) { + return error(resultCode.getCode(), resultCode.getMessage()); + } +} diff --git a/backend/ims-common/src/main/java/com/ims/common/dto/PageResult.java b/backend/ims-common/src/main/java/com/ims/common/dto/PageResult.java new file mode 100644 index 0000000..87f1779 --- /dev/null +++ b/backend/ims-common/src/main/java/com/ims/common/dto/PageResult.java @@ -0,0 +1,26 @@ +package com.ims.common.dto; + +import lombok.Data; +import java.util.Collections; +import java.util.List; + +@Data +public class PageResult { + private List items; + private long total; + private int page; + private int pageSize; + private int totalPages; + + public PageResult() { + this.items = Collections.emptyList(); + } + + public PageResult(List 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; + } +} diff --git a/backend/ims-common/src/main/java/com/ims/common/exception/BusinessException.java b/backend/ims-common/src/main/java/com/ims/common/exception/BusinessException.java new file mode 100644 index 0000000..bceded1 --- /dev/null +++ b/backend/ims-common/src/main/java/com/ims/common/exception/BusinessException.java @@ -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; + } +} diff --git a/backend/ims-common/src/main/java/com/ims/common/util/JwtUtil.java b/backend/ims-common/src/main/java/com/ims/common/util/JwtUtil.java new file mode 100644 index 0000000..09a2e61 --- /dev/null +++ b/backend/ims-common/src/main/java/com/ims/common/util/JwtUtil.java @@ -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; + } + } +} diff --git a/backend/ims-service/pom.xml b/backend/ims-service/pom.xml new file mode 100644 index 0000000..344c8c2 --- /dev/null +++ b/backend/ims-service/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + com.ims + ims-backend + 1.0.0-SNAPSHOT + + ims-service + + + com.ims + ims-common + + + com.ims + ims-api + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.postgresql + postgresql + runtime + + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-database-postgresql + + + io.minio + minio + 8.5.17 + + + org.springframework.ai + spring-ai-ollama + + + org.springframework.ai + spring-ai-openai + + + org.apache.tika + tika-core + 2.9.2 + + + org.apache.tika + tika-parser-microsoft-module + 2.9.2 + + + org.apache.poi + poi-ooxml + 5.2.5 + + + commons-io + commons-io + 2.16.1 + + + org.projectlombok + lombok + true + + + diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigService.java b/backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigService.java new file mode 100644 index 0000000..02cd118 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigService.java @@ -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 getConfig() { + com.ims.api.dto.ai.AiConfigResponse cfg = aiConfigService.getConfig(); + Map 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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigServiceImpl.java new file mode 100644 index 0000000..c7d65c9 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/AgentConfigServiceImpl.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/AgentOrchestratorService.java b/backend/ims-service/src/main/java/com/ims/service/agent/AgentOrchestratorService.java new file mode 100644 index 0000000..a18fe28 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/AgentOrchestratorService.java @@ -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 CATEGORIES = Set.of("功能缺陷", "UI/UX问题", "性能问题", "安全漏洞", "文档错误"); + private static final Set PHASES = Set.of("需求", "设计", "编码", "测试", "部署", "运维"); + private static final Set IMPACT_LEVELS = Set.of("高", "中", "低"); + private static final Set PRIORITIES = Set.of("urgent", "high", "medium", "low"); + private static final Set 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 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 getStatus(Long planId) { + AgentPlan plan = planRepository.findById(planId) + .orElseThrow(() -> new BusinessException("Agent计划不存在: " + planId)); + Map 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 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 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 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 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 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 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 params = objectMapper.readValue(pending.getInputParams(), + new TypeReference>() {}); + 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 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 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 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 suggestFields(String title, String description) { + Map result = new LinkedHashMap<>(); + List users = userRepository.findAll(); + List 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 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 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 out, ObjectNode node, String nameKey, String idKey, List 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 out, ObjectNode node, String nameKey, String idKey, List 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 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 retrieveSimilarCases(String query) { + try { + List 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 out, ObjectNode node, String key, Set 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 executedSteps = new ArrayList<>(); + + try { + Map systemVars = systemContextBuilder.build(user, toolDescriptions()); + String systemPrompt = promptEngine.render(SYS_ROLE_TEMPLATE, systemVars); + + Map 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 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 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 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 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 parseArguments(String arguments) { + if (arguments == null || arguments.isBlank()) { + return new LinkedHashMap<>(); + } + try { + return objectMapper.readValue(arguments, new TypeReference>() {}); + } catch (Exception e) { + return new LinkedHashMap<>(); + } + } + + private Map buildPlanVariables(Issue issue, String goal, String similarCases, + List executedSteps, int step, int maxSteps) { + Map 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 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 toolDescriptions() { + List 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 toolExecutionToMap(ToolExecution t) { + Map 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/AgentService.java b/backend/ims-service/src/main/java/com/ims/service/agent/AgentService.java new file mode 100644 index 0000000..6508e29 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/AgentService.java @@ -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 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 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 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 status(Long planId) { + AgentPlan plan = agentPlanRepository.findById(planId) + .orElseThrow(() -> new BusinessException("计划不存在")); + List tools = toolExecutionRepository.findByPlanId(planId); + Map 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 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("\"", "\\\""); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/AgentToolPermissionService.java b/backend/ims-service/src/main/java/com/ims/service/agent/AgentToolPermissionService.java new file mode 100644 index 0000000..6280e1f --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/AgentToolPermissionService.java @@ -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 roleIds = userRoleRepository.findByUserId(user.getId()) + .stream().map(UserRole::getRoleId).distinct().toList(); + if (roleIds.isEmpty()) { + return false; + } + List 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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/MemoryService.java b/backend/ims-service/src/main/java/com/ims/service/agent/MemoryService.java new file mode 100644 index 0000000..d8305e2 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/MemoryService.java @@ -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 list(int page, int pageSize) { + Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize); + return memoryRepository.findAll(pageable); + } + + public List 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 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; + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/OllamaChatService.java b/backend/ims-service/src/main/java/com/ims/service/agent/OllamaChatService.java new file mode 100644 index 0000000..51ece53 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/OllamaChatService.java @@ -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); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/AgentFunctionCallbackAdapter.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/AgentFunctionCallbackAdapter.java new file mode 100644 index 0000000..47053c5 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/AgentFunctionCallbackAdapter.java @@ -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 parameters = parseArguments(functionArguments); + Object output = tool.execute(parameters); + return write(output); + } + + private Map parseArguments(String arguments) { + if (arguments == null || arguments.isBlank()) { + return new LinkedHashMap<>(); + } + try { + return objectMapper.readValue(arguments, new TypeReference>() {}); + } 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\":{}}"; + }; + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/AiAnalysisTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/AiAnalysisTool.java new file mode 100644 index 0000000..331a0a1 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/AiAnalysisTool.java @@ -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 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 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 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 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 buildAnalysisVariables(Issue issue, String extractedKeywords) { + Map 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 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 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; + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/AssignPendingTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/AssignPendingTool.java new file mode 100644 index 0000000..ce15404 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/AssignPendingTool.java @@ -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 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 pending = issueRepository.findByIsDeletedFalseAndStatusAndAssigneeIsNull("open"); + if (pending.isEmpty()) { + Map map = new LinkedHashMap<>(); + map.put("assigned", 0); + map.put("message", "当前没有待处理且未分配对应者的指摘。"); + return map; + } + List 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 map = new LinkedHashMap<>(); + map.put("assigned", count); + map.put("targetCount", ids.size()); + map.put("assignee", assigneeName); + map.put("message", "已将 " + count + " 条待处理指摘分配给对应者 " + assigneeName); + return map; + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueCreateTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueCreateTool.java new file mode 100644 index 0000000..7f4af10 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueCreateTool.java @@ -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 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 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; + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueQueryTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueQueryTool.java new file mode 100644 index 0000000..f1d986b --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueQueryTool.java @@ -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 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 toMap(Issue issue) { + Map 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; + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueUpdateTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueUpdateTool.java new file mode 100644 index 0000000..b224d7a --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/IssueUpdateTool.java @@ -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 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 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); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/KnowledgeSearchTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/KnowledgeSearchTool.java new file mode 100644 index 0000000..411007e --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/KnowledgeSearchTool.java @@ -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 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 results = searchService.search(query, topK); + return results.stream().map(r -> { + Map 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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/NotifyOverdueTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/NotifyOverdueTool.java new file mode 100644 index 0000000..f1b7d98 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/NotifyOverdueTool.java @@ -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 parameters) { + String content = parameters.get("content") == null ? "" : String.valueOf(parameters.get("content")); + List overdue = issueRepository.findByIsDeletedFalseAndStatusNotAndDeadlineBefore("closed", LocalDateTime.now()); + if (overdue.isEmpty()) { + Map map = new LinkedHashMap<>(); + map.put("notified", 0); + map.put("message", "当前没有逾期未关闭的指摘,无需催办。"); + return map; + } + List 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 map = new LinkedHashMap<>(); + map.put("notified", count); + map.put("targetCount", ids.size()); + map.put("message", "已对 " + count + " 条逾期指摘执行催办(已向对应者发送通知)"); + return map; + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/Tool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/Tool.java new file mode 100644 index 0000000..4db4a94 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/Tool.java @@ -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 parameters); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/ToolRegistry.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/ToolRegistry.java new file mode 100644 index 0000000..715cce6 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/ToolRegistry.java @@ -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 tools = new LinkedHashMap<>(); + + public ToolRegistry(List toolList) { + for (Tool tool : toolList) { + tools.put(tool.name(), tool); + } + } + + public Map descriptions() { + Map result = new LinkedHashMap<>(); + tools.forEach((name, tool) -> result.put(name, tool.description())); + return result; + } + + public List names() { + return List.copyOf(tools.keySet()); + } + + public List 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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/agent/tool/WeeklyReportTool.java b/backend/ims-service/src/main/java/com/ims/service/agent/tool/WeeklyReportTool.java new file mode 100644 index 0000000..4868101 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/agent/tool/WeeklyReportTool.java @@ -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 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 statusCounts = new LinkedHashMap<>(); + List 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 recent = issueRepository + .findAll(PageRequest.of(0, 5, Sort.by(Sort.Direction.DESC, "createdAt"))).getContent(); + List 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(); + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/AiAnalysisService.java b/backend/ims-service/src/main/java/com/ims/service/ai/AiAnalysisService.java new file mode 100644 index 0000000..f1fdddb --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/AiAnalysisService.java @@ -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 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 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 systemVars = systemContextBuilder.build(user, null); + String systemPrompt = promptEngine.render(SYS_ROLE_TEMPLATE, systemVars); + + Map 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 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 result = analysisRepository.search(id, issueId, departmentId, status, start, end, pageable); + return result.map(this::toResponse); + } + + public List running() { + List 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 buildAnalysisVariables(Issue issue, String extractedKeywords) { + Map 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 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 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/AiProviderConfig.java b/backend/ims-service/src/main/java/com/ims/service/ai/AiProviderConfig.java new file mode 100644 index 0000000..56df7ce --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/AiProviderConfig.java @@ -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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/DeepSeekChatService.java b/backend/ims-service/src/main/java/com/ims/service/ai/DeepSeekChatService.java new file mode 100644 index 0000000..1867846 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/DeepSeekChatService.java @@ -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 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); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/KeywordExtractor.java b/backend/ims-service/src/main/java/com/ims/service/ai/KeywordExtractor.java new file mode 100644 index 0000000..826e0c3 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/KeywordExtractor.java @@ -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 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 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/ModelRoutingService.java b/backend/ims-service/src/main/java/com/ims/service/ai/ModelRoutingService.java new file mode 100644 index 0000000..d1eb07e --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/ModelRoutingService.java @@ -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 callbacks = new ArrayList<>(); + for (var tool : toolRegistry.tools()) { + callbacks.add(new AgentFunctionCallbackAdapter(tool, objectMapper)); + } + Set 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 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 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 test() { + String provider = currentProvider(); + AiConfigResponse cfg = aiConfigService.getConfig(); + Map 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/OllamaChatService.java b/backend/ims-service/src/main/java/com/ims/service/ai/OllamaChatService.java new file mode 100644 index 0000000..a50f854 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/OllamaChatService.java @@ -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 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); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/PromptFormatter.java b/backend/ims-service/src/main/java/com/ims/service/ai/PromptFormatter.java new file mode 100644 index 0000000..6065882 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/PromptFormatter.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/PromptTemplateEngine.java b/backend/ims-service/src/main/java/com/ims/service/ai/PromptTemplateEngine.java new file mode 100644 index 0000000..b7c886f --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/PromptTemplateEngine.java @@ -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 variables) { + PromptTemplate template = loadActive(templateId); + return render(template, variables); + } + + public String render(PromptTemplate template, Map variables) { + validateVariables(template, variables); + String content = template.getContent(); + if (variables != null) { + for (Map.Entry 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 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 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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/RoutingChatService.java b/backend/ims-service/src/main/java/com/ims/service/ai/RoutingChatService.java new file mode 100644 index 0000000..0728ea0 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/RoutingChatService.java @@ -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); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/ai/SystemContextBuilder.java b/backend/ims-service/src/main/java/com/ims/service/ai/SystemContextBuilder.java new file mode 100644 index 0000000..35e1ec4 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/ai/SystemContextBuilder.java @@ -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 build(User user, List availableTools) { + Map 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 userRoles = userRoleRepository.findByUserId(userId); + if (userRoles.isEmpty()) { + return ""; + } + List names = new ArrayList<>(); + for (UserRole ur : userRoles) { + roleRepository.findById(ur.getRoleId()).map(Role::getName).ifPresent(names::add); + } + return String.join(",", names); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/config/JacksonConfig.java b/backend/ims-service/src/main/java/com/ims/service/config/JacksonConfig.java new file mode 100644 index 0000000..c97c869 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/config/JacksonConfig.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/config/JwtConfig.java b/backend/ims-service/src/main/java/com/ims/service/config/JwtConfig.java new file mode 100644 index 0000000..e8e5872 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/config/JwtConfig.java @@ -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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/config/MinioConfig.java b/backend/ims-service/src/main/java/com/ims/service/config/MinioConfig.java new file mode 100644 index 0000000..ed47617 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/config/MinioConfig.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/config/RedisConfig.java b/backend/ims-service/src/main/java/com/ims/service/config/RedisConfig.java new file mode 100644 index 0000000..f2047a4 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/config/RedisConfig.java @@ -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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/config/WebConfig.java b/backend/ims-service/src/main/java/com/ims/service/config/WebConfig.java new file mode 100644 index 0000000..52c1033 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/config/WebConfig.java @@ -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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/dashboard/DashboardService.java b/backend/ims-service/src/main/java/com/ims/service/dashboard/DashboardService.java new file mode 100644 index 0000000..d35f6f8 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/dashboard/DashboardService.java @@ -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 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 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 buildCards() { + Map 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 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 insights() { + List 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 statusCounts() { + Map map = new HashMap<>(); + List 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 trend7Days() { + LocalDate today = LocalDate.now(); + LocalDate from = today.minusDays(6); + Map created = countGroupedByDay("created_at", from); + Map closed = countGroupedByDay("closed_at", from); + List 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 countGroupedByDay(String column, LocalDate from) { + Map map = new HashMap<>(); + List 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 recentActivities() { + List logs = issueLogRepository + .findAll(PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "createdAt"))).getContent(); + List 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/AgentMemory.java b/backend/ims-service/src/main/java/com/ims/service/entity/AgentMemory.java new file mode 100644 index 0000000..1c03577 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/AgentMemory.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/AgentPlan.java b/backend/ims-service/src/main/java/com/ims/service/entity/AgentPlan.java new file mode 100644 index 0000000..a4ac497 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/AgentPlan.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/AiAnalysis.java b/backend/ims-service/src/main/java/com/ims/service/entity/AiAnalysis.java new file mode 100644 index 0000000..c703d78 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/AiAnalysis.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/AiCallLog.java b/backend/ims-service/src/main/java/com/ims/service/entity/AiCallLog.java new file mode 100644 index 0000000..a6e6167 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/AiCallLog.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/AiFeedback.java b/backend/ims-service/src/main/java/com/ims/service/entity/AiFeedback.java new file mode 100644 index 0000000..b12d800 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/AiFeedback.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/Attachment.java b/backend/ims-service/src/main/java/com/ims/service/entity/Attachment.java new file mode 100644 index 0000000..3faead0 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/Attachment.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/Department.java b/backend/ims-service/src/main/java/com/ims/service/entity/Department.java new file mode 100644 index 0000000..0250f30 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/Department.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/ImportRecord.java b/backend/ims-service/src/main/java/com/ims/service/entity/ImportRecord.java new file mode 100644 index 0000000..bbd4c3a --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/ImportRecord.java @@ -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"; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/Issue.java b/backend/ims-service/src/main/java/com/ims/service/entity/Issue.java new file mode 100644 index 0000000..16e7d08 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/Issue.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/IssueLog.java b/backend/ims-service/src/main/java/com/ims/service/entity/IssueLog.java new file mode 100644 index 0000000..6f34d4a --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/IssueLog.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeChunk.java b/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeChunk.java new file mode 100644 index 0000000..2dd60eb --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeChunk.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeDocument.java b/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeDocument.java new file mode 100644 index 0000000..bbfb004 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeDocument.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeSearchLog.java b/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeSearchLog.java new file mode 100644 index 0000000..0cc0ecb --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/KnowledgeSearchLog.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/Notification.java b/backend/ims-service/src/main/java/com/ims/service/entity/Notification.java new file mode 100644 index 0000000..e83f655 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/Notification.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/Permission.java b/backend/ims-service/src/main/java/com/ims/service/entity/Permission.java new file mode 100644 index 0000000..94267ba --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/Permission.java @@ -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; +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/PhaseRule.java b/backend/ims-service/src/main/java/com/ims/service/entity/PhaseRule.java new file mode 100644 index 0000000..6e77808 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/PhaseRule.java @@ -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(); + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/PromptRenderLog.java b/backend/ims-service/src/main/java/com/ims/service/entity/PromptRenderLog.java new file mode 100644 index 0000000..7a5ffec --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/PromptRenderLog.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplate.java b/backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplate.java new file mode 100644 index 0000000..51219b5 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplate.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplateVersion.java b/backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplateVersion.java new file mode 100644 index 0000000..eace641 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/PromptTemplateVersion.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/Role.java b/backend/ims-service/src/main/java/com/ims/service/entity/Role.java new file mode 100644 index 0000000..12324b2 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/Role.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/RolePermission.java b/backend/ims-service/src/main/java/com/ims/service/entity/RolePermission.java new file mode 100644 index 0000000..db70291 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/RolePermission.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/TaskExecution.java b/backend/ims-service/src/main/java/com/ims/service/entity/TaskExecution.java new file mode 100644 index 0000000..97c3e6a --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/TaskExecution.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/ToolExecution.java b/backend/ims-service/src/main/java/com/ims/service/entity/ToolExecution.java new file mode 100644 index 0000000..f3d5218 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/ToolExecution.java @@ -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"; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/User.java b/backend/ims-service/src/main/java/com/ims/service/entity/User.java new file mode 100644 index 0000000..8c2133b --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/User.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/entity/UserRole.java b/backend/ims-service/src/main/java/com/ims/service/entity/UserRole.java new file mode 100644 index 0000000..2372bf5 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/entity/UserRole.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/issue/AttachmentService.java b/backend/ims-service/src/main/java/com/ims/service/issue/AttachmentService.java new file mode 100644 index 0000000..21c1bd6 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/issue/AttachmentService.java @@ -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 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; + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/issue/IssueService.java b/backend/ims-service/src/main/java/com/ims/service/issue/IssueService.java new file mode 100644 index 0000000..f12a5d2 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/issue/IssueService.java @@ -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> 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 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 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 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 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 query = entityManager.createQuery(jpql.toString(), Issue.class); + TypedQuery 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 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 findAllFiltered(IssueListRequest req) { + StringBuilder jpql = new StringBuilder("select i from Issue i where i.isDeleted = false"); + Map 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 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 query = entityManager.createQuery(jpql.toString(), Issue.class); + params.forEach(query::setParameter); + return query.getResultList(); + } + + @Transactional + public int batchAssign(List 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 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> logs(Long issueId) { + return issueLogRepository.findByIssueIdOrderByCreatedAtDesc(issueId).stream().map(l -> { + Map 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 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 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/AiConfigService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/AiConfigService.java new file mode 100644 index 0000000..04b7156 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/AiConfigService.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/DeepSeekEmbeddingService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/DeepSeekEmbeddingService.java new file mode 100644 index 0000000..44812b7 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/DeepSeekEmbeddingService.java @@ -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 embed(String text) { + String apiKey = aiConfigService.getEffectiveApiKey(); + String model = aiConfigService.getConfig().getDeepseekEmbeddingModel(); + + Map 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 result = new ArrayList<>(); + for (JsonNode n : embedding) { + result.add(n.floatValue()); + } + return result; + } catch (JsonProcessingException e) { + throw new RuntimeException("DeepSeek embedding failed", e); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/DocumentParserService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/DocumentParserService.java new file mode 100644 index 0000000..124bb50 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/DocumentParserService.java @@ -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 splitText(String text) { + int chunkSize = aiConfigService.getEffectiveChunkSize(); + int chunkOverlap = aiConfigService.getEffectiveChunkOverlap(); + List chunks = new ArrayList<>(); + List 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/EmbeddingService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/EmbeddingService.java new file mode 100644 index 0000000..4079d54 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/EmbeddingService.java @@ -0,0 +1,7 @@ +package com.ims.service.knowledge; + +import java.util.List; + +public interface EmbeddingService { + List embed(String text); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/KnowledgeService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/KnowledgeService.java new file mode 100644 index 0000000..463b4ad --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/KnowledgeService.java @@ -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 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 chunks = documentParserService.splitText(text); + + int chunkCount = 0; + for (String chunkText : chunks) { + List 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 chunks = documentParserService.splitText(text); + + int chunkCount = 0; + for (String chunkText : chunks) { + List 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/OllamaEmbeddingService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/OllamaEmbeddingService.java new file mode 100644 index 0000000..24a3fdb --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/OllamaEmbeddingService.java @@ -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 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 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"); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/RoutingEmbeddingService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/RoutingEmbeddingService.java new file mode 100644 index 0000000..2c26f96 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/RoutingEmbeddingService.java @@ -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 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 result = ollamaEmbeddingService.embed(text); + System.out.println("=== Ollama result size: " + result.size()); + return result; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/SearchLogService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/SearchLogService.java new file mode 100644 index 0000000..d675245 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/SearchLogService.java @@ -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 list(int page, int pageSize) { + return repository.findAll(PageRequest.of(page - 1, pageSize)); + } + + public long todayCount() { + return repository.count(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/knowledge/SearchService.java b/backend/ims-service/src/main/java/com/ims/service/knowledge/SearchService.java new file mode 100644 index 0000000..876fc93 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/knowledge/SearchService.java @@ -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 search(String query, int topK) { + long start = System.currentTimeMillis(); + List 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 rows = nativeQuery.getResultList(); + + List 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 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; } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/notification/EmailService.java b/backend/ims-service/src/main/java/com/ims/service/notification/EmailService.java new file mode 100644 index 0000000..04bc6ab --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/notification/EmailService.java @@ -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); + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/notification/NotificationScheduler.java b/backend/ims-service/src/main/java/com/ims/service/notification/NotificationScheduler.java new file mode 100644 index 0000000..08d7f1e --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/notification/NotificationScheduler.java @@ -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 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 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); + } + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/notification/NotificationService.java b/backend/ims-service/src/main/java/com/ims/service/notification/NotificationService.java new file mode 100644 index 0000000..cdf741d --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/notification/NotificationService.java @@ -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 list(Long userId, int page, int pageSize) { + int p = Math.max(1, page); + int ps = pageSize > 0 ? pageSize : 20; + TypedQuery 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 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 adminRoleIds = roleRepository.findByNameIn(List.of("超级管理员", "部门管理员")).stream() + .map(Role::getId) + .collect(Collectors.toSet()); + if (adminRoleIds.isEmpty()) return; + Set 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/prompt/PromptService.java b/backend/ims-service/src/main/java/com/ims/service/prompt/PromptService.java new file mode 100644 index 0000000..cc7d3e7 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/prompt/PromptService.java @@ -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 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 test(PromptTestRequest request) { + PromptTemplate template = templateRepository.findByTemplateIdAndIsActiveTrue(request.getTemplateId()) + .orElseThrow(() -> new BusinessException("模板不存在: " + request.getTemplateId())); + Map vars = request.getVariables() == null ? Map.of() : request.getVariables(); + String rendered = promptEngine.render(template, vars); + + Map result = new LinkedHashMap<>(); + result.put("templateId", template.getTemplateId()); + result.put("version", template.getVersion()); + result.put("rendered", rendered); + return result; + } + + public List> versions(String templateId) { + List> result = new ArrayList<>(); + for (PromptTemplateVersion v : versionRepository.findByTemplateIdOrderByVersionDesc(templateId)) { + Map 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 logs(int page, int pageSize) { + Pageable pageable = PageRequest.of(Math.max(page - 1, 0), pageSize); + return renderLogRepository.findAllByOrderByCreatedAtDesc(pageable).map(this::toLogResponse); + } + + public List stats() { + Map 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 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/prompt/PromptServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/prompt/PromptServiceImpl.java new file mode 100644 index 0000000..4b15d59 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/prompt/PromptServiceImpl.java @@ -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 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 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 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 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 logs(int page, int pageSize) { + List 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 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/AgentMemoryRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/AgentMemoryRepository.java new file mode 100644 index 0000000..2597967 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/AgentMemoryRepository.java @@ -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 { + + @Query(value = "SELECT * FROM agent_memories ORDER BY embedding <=> CAST(:vector AS vector) LIMIT :limit", + nativeQuery = true) + List findSimilar(@Param("vector") String vector, @Param("limit") int limit); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/AgentPlanRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/AgentPlanRepository.java new file mode 100644 index 0000000..bc687c3 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/AgentPlanRepository.java @@ -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 { + List findByIssueIdOrderByCreatedAtDesc(Long issueId); + + Page findByApprovalStatusOrderByCreatedAtDesc(String approvalStatus, Pageable pageable); + + long countByApprovalStatus(String approvalStatus); + + long countByCreatedAtAfter(LocalDateTime time); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/AiAnalysisRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/AiAnalysisRepository.java new file mode 100644 index 0000000..3ed4e60 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/AiAnalysisRepository.java @@ -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, JpaSpecificationExecutor { + List findByIssueIdOrderByCreatedAtDesc(Long issueId); + Page findAllByOrderByCreatedAtDesc(Pageable pageable); + + @Query("SELECT a FROM AiAnalysis a WHERE a.status IN :statuses ORDER BY a.createdAt DESC") + List findByStatusIn(@Param("statuses") Collection 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 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 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 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 dailyTrendGroup(@Param("since") LocalDateTime since); + + default Page search(Long id, Long issueId, Long departmentId, String status, + LocalDateTime start, LocalDateTime end, Pageable pageable) { + Specification spec = (root, query, cb) -> { + List 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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/AiCallLogRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/AiCallLogRepository.java new file mode 100644 index 0000000..1a187ba --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/AiCallLogRepository.java @@ -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 { + List findTop20ByOrderByCreatedAtDesc(); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/AiFeedbackRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/AiFeedbackRepository.java new file mode 100644 index 0000000..d028bb0 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/AiFeedbackRepository.java @@ -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 { +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/AttachmentRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/AttachmentRepository.java new file mode 100644 index 0000000..bd32dd5 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/AttachmentRepository.java @@ -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 { + List findByIssueId(Long issueId); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/DepartmentRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/DepartmentRepository.java new file mode 100644 index 0000000..803344b --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/DepartmentRepository.java @@ -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 { + List findByParentIdOrderBySortOrder(Long parentId); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/ImportRecordRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/ImportRecordRepository.java new file mode 100644 index 0000000..e7f98d9 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/ImportRecordRepository.java @@ -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 { +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/IssueLogRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/IssueLogRepository.java new file mode 100644 index 0000000..d827477 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/IssueLogRepository.java @@ -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 { + List findByIssueIdOrderByCreatedAtDesc(Long issueId); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/IssueRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/IssueRepository.java new file mode 100644 index 0000000..9d3a55e --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/IssueRepository.java @@ -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, JpaSpecificationExecutor { + Optional findByIssueNo(String issueNo); + + List findByIsDeletedFalseAndStatusNotAndDeadlineBefore(String status, LocalDateTime now); + + List findByIsDeletedFalseAndStatusAndAssigneeIsNull(String status); + + default Page search(String status, String phase, Long departmentId, String keyword, + LocalDateTime start, LocalDateTime end, Pageable pageable) { + Specification spec = (root, query, cb) -> { + List 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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeChunkRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeChunkRepository.java new file mode 100644 index 0000000..ba59877 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeChunkRepository.java @@ -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 { + List findByDocId(Long docId); + void deleteByDocId(Long docId); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeDocumentRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeDocumentRepository.java new file mode 100644 index 0000000..32ff2f8 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeDocumentRepository.java @@ -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 { +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeSearchLogRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeSearchLogRepository.java new file mode 100644 index 0000000..0189450 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/KnowledgeSearchLogRepository.java @@ -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 { +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/NotificationRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/NotificationRepository.java new file mode 100644 index 0000000..9946e7d --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/NotificationRepository.java @@ -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 { + List 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); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/PermissionRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/PermissionRepository.java new file mode 100644 index 0000000..fc8b93b --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/PermissionRepository.java @@ -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 { +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/PhaseRuleRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/PhaseRuleRepository.java new file mode 100644 index 0000000..a1a049b --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/PhaseRuleRepository.java @@ -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 { + List findByActiveTrueOrderBySortOrderAsc(); +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/PromptRenderLogRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/PromptRenderLogRepository.java new file mode 100644 index 0000000..b60886f --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/PromptRenderLogRepository.java @@ -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 { + Page 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 aggregateByTemplate(); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateRepository.java new file mode 100644 index 0000000..1bdadef --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateRepository.java @@ -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 { + Optional findByTemplateIdAndIsActiveTrue(String templateId); + List findByCategoryAndIsActiveTrue(String category); + List findAllByIsActiveTrue(); + Page findAllByIsActiveTrue(Pageable pageable); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateVersionRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateVersionRepository.java new file mode 100644 index 0000000..ba7d0de --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/PromptTemplateVersionRepository.java @@ -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 { + List findByTemplateIdOrderByVersionDesc(String templateId); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/RolePermissionRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/RolePermissionRepository.java new file mode 100644 index 0000000..587af50 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/RolePermissionRepository.java @@ -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 { + List findByRoleId(Long roleId); + + List findByRoleIdIn(Collection roleIds); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/RoleRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/RoleRepository.java new file mode 100644 index 0000000..8e2c5c0 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/RoleRepository.java @@ -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 { + List findByNameIn(Collection names); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/TaskExecutionRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/TaskExecutionRepository.java new file mode 100644 index 0000000..61b6b27 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/TaskExecutionRepository.java @@ -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 { + Optional findByTaskId(String taskId); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/ToolExecutionRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/ToolExecutionRepository.java new file mode 100644 index 0000000..4f13780 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/ToolExecutionRepository.java @@ -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 { + List findByPlanId(Long planId); + + long countByStatus(String status); + + long countByCreatedAtAfter(LocalDateTime time); + + List findTop15ByOrderByCreatedAtDesc(); + + Page 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); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/UserRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/UserRepository.java new file mode 100644 index 0000000..e1873cc --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/UserRepository.java @@ -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 { + Optional findByUserid(String userid); + Optional findByUsername(String username); + + @EntityGraph(attributePaths = "department") + Optional findWithDepartmentById(Long id); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/repository/UserRoleRepository.java b/backend/ims-service/src/main/java/com/ims/service/repository/UserRoleRepository.java new file mode 100644 index 0000000..df65301 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/repository/UserRoleRepository.java @@ -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 { + List findByUserId(Long userId); + List findByRoleIdIn(Collection roleIds); +} diff --git a/backend/ims-service/src/main/java/com/ims/service/security/DataScope.java b/backend/ims-service/src/main/java/com/ims/service/security/DataScope.java new file mode 100644 index 0000000..19ab78f --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/security/DataScope.java @@ -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 ""; +} diff --git a/backend/ims-service/src/main/java/com/ims/service/security/DataScopeAspect.java b/backend/ims-service/src/main/java/com/ims/service/security/DataScopeAspect.java new file mode 100644 index 0000000..0af0002 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/security/DataScopeAspect.java @@ -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 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 acc) { + if (parentId == null) { + return; + } + acc.add(parentId); + List children = departmentRepository.findByParentIdOrderBySortOrder(parentId); + for (Department child : children) { + collectDepartments(child.getId(), acc); + } + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/security/DataScopeContext.java b/backend/ims-service/src/main/java/com/ims/service/security/DataScopeContext.java new file mode 100644 index 0000000..92f8b32 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/security/DataScopeContext.java @@ -0,0 +1,27 @@ +package com.ims.service.security; + +import java.util.Set; + +public final class DataScopeContext { + + private static final ThreadLocal> DEPT_IDS = new ThreadLocal<>(); + + private DataScopeContext() { + } + + public static void set(Set deptIds) { + DEPT_IDS.set(deptIds); + } + + public static Set 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(); + } +} \ No newline at end of file diff --git a/backend/ims-service/src/main/java/com/ims/service/security/JwtAuthFilter.java b/backend/ims-service/src/main/java/com/ims/service/security/JwtAuthFilter.java new file mode 100644 index 0000000..7885934 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/security/JwtAuthFilter.java @@ -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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/security/SecurityConfig.java b/backend/ims-service/src/main/java/com/ims/service/security/SecurityConfig.java new file mode 100644 index 0000000..e153785 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/security/SecurityConfig.java @@ -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(); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/security/UserDetailsServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/security/UserDetailsServiceImpl.java new file mode 100644 index 0000000..b17defd --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/security/UserDetailsServiceImpl.java @@ -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")) + ); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/system/DepartmentServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/system/DepartmentServiceImpl.java new file mode 100644 index 0000000..5663948 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/system/DepartmentServiceImpl.java @@ -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 tree() { + List all = departmentRepository.findAll(); + Map 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 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 nodes) { + nodes.sort(Comparator.comparing(DepartmentResponse::getSortOrder, Comparator.nullsLast(Integer::compareTo))); + for (DepartmentResponse n : nodes) { + sort(n.getChildren()); + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/system/ImportServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/system/ImportServiceImpl.java new file mode 100644 index 0000000..c0a5f26 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/system/ImportServiceImpl.java @@ -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 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 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 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 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 rows = request.getRows() == null ? List.of() : request.getRows(); + int success = 0; + int fail = 0; + List errors = new ArrayList<>(); + for (ImportRow row : rows) { + List 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 records(int page, int pageSize) { + List 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 items = all.subList(from, to).stream().map(this::toResponse).toList(); + return new PageResult<>(items, total, page, pageSize); + } + + private ParseResult parseRows(MultipartFile file) { + List 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 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 rows = new ArrayList<>(); + private final Map headerValues = new LinkedHashMap<>(); + private int currentRowNum = -1; + private String currentCol; + private String currentCellType; + private final StringBuilder cellValue = new StringBuilder(); + private final Map rowValues = new LinkedHashMap<>(); + private boolean inCellValue = false; + + SheetDataHandler(SharedStrings sst) { + this.sst = sst; + } + + boolean isValidHeader() { + if (headerValues.isEmpty()) { + return false; + } + for (Map.Entry 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 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 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 values) { + List 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 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 validate(ImportRow row) { + List 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 rows; + private final boolean headerValid; + + ParseResult(List rows, boolean headerValid) { + this.rows = rows; + this.headerValid = headerValid; + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/system/ImportSuggestService.java b/backend/ims-service/src/main/java/com/ims/service/system/ImportSuggestService.java new file mode 100644 index 0000000..3fbbf86 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/system/ImportSuggestService.java @@ -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 PRIORITIES = Set.of("high", "medium", "low"); + private static final List 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 PRIORITY_ALIASES = Map.of( + "紧急", "high", "高", "high", "中", "medium", "低", "low"); + private static final Map 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 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 rows) { + long startNanos = System.nanoTime(); + List list = rows == null ? List.of() : rows; + + FileUsability ruleUsable = ruleUsability(list); + List 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 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 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 ruleSuggest(List rows) { + List 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 rowLevelErrors(ImportRow row) { + List 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 rows) { + try { + if (rows.isEmpty()) { + return new LlmResult(true, "", List.of()); + } + List allSuggestions = new ArrayList<>(); + Boolean usable = null; + String usableReason = ""; + for (int i = 0; i < rows.size(); i += LLM_BATCH_SIZE) { + List 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 batch) { + try { + String rowsJson = rawJsonMapper.writeValueAsString(batch.stream().map(r -> { + Map 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 suggestions = parseSuggestionArray(node.path("suggestions")); + return new LlmResult(usable, usableReason, suggestions); + } + + private List parseSuggestionArray(JsonNode array) { + List 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 merge(List rules, List ai) { + Map 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 e : HIGH_KEYWORDS.entrySet()) { + if (lower.contains(e.getKey())) { + return e.getValue(); + } + } + return "medium"; + } + + private String inferPhase(ImportRow row) { + List 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 loadPhaseRules() { + long now = System.currentTimeMillis(); + if (phaseRuleCache != null && now - phaseRuleCacheAt < PHASE_RULE_CACHE_TTL_MS) { + return phaseRuleCache; + } + List rules = BUILTIN_PHASE_RULES; + try { + List 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 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 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 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 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 suggestions; + + LlmResult(Boolean usable, String usableReason, List 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; + } + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/system/LogServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/system/LogServiceImpl.java new file mode 100644 index 0000000..41a8680 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/system/LogServiceImpl.java @@ -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 list(LogQueryRequest request) { + List 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 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; + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/system/RoleServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/system/RoleServiceImpl.java new file mode 100644 index 0000000..4e6fcee --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/system/RoleServiceImpl.java @@ -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 list() { + return roleRepository.findAll().stream().map(this::toResponse).toList(); + } + + @Override + @Transactional(readOnly = true) + public List 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 permissionIds) { + List existing = rolePermissionRepository.findByRoleId(roleId); + if (!existing.isEmpty()) { + rolePermissionRepository.deleteAll(existing); + } + if (permissionIds == null || permissionIds.isEmpty()) { + return; + } + List 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 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); + } +} diff --git a/backend/ims-service/src/main/java/com/ims/service/system/UserServiceImpl.java b/backend/ims-service/src/main/java/com/ims/service/system/UserServiceImpl.java new file mode 100644 index 0000000..e86acd4 --- /dev/null +++ b/backend/ims-service/src/main/java/com/ims/service/system/UserServiceImpl.java @@ -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 list(int page, int pageSize, String keyword, Long departmentId, Boolean isActive) { + List 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 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 roleIds) { + List existing = userRoleRepository.findByUserId(userId); + if (!existing.isEmpty()) { + userRoleRepository.deleteAll(existing); + } + if (roleIds == null || roleIds.isEmpty()) { + return; + } + List 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 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; + } +} diff --git a/backend/ims-service/src/main/resources/db/migration/V1.0__init_schema.sql b/backend/ims-service/src/main/resources/db/migration/V1.0__init_schema.sql new file mode 100644 index 0000000..7a359b5 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.0__init_schema.sql @@ -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) +); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.1__core_business.sql b/backend/ims-service/src/main/resources/db/migration/V1.1__core_business.sql new file mode 100644 index 0000000..050432b --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.1__core_business.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.2__ai_analysis.sql b/backend/ims-service/src/main/resources/db/migration/V1.2__ai_analysis.sql new file mode 100644 index 0000000..d6625e9 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.2__ai_analysis.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.3__agent_tables.sql b/backend/ims-service/src/main/resources/db/migration/V1.3__agent_tables.sql new file mode 100644 index 0000000..3ec7c15 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.3__agent_tables.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.4__knowledge_tables.sql b/backend/ims-service/src/main/resources/db/migration/V1.4__knowledge_tables.sql new file mode 100644 index 0000000..d0e9c55 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.4__knowledge_tables.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.5__prompt_tables.sql b/backend/ims-service/src/main/resources/db/migration/V1.5__prompt_tables.sql new file mode 100644 index 0000000..5696289 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.5__prompt_tables.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.6__seed_data.sql b/backend/ims-service/src/main/resources/db/migration/V1.6__seed_data.sql new file mode 100644 index 0000000..76d44d9 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.6__seed_data.sql @@ -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', '系统管理员', 'admin@ims.com', '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6', 1, TRUE, TRUE), +(2, 'zhangsan', '张三', 'zhangsan@ims.com', '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6', 2, TRUE, FALSE), +(3, 'lisi', '李四', 'lisi@ims.com', '$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; diff --git a/backend/ims-service/src/main/resources/db/migration/V1.7__fix_password_hash.sql b/backend/ims-service/src/main/resources/db/migration/V1.7__fix_password_hash.sql new file mode 100644 index 0000000..5a82441 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.7__fix_password_hash.sql @@ -0,0 +1,2 @@ +UPDATE users SET password_hash = '$2b$10$RgDKGUTF75aTu/8apLJjQOkDnOQWSd0/bBu4XBj6pXK4XvZcmQ6e6' +WHERE userid IN ('admin', 'zhangsan', 'lisi'); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.8__fix_vector_dimension.sql b/backend/ims-service/src/main/resources/db/migration/V1.8__fix_vector_dimension.sql new file mode 100644 index 0000000..a388f2b --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.8__fix_vector_dimension.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V1.9__seed_prompt_templates.sql b/backend/ims-service/src/main/resources/db/migration/V1.9__seed_prompt_templates.sql new file mode 100644 index 0000000..504eaa4 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V1.9__seed_prompt_templates.sql @@ -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; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.0__seed_demo_data.sql b/backend/ims-service/src/main/resources/db/migration/V2.0__seed_demo_data.sql new file mode 100644 index 0000000..514b993 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.0__seed_demo_data.sql @@ -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; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.10__add_role_data_scope.sql b/backend/ims-service/src/main/resources/db/migration/V2.10__add_role_data_scope.sql new file mode 100644 index 0000000..9685e4d --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.10__add_role_data_scope.sql @@ -0,0 +1 @@ +ALTER TABLE roles ADD COLUMN IF NOT EXISTS data_scope VARCHAR(20) DEFAULT 'all'; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.1__add_ai_analysis_error_message.sql b/backend/ims-service/src/main/resources/db/migration/V2.1__add_ai_analysis_error_message.sql new file mode 100644 index 0000000..f0e49ed --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.1__add_ai_analysis_error_message.sql @@ -0,0 +1,2 @@ +-- ai_analysis 增加失败原因字段 +ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS error_message TEXT; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.2__add_ai_analysis_duration.sql b/backend/ims-service/src/main/resources/db/migration/V2.2__add_ai_analysis_duration.sql new file mode 100644 index 0000000..a4ddebc --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.2__add_ai_analysis_duration.sql @@ -0,0 +1,2 @@ +-- ai_analysis 增加分析耗时字段(秒) +ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS duration_seconds INTEGER; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.3__ai_analysis_timestamps.sql b/backend/ims-service/src/main/resources/db/migration/V2.3__ai_analysis_timestamps.sql new file mode 100644 index 0000000..d78b376 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.3__ai_analysis_timestamps.sql @@ -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; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.4__ai_call_logs.sql b/backend/ims-service/src/main/resources/db/migration/V2.4__ai_call_logs.sql new file mode 100644 index 0000000..0f84296 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.4__ai_call_logs.sql @@ -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); diff --git a/backend/ims-service/src/main/resources/db/migration/V2.5__analysis_prompt_keywords.sql b/backend/ims-service/src/main/resources/db/migration/V2.5__analysis_prompt_keywords.sql new file mode 100644 index 0000000..89552c8 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.5__analysis_prompt_keywords.sql @@ -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'; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.6__ai_analysis_extracted_keywords.sql b/backend/ims-service/src/main/resources/db/migration/V2.6__ai_analysis_extracted_keywords.sql new file mode 100644 index 0000000..09bf6c3 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.6__ai_analysis_extracted_keywords.sql @@ -0,0 +1 @@ +ALTER TABLE ai_analysis ADD COLUMN IF NOT EXISTS extracted_keywords TEXT; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.7__agent_plan_issue_nullable.sql b/backend/ims-service/src/main/resources/db/migration/V2.7__agent_plan_issue_nullable.sql new file mode 100644 index 0000000..9eca623 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.7__agent_plan_issue_nullable.sql @@ -0,0 +1,2 @@ +-- 支持 Agent 创建型指令:无目标指摘时创建的计划可不关联指摘 +ALTER TABLE agent_plans ALTER COLUMN issue_id DROP NOT NULL; diff --git a/backend/ims-service/src/main/resources/db/migration/V2.8__agent_native_tools.sql b/backend/ims-service/src/main/resources/db/migration/V2.8__agent_native_tools.sql new file mode 100644 index 0000000..bd02bf4 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.8__agent_native_tools.sql @@ -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'; \ No newline at end of file diff --git a/backend/ims-service/src/main/resources/db/migration/V2.9__fix_test_missing_tables.sql b/backend/ims-service/src/main/resources/db/migration/V2.9__fix_test_missing_tables.sql new file mode 100644 index 0000000..296da66 --- /dev/null +++ b/backend/ims-service/src/main/resources/db/migration/V2.9__fix_test_missing_tables.sql @@ -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; \ No newline at end of file diff --git a/backend/ims-web/pom.xml b/backend/ims-web/pom.xml new file mode 100644 index 0000000..60e6b59 --- /dev/null +++ b/backend/ims-web/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + com.ims + ims-backend + 1.0.0-SNAPSHOT + + ims-web + + + com.ims + ims-api + + + com.ims + ims-service + + + org.springframework.boot + spring-boot-starter-web + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/backend/ims-web/replay_pid112402.log b/backend/ims-web/replay_pid112402.log new file mode 100644 index 0000000..ba38545 --- /dev/null +++ b/backend/ims-web/replay_pid112402.log @@ -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 ()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 ()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 ()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 (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 (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 (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 (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 ()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 ()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 (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 (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 (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 (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 ()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 (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 (IF)V 40 0 10864 0 0 +ciMethod java/util/HashMap (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 (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 ()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 ()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 (Ljava/util/Collection;)V 758 0 8178 0 0 +ciMethod java/util/ArrayList ()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 ()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 ()V 3 1 java/util/AbstractList ()V 4 1 java/util/AbstractCollection ()V 5 1 java/lang/Object ()V 1 8 java/util/ArrayList isEmpty ()Z 1 17 org/apache/maven/model/Plugin getExecutions ()Ljava/util/List; 2 12 java/util/ArrayList ()V 3 1 java/util/AbstractList ()V 4 1 java/util/AbstractCollection ()V 5 1 java/lang/Object ()V 1 28 java/util/ArrayList size ()I 1 35 java/util/ArrayList size ()I 1 43 java/util/LinkedHashMap (I)V 2 2 java/util/HashMap (I)V 3 4 java/util/HashMap (IF)V 4 1 java/util/AbstractMap ()V 5 1 java/lang/Object ()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 (Ljava/util/ArrayList;)V 3 6 java/lang/Object ()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 (Ljava/util/ArrayList;)V 3 6 java/lang/Object ()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 (Ljava/util/LinkedHashMap;)V 3 6 java/util/AbstractCollection ()V 4 1 java/lang/Object ()V 1 228 java/util/ArrayList (Ljava/util/Collection;)V 2 1 java/util/AbstractList ()V 3 1 java/util/AbstractCollection ()V 4 1 java/lang/Object ()V 1 231 org/apache/maven/model/Plugin setExecutions (Ljava/util/List;)V diff --git a/backend/ims-web/src/main/java/com/ims/web/AgentControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/AgentControllerImpl.java new file mode 100644 index 0000000..12ed489 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/AgentControllerImpl.java @@ -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 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> 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> 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> 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 suggest(@Valid @RequestBody AgentSuggestRequest request, + Authentication authentication) { + return ApiResponse.success(orchestratorService.suggest(request.getIssueId(), request.getGoal(), + requireUserId(authentication))); + } + + @PostMapping("/suggest-fields") + public ApiResponse> suggestFields(@Valid @RequestBody AgentSuggestFieldsRequest request) { + return ApiResponse.success(orchestratorService.suggestFields(request.getTitle(), request.getDescription())); + } + + @GetMapping("/memories") + public ApiResponse>> memories( + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "20") int pageSize) { + Page result = memoryService.list(page, pageSize); + PageResult> pageResult = new PageResult<>( + result.getContent().stream().map(this::toMemoryMap).toList(), + result.getTotalElements(), page, pageSize); + return ApiResponse.success(pageResult); + } + + @PostMapping("/memories") + public ApiResponse> createMemory(@Valid @RequestBody AgentMemoryRequest request) { + AgentMemory memory = memoryService.add(request.getIssueSummary(), request.getSolutionSteps()); + return ApiResponse.success(toMemoryMap(memory)); + } + + @DeleteMapping("/memories/{id}") + public ApiResponse deleteMemory(@PathVariable Long id) { + memoryService.delete(id); + return ApiResponse.success(null); + } + + @PutMapping("/memories/{id}") + public ApiResponse> 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> getConfig() { + return ApiResponse.success(agentConfigService.getConfig()); + } + + @PutMapping("/config") + public ApiResponse updateConfig(@RequestBody AgentConfigRequest request) { + agentConfigService.updateConfig(request); + return ApiResponse.success(null); + } + + @GetMapping("/overview") + public ApiResponse> 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> latestExecutions = new ArrayList<>(); + for (ToolExecution t : toolExecutionRepository.findTop15ByOrderByCreatedAtDesc()) { + latestExecutions.add(toExecutionMap(t)); + } + + // 趋势图数据:最近7天每小时的调用次数 + List> 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 point = new LinkedHashMap<>(); + point.put("hour", hourFormatter.format(hourStart)); + point.put("count", count); + trendData.add(point); + } + + Map 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>> 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 result = planRepository.findByApprovalStatusOrderByCreatedAtDesc(approvalStatus, pageable); + PageResult> pageResult = new PageResult<>( + result.getContent().stream().map(this::toPlanMap).toList(), + result.getTotalElements(), page, pageSize); + return ApiResponse.success(pageResult); + } + + @GetMapping("/tools") + public ApiResponse>> tools() { + List> result = new ArrayList<>(); + for (Map.Entry entry : toolRegistry.descriptions().entrySet()) { + Map 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 toPlanMap(AgentPlan plan) { + Map 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 toExecutionMap(ToolExecution t) { + Map 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 toMemoryMap(AgentMemory memory) { + Map 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(); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/AiAnalysisControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/AiAnalysisControllerImpl.java new file mode 100644 index 0000000..80dbc76 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/AiAnalysisControllerImpl.java @@ -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> batchGenerate(@RequestBody AiAnalysisRequest request, + Authentication authentication) { + int count = aiAnalysisService.batchGenerate(request, requireUserId(authentication)); + return ApiResponse.success(Map.of("submitted", count)); + } + + @GetMapping("/records") + public ApiResponse> 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 result = aiAnalysisService.records(id, page, pageSize, issueId, departmentId, status, startDate, endDate); + PageResult pageResult = new PageResult<>( + result.getContent(), result.getTotalElements(), page, pageSize); + return ApiResponse.success(pageResult); + } + + @GetMapping("/records/running") + public ApiResponse> running() { + return ApiResponse.success(aiAnalysisService.running()); + } + + @GetMapping("/call-logs") + public ApiResponse>> callLogs() { + List> result = new ArrayList<>(); + for (AiCallLog log : aiCallLogRepository.findTop20ByOrderByCreatedAtDesc()) { + Map 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> overviewStats( + @RequestParam(defaultValue = "14") int days) { + Map 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 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> statusDistribution = new ArrayList<>(); + for (Object[] row : statusRows) { + Map item = new LinkedHashMap<>(); + item.put("name", row[0]); + item.put("value", row[1]); + statusDistribution.add(item); + } + + List> categoryDistribution = new ArrayList<>(); + for (Object[] row : aiAnalysisRepository.countByCategoryGroup()) { + Map item = new LinkedHashMap<>(); + item.put("name", row[0]); + item.put("value", row[1]); + categoryDistribution.add(item); + } + + List> departmentDistribution = new ArrayList<>(); + for (Object[] row : aiAnalysisRepository.countByDepartmentGroup()) { + Map item = new LinkedHashMap<>(); + item.put("name", row[0]); + item.put("value", row[1]); + departmentDistribution.add(item); + } + + List> dailyTrend = new ArrayList<>(); + LocalDateTime since = java.time.LocalDate.now().minusDays(days).atStartOfDay(); + List trendRows = aiAnalysisRepository.dailyTrendGroup(since); + Map> 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 m = new LinkedHashMap<>(); + m.put("completed", 0L); + m.put("failed", 0L); + return m; + }).put(status, count); + } + for (Map.Entry> entry : dateMap.entrySet()) { + Map 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 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 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(); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/AiConfigControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/AiConfigControllerImpl.java new file mode 100644 index 0000000..4cccf79 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/AiConfigControllerImpl.java @@ -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 getConfig() { + return ApiResponse.success(aiConfigService.getConfig()); + } + + @PutMapping + public ApiResponse updateConfig(@RequestBody AiConfigRequest request) { + aiConfigService.updateConfig(request); + return ApiResponse.success(null); + } + + @PostMapping("/test") + public ApiResponse> test() { + return ApiResponse.success(modelRoutingService.test()); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/AuthControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/AuthControllerImpl.java new file mode 100644 index 0000000..43a5cde --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/AuthControllerImpl.java @@ -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 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> 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 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 refresh(@RequestBody Map 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, "")); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/DashboardControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/DashboardControllerImpl.java new file mode 100644 index 0000000..2eed089 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/DashboardControllerImpl.java @@ -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 stats() { + return ApiResponse.success(dashboardService.stats()); + } +} \ No newline at end of file diff --git a/backend/ims-web/src/main/java/com/ims/web/DepartmentControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/DepartmentControllerImpl.java new file mode 100644 index 0000000..9638e00 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/DepartmentControllerImpl.java @@ -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() { + 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 toMap(Department d) { + Map 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; + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/GlobalExceptionHandler.java b/backend/ims-web/src/main/java/com/ims/web/GlobalExceptionHandler.java new file mode 100644 index 0000000..d3c5912 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/GlobalExceptionHandler.java @@ -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 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 handleAccessDeniedException(AccessDeniedException e) { + return ApiResponse.error(ResultCode.FORBIDDEN); + } + + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ApiResponse handleTypeMismatch(MethodArgumentTypeMismatchException e) { + return ApiResponse.error(400, "参数格式不正确:" + e.getName() + " 必须为数字"); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ApiResponse 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 handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { + return ApiResponse.error(413, "文件大小超过限制,最大允许 50MB"); + } + + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ApiResponse handleException(Exception e) { + log.error("Unexpected error", e); + return ApiResponse.error(ResultCode.INTERNAL_ERROR); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/IMSApplication.java b/backend/ims-web/src/main/java/com/ims/web/IMSApplication.java new file mode 100644 index 0000000..9ad776a --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/IMSApplication.java @@ -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); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/ImportExportControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/ImportExportControllerImpl.java new file mode 100644 index 0000000..22c1c67 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/ImportExportControllerImpl.java @@ -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 uploadExcel(@RequestParam("file") MultipartFile file) { + return ApiResponse.success(importService.preview(file)); + } + + @PostMapping("/ai-validate") + public ApiResponse aiValidate(@RequestBody List rows) { + return ApiResponse.success(importService.aiValidate(rows)); + } + + @PostMapping("/confirm") + public ApiResponse confirm(@RequestBody ImportConfirmRequest request, + Authentication authentication) { + return ApiResponse.success(importService.confirm(request, authentication.getName())); + } + + @GetMapping("/records") + public ApiResponse> records(ImportRecordQueryRequest request) { + return ApiResponse.success(importService.records(request.getPage(), request.getPageSize())); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/IssueControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/IssueControllerImpl.java new file mode 100644 index 0000000..081d852 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/IssueControllerImpl.java @@ -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 create(@Valid @RequestBody IssueCreateRequest request, Authentication authentication) { + return ApiResponse.success(issueService.create(request, currentUser(authentication))); + } + + @GetMapping + public ApiResponse> list(@Valid IssueListRequest request) { + return ApiResponse.success(issueService.list(request)); + } + + @GetMapping("/{id}") + public ApiResponse detail(@PathVariable Long id) { + return ApiResponse.success(issueService.detail(id)); + } + + @GetMapping("/{id}/logs") + public ApiResponse>> logs(@PathVariable Long id) { + return ApiResponse.success(issueService.logs(id)); + } + + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody IssueUpdateRequest request, Authentication authentication) { + return ApiResponse.success(issueService.update(id, request, currentUser(authentication))); + } + + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id, Authentication authentication) { + issueService.delete(id, currentUser(authentication)); + return ApiResponse.success(null); + } + + @PatchMapping("/{id}/status") + public ApiResponse 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 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 uploadAttachment(@PathVariable Long id, + @RequestParam("file") MultipartFile file, + Authentication authentication) { + return ApiResponse.success(attachmentService.upload(id, file, currentUser(authentication))); + } + + @GetMapping("/{id}/attachments") + public ApiResponse> 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 deleteAttachment(@PathVariable Long id, @PathVariable Long attachmentId) { + attachmentService.delete(attachmentId); + return ApiResponse.success(null); + } + + private static final Map STATUS_CN = Map.of( + "draft", "草稿", "open", "待处理", "in_progress", "进行中", + "resolved", "已解决", "verified", "已验证", "closed", "已关闭", "rejected", "已驳回"); + + private static final Map 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 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> batchAssign(@Valid @RequestBody BatchAssignRequest request, + Authentication authentication) { + List 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> batchNotify(@RequestBody BatchNotifyRequest request, + Authentication authentication) { + List 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> batchAgent(@RequestBody BatchAgentRequest request, + Authentication authentication) { + List 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 planIds = new ArrayList<>(); + for (Long id : ids) { + Map 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("用户不存在")); + } +} \ No newline at end of file diff --git a/backend/ims-web/src/main/java/com/ims/web/KnowledgeControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/KnowledgeControllerImpl.java new file mode 100644 index 0000000..c28815a --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/KnowledgeControllerImpl.java @@ -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> documents( + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "20") int pageSize) { + Page result = knowledgeService.list(page, pageSize); + PageResult pageResult = new PageResult<>( + result.getContent(), result.getTotalElements(), page, pageSize); + return ApiResponse.success(pageResult); + } + + @PostMapping("/documents") + public ApiResponse 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 delete(@PathVariable Long id) { + knowledgeService.delete(id); + return ApiResponse.success(null); + } + + @PostMapping("/documents/{id}/reindex") + public ApiResponse reindex(@PathVariable Long id) { + knowledgeService.reindex(id); + return ApiResponse.success(null); + } + + @GetMapping("/search") + public ApiResponse> search(@Valid KnowledgeSearchRequest request) { + java.util.List results = searchService.search( + request.getQuery(), request.getTopK()); + PageResult pageResult = new PageResult<>( + results, results.size(), 1, results.size()); + return ApiResponse.success(pageResult); + } + + @GetMapping("/logs") + public ApiResponse> 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); + } +} diff --git a/backend/ims-web/src/main/java/com/ims/web/NotificationControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/NotificationControllerImpl.java new file mode 100644 index 0000000..c2316e5 --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/NotificationControllerImpl.java @@ -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> 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> unreadCount(Authentication authentication) { + return ApiResponse.success(Map.of("count", notificationService.unreadCount(currentUserId(authentication)))); + } + + @PatchMapping("/{id}/read") + public ApiResponse markRead(@PathVariable Long id, Authentication authentication) { + notificationService.markRead(id, currentUserId(authentication)); + return ApiResponse.success(null); + } + + @PostMapping("/read-all") + public ApiResponse 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(); + } +} \ No newline at end of file diff --git a/backend/ims-web/src/main/java/com/ims/web/PromptControllerImpl.java b/backend/ims-web/src/main/java/com/ims/web/PromptControllerImpl.java new file mode 100644 index 0000000..c51008c --- /dev/null +++ b/backend/ims-web/src/main/java/com/ims/web/PromptControllerImpl.java @@ -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> list( + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "20") int pageSize) { + Page result = promptService.list(page, pageSize); + PageResult pageResult = new PageResult<>( + result.getContent(), result.getTotalElements(), page, pageSize); + return ApiResponse.success(pageResult); + } + + @GetMapping("/{templateId}") + public ApiResponse detail(@PathVariable String templateId) { + return ApiResponse.success(promptService.detail(templateId)); + } + + @PostMapping + public ApiResponse create(@Valid @RequestBody PromptTemplateRequest request) { + return ApiResponse.success(promptService.create(request)); + } + + @PutMapping("/{templateId}") + public ApiResponse update(@PathVariable String templateId, + @RequestBody PromptTemplateRequest request) { + return ApiResponse.success(promptService.update(templateId, request)); + } + + @PostMapping("/{templateId}/rollback") + public ApiResponse rollback(@PathVariable String templateId, + @RequestParam int version) { + return ApiResponse.success(promptService.rollback(templateId, version)); + } + + @PostMapping("/{templateId}/test") + public ApiResponse> 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>> versions(@PathVariable String templateId) { + return ApiResponse.success(promptService.versions(templateId)); + } + + @GetMapping("/logs") + public ApiResponse> logs( + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "20") int pageSize) { + Page result = promptService.logs(page, pageSize); + PageResult pageResult = new PageResult<>( + result.getContent(), result.getTotalElements(), page, pageSize); + return ApiResponse.success(pageResult); + } + + @GetMapping("/stats") + public ApiResponse> stats() { + return ApiResponse.success(promptService.stats()); + } +} diff --git a/backend/ims-web/src/main/resources/application-dev.yml b/backend/ims-web/src/main/resources/application-dev.yml new file mode 100644 index 0000000..4ef5ad0 --- /dev/null +++ b/backend/ims-web/src/main/resources/application-dev.yml @@ -0,0 +1,10 @@ +spring: + jpa: + show-sql: true + flyway: + enabled: true + +logging: + level: + com.ims: DEBUG + org.springframework.security: DEBUG diff --git a/backend/ims-web/src/main/resources/application-prod.yml b/backend/ims-web/src/main/resources/application-prod.yml new file mode 100644 index 0000000..b656d18 --- /dev/null +++ b/backend/ims-web/src/main/resources/application-prod.yml @@ -0,0 +1,3 @@ +spring: + jpa: + show-sql: false diff --git a/backend/ims-web/src/main/resources/application.yml b/backend/ims-web/src/main/resources/application.yml new file mode 100644 index 0000000..c623eb2 --- /dev/null +++ b/backend/ims-web/src/main/resources/application.yml @@ -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 diff --git a/backend/ims-web/src/main/resources/templates/レビュー記録表.xlsx b/backend/ims-web/src/main/resources/templates/レビュー記録表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3a7fac936f320da8bf6fa0877a8520334434e48e GIT binary patch literal 12613028 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 z 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

!I25-G`cpfo2>k7^*6fr}2hE2a

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%0AEzeu_ebCpxBC=Jk=-a&mEtFVheBL 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�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

6@-Uli(Sj=i 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%0DjtHJV&M)0y{ydc8G&|9Ex<`8P}9 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 VUia{-^y%+!OKk{tnYM4* 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

rTpo?!z5bj9&Rn0cjPMI0f+L+hX+}Y0x$>- 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�*meQpsYYzj$IQzzd*}vO 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