From 537fba0e0662b8f8b0d049df965ca19d7a7d8810 Mon Sep 17 00:00:00 2001 From: wxlong Date: Tue, 25 Nov 2025 17:51:39 +0800 Subject: [PATCH] =?UTF-8?q?20251124=E7=82=B3=E8=BE=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 45 + .mvn/wrapper/MavenWrapperDownloader.java | 114 + .mvn/wrapper/maven-wrapper.jar | Bin 0 -> 48337 bytes .mvn/wrapper/maven-wrapper.properties | 1 + Dockerfile | 9 + ModifyLog.md | 4 + README.md | 103 + docker-compose.yaml | 41 + docs/任务自动分配.md | 23 + docs/数据状态码字段.md | 35 + environment_check.sh | 0 hs_err_pid15872.log | 427 ++ hs_err_pid17356.log | 532 +++ hs_err_pid26132.log | 335 ++ libs/gdal.jar | Bin 0 -> 207526 bytes libs/gdalalljni.dll | Bin 0 -> 667648 bytes mvnw | 286 ++ mvnw.cmd | 161 + nginx/conf/fastcgi.conf | 26 + nginx/conf/fastcgi_params | 25 + nginx/conf/koi-utf | 109 + nginx/conf/koi-win | 103 + nginx/conf/mime.types | 97 + nginx/conf/nginx.conf | 72 + nginx/conf/scgi_params | 17 + nginx/conf/uwsgi_params | 17 + nginx/conf/win-utf | 126 + pom.xml | 314 ++ postgres/Dockerfile | 10 + postgres/schema.sql | 954 ++++ postgres/tables.sql | 143 + replay_pid26132.log | 4030 +++++++++++++++++ .../java/cn/edu/whu/boot/BootApplication.java | 79 + .../controllers/DraftController.java | 93 + .../controllers/ImageController.java | 329 ++ .../controllers/RouteLineController.java | 139 + .../controllers/TaskController.java | 1357 ++++++ .../allocation/controllers/dtos/Cell.java | 50 + .../dtos/CustomFeatureCollection.java | 44 + .../allocation/controllers/dtos/Data.java | 59 + .../controllers/dtos/ImageWithUrl.java | 89 + .../controllers/dtos/MapServerContents.java | 13 + .../dtos/MapServerInitialExtent.java | 43 + .../controllers/dtos/MapServerRoot.java | 13 + .../allocation/controllers/dtos/Pair.java | 10 + .../controllers/dtos/TableField.java | 71 + .../allocation/controllers/dtos/Worker.java | 106 + .../whu/boot/allocation/entities/Draft.java | 60 + .../whu/boot/allocation/entities/Image.java | 90 + .../boot/allocation/entities/RouteLine.java | 103 + .../boot/allocation/entities/TaskCell.java | 79 + .../allocation/entities/TaskCellData.java | 67 + .../boot/allocation/entities/TaskToUser.java | 68 + .../allocation/entities/TaskUserCell.java | 71 + .../allocation/entities/TaskUserRole.java | 67 + .../exceptions/InvalidAssignmentStatus.java | 11 + .../exceptions/InvalidShapefileException.java | 10 + .../InvalidUserRoleCodeException.java | 11 + .../boot/allocation/mapper/DraftMapper.java | 13 + .../boot/allocation/mapper/ImageMapper.java | 59 + .../allocation/mapper/RouteLineMapper.java | 20 + .../allocation/mapper/SimpleTaskMapper.java | 17 + .../allocation/mapper/TaskCellDataMapper.java | 179 + .../allocation/mapper/TaskCellMapper.java | 52 + .../allocation/mapper/TaskUserCellMapper.java | 120 + .../allocation/mapper/TaskUserRoleMapper.java | 87 + .../allocation/services/DraftService.java | 8 + .../allocation/services/ImageService.java | 26 + .../allocation/services/RouteLineService.java | 15 + .../services/TaskCellDataService.java | 37 + .../allocation/services/TaskCellService.java | 21 + .../allocation/services/TaskInfoService.java | 92 + .../services/TaskUserCellService.java | 37 + .../services/TaskUserRoleService.java | 34 + .../services/impl/DraftServiceImpl.java | 21 + .../services/impl/ImageServiceImpl.java | 61 + .../services/impl/RouteLineServiceImpl.java | 45 + .../impl/TaskCellDataServiceImpl.java | 165 + .../services/impl/TaskCellServiceImpl.java | 62 + .../services/impl/TaskInfoServiceImpl.java | 300 ++ .../impl/TaskUserCellServiceImpl.java | 129 + .../services/impl/TaskUserRoleImpl.java | 84 + .../controller/ApkVersionController.java | 32 + .../apkversion/mapper/ApkVersionMapper.java | 12 + .../apkversion/service/ApkVersionService.java | 38 + .../collection/controller/BaseController.java | 438 ++ .../controller/DefaultController.java | 18 + .../controller/ExportController.java | 1170 +++++ .../collection/controller/GetController.java | 1983 ++++++++ .../controller/ImportController.java | 457 ++ .../collection/domain/ExportMediaRecord.java | 173 + .../collection/domain/ExportUserRecord.java | 31 + .../collection/domain/MultimediaItem.java | 225 + .../boot/collection/domain/TaskSelectId.java | 89 + .../whu/boot/collection/dto/CompositeKey.java | 44 + .../edu/whu/boot/collection/dto/Feature.java | 47 + .../whu/boot/collection/dto/GeometryType.java | 36 + .../edu/whu/boot/collection/dto/SqlEnity.java | 44 + .../edu/whu/boot/collection/dto/WebLog.java | 149 + .../boot/collection/mapper/BaseMapper.java | 65 + .../collection/mapper/MultimediaMapper.java | 30 + .../collection/mapper/SearchPageMapper.java | 26 + .../collection/mapper/TaskSelectIdMapper.java | 21 + .../boot/collection/mapper/UpdateMapper.java | 27 + .../collection/service/ExportService.java | 10 + .../service/ExportWriterService.java | 9 + .../boot/collection/service/IBaseService.java | 170 + .../service/IMultimediaService.java | 36 + .../service/ISearchPageService.java | 16 + .../service/ITaskSelectIdService.java | 28 + .../collection/service/ImportService.java | 32 + .../service/impl/BaseServiceImpl.java | 935 ++++ .../service/impl/CSVExportWriterService.java | 41 + .../service/impl/ExportServiceImpl.java | 44 + .../impl/ITaskSelectIdServiceImpl.java | 50 + .../service/impl/ImportServiceImpl.java | 684 +++ .../service/impl/MultimediaServiceImpl.java | 125 + .../service/impl/SearchPageServiceImpl.java | 47 + .../boot/common/component/WebLogAspect.java | 103 + .../boot/common/config/BaseRedisConfig.java | 62 + .../boot/common/domain/CommonConstant.java | 274 ++ .../whu/boot/common/domain/ExceptionInfo.java | 58 + .../common/domain/GlobalExceptionHandler.java | 89 + .../boot/common/domain/RedisExpireTime.java | 28 + .../whu/boot/common/domain/ResultMessage.java | 123 + .../boot/common/domain/SqlStringConstant.java | 97 + .../whu/boot/common/domain/StatusCode.java | 37 + .../whu/boot/common/service/CacheService.java | 26 + .../whu/boot/common/service/RedisService.java | 181 + .../common/service/impl/CacheServiceImpl.java | 32 + .../common/service/impl/RedisServiceImpl.java | 199 + .../utils/allocation/ArcGisGeoJsonParser.java | 195 + .../common/utils/allocation/GeohashUtil.java | 134 + .../utils/allocation/KMeansClustering.java | 34 + .../MixedEndianDataInputStream.java | 52 + .../utils/allocation/PiEncryptUtils.java | 153 + .../common/utils/allocation/PointWrapper.java | 23 + .../allocation/ShapefileGeometryCursor.java | 173 + .../utils/allocation/TpkEncryptHelper.java | 115 + .../utils/allocation/dtos/Envelope.java | 63 + .../utils/allocation/dtos/MultiPoint.java | 27 + .../common/utils/allocation/dtos/Point.java | 39 + .../common/utils/allocation/dtos/Polygon.java | 27 + .../utils/allocation/dtos/Polyline.java | 27 + .../allocation/dtos/SpatialReference.java | 15 + .../utils/collection/DbTypeMappingUtil.java | 30 + .../common/utils/collection/EncryptUtils.java | 97 + .../common/utils/collection/OtherUtil.java | 256 ++ .../utils/collection/PostgreSqlUtil.java | 52 + .../utils/collection/ShapeTypeUtil.java | 110 + .../utils/collection/StoreMediaFileUtil.java | 161 + .../utils/collection/TableOperationUtil.java | 238 + .../common/utils/user/PasswordEncoder.java | 28 + .../common/utils/xml/CheckTableDataUtil.java | 342 ++ .../common/utils/xml/GenerateSqlUtil.java | 556 +++ .../common/utils/xml/JsonToElementUtil.java | 274 ++ .../common/utils/xml/XmlFileToJsonUtil.java | 125 + .../whu/boot/message/bean/ChatMessage.java | 47 + .../edu/whu/boot/message/bean/Position.java | 57 + .../whu/boot/message/bean/RequestMessage.java | 25 + .../boot/message/bean/ResponseMessage.java | 25 + .../whu/boot/message/bean/ResultMessage.java | 81 + .../cn/edu/whu/boot/message/bean/Team.java | 46 + .../cn/edu/whu/boot/message/bean/Worker.java | 53 + .../message/configure/SchedulerConfig.java | 9 + .../message/configure/WebSocketConfig.java | 32 + .../message/controller/ChatController.java | 138 + .../controller/GreetingController.java | 49 + .../controller/LocationController.java | 80 + .../message/interceptor/ChatInterceptor.java | 28 + .../controller/PhotoZipController.java | 104 + .../boot/photozip/mapper/PhotoZipMapper.java | 20 + .../whu/boot/photozip/model/MediaFile.java | 13 + .../photozip/service/PhotoZipService.java | 14 + .../service/impl/PhotoZipServiceImpl.java | 146 + .../edu/whu/boot/photozip/util/XmlUtil.java | 30 + .../edu/whu/boot/photozip/util/ZipUtil.java | 74 + .../whu/boot/statistics/bean/Collector.java | 60 + .../statistics/bean/CollectorWorkload.java | 27 + .../statistics/bean/ReviewerWorkload.java | 60 + .../whu/boot/statistics/bean/RouteLine.java | 47 + .../boot/statistics/bean/UserWorkload.java | 120 + .../controller/BasicStatController.java | 44 + .../controller/ProgressStatController.java | 102 + .../controller/ReportController.java | 34 + .../statistics/mapper/BasicStatMapper.java | 19 + .../statistics/mapper/CollectorMapper.java | 36 + .../statistics/mapper/ProgressStatMapper.java | 30 + .../statistics/service/BasicStatService.java | 95 + .../service/ProgressStatService.java | 108 + .../statistics/service/ReportService.java | 293 ++ .../components/CustomSessionListener.java | 34 + .../edu/whu/boot/user/config/CORSConfig.java | 16 + .../edu/whu/boot/user/config/ShiroConfig.java | 169 + .../boot/user/controllers/UserController.java | 545 +++ .../dtos/UserWithoutPrivateInfo.java | 63 + .../whu/boot/user/entities/Permission.java | 28 + .../cn/edu/whu/boot/user/entities/Role.java | 39 + .../boot/user/entities/RoleToPermission.java | 38 + .../cn/edu/whu/boot/user/entities/User.java | 88 + .../boot/user/mapper/PermissionMapper.java | 32 + .../edu/whu/boot/user/mapper/RoleMapper.java | 19 + .../user/mapper/RoleToPermissionMapper.java | 14 + .../edu/whu/boot/user/mapper/UserMapper.java | 88 + .../edu/whu/boot/user/realms/UserRealm.java | 120 + .../user/services/PermissionCacheService.java | 13 + .../boot/user/services/PermissionService.java | 14 + .../whu/boot/user/services/RoleService.java | 13 + .../services/RoleToPermissionService.java | 7 + .../boot/user/services/SessionService.java | 27 + .../whu/boot/user/services/UserService.java | 53 + .../impl/PermissionCacheServiceImpl.java | 53 + .../services/impl/PermissionServiceImpl.java | 45 + .../user/services/impl/RoleServiceImpl.java | 35 + .../impl/RoleToPermissionServiceImpl.java | 28 + .../services/impl/SessionServiceImpl.java | 75 + .../user/services/impl/UserServiceImpl.java | 179 + .../controller/DataBaseTableController.java | 112 + .../controller/TaskManagementController.java | 484 ++ .../XmlFileManagementController.java | 79 + .../edu/whu/boot/xml/domain/RedisKeyType.java | 32 + .../java/cn/edu/whu/boot/xml/domain/Task.java | 206 + .../edu/whu/boot/xml/domain/TaskExample.java | 991 ++++ .../cn/edu/whu/boot/xml/domain/XmlEnity.java | 90 + .../whu/boot/xml/domain/XmlEnityExample.java | 591 +++ .../edu/whu/boot/xml/dto/FrontEndConfig.java | 33 + .../edu/whu/boot/xml/dto/FrontEndField.java | 276 ++ .../cn/edu/whu/boot/xml/dto/FrontEndMeta.java | 67 + .../edu/whu/boot/xml/dto/FrontEndSelect.java | 41 + .../edu/whu/boot/xml/dto/FrontEndTable.java | 59 + .../edu/whu/boot/xml/mapper/TableMapper.java | 10 + .../edu/whu/boot/xml/mapper/TaskMapper.java | 36 + .../whu/boot/xml/mapper/XmlEnityMapper.java | 34 + .../whu/boot/xml/service/ITableService.java | 13 + .../whu/boot/xml/service/ITaskService.java | 65 + .../boot/xml/service/IXmlEnityService.java | 13 + .../xml/service/impl/TableServiceImpl.java | 33 + .../xml/service/impl/TaskServiceImpl.java | 241 + .../xml/service/impl/XmlEnityServiceImpl.java | 29 + .../boot/xml/xmlreader/XmlTemplateReader.java | 306 ++ .../whu/boot/xml/xmlreader/bean/Config.java | 49 + .../whu/boot/xml/xmlreader/bean/Field.java | 295 ++ .../whu/boot/xml/xmlreader/bean/Group.java | 30 + .../whu/boot/xml/xmlreader/bean/Layer.java | 64 + .../edu/whu/boot/xml/xmlreader/bean/Meta.java | 65 + .../whu/boot/xml/xmlreader/bean/Select.java | 50 + .../whu/boot/xml/xmlreader/bean/Table.java | 86 + .../whu/boot/xml/xmlreader/bean/ViewType.java | 20 + src/main/resources/application.properties | 74 + src/main/resources/config/ehcache.xml | 16 + .../mapper/PhotoZipMapper/PhotoZipMapper.xml | 39 + .../mapper/allocation/DraftMapper.xml | 16 + .../mapper/allocation/RouteLineMapper.xml | 28 + .../mapper/apkversion/ApkVersionMapper.xml | 19 + .../mapper/collection/BaseMapper.xml | 99 + .../mapper/collection/MultimediaMapper.xml | 73 + .../mapper/collection/SearchPageMapper.xml | 39 + .../mapper/collection/TableMapper.xml | 8 + .../mapper/collection/TaskSelectIdMapper.xml | 36 + .../mapper/collection/UpdateMapper.xml | 41 + .../mapper/statistics/BasicStatMapper.xml | 23 + .../mapper/statistics/CollectorMapper.xml | 79 + .../mapper/statistics/ProgressStatMapper.xml | 47 + src/main/resources/mapper/xml/TaskMapper.xml | 364 ++ .../resources/mapper/xml/XmlEnityMapper.xml | 234 + .../cn/edu/whu/boot/BootApplicationTests.java | 35 + 字段排序.csv | 118 + 对应关系v1.txt | 28 + 数据下载需求.pdf | Bin 0 -> 706459 bytes 269 files changed, 34909 insertions(+) create mode 100644 .gitignore create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java create mode 100644 .mvn/wrapper/maven-wrapper.jar create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 Dockerfile create mode 100644 ModifyLog.md create mode 100644 README.md create mode 100644 docker-compose.yaml create mode 100644 docs/任务自动分配.md create mode 100644 docs/数据状态码字段.md create mode 100644 environment_check.sh create mode 100644 hs_err_pid15872.log create mode 100644 hs_err_pid17356.log create mode 100644 hs_err_pid26132.log create mode 100644 libs/gdal.jar create mode 100644 libs/gdalalljni.dll create mode 100644 mvnw create mode 100644 mvnw.cmd create mode 100644 nginx/conf/fastcgi.conf create mode 100644 nginx/conf/fastcgi_params create mode 100644 nginx/conf/koi-utf create mode 100644 nginx/conf/koi-win create mode 100644 nginx/conf/mime.types create mode 100644 nginx/conf/nginx.conf create mode 100644 nginx/conf/scgi_params create mode 100644 nginx/conf/uwsgi_params create mode 100644 nginx/conf/win-utf create mode 100644 pom.xml create mode 100644 postgres/Dockerfile create mode 100644 postgres/schema.sql create mode 100644 postgres/tables.sql create mode 100644 replay_pid26132.log create mode 100644 src/main/java/cn/edu/whu/boot/BootApplication.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/DraftController.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/ImageController.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/RouteLineController.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/TaskController.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Cell.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/CustomFeatureCollection.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Data.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/ImageWithUrl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerContents.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerInitialExtent.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerRoot.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Pair.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/TableField.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Worker.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/Draft.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/Image.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/RouteLine.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/TaskCell.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/TaskCellData.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/TaskToUser.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserCell.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserRole.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidAssignmentStatus.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidShapefileException.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidUserRoleCodeException.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/DraftMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/ImageMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/RouteLineMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/SimpleTaskMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellDataMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserCellMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserRoleMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/DraftService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/ImageService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/RouteLineService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/TaskCellDataService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/TaskCellService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/TaskInfoService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/TaskUserCellService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/TaskUserRoleService.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/DraftServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/ImageServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/RouteLineServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellDataServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskInfoServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserCellServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserRoleImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/apkversion/controller/ApkVersionController.java create mode 100644 src/main/java/cn/edu/whu/boot/apkversion/mapper/ApkVersionMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/apkversion/service/ApkVersionService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/controller/BaseController.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/controller/DefaultController.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/controller/ExportController.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/controller/GetController.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/controller/ImportController.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/domain/ExportMediaRecord.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/domain/ExportUserRecord.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/domain/MultimediaItem.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/domain/TaskSelectId.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/dto/CompositeKey.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/dto/Feature.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/dto/GeometryType.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/dto/SqlEnity.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/dto/WebLog.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/mapper/BaseMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/mapper/MultimediaMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/mapper/SearchPageMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/mapper/TaskSelectIdMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/mapper/UpdateMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/ExportService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/ExportWriterService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/IBaseService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/IMultimediaService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/ISearchPageService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/ITaskSelectIdService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/ImportService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/BaseServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/CSVExportWriterService.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/ExportServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/ITaskSelectIdServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/ImportServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/MultimediaServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/collection/service/impl/SearchPageServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/common/component/WebLogAspect.java create mode 100644 src/main/java/cn/edu/whu/boot/common/config/BaseRedisConfig.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/CommonConstant.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/ExceptionInfo.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/GlobalExceptionHandler.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/RedisExpireTime.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/ResultMessage.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/SqlStringConstant.java create mode 100644 src/main/java/cn/edu/whu/boot/common/domain/StatusCode.java create mode 100644 src/main/java/cn/edu/whu/boot/common/service/CacheService.java create mode 100644 src/main/java/cn/edu/whu/boot/common/service/RedisService.java create mode 100644 src/main/java/cn/edu/whu/boot/common/service/impl/CacheServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/common/service/impl/RedisServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/ArcGisGeoJsonParser.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/GeohashUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/KMeansClustering.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/MixedEndianDataInputStream.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/PiEncryptUtils.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/PointWrapper.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/ShapefileGeometryCursor.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/TpkEncryptHelper.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Envelope.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/MultiPoint.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Point.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polygon.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polyline.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/SpatialReference.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/DbTypeMappingUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/EncryptUtils.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/OtherUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/PostgreSqlUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/ShapeTypeUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/StoreMediaFileUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/collection/TableOperationUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/user/PasswordEncoder.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/xml/CheckTableDataUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/xml/GenerateSqlUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/xml/JsonToElementUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/common/utils/xml/XmlFileToJsonUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/ChatMessage.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/Position.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/RequestMessage.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/ResponseMessage.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/ResultMessage.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/Team.java create mode 100644 src/main/java/cn/edu/whu/boot/message/bean/Worker.java create mode 100644 src/main/java/cn/edu/whu/boot/message/configure/SchedulerConfig.java create mode 100644 src/main/java/cn/edu/whu/boot/message/configure/WebSocketConfig.java create mode 100644 src/main/java/cn/edu/whu/boot/message/controller/ChatController.java create mode 100644 src/main/java/cn/edu/whu/boot/message/controller/GreetingController.java create mode 100644 src/main/java/cn/edu/whu/boot/message/controller/LocationController.java create mode 100644 src/main/java/cn/edu/whu/boot/message/interceptor/ChatInterceptor.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/controller/PhotoZipController.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/mapper/PhotoZipMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/model/MediaFile.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/service/PhotoZipService.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/service/impl/PhotoZipServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/util/XmlUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/photozip/util/ZipUtil.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/bean/Collector.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/bean/CollectorWorkload.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/bean/ReviewerWorkload.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/bean/RouteLine.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/bean/UserWorkload.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/controller/BasicStatController.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/controller/ProgressStatController.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/controller/ReportController.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/mapper/BasicStatMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/mapper/CollectorMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/mapper/ProgressStatMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/service/BasicStatService.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/service/ProgressStatService.java create mode 100644 src/main/java/cn/edu/whu/boot/statistics/service/ReportService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/components/CustomSessionListener.java create mode 100644 src/main/java/cn/edu/whu/boot/user/config/CORSConfig.java create mode 100644 src/main/java/cn/edu/whu/boot/user/config/ShiroConfig.java create mode 100644 src/main/java/cn/edu/whu/boot/user/controllers/UserController.java create mode 100644 src/main/java/cn/edu/whu/boot/user/controllers/dtos/UserWithoutPrivateInfo.java create mode 100644 src/main/java/cn/edu/whu/boot/user/entities/Permission.java create mode 100644 src/main/java/cn/edu/whu/boot/user/entities/Role.java create mode 100644 src/main/java/cn/edu/whu/boot/user/entities/RoleToPermission.java create mode 100644 src/main/java/cn/edu/whu/boot/user/entities/User.java create mode 100644 src/main/java/cn/edu/whu/boot/user/mapper/PermissionMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/user/mapper/RoleMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/user/mapper/RoleToPermissionMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/user/mapper/UserMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/user/realms/UserRealm.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/PermissionCacheService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/PermissionService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/RoleService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/RoleToPermissionService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/SessionService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/UserService.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/impl/PermissionCacheServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/impl/PermissionServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/impl/RoleServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/impl/RoleToPermissionServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/impl/SessionServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/user/services/impl/UserServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/controller/DataBaseTableController.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/controller/TaskManagementController.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/controller/XmlFileManagementController.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/domain/RedisKeyType.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/domain/Task.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/domain/TaskExample.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/domain/XmlEnity.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/domain/XmlEnityExample.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/dto/FrontEndConfig.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/dto/FrontEndField.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/dto/FrontEndMeta.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/dto/FrontEndSelect.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/dto/FrontEndTable.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/mapper/TableMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/mapper/TaskMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/mapper/XmlEnityMapper.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/service/ITableService.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/service/ITaskService.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/service/IXmlEnityService.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/service/impl/TableServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/service/impl/TaskServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/service/impl/XmlEnityServiceImpl.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/XmlTemplateReader.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Config.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Field.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Group.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Layer.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Meta.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Select.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Table.java create mode 100644 src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/ViewType.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/config/ehcache.xml create mode 100644 src/main/resources/mapper/PhotoZipMapper/PhotoZipMapper.xml create mode 100644 src/main/resources/mapper/allocation/DraftMapper.xml create mode 100644 src/main/resources/mapper/allocation/RouteLineMapper.xml create mode 100644 src/main/resources/mapper/apkversion/ApkVersionMapper.xml create mode 100644 src/main/resources/mapper/collection/BaseMapper.xml create mode 100644 src/main/resources/mapper/collection/MultimediaMapper.xml create mode 100644 src/main/resources/mapper/collection/SearchPageMapper.xml create mode 100644 src/main/resources/mapper/collection/TableMapper.xml create mode 100644 src/main/resources/mapper/collection/TaskSelectIdMapper.xml create mode 100644 src/main/resources/mapper/collection/UpdateMapper.xml create mode 100644 src/main/resources/mapper/statistics/BasicStatMapper.xml create mode 100644 src/main/resources/mapper/statistics/CollectorMapper.xml create mode 100644 src/main/resources/mapper/statistics/ProgressStatMapper.xml create mode 100644 src/main/resources/mapper/xml/TaskMapper.xml create mode 100644 src/main/resources/mapper/xml/XmlEnityMapper.xml create mode 100644 src/test/java/cn/edu/whu/boot/BootApplicationTests.java create mode 100644 字段排序.csv create mode 100644 对应关系v1.txt create mode 100644 数据下载需求.pdf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1268508 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ + +# front-end code +src/main/resources/static/ +src/main/resources/templates/ + +# NGINX +nginx/* +!nginx/conf/ + +# application.properties +src/main/resources/*.properties +!src/main/resources/application.properties + +static \ No newline at end of file diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..72308aa --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,114 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..01e67997377a393fd672c7dcde9dccbedf0cb1e9 GIT binary patch literal 48337 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 --server.port=9001 + ``` + - 如果编写了启动脚本,还可以将脚本的快捷方式放在 Startup 目录下(执行 `shell:common startup` 命令可打开该目录),这样系统重启时后端工程也会跟着重启 +5. 将[这个文件](nginx/conf/nginx.conf)作为模板配置 Nginx,然后运行 `nginx.exe` 启动 NGINX 服务器。 + + +## 将 NGINX 和 Redis 注册为 Windows 服务 + +1. 关闭正在运行的 NGINX(通过 `nginx.exe -s stop` 命令关闭) 和 Redis 实例; +2. 下载并解压 [NSSM](http://nssm.cc/download),以管理员身份在相应的解压目录下启动一个 Powershell 窗口,执行命令 `nssm install`,将 `nginx.exe` 和 `redis-server.exe` 注册为 Windows 服务; +3. 通过 [`Start-Service`](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-service?view=powershell-7.2) 命令启动服务: + +```powershell +> Start-Service "nginx" +> Start-Service "redis" +``` \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..e37d2ec --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,41 @@ +version: "3.7" + +services: + backend: + build: . + container_name: tj-project-app + ports: + - 9001:9000 + restart: always + volumes: + - ./mount/backend:/usr/local/data + networks: + - spring-postgres + depends_on: + - db + - redis + db: + build: ./postgres + container_name: tj-project-db + ports: + - 5433:5432 + restart: always + volumes: + - ./mount/db:/var/lib/postgresql/data + networks: + - spring-postgres + environment: + - POSTGRES_DB=tj_project + - POSTGRES_PASSWORD=admin503 + redis: + image: redis + container_name: tj-project-redis + volumes: + - ./mount/redis:/usr/local/etc/redis + expose: + - 6379 + networks: + - spring-postgres + +networks: + spring-postgres: \ No newline at end of file diff --git a/docs/任务自动分配.md b/docs/任务自动分配.md new file mode 100644 index 0000000..3fd792d --- /dev/null +++ b/docs/任务自动分配.md @@ -0,0 +1,23 @@ +从总体上看,任务自动分配可以分为两部分,一个是分配工作区域,另一个是分配数据。 + +# 分配工作区域 + +目前工作工作区域分配的前提是用户已经上传了包含整个工作区域信息的 Shapefile。 + +如果用户设置了 [Geohash](https://halfrost.com/go_spatial_search/) 精度,将整个工作区域的外接矩形按照用户选择的精度划分为若干个 Geohash 网格(如果按照用户选择的精度划分出的网格数量小于外业人员数量,则尝试将精度加 1 后再次划分),然后将这些网格尽可能平均地分配给外业人员。 + +如果用户没有指定 Geohash 精度,则按照以下方法将 Shapefile 中的多边形分配给外业人员: + +1. 如果多边形数量等于外业人员数量,随机分配; +2. 如果多边形数量大于 1 但小于外业人员数量,以多边形的面积为权重进行分配,即多边形的面积越大,分配到的人员数量就越多; +3. 如果多边形数量大于外业人员数量,对多边形进行 k-means 聚类,类簇数量等于外业人员数量,然后随机分配每个类簇; +4. 如果只有一个多边形而且外业人员数量大于 1,将这个多边形的外接矩形按照合适的 Geohash 精度划分为若干个网格,然后将这些网格尽可能平均地分配给外业人员;确定 Geohash 精度的原则是保证划分后得到的网格数量不小于外业人员数量。 + +# 分配数据 + +如果用户提前导入了一些数据,则需要按照以下方法分配数据: + +1. 如果只有一个外业人员,将所有数据都分配给该人员; +2. 如果外业人员数量大于 1,首先计算每个数据的质心(坐标相同的质心只保留一个),然后按照以下方法分配: + 1. 如果质心数量小于外业人员数量,将所有数据尽可能平均地分配给外业人员; + 2. 否则,将质心进行聚类,类簇数量等于外业人员数量,然后随机分配每个类簇。 \ No newline at end of file diff --git a/docs/数据状态码字段.md b/docs/数据状态码字段.md new file mode 100644 index 0000000..8574e11 --- /dev/null +++ b/docs/数据状态码字段.md @@ -0,0 +1,35 @@ +在数据库中,每条数据都有 3 个字段: + +- `collector`:这条数据的上传者的 ID; +- `reviewer`:需要到实地对这条数据进行**核查**的外业人员的 ID,大多数情况下 `collector != reviewer`; +- `status`:状态字段。 + +将这 3 个字段结合起来分析,可以识别一条数据在整个工作流程中当前所处的阶段。 + +一条数据从被导入数据库中到被核查,会经历以下 3 个阶段: + +| collector | reviewer | status | 阶段 | +| --------- |----------| ------ |---------------------| +| -1 | -1 | 0 | 数据刚被导入到数据库中 | +| -1 | A | 0 | 管理员将数据分配给外业人员 A | +| -1 | A | 1 | 外业人员 A 已经在实地核查过这条数据 | + +如果一条数据原本不在数据库中(即所谓的“新增”数据),那么它从被上传到被核查,会经历以下 3 个阶段: + +| collector | reviewer | status | 阶段 | +|-----------|----------|--------|---------------------| +| A | -1 | 1 | 外业人员 A 上传了这条数据 | +| A | B | 0 | 管理员将数据分配给外业人员 B | +| A | B | 1 | 外业人员 B 已经在实地核查过这条数据 | + +管理员还可以在网页端对**已经被外业人员核查过的数据**进行审核,如果管理员认为数据没问题,则标记为审核通过: + +| status | +|--------| +| 2 | + +如果管理员将数据标记为审核未通过: + +| status | +|--------| +| -1 | diff --git a/environment_check.sh b/environment_check.sh new file mode 100644 index 0000000..e69de29 diff --git a/hs_err_pid15872.log b/hs_err_pid15872.log new file mode 100644 index 0000000..fc890a6 --- /dev/null +++ b/hs_err_pid15872.log @@ -0,0 +1,427 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000000, pid=15872, tid=0x0000000000003de0 +# +# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09) +# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops) +# Problematic frame: +# C 0x0000000000000000 +# +# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows +# +# If you would like to submit a bug report, please visit: +# http://bugreport.java.com/bugreport/crash.jsp +# + +--------------- T H R E A D --------------- + +Current thread (0x000000002752a800): VMThread [stack: 0x000000002bca0000,0x000000002bda0000] [id=15840] + +siginfo: ExceptionCode=0xc0000005, ExceptionInformation=0x0000000000000008 0x0000000000000000 + +Registers: +RAX=0x000000002f9e8450, RBX=0x00000000373ad4c0, RCX=0x000000003749b0f0, RDX=0x0000000000000000 +RSP=0x000000002bd9edb8, RBP=0x00007ffbedd4ed40, RSI=0x0000000000000002, RDI=0x000000002fa2c450 +R8 =0x000000002bd9edf0, R9 =0x00007ffc2892c848, R10=0x0000000000000004, R11=0x000000002bd9edf0 +R12=0x00007ffbeda57908, R13=0x0000000003601658, R14=0x0000000000000000, R15=0x0000000000000001 +RIP=0x0000000000000000, EFLAGS=0x0000000000010206 + +Top of Stack: (sp=0x000000002bd9edb8) +0x000000002bd9edb8: 00007ffbd0deb263 00007ffbedd4ed40 +0x000000002bd9edc8: 0000000000000000 0000000000000000 +0x000000002bd9edd8: 0000000000000000 000000002bd9ee50 +0x000000002bd9ede8: 00007ffc2890930e 0000000000000000 +0x000000002bd9edf8: 0000000000000000 0000000003601658 +0x000000002bd9ee08: 00007ffbeda57908 000000002fa2c450 +0x000000002bd9ee18: 00007ffc288f6462 0000000000000000 +0x000000002bd9ee28: 0000000000000000 0000000000000002 +0x000000002bd9ee38: 00007ffc4d5347b1 0000000000000000 +0x000000002bd9ee48: 00007ffc4b43f05b 000000002fa0a660 +0x000000002bd9ee58: 00007ffc289266e0 00007ffb00000078 +0x000000002bd9ee68: 00000000373b32d0 000000002faf8a40 +0x000000002bd9ee78: 00007ffc288f9a44 0000000000000001 +0x000000002bd9ee88: 00007ffbedd4ed40 000000002faf8b98 +0x000000002bd9ee98: 000000002fa2c450 00000000373cbab0 +0x000000002bd9eea8: 00007ffbed7f7e04 000000002fa30630 + +Instructions: (pc=0x0000000000000000) +0xffffffffffffffe0: + + +Register to memory mapping: + +RAX=0x000000002f9e8450 is an unknown value +RBX=0x00000000373ad4c0 is an unknown value +RCX=0x000000003749b0f0 is an unknown value +RDX=0x0000000000000000 is an unknown value +RSP=0x000000002bd9edb8 is an unknown value +RBP=0x00007ffbedd4ed40 is an unknown value +RSI=0x0000000000000002 is an unknown value +RDI=0x000000002fa2c450 is an unknown value +R8 =0x000000002bd9edf0 is an unknown value +R9 =0x00007ffc2892c848 is an unknown value +R10=0x0000000000000004 is an unknown value +R11=0x000000002bd9edf0 is an unknown value +R12=0x00007ffbeda57908 is an unknown value +R13=0x0000000003601658 is an unknown value +R14=0x0000000000000000 is an unknown value +R15=0x0000000000000001 is an unknown value + + +Stack: [0x000000002bca0000,0x000000002bda0000], sp=0x000000002bd9edb8, free space=1019k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) + +VM_Operation (0x00000000385aee20): Exit, mode: safepoint, requested by thread 0x000000002e197000 + + +--------------- P R O C E S S --------------- + +Java Threads: ( => current thread ) + 0x00000000317bb000 JavaThread "globalEventExecutor-2-2" [_thread_blocked, id=708, stack(0x0000000034390000,0x0000000034490000)] + 0x000000002e197000 JavaThread "SIGINT handler" daemon [_thread_blocked, id=6716, stack(0x00000000384b0000,0x00000000385b0000)] + 0x00000000317c4000 JavaThread "FeatureNativeObjectsCleaner" daemon [_thread_blocked, id=15080, stack(0x0000000037aa0000,0x0000000037ba0000)] + 0x00000000317c5800 JavaThread "GeometryNativeObjectsCleaner" daemon [_thread_blocked, id=16292, stack(0x00000000379a0000,0x0000000037aa0000)] + 0x00000000317bf800 JavaThread "RMI TCP Connection(2)-192.168.1.32" daemon [_thread_in_native, id=2864, stack(0x0000000034790000,0x0000000034890000)] + 0x00000000317c2800 JavaThread "DestroyJavaVM" [_thread_blocked, id=16052, stack(0x0000000003610000,0x0000000003710000)] + 0x000000002db6c000 JavaThread "JMX server connection timeout 24" daemon [_thread_blocked, id=8940, stack(0x000000002ef80000,0x000000002f080000)] + 0x000000002db68800 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=5980, stack(0x000000002ee80000,0x000000002ef80000)] + 0x000000002db55800 JavaThread "RMI TCP Connection(1)-192.168.1.32" daemon [_thread_in_native, id=9632, stack(0x000000002ed80000,0x000000002ee80000)] + 0x000000002d9a4000 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=12188, stack(0x000000002e8d0000,0x000000002e9d0000)] + 0x000000002c87a800 JavaThread "Service Thread" daemon [_thread_blocked, id=9496, stack(0x000000002d800000,0x000000002d900000)] + 0x000000002c77b000 JavaThread "C1 CompilerThread11" daemon [_thread_blocked, id=10228, stack(0x000000002d700000,0x000000002d800000)] + 0x000000002c772000 JavaThread "C1 CompilerThread10" daemon [_thread_blocked, id=2164, stack(0x000000002d600000,0x000000002d700000)] + 0x000000002c767800 JavaThread "C1 CompilerThread9" daemon [_thread_blocked, id=32, stack(0x000000002d500000,0x000000002d600000)] + 0x000000002c764800 JavaThread "C1 CompilerThread8" daemon [_thread_blocked, id=8956, stack(0x000000002d400000,0x000000002d500000)] + 0x000000002995d800 JavaThread "C2 CompilerThread7" daemon [_thread_blocked, id=17204, stack(0x000000002d300000,0x000000002d400000)] + 0x000000002c760000 JavaThread "C2 CompilerThread6" daemon [_thread_blocked, id=6016, stack(0x000000002d200000,0x000000002d300000)] + 0x000000002995d000 JavaThread "C2 CompilerThread5" daemon [_thread_blocked, id=10216, stack(0x000000002d000000,0x000000002d100000)] + 0x000000002995a000 JavaThread "C2 CompilerThread4" daemon [_thread_blocked, id=6480, stack(0x000000002cf00000,0x000000002d000000)] + 0x000000002c74e800 JavaThread "C2 CompilerThread3" daemon [_thread_blocked, id=18876, stack(0x000000002ce00000,0x000000002cf00000)] + 0x000000002c74e000 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=17036, stack(0x000000002cd00000,0x000000002ce00000)] + 0x000000002c74d000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=13880, stack(0x000000002cc00000,0x000000002cd00000)] + 0x000000002c74b800 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=9560, stack(0x000000002cb00000,0x000000002cc00000)] + 0x000000002c75d000 JavaThread "Monitor Ctrl-Break" daemon [_thread_in_native, id=2404, stack(0x000000002ca00000,0x000000002cb00000)] + 0x0000000029744800 JavaThread "Attach Listener" daemon [_thread_blocked, id=19132, stack(0x000000002c100000,0x000000002c200000)] + 0x000000002979d800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=14440, stack(0x000000002c000000,0x000000002c100000)] + 0x000000002972a000 JavaThread "Finalizer" daemon [_thread_blocked, id=16324, stack(0x000000002bea0000,0x000000002bfa0000)] + 0x0000000029729000 JavaThread "Reference Handler" daemon [_thread_blocked, id=8052, stack(0x000000002bda0000,0x000000002bea0000)] + +Other Threads: +=>0x000000002752a800 VMThread [stack: 0x000000002bca0000,0x000000002bda0000] [id=15840] + +VM state:at safepoint (shutting down) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x0000000003710e50] Threads_lock - owner thread: 0x000000002752a800 + +heap address: 0x00000005c3400000, size: 8140 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 +Narrow klass base: 0x0000000000000000, Narrow klass shift: 3 +Compressed class space size: 1073741824 Address: 0x00000007c0000000 + +Heap: + PSYoungGen total 425472K, used 131639K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000) + eden space 404480K, 32% used [0x0000000716700000,0x000000071e78dc80,0x000000072f200000) + from space 20992K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732300000) + to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000) + ParOldGen total 599552K, used 32010K [0x00000005c3400000, 0x00000005e7d80000, 0x0000000716700000) + object space 599552K, 5% used [0x00000005c3400000,0x00000005c53428b8,0x00000005e7d80000) + Metaspace used 60029K, capacity 63176K, committed 63256K, reserved 1103872K + class space used 7368K, capacity 7950K, committed 7984K, reserved 1048576K + +Card table byte_map: [0x0000000012dc0000,0x0000000013db0000] byte_map_base: 0x000000000ffa6000 + +Marking Bits: (ParMarkBitMap*) 0x000000006a8a4ce0 + Begin Bits: [0x0000000015c50000, 0x000000001db80000) + End Bits: [0x000000001db80000, 0x0000000025ab0000) + +Polling page: 0x0000000001710000 + +CodeCache: size=245760Kb used=14111Kb max_used=14194Kb free=231648Kb + bounds [0x0000000003a00000, 0x00000000047e0000, 0x0000000012a00000] + total_blobs=7102 nmethods=6344 adapters=666 + compilation: enabled + +Compilation events (10 events): +Event: 15.649 Thread 0x000000002c764800 6372 1 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node::predecessor (19 bytes) +Event: 15.649 Thread 0x000000002c764800 nmethod 6372 0x00000000047dbe50 code [0x00000000047dbfc0, 0x00000000047dc188] +Event: 15.649 Thread 0x000000002c767800 6373 1 java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl::accessCheck (17 bytes) +Event: 15.649 Thread 0x000000002c767800 nmethod 6373 0x00000000047dc250 code [0x00000000047dc3c0, 0x00000000047dc528] +Event: 15.649 Thread 0x000000002c772000 6374 ! 1 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry::destroyBean (385 bytes) +Event: 15.649 Thread 0x000000002c77b000 6375 1 io.netty.util.concurrent.SingleThreadEventExecutor::fetchFromScheduledTaskQueue (69 bytes) +Event: 15.649 Thread 0x000000002c77b000 nmethod 6375 0x00000000047dc5d0 code [0x00000000047dc760, 0x00000000047dc9f8] +Event: 15.650 Thread 0x000000002c772000 nmethod 6374 0x0000000003d1a790 code [0x0000000003d1ab20, 0x0000000003d1bcd8] +Event: 15.650 Thread 0x000000002c764800 6376 1 java.util.concurrent.locks.ReentrantLock$Sync::isHeldExclusively (16 bytes) +Event: 15.650 Thread 0x000000002c764800 nmethod 6376 0x0000000003d05810 code [0x0000000003d05960, 0x0000000003d05a90] + +GC Heap History (10 events): +Event: 1.126 GC heap before +{Heap before GC invocations=5 (full 1): + PSYoungGen total 283648K, used 172335K [0x0000000716700000, 0x000000072e100000, 0x00000007c0000000) + eden space 262144K, 62% used [0x0000000716700000,0x000000072073ed58,0x0000000726700000) + from space 21504K, 38% used [0x0000000726700000,0x0000000726f0d1e0,0x0000000727c00000) + to space 21504K, 0% used [0x000000072cc00000,0x000000072cc00000,0x000000072e100000) + ParOldGen total 225792K, used 9890K [0x00000005c3400000, 0x00000005d1080000, 0x0000000716700000) + object space 225792K, 4% used [0x00000005c3400000,0x00000005c3da8948,0x00000005d1080000) + Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K +Event: 1.130 GC heap after +Heap after GC invocations=5 (full 1): + PSYoungGen total 359424K, used 13394K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000) + eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000) + from space 18432K, 72% used [0x000000072cc00000,0x000000072d914860,0x000000072de00000) + to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000) + ParOldGen total 225792K, used 9970K [0x00000005c3400000, 0x00000005d1080000, 0x0000000716700000) + object space 225792K, 4% used [0x00000005c3400000,0x00000005c3dbc958,0x00000005d1080000) + Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K +} +Event: 1.130 GC heap before +{Heap before GC invocations=6 (full 2): + PSYoungGen total 359424K, used 13394K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000) + eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000) + from space 18432K, 72% used [0x000000072cc00000,0x000000072d914860,0x000000072de00000) + to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000) + ParOldGen total 225792K, used 9970K [0x00000005c3400000, 0x00000005d1080000, 0x0000000716700000) + object space 225792K, 4% used [0x00000005c3400000,0x00000005c3dbc958,0x00000005d1080000) + Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K +Event: 1.180 GC heap after +Heap after GC invocations=6 (full 2): + PSYoungGen total 359424K, used 0K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000) + eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000) + from space 18432K, 0% used [0x000000072cc00000,0x000000072cc00000,0x000000072de00000) + to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000) + ParOldGen total 402432K, used 19607K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000) + object space 402432K, 4% used [0x00000005c3400000,0x00000005c4725da8,0x00000005dbd00000) + Metaspace used 34086K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4463K, capacity 4782K, committed 4784K, reserved 1048576K +} +Event: 2.001 GC heap before +{Heap before GC invocations=7 (full 2): + PSYoungGen total 359424K, used 340992K [0x0000000716700000, 0x000000072de00000, 0x00000007c0000000) + eden space 340992K, 100% used [0x0000000716700000,0x000000072b400000,0x000000072b400000) + from space 18432K, 0% used [0x000000072cc00000,0x000000072cc00000,0x000000072de00000) + to space 21504K, 0% used [0x000000072b400000,0x000000072b400000,0x000000072c900000) + ParOldGen total 402432K, used 19607K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000) + object space 402432K, 4% used [0x00000005c3400000,0x00000005c4725da8,0x00000005dbd00000) + Metaspace used 49819K, capacity 52484K, committed 52648K, reserved 1095680K + class space used 6275K, capacity 6791K, committed 6832K, reserved 1048576K +Event: 2.009 GC heap after +Heap after GC invocations=7 (full 2): + PSYoungGen total 362496K, used 21482K [0x0000000716700000, 0x0000000732500000, 0x00000007c0000000) + eden space 340992K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b400000) + from space 21504K, 99% used [0x000000072b400000,0x000000072c8faa00,0x000000072c900000) + to space 23040K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732500000) + ParOldGen total 402432K, used 21364K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000) + object space 402432K, 5% used [0x00000005c3400000,0x00000005c48dd370,0x00000005dbd00000) + Metaspace used 49819K, capacity 52484K, committed 52648K, reserved 1095680K + class space used 6275K, capacity 6791K, committed 6832K, reserved 1048576K +} +Event: 2.671 GC heap before +{Heap before GC invocations=8 (full 2): + PSYoungGen total 362496K, used 210703K [0x0000000716700000, 0x0000000732500000, 0x00000007c0000000) + eden space 340992K, 55% used [0x0000000716700000,0x0000000721fc94f8,0x000000072b400000) + from space 21504K, 99% used [0x000000072b400000,0x000000072c8faa00,0x000000072c900000) + to space 23040K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732500000) + ParOldGen total 402432K, used 21364K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000) + object space 402432K, 5% used [0x00000005c3400000,0x00000005c48dd370,0x00000005dbd00000) + Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K +Event: 2.677 GC heap after +Heap after GC invocations=8 (full 2): + PSYoungGen total 425472K, used 20137K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000) + eden space 404480K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072f200000) + from space 20992K, 95% used [0x0000000730e80000,0x000000073222a4e8,0x0000000732300000) + to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000) + ParOldGen total 402432K, used 21372K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000) + object space 402432K, 5% used [0x00000005c3400000,0x00000005c48df370,0x00000005dbd00000) + Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K +} +Event: 2.677 GC heap before +{Heap before GC invocations=9 (full 3): + PSYoungGen total 425472K, used 20137K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000) + eden space 404480K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072f200000) + from space 20992K, 95% used [0x0000000730e80000,0x000000073222a4e8,0x0000000732300000) + to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000) + ParOldGen total 402432K, used 21372K [0x00000005c3400000, 0x00000005dbd00000, 0x0000000716700000) + object space 402432K, 5% used [0x00000005c3400000,0x00000005c48df370,0x00000005dbd00000) + Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K +Event: 2.745 GC heap after +Heap after GC invocations=9 (full 3): + PSYoungGen total 425472K, used 0K [0x0000000716700000, 0x0000000732300000, 0x00000007c0000000) + eden space 404480K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072f200000) + from space 20992K, 0% used [0x0000000730e80000,0x0000000730e80000,0x0000000732300000) + to space 25088K, 0% used [0x000000072f200000,0x000000072f200000,0x0000000730a80000) + ParOldGen total 599552K, used 32010K [0x00000005c3400000, 0x00000005e7d80000, 0x0000000716700000) + object space 599552K, 5% used [0x00000005c3400000,0x00000005c53428b8,0x00000005e7d80000) + Metaspace used 56205K, capacity 59076K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7435K, committed 7472K, reserved 1048576K +} + +Deoptimization events (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (10 events): +Event: 2.819 Thread 0x000000002e29b800 Exception (0x0000000718461928) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 3.158 Thread 0x000000002e29b800 Exception (0x00000007188b8760) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 3.266 Thread 0x000000002e29b800 Exception (0x00000007190894f8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\reflection.cpp, line 1092] +Event: 3.269 Thread 0x000000002e29b800 Exception (0x0000000719130938) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 3.269 Thread 0x000000002e29b800 Exception (0x0000000719131a60) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 3.270 Thread 0x000000002e29b800 Exception (0x00000007191a7c00) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 15.431 Thread 0x000000002c258800 Exception (0x000000071aff4e68) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\prims\jvm.cpp, line 3340] +Event: 15.435 Thread 0x000000002e197800 Exception (0x000000071b7961c0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\l +Event: 15.435 Thread 0x000000002e197800 Exception (0x000000071b79c368) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolver.cpp, +Event: 15.435 Thread 0x000000002e197800 Exception (0x000000071b7a0220) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolver.cpp, line 620] + +Events (10 events): +Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e3f090 +Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e44390 +Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e47350 +Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e4c790 +Event: 15.650 Thread 0x000000002c764800 flushing nmethod 0x0000000003e4ea50 +Event: 15.651 Executing VM operation: RevokeBias +Event: 15.651 Executing VM operation: RevokeBias done +Event: 15.651 Thread 0x00000000317b8800 Thread exited: 0x00000000317b8800 +Event: 15.651 Thread 0x000000002e197800 Thread exited: 0x000000002e197800 +Event: 15.652 Executing VM operation: Exit + + +Dynamic libraries: +0x00007ff600c30000 - 0x00007ff600c67000 E:\Java\jdk1.8.0_201\bin\java.exe +0x00007ffc4d510000 - 0x00007ffc4d708000 C:\Windows\SYSTEM32\ntdll.dll +0x00007ffc4bd90000 - 0x00007ffc4be52000 C:\Windows\System32\KERNEL32.DLL +0x00007ffc4b100000 - 0x00007ffc4b3f6000 C:\Windows\System32\KERNELBASE.dll +0x00007ffc4c230000 - 0x00007ffc4c2e1000 C:\Windows\System32\ADVAPI32.dll +0x00007ffc4b6e0000 - 0x00007ffc4b77e000 C:\Windows\System32\msvcrt.dll +0x00007ffc4b990000 - 0x00007ffc4ba2f000 C:\Windows\System32\sechost.dll +0x00007ffc4c100000 - 0x00007ffc4c223000 C:\Windows\System32\RPCRT4.dll +0x00007ffc4ad40000 - 0x00007ffc4ad67000 C:\Windows\System32\bcrypt.dll +0x00007ffc4b540000 - 0x00007ffc4b6dd000 C:\Windows\System32\USER32.dll +0x00007ffc4b400000 - 0x00007ffc4b422000 C:\Windows\System32\win32u.dll +0x00007ffc4d320000 - 0x00007ffc4d34b000 C:\Windows\System32\GDI32.dll +0x00007ffc4ae80000 - 0x00007ffc4af99000 C:\Windows\System32\gdi32full.dll +0x00007ffc4aba0000 - 0x00007ffc4ac3d000 C:\Windows\System32\msvcp_win.dll +0x00007ffc4b430000 - 0x00007ffc4b530000 C:\Windows\System32\ucrtbase.dll +0x00007ffc3c640000 - 0x00007ffc3c8da000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.5915_none_60b4b9d171f9c7c7\COMCTL32.dll +0x00007ffc4d2f0000 - 0x00007ffc4d31f000 C:\Windows\System32\IMM32.DLL +0x000000006a930000 - 0x000000006aa01000 E:\Java\jdk1.8.0_201\jre\bin\msvcr100.dll +0x000000006a080000 - 0x000000006a924000 E:\Java\jdk1.8.0_201\jre\bin\server\jvm.dll +0x00007ffc4c420000 - 0x00007ffc4c428000 C:\Windows\System32\PSAPI.DLL +0x00007ffc47420000 - 0x00007ffc47429000 C:\Windows\SYSTEM32\WSOCK32.dll +0x00007ffc41df0000 - 0x00007ffc41e17000 C:\Windows\SYSTEM32\WINMM.dll +0x00007ffc46f80000 - 0x00007ffc46f8a000 C:\Windows\SYSTEM32\VERSION.dll +0x00007ffc4cd00000 - 0x00007ffc4cd6b000 C:\Windows\System32\WS2_32.dll +0x00007ffc47410000 - 0x00007ffc4741f000 E:\Java\jdk1.8.0_201\jre\bin\verify.dll +0x00007ffc473e0000 - 0x00007ffc47409000 E:\Java\jdk1.8.0_201\jre\bin\java.dll +0x00007ffc45690000 - 0x00007ffc456b3000 E:\Java\jdk1.8.0_201\jre\bin\instrument.dll +0x00007ffc43d30000 - 0x00007ffc43d46000 E:\Java\jdk1.8.0_201\jre\bin\zip.dll +0x00007ffc4c590000 - 0x00007ffc4ccfe000 C:\Windows\System32\SHELL32.dll +0x00007ffc48c20000 - 0x00007ffc493c4000 C:\Windows\SYSTEM32\windows.storage.dll +0x00007ffc4ba30000 - 0x00007ffc4bd83000 C:\Windows\System32\combase.dll +0x00007ffc4a5d0000 - 0x00007ffc4a5fb000 C:\Windows\SYSTEM32\Wldp.dll +0x00007ffc4d350000 - 0x00007ffc4d41d000 C:\Windows\System32\OLEAUT32.dll +0x00007ffc4cd70000 - 0x00007ffc4ce1d000 C:\Windows\System32\SHCORE.dll +0x00007ffc4b930000 - 0x00007ffc4b98b000 C:\Windows\System32\shlwapi.dll +0x00007ffc4aad0000 - 0x00007ffc4aaf5000 C:\Windows\SYSTEM32\profapi.dll +0x00007ffbfbf40000 - 0x00007ffbfbf5a000 E:\Java\jdk1.8.0_201\jre\bin\net.dll +0x00007ffc3f5e0000 - 0x00007ffc3f7d0000 C:\Windows\SYSTEM32\urlmon.dll +0x00007ffc4a000000 - 0x00007ffc4a00c000 C:\Windows\SYSTEM32\netutils.dll +0x00007ffc3f5b0000 - 0x00007ffc3f5d8000 C:\Windows\SYSTEM32\srvcli.dll +0x00007ffc3f2f0000 - 0x00007ffc3f5af000 C:\Windows\SYSTEM32\iertutil.dll +0x00007ffc4a330000 - 0x00007ffc4a39a000 C:\Windows\system32\mswsock.dll +0x00007ffc4a010000 - 0x00007ffc4a0da000 C:\Windows\SYSTEM32\DNSAPI.dll +0x00007ffc49fc0000 - 0x00007ffc49ffb000 C:\Windows\SYSTEM32\IPHLPAPI.DLL +0x00007ffc4b530000 - 0x00007ffc4b538000 C:\Windows\System32\NSI.dll +0x00007ffc44d70000 - 0x00007ffc44d7a000 C:\Windows\System32\rasadhlp.dll +0x00007ffc43240000 - 0x00007ffc432c0000 C:\Windows\System32\fwpuclnt.dll +0x00007ffc45150000 - 0x00007ffc4515d000 E:\Java\jdk1.8.0_201\jre\bin\management.dll +0x00007ffbf80e0000 - 0x00007ffbf80f1000 E:\Java\jdk1.8.0_201\jre\bin\nio.dll +0x00007ffc4a520000 - 0x00007ffc4a538000 C:\Windows\SYSTEM32\CRYPTSP.dll +0x00007ffc49be0000 - 0x00007ffc49c18000 C:\Windows\system32\rsaenh.dll +0x00007ffc4aa90000 - 0x00007ffc4aabe000 C:\Windows\SYSTEM32\USERENV.dll +0x00007ffc4ad70000 - 0x00007ffc4adf2000 C:\Windows\System32\bcryptprimitives.dll +0x00007ffc4a540000 - 0x00007ffc4a54c000 C:\Windows\SYSTEM32\CRYPTBASE.dll +0x00007ffc451a0000 - 0x00007ffc451b7000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL +0x00007ffc45180000 - 0x00007ffc4519d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL +0x00007ffc34ce0000 - 0x00007ffc34cf7000 C:\Windows\system32\napinsp.dll +0x00007ffc302b0000 - 0x00007ffc302cb000 C:\Windows\system32\pnrpnsp.dll +0x00007ffc30290000 - 0x00007ffc302ad000 C:\Windows\system32\wshbth.dll +0x00007ffc455f0000 - 0x00007ffc4560d000 C:\Windows\system32\NLAapi.dll +0x00007ffc30270000 - 0x00007ffc30282000 C:\Windows\System32\winrnr.dll +0x00007ffc3abe0000 - 0x00007ffc3ac31000 C:\Windows\SYSTEM32\pdh.dll +0x00007ffc43d20000 - 0x00007ffc43d2f000 C:\Windows\System32\perfproc.dll +0x00007ffc1a870000 - 0x00007ffc1a87f000 C:\Windows\System32\perfos.dll +0x00007ffc1b9c0000 - 0x00007ffc1b9e4000 E:\Java\jdk1.8.0_201\jre\bin\sunec.dll +0x00007ffc35b90000 - 0x00007ffc35c38000 E:\Java\jdk1.8.0_201\bin\gdalalljni.dll +0x00007ffc35b00000 - 0x00007ffc35b8d000 E:\Java\jdk1.8.0_201\bin\MSVCP140.dll +0x00007ffc438e0000 - 0x00007ffc438fb000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140.dll +0x00007ffc43cf0000 - 0x00007ffc43cfc000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140_1.dll +0x00007ffbecbd0000 - 0x00007ffbee01d000 E:\Java\jdk1.8.0_201\bin\gdal.dll +0x00007ffc4afa0000 - 0x00007ffc4b0fd000 C:\Windows\System32\CRYPT32.dll +0x00007ffc433a0000 - 0x00007ffc433b9000 E:\Java\jdk1.8.0_201\bin\zlib.dll +0x00007ffc359e0000 - 0x00007ffc35a73000 E:\Java\jdk1.8.0_201\bin\libcurl.dll +0x00007ffc4c2f0000 - 0x00007ffc4c41b000 C:\Windows\System32\ole32.dll +0x00007ffc4c450000 - 0x00007ffc4c4af000 C:\Windows\System32\WLDAP32.dll +0x00007ffc249e0000 - 0x00007ffc24aa0000 C:\Windows\SYSTEM32\ODBC32.dll +0x00007ffc1c440000 - 0x00007ffc1c5a3000 E:\Java\jdk1.8.0_201\bin\libxml2.dll +0x00007ffc1c300000 - 0x00007ffc1c439000 E:\Java\jdk1.8.0_201\bin\libssl-3-x64.dll +0x00007ffbec6f0000 - 0x00007ffbecbc2000 E:\Java\jdk1.8.0_201\bin\libcrypto-3-x64.dll +0x00007ffc358a0000 - 0x00007ffc35954000 E:\Java\jdk1.8.0_201\bin\zstd.dll +0x00007ffbf7f90000 - 0x00007ffbf80dd000 E:\Java\jdk1.8.0_201\bin\tiff.dll +0x00007ffc19400000 - 0x00007ffc196ab000 E:\Java\jdk1.8.0_201\bin\xerces-c_3_2.dll +0x00007ffc3bec0000 - 0x00007ffc3bef5000 E:\Java\jdk1.8.0_201\bin\libpng16.dll +0x00007ffc1bfa0000 - 0x00007ffc1c2fa000 E:\Java\jdk1.8.0_201\bin\proj_9.dll +0x00007ffbec420000 - 0x00007ffbec6e8000 E:\Java\jdk1.8.0_201\bin\sqlite3.dll +0x0000000180000000 - 0x000000018004e000 E:\Java\jdk1.8.0_201\bin\LIBPQ.dll +0x00007ffc35aa0000 - 0x00007ffc35af1000 E:\Java\jdk1.8.0_201\bin\openjp2.dll +0x00007ffc3bea0000 - 0x00007ffc3bec0000 E:\Java\jdk1.8.0_201\bin\pcre.dll +0x00007ffbd1960000 - 0x00007ffbd264b000 E:\Java\jdk1.8.0_201\bin\spatialite.dll +0x00007ffc359b0000 - 0x00007ffc359d9000 E:\Java\jdk1.8.0_201\bin\freexl.dll +0x00007ffbe86e0000 - 0x00007ffbe8d81000 E:\Java\jdk1.8.0_201\bin\libmysql.dll +0x00007ffc35980000 - 0x00007ffc359a2000 E:\Java\jdk1.8.0_201\bin\ogdi.dll +0x00007ffc35870000 - 0x00007ffc3589a000 E:\Java\jdk1.8.0_201\bin\libexpat.dll +0x00007ffc2e8d0000 - 0x00007ffc2e92c000 E:\Java\jdk1.8.0_201\bin\geos_c.dll +0x00007ffc25760000 - 0x00007ffc2585f000 E:\Java\jdk1.8.0_201\bin\iconv-2.dll +0x00007ffc3d020000 - 0x00007ffc3d02c000 C:\Windows\SYSTEM32\Secur32.dll +0x00007ffbe8500000 - 0x00007ffbe86d5000 E:\Java\jdk1.8.0_201\bin\geos.dll +0x00007ffc4a990000 - 0x00007ffc4a99a000 C:\Windows\SYSTEM32\DPAPI.DLL +0x00007ffc4aa50000 - 0x00007ffc4aa82000 C:\Windows\SYSTEM32\SSPICLI.DLL +0x00007ffc288f0000 - 0x00007ffc28957000 E:\gdal\bin\gdalplugins\ogr_FileGDB.dll +0x00007ffbd0dd0000 - 0x00007ffbd1952000 E:\Java\jdk1.8.0_201\bin\FileGDBAPI.dll +0x00007ffc485d0000 - 0x00007ffc487d1000 C:\Windows\SYSTEM32\dbghelp.dll + +VM Arguments: +jvm_args: -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\lib\idea_rt.jar=53785 -Dfile.encoding=UTF-8 +java_command: cn.edu.whu.boot.BootApplication +java_class_path (initial): E:\Java\jdk1.8.0_201\jre\lib\charsets.jar;E:\Java\jdk1.8.0_201\jre\lib\deploy.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_201\jre\lib\javaws.jar;E:\Java\jdk1.8.0_201\jre\lib\jce.jar;E:\Java\jdk1.8.0_201\jre\lib\jfr.jar;E:\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_201\jre\lib\jsse.jar;E:\Java\jdk1.8.0_201\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_201\jre\lib\plugin.jar;E:\Java\jdk1.8.0_201\jre\lib\resources.jar;E:\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\503\TJ_project\lydc_backend\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.0.RELEASE\spring-boot-starter-web-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.0.RELEASE\spring-boot-starter-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.3.0.RELEASE\spring-boot-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.0.RELEASE\spring-boot-starter-logging-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.2\log4j-to-slf4j-2.13.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-a +Launcher Type: SUN_STANDARD + +Environment Variables: +JAVA_HOME=E:\Java\jdk1.8.0_201 +PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;E:\gdal\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\bin; +USERNAME=Administrator +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 183 Stepping 1, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 10.0 , 64 bit Build 19041 (10.0.19041.5915) + +CPU:total 28 (initial active 28) (14 cores per cpu, 2 threads per core) family 6 model 183 stepping 1, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx + +Memory: 4k page, physical 33338604k(22288736k free), swap 38319340k(24209488k free) + +vm_info: Java HotSpot(TM) 64-Bit Server VM (25.201-b09) for windows-amd64 JRE (1.8.0_201-b09), built on Dec 15 2018 18:36:39 by "java_re" with MS VC++ 10.0 (VS2010) + +time: Mon Nov 03 21:25:38 2025 +timezone: й׼ʱ +elapsed time: 16 seconds (0d 0h 0m 16s) + diff --git a/hs_err_pid17356.log b/hs_err_pid17356.log new file mode 100644 index 0000000..801f716 --- /dev/null +++ b/hs_err_pid17356.log @@ -0,0 +1,532 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffbecc04fa0, pid=17356, tid=0x0000000000000d44 +# +# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09) +# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops) +# Problematic frame: +# C [gdal.dll+0x34fa0] +# +# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows +# +# If you would like to submit a bug report, please visit: +# http://bugreport.java.com/bugreport/crash.jsp +# The crash happened outside the Java Virtual Machine in native code. +# See problematic frame for where to report the bug. +# + +--------------- T H R E A D --------------- + +Current thread (0x00000000302d2000): JavaThread "http-nio-0.0.0.0-9001-exec-1" daemon [_thread_in_native, id=3396, stack(0x0000000032b90000,0x0000000032c90000)] + +siginfo: ExceptionCode=0xc0000005, reading address 0x0000000000000000 + +Registers: +RAX=0x0000000036790960, RBX=0xffffffffffffffff, RCX=0x0000000000000000, RDX=0x00007ffbedaebff0 +RSP=0x0000000032c8ca20, RBP=0x000000000000195f, RSI=0x00007ffbedaebff0, RDI=0x0000000000000000 +R8 =0x000000000000195f, R9 =0x0000000000000001, R10=0x00000000367ba320, R11=0x0000000036968cf1 +R12=0x00000000367b9ba0, R13=0x00000000367ba560, R14=0x0000000000000004, R15=0x000000000000000a +RIP=0x00007ffbecc04fa0, EFLAGS=0x0000000000010202 + +Top of Stack: (sp=0x0000000032c8ca20) +0x0000000032c8ca20: 0000000036a26760 00007ffbece518fa +0x0000000032c8ca30: 00000000367b9ba0 0000000000000000 +0x0000000032c8ca40: 0000000000000004 00007ffbecc05012 +0x0000000032c8ca50: 0000000000000000 00007ffbedaebff0 +0x0000000032c8ca60: 0000000000000009 00007ffc4b450c06 +0x0000000032c8ca70: 00000000367ba560 00007ffbece491c3 +0x0000000032c8ca80: 0000000000000004 00007ffbece4d1f1 +0x0000000032c8ca90: 0000000000000014 000000000000000a +0x0000000032c8caa0: 0000000000000014 00007ffbece4d87b +0x0000000032c8cab0: 0000000000000014 000000000000000a +0x0000000032c8cac0: 00000000367b9ba0 00000000302d2000 +0x0000000032c8cad0: 00000000367b9ba0 0000000033bf2be8 +0x0000000032c8cae0: 0000000000000000 0000000000000001 +0x0000000032c8caf0: 00000000367ba560 0000000032c8cc68 +0x0000000032c8cb00: 00000000367b9ba0 00007ffbece4d5f3 +0x0000000032c8cb10: 000000000000000a 0000000000000014 + +Instructions: (pc=0x00007ffbecc04fa0) +0x00007ffbecc04f80: 48 89 5c 24 08 48 89 74 24 10 57 48 83 ec 20 48 +0x00007ffbecc04f90: 8b f9 48 c7 c3 ff ff ff ff 0f 1f 80 00 00 00 00 +0x00007ffbecc04fa0: 80 7c 19 01 00 48 8d 5b 01 75 f5 48 8d 4b 01 ff +0x00007ffbecc04fb0: 15 4b fb e9 00 48 8b f0 48 85 c0 75 10 48 8b 5c + + +Register to memory mapping: + +RAX=0x0000000036790960 is an unknown value +RBX=0xffffffffffffffff is an unknown value +RCX=0x0000000000000000 is an unknown value +RDX=0x00007ffbedaebff0 is an unknown value +RSP=0x0000000032c8ca20 is pointing into the stack for thread: 0x00000000302d2000 +RBP=0x000000000000195f is an unknown value +RSI=0x00007ffbedaebff0 is an unknown value +RDI=0x0000000000000000 is an unknown value +R8 =0x000000000000195f is an unknown value +R9 =0x0000000000000001 is an unknown value +R10=0x00000000367ba320 is an unknown value +R11=0x0000000036968cf1 is an unknown value +R12=0x00000000367b9ba0 is an unknown value +R13=0x00000000367ba560 is an unknown value +R14=0x0000000000000004 is an unknown value +R15=0x000000000000000a is an unknown value + + +Stack: [0x0000000032b90000,0x0000000032c90000], sp=0x0000000032c8ca20, free space=1010k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +C [gdal.dll+0x34fa0] +C [gdal.dll+0x35012] +C [gdal.dll+0x27d1f1] +C [gdal.dll+0x27d5f3] +C [gdal.dll+0xc27149] +C [gdalalljni.dll+0x5307f] +C 0x0000000002eb8c67 + +Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) +j org.gdal.ogr.ogrJNI.Layer_CreateFeature(JLorg/gdal/ogr/Layer;JLorg/gdal/ogr/Feature;)I+0 +j org.gdal.ogr.Layer.CreateFeature(Lorg/gdal/ogr/Feature;)I+10 +j cn.edu.whu.boot.collection.controller.ExportController.addGeometryLayerToGdb(Lorg/gdal/ogr/DataSource;Lcn/edu/whu/boot/xml/xmlreader/bean/Table;Ljava/lang/String;Ljava/util/List;)V+727 +j cn.edu.whu.boot.collection.controller.ExportController.taskGdbExport(Ljava/lang/Integer;ZLjavax/servlet/http/HttpServletResponse;)Ljava/lang/String;+793 +v ~StubRoutines::call_stub +J 1981 sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (0 bytes) @ 0x000000000346a5ff [0x000000000346a580+0x7f] +J 1980 C1 sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (104 bytes) @ 0x000000000346ada4 [0x000000000346a9e0+0x3c4] +J 1971 C1 sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (10 bytes) @ 0x0000000003467c24 [0x0000000003467be0+0x44] +J 1970 C1 java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (62 bytes) @ 0x00000000034683a4 [0x00000000034682a0+0x104] +j org.springframework.web.method.support.InvocableHandlerMethod.doInvoke([Ljava/lang/Object;)Ljava/lang/Object;+16 +j org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(Lorg/springframework/web/context/request/NativeWebRequest;Lorg/springframework/web/method/support/ModelAndViewContainer;[Ljava/lang/Object;)Ljava/lang/Object;+56 +j org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(Lorg/springframework/web/context/request/ServletWebRequest;Lorg/springframework/web/method/support/ModelAndViewContainer;[Ljava/lang/Object;)V+4 +j org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Lorg/springframework/web/method/HandlerMethod;)Lorg/springframework/web/servlet/ModelAndView;+244 +j org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Lorg/springframework/web/method/HandlerMethod;)Lorg/springframework/web/servlet/ModelAndView;+81 +j org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/Object;)Lorg/springframework/web/servlet/ModelAndView;+7 +j org.springframework.web.servlet.DispatcherServlet.doDispatch(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+257 +j org.springframework.web.servlet.DispatcherServlet.doService(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+212 +j org.springframework.web.servlet.FrameworkServlet.processRequest(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+71 +j org.springframework.web.servlet.FrameworkServlet.doGet(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+3 +j javax.servlet.http.HttpServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+35 +j org.springframework.web.servlet.FrameworkServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+33 +j javax.servlet.http.HttpServlet.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+36 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+304 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.apache.tomcat.websocket.server.WsFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+21 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+13 +j org.apache.shiro.web.servlet.AbstractShiroFilter$1.call()Ljava/lang/Object;+31 +j org.apache.shiro.subject.support.SubjectCallable.doCall(Ljava/util/concurrent/Callable;)Ljava/lang/Object;+1 +j org.apache.shiro.subject.support.SubjectCallable.call()Ljava/lang/Object;+14 +j org.apache.shiro.subject.support.DelegatingSubject.execute(Ljava/util/concurrent/Callable;)Ljava/lang/Object;+7 +j org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+47 +j org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+113 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.springframework.web.filter.RequestContextFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+21 +j org.springframework.web.filter.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+147 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.springframework.web.filter.FormContentFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+38 +j org.springframework.web.filter.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+147 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+44 +j org.springframework.session.web.http.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+118 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljavax/servlet/FilterChain;)V+53 +j org.springframework.web.filter.OncePerRequestFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V+147 +j org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+135 +j org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+101 +j org.apache.catalina.core.StandardWrapperValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+694 +j org.apache.catalina.core.StandardContextValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+166 +j org.apache.catalina.authenticator.AuthenticatorBase.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+260 +j org.apache.catalina.core.StandardHostValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+114 +j org.apache.catalina.valves.ErrorReportValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+6 +j org.apache.catalina.core.StandardEngineValve.invoke(Lorg/apache/catalina/connector/Request;Lorg/apache/catalina/connector/Response;)V+45 +j org.apache.catalina.connector.CoyoteAdapter.service(Lorg/apache/coyote/Request;Lorg/apache/coyote/Response;)V+199 +j org.apache.coyote.http11.Http11Processor.service(Lorg/apache/tomcat/util/net/SocketWrapperBase;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState;+735 +j org.apache.coyote.AbstractProcessorLight.process(Lorg/apache/tomcat/util/net/SocketWrapperBase;Lorg/apache/tomcat/util/net/SocketEvent;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState;+170 +j org.apache.coyote.AbstractProtocol$ConnectionHandler.process(Lorg/apache/tomcat/util/net/SocketWrapperBase;Lorg/apache/tomcat/util/net/SocketEvent;)Lorg/apache/tomcat/util/net/AbstractEndpoint$Handler$SocketState;+505 +j org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun()V+214 +j org.apache.tomcat.util.net.SocketProcessorBase.run()V+21 +j java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+95 +j java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5 +j org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run()V+4 +j java.lang.Thread.run()V+11 +v ~StubRoutines::call_stub + +--------------- P R O C E S S --------------- + +Java Threads: ( => current thread ) + 0x0000000030aed000 JavaThread "FeatureNativeObjectsCleaner" daemon [_thread_blocked, id=15244, stack(0x0000000036f60000,0x0000000037060000)] + 0x0000000030aec800 JavaThread "GeometryNativeObjectsCleaner" daemon [_thread_blocked, id=3820, stack(0x0000000036e60000,0x0000000036f60000)] + 0x0000000030aea000 JavaThread "MessageBroker-5" [_thread_blocked, id=11528, stack(0x0000000036560000,0x0000000036660000)] + 0x0000000030af0000 JavaThread "lettuce-eventExecutorLoop-1-1" daemon [_thread_blocked, id=17248, stack(0x0000000035270000,0x0000000035370000)] + 0x0000000030ae2800 JavaThread "lettuce-nioEventLoop-4-1" daemon [_thread_in_native, id=5596, stack(0x0000000034160000,0x0000000034260000)] + 0x0000000030ae9800 JavaThread "SessionValidationThread-1" daemon [_thread_blocked, id=18952, stack(0x0000000033d90000,0x0000000033e90000)] + 0x0000000030ae3800 JavaThread "RMI TCP Connection(2)-192.168.1.32" daemon [_thread_in_native, id=17612, stack(0x0000000033a90000,0x0000000033b90000)] + 0x0000000030ae2000 JavaThread "MessageBroker-4" [_thread_blocked, id=9588, stack(0x0000000033990000,0x0000000033a90000)] + 0x0000000030ae8800 JavaThread "DestroyJavaVM" [_thread_blocked, id=9444, stack(0x0000000002a40000,0x0000000002b40000)] + 0x0000000030ae1000 JavaThread "MessageBroker-3" [_thread_blocked, id=17364, stack(0x0000000033890000,0x0000000033990000)] + 0x0000000030ae8000 JavaThread "MessageBroker-2" [_thread_blocked, id=18688, stack(0x0000000033790000,0x0000000033890000)] + 0x0000000030ae5800 JavaThread "http-nio-0.0.0.0-9001-Acceptor" daemon [_thread_in_native, id=1752, stack(0x0000000033690000,0x0000000033790000)] + 0x0000000030ae5000 JavaThread "http-nio-0.0.0.0-9001-ClientPoller" daemon [_thread_in_native, id=16100, stack(0x0000000033590000,0x0000000033690000)] + 0x0000000030ae6800 JavaThread "http-nio-0.0.0.0-9001-exec-10" daemon [_thread_blocked, id=18992, stack(0x0000000033490000,0x0000000033590000)] + 0x0000000030ae4000 JavaThread "http-nio-0.0.0.0-9001-exec-9" daemon [_thread_blocked, id=14280, stack(0x0000000033390000,0x0000000033490000)] + 0x0000000030ae7000 JavaThread "http-nio-0.0.0.0-9001-exec-8" daemon [_thread_blocked, id=13748, stack(0x0000000033290000,0x0000000033390000)] + 0x00000000302ce800 JavaThread "http-nio-0.0.0.0-9001-exec-7" daemon [_thread_blocked, id=16148, stack(0x0000000033190000,0x0000000033290000)] + 0x00000000302cd800 JavaThread "http-nio-0.0.0.0-9001-exec-6" daemon [_thread_blocked, id=19248, stack(0x0000000033090000,0x0000000033190000)] + 0x00000000302d4800 JavaThread "http-nio-0.0.0.0-9001-exec-5" daemon [_thread_blocked, id=11532, stack(0x0000000032f90000,0x0000000033090000)] + 0x00000000302d3000 JavaThread "http-nio-0.0.0.0-9001-exec-4" daemon [_thread_blocked, id=1884, stack(0x0000000032e90000,0x0000000032f90000)] + 0x00000000302d0000 JavaThread "http-nio-0.0.0.0-9001-exec-3" daemon [_thread_blocked, id=252, stack(0x0000000032d90000,0x0000000032e90000)] + 0x00000000302cf000 JavaThread "http-nio-0.0.0.0-9001-exec-2" daemon [_thread_blocked, id=15996, stack(0x0000000032c90000,0x0000000032d90000)] +=>0x00000000302d2000 JavaThread "http-nio-0.0.0.0-9001-exec-1" daemon [_thread_in_native, id=3396, stack(0x0000000032b90000,0x0000000032c90000)] + 0x00000000302d1800 JavaThread "http-nio-0.0.0.0-9001-BlockPoller" daemon [_thread_in_native, id=3532, stack(0x0000000032a90000,0x0000000032b90000)] + 0x00000000302d0800 JavaThread "MessageBroker-1" [_thread_blocked, id=2416, stack(0x0000000032190000,0x0000000032290000)] + 0x00000000302d3800 JavaThread "HikariPool-1 connection adder" daemon [_thread_blocked, id=3952, stack(0x0000000031e90000,0x0000000031f90000)] + 0x0000000028d47000 JavaThread "container-0" [_thread_blocked, id=3140, stack(0x0000000031d90000,0x0000000031e90000)] + 0x0000000028d48800 JavaThread "Catalina-utility-2" [_thread_blocked, id=7696, stack(0x0000000031c90000,0x0000000031d90000)] + 0x0000000028d44800 JavaThread "Catalina-utility-1" [_thread_blocked, id=13188, stack(0x0000000031b90000,0x0000000031c90000)] + 0x0000000028d42000 JavaThread "HikariPool-1 housekeeper" daemon [_thread_blocked, id=15844, stack(0x0000000031890000,0x0000000031990000)] + 0x000000002b6ac800 JavaThread "PostgreSQL-JDBC-SharedTimer-1" daemon [_thread_blocked, id=9172, stack(0x0000000031790000,0x0000000031890000)] + 0x000000002cf80800 JavaThread "JMX server connection timeout 24" daemon [_thread_blocked, id=17704, stack(0x000000002e380000,0x000000002e480000)] + 0x000000002cf3a800 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=17464, stack(0x000000002e280000,0x000000002e380000)] + 0x000000002cef7000 JavaThread "RMI TCP Connection(1)-192.168.1.32" daemon [_thread_in_native, id=10332, stack(0x000000002e180000,0x000000002e280000)] + 0x000000002cdb7000 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=19092, stack(0x000000002dcd0000,0x000000002ddd0000)] + 0x000000002bc6b800 JavaThread "Service Thread" daemon [_thread_blocked, id=14408, stack(0x000000002cc00000,0x000000002cd00000)] + 0x000000002bb7f000 JavaThread "C1 CompilerThread11" daemon [_thread_blocked, id=17812, stack(0x000000002cb00000,0x000000002cc00000)] + 0x000000002bb76000 JavaThread "C1 CompilerThread10" daemon [_thread_blocked, id=19160, stack(0x000000002ca00000,0x000000002cb00000)] + 0x000000002bb73800 JavaThread "C1 CompilerThread9" daemon [_thread_blocked, id=13504, stack(0x000000002c900000,0x000000002ca00000)] + 0x000000002bb6a800 JavaThread "C1 CompilerThread8" daemon [_thread_blocked, id=17204, stack(0x000000002c800000,0x000000002c900000)] + 0x000000002bb67800 JavaThread "C2 CompilerThread7" daemon [_thread_blocked, id=4436, stack(0x000000002c700000,0x000000002c800000)] + 0x000000002bb5f000 JavaThread "C2 CompilerThread6" daemon [_thread_blocked, id=2332, stack(0x000000002c600000,0x000000002c700000)] + 0x000000002bb5c000 JavaThread "C2 CompilerThread5" daemon [_thread_blocked, id=17980, stack(0x000000002c500000,0x000000002c600000)] + 0x000000002bb59800 JavaThread "C2 CompilerThread4" daemon [_thread_blocked, id=9096, stack(0x000000002c300000,0x000000002c400000)] + 0x000000002bb58800 JavaThread "C2 CompilerThread3" daemon [_thread_blocked, id=2784, stack(0x000000002c200000,0x000000002c300000)] + 0x000000002bb58000 JavaThread "C2 CompilerThread2" daemon [_thread_blocked, id=8084, stack(0x000000002c100000,0x000000002c200000)] + 0x000000002bb57000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=17652, stack(0x000000002c000000,0x000000002c100000)] + 0x000000002bb55800 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=14620, stack(0x000000002bf00000,0x000000002c000000)] + 0x000000002bb54000 JavaThread "Monitor Ctrl-Break" daemon [_thread_in_native, id=6068, stack(0x000000002be00000,0x000000002bf00000)] + 0x0000000028bba000 JavaThread "Attach Listener" daemon [_thread_blocked, id=18180, stack(0x000000002b500000,0x000000002b600000)] + 0x0000000028c15000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=13996, stack(0x000000002b400000,0x000000002b500000)] + 0x0000000028b9d800 JavaThread "Finalizer" daemon [_thread_blocked, id=7232, stack(0x000000002b300000,0x000000002b400000)] + 0x0000000028b97800 JavaThread "Reference Handler" daemon [_thread_blocked, id=17012, stack(0x000000002b200000,0x000000002b300000)] + +Other Threads: + 0x00000000269cc000 VMThread [stack: 0x000000002b100000,0x000000002b200000] [id=7748] + 0x000000002cdbe800 WatcherThread [stack: 0x000000002ddd0000,0x000000002ded0000] [id=18648] + +VM state:not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: None + +heap address: 0x00000005c3400000, size: 8140 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 +Narrow klass base: 0x0000000000000000, Narrow klass shift: 3 +Compressed class space size: 1073741824 Address: 0x00000007c0000000 + +Heap: + PSYoungGen total 413696K, used 44369K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000) + eden space 393216K, 11% used [0x0000000716700000,0x0000000719254530,0x000000072e700000) + from space 20480K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731b80000) + to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000) + ParOldGen total 608768K, used 32122K [0x00000005c3400000, 0x00000005e8680000, 0x0000000716700000) + object space 608768K, 5% used [0x00000005c3400000,0x00000005c535e8b0,0x00000005e8680000) + Metaspace used 59500K, capacity 62494K, committed 62616K, reserved 1103872K + class space used 7280K, capacity 7807K, committed 7856K, reserved 1048576K + +Card table byte_map: [0x0000000012260000,0x0000000013250000] byte_map_base: 0x000000000f446000 + +Marking Bits: (ParMarkBitMap*) 0x000000006a8a4ce0 + Begin Bits: [0x00000000150f0000, 0x000000001d020000) + End Bits: [0x000000001d020000, 0x0000000024f50000) + +Polling page: 0x0000000000c00000 + +CodeCache: size=245760Kb used=13881Kb max_used=13881Kb free=231878Kb + bounds [0x0000000002ea0000, 0x0000000003c30000, 0x0000000011ea0000] + total_blobs=6937 nmethods=6187 adapters=659 + compilation: enabled + +Compilation events (10 events): +Event: 4.508 Thread 0x000000002bb7f000 6183 1 org.postgresql.jdbc.PgResultSet::checkColumnIndex (54 bytes) +Event: 4.508 Thread 0x000000002bb73800 nmethod 6182 0x0000000003c27550 code [0x0000000003c27700, 0x0000000003c27b88] +Event: 4.508 Thread 0x000000002bb73800 6184 1 org.apache.ibatis.type.TypeHandlerRegistry::hasTypeHandler (7 bytes) +Event: 4.508 Thread 0x000000002bb6a800 nmethod 6176 0x0000000003c27e50 code [0x0000000003c27fc0, 0x0000000003c282d8] +Event: 4.508 Thread 0x000000002bb73800 nmethod 6184 0x0000000003c28490 code [0x0000000003c285e0, 0x0000000003c28748] +Event: 4.508 Thread 0x000000002bb7f000 nmethod 6183 0x0000000003c287d0 code [0x0000000003c28980, 0x0000000003c28e78] +Event: 4.508 Thread 0x000000002bb76000 6186 1 org.postgresql.core.PGStream::receiveChar (22 bytes) +Event: 4.508 Thread 0x000000002bb6a800 6187 1 org.postgresql.core.VisibleBufferedInputStream::read (31 bytes) +Event: 4.508 Thread 0x000000002bb76000 nmethod 6186 0x0000000003c29250 code [0x0000000003c293c0, 0x0000000003c295d8] +Event: 4.508 Thread 0x000000002bb6a800 nmethod 6187 0x0000000003c29790 code [0x0000000003c29900, 0x0000000003c29aa8] + +GC Heap History (10 events): +Event: 1.137 GC heap before +{Heap before GC invocations=5 (full 1): + PSYoungGen total 283648K, used 174161K [0x0000000716700000, 0x000000072de80000, 0x00000007c0000000) + eden space 262144K, 63% used [0x0000000716700000,0x0000000720905518,0x0000000726700000) + from space 21504K, 38% used [0x0000000726700000,0x0000000726f0f280,0x0000000727c00000) + to space 21504K, 0% used [0x000000072c980000,0x000000072c980000,0x000000072de80000) + ParOldGen total 227840K, used 9897K [0x00000005c3400000, 0x00000005d1280000, 0x0000000716700000) + object space 227840K, 4% used [0x00000005c3400000,0x00000005c3daa578,0x00000005d1280000) + Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K +Event: 1.141 GC heap after +Heap after GC invocations=5 (full 1): + PSYoungGen total 355840K, used 13174K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000) + eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000) + from space 17920K, 73% used [0x000000072c980000,0x000000072d65da90,0x000000072db00000) + to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000) + ParOldGen total 227840K, used 9977K [0x00000005c3400000, 0x00000005d1280000, 0x0000000716700000) + object space 227840K, 4% used [0x00000005c3400000,0x00000005c3dbe588,0x00000005d1280000) + Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K +} +Event: 1.141 GC heap before +{Heap before GC invocations=6 (full 2): + PSYoungGen total 355840K, used 13174K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000) + eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000) + from space 17920K, 73% used [0x000000072c980000,0x000000072d65da90,0x000000072db00000) + to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000) + ParOldGen total 227840K, used 9977K [0x00000005c3400000, 0x00000005d1280000, 0x0000000716700000) + object space 227840K, 4% used [0x00000005c3400000,0x00000005c3dbe588,0x00000005d1280000) + Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K +Event: 1.188 GC heap after +Heap after GC invocations=6 (full 2): + PSYoungGen total 355840K, used 0K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000) + eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000) + from space 17920K, 0% used [0x000000072c980000,0x000000072c980000,0x000000072db00000) + to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000) + ParOldGen total 408064K, used 19598K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000) + object space 408064K, 4% used [0x00000005c3400000,0x00000005c4723968,0x00000005dc280000) + Metaspace used 34084K, capacity 35470K, committed 35496K, reserved 1079296K + class space used 4462K, capacity 4782K, committed 4784K, reserved 1048576K +} +Event: 2.123 GC heap before +{Heap before GC invocations=7 (full 2): + PSYoungGen total 355840K, used 337920K [0x0000000716700000, 0x000000072db00000, 0x00000007c0000000) + eden space 337920K, 100% used [0x0000000716700000,0x000000072b100000,0x000000072b100000) + from space 17920K, 0% used [0x000000072c980000,0x000000072c980000,0x000000072db00000) + to space 21504K, 0% used [0x000000072b100000,0x000000072b100000,0x000000072c600000) + ParOldGen total 408064K, used 19598K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000) + object space 408064K, 4% used [0x00000005c3400000,0x00000005c4723968,0x00000005dc280000) + Metaspace used 49543K, capacity 52198K, committed 52392K, reserved 1095680K + class space used 6239K, capacity 6760K, committed 6832K, reserved 1048576K +Event: 2.131 GC heap after +Heap after GC invocations=7 (full 2): + PSYoungGen total 359424K, used 21498K [0x0000000716700000, 0x0000000731d80000, 0x00000007c0000000) + eden space 337920K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072b100000) + from space 21504K, 99% used [0x000000072b100000,0x000000072c5feb08,0x000000072c600000) + to space 22528K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731d80000) + ParOldGen total 408064K, used 21202K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000) + object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b4ba0,0x00000005dc280000) + Metaspace used 49543K, capacity 52198K, committed 52392K, reserved 1095680K + class space used 6239K, capacity 6760K, committed 6832K, reserved 1048576K +} +Event: 4.059 GC heap before +{Heap before GC invocations=8 (full 2): + PSYoungGen total 359424K, used 213127K [0x0000000716700000, 0x0000000731d80000, 0x00000007c0000000) + eden space 337920K, 56% used [0x0000000716700000,0x0000000722223468,0x000000072b100000) + from space 21504K, 99% used [0x000000072b100000,0x000000072c5feb08,0x000000072c600000) + to space 22528K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731d80000) + ParOldGen total 408064K, used 21202K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000) + object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b4ba0,0x00000005dc280000) + Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K +Event: 4.066 GC heap after +Heap after GC invocations=8 (full 2): + PSYoungGen total 413696K, used 20130K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000) + eden space 393216K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072e700000) + from space 20480K, 98% used [0x0000000730780000,0x0000000731b289d0,0x0000000731b80000) + to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000) + ParOldGen total 408064K, used 21210K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000) + object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b6ba0,0x00000005dc280000) + Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K +} +Event: 4.066 GC heap before +{Heap before GC invocations=9 (full 3): + PSYoungGen total 413696K, used 20130K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000) + eden space 393216K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072e700000) + from space 20480K, 98% used [0x0000000730780000,0x0000000731b289d0,0x0000000731b80000) + to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000) + ParOldGen total 408064K, used 21210K [0x00000005c3400000, 0x00000005dc280000, 0x0000000716700000) + object space 408064K, 5% used [0x00000005c3400000,0x00000005c48b6ba0,0x00000005dc280000) + Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K +Event: 4.132 GC heap after +Heap after GC invocations=9 (full 3): + PSYoungGen total 413696K, used 0K [0x0000000716700000, 0x0000000731b80000, 0x00000007c0000000) + eden space 393216K, 0% used [0x0000000716700000,0x0000000716700000,0x000000072e700000) + from space 20480K, 0% used [0x0000000730780000,0x0000000730780000,0x0000000731b80000) + to space 25088K, 0% used [0x000000072ea80000,0x000000072ea80000,0x0000000730300000) + ParOldGen total 608768K, used 32122K [0x00000005c3400000, 0x00000005e8680000, 0x0000000716700000) + object space 608768K, 5% used [0x00000005c3400000,0x00000005c535e8b0,0x00000005e8680000) + Metaspace used 56210K, capacity 59082K, committed 59160K, reserved 1101824K + class space used 6888K, capacity 7436K, committed 7472K, reserved 1048576K +} + +Deoptimization events (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (10 events): +Event: 4.209 Thread 0x00000000302d2000 Exception (0x00000007183cfb70) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x000000071843ec78) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x00000007184403e0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x0000000718441b00) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x00000007184468b8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x0000000718448f90) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x000000071844a6d8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x000000071844bdd8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.210 Thread 0x00000000302d2000 Exception (0x000000071844d320) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] +Event: 4.492 Thread 0x00000000302d2000 Exception (0x0000000718c4e720) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\runtime\sharedRuntime.cpp, line 605] + +Events (10 events): +Event: 4.551 loading class org/gdal/ogr/FieldDefn done +Event: 4.582 loading class org/gdal/ogr/FeatureDefn +Event: 4.582 loading class org/gdal/ogr/FeatureDefn done +Event: 4.583 loading class org/gdal/ogr/Feature +Event: 4.583 loading class org/gdal/ogr/Feature done +Event: 4.583 loading class org/gdal/ogr/FeatureNative +Event: 4.583 loading class org/gdal/ogr/FeatureNative done +Event: 4.583 loading class org/gdal/ogr/FeatureNative$1 +Event: 4.583 loading class org/gdal/ogr/FeatureNative$1 done +Event: 4.584 Thread 0x0000000030aed000 Thread added: 0x0000000030aed000 + + +Dynamic libraries: +0x00007ff600c30000 - 0x00007ff600c67000 E:\Java\jdk1.8.0_201\bin\java.exe +0x00007ffc4d510000 - 0x00007ffc4d708000 C:\Windows\SYSTEM32\ntdll.dll +0x00007ffc4bd90000 - 0x00007ffc4be52000 C:\Windows\System32\KERNEL32.DLL +0x00007ffc4b100000 - 0x00007ffc4b3f6000 C:\Windows\System32\KERNELBASE.dll +0x00007ffc4c230000 - 0x00007ffc4c2e1000 C:\Windows\System32\ADVAPI32.dll +0x00007ffc4b6e0000 - 0x00007ffc4b77e000 C:\Windows\System32\msvcrt.dll +0x00007ffc4b990000 - 0x00007ffc4ba2f000 C:\Windows\System32\sechost.dll +0x00007ffc4c100000 - 0x00007ffc4c223000 C:\Windows\System32\RPCRT4.dll +0x00007ffc4ad40000 - 0x00007ffc4ad67000 C:\Windows\System32\bcrypt.dll +0x00007ffc4b540000 - 0x00007ffc4b6dd000 C:\Windows\System32\USER32.dll +0x00007ffc4b400000 - 0x00007ffc4b422000 C:\Windows\System32\win32u.dll +0x00007ffc4d320000 - 0x00007ffc4d34b000 C:\Windows\System32\GDI32.dll +0x00007ffc4ae80000 - 0x00007ffc4af99000 C:\Windows\System32\gdi32full.dll +0x00007ffc4aba0000 - 0x00007ffc4ac3d000 C:\Windows\System32\msvcp_win.dll +0x00007ffc4b430000 - 0x00007ffc4b530000 C:\Windows\System32\ucrtbase.dll +0x00007ffc3c640000 - 0x00007ffc3c8da000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.5915_none_60b4b9d171f9c7c7\COMCTL32.dll +0x00007ffc4d2f0000 - 0x00007ffc4d31f000 C:\Windows\System32\IMM32.DLL +0x000000006a930000 - 0x000000006aa01000 E:\Java\jdk1.8.0_201\jre\bin\msvcr100.dll +0x000000006a080000 - 0x000000006a924000 E:\Java\jdk1.8.0_201\jre\bin\server\jvm.dll +0x00007ffc4c420000 - 0x00007ffc4c428000 C:\Windows\System32\PSAPI.DLL +0x00007ffc47420000 - 0x00007ffc47429000 C:\Windows\SYSTEM32\WSOCK32.dll +0x00007ffc46f80000 - 0x00007ffc46f8a000 C:\Windows\SYSTEM32\VERSION.dll +0x00007ffc41df0000 - 0x00007ffc41e17000 C:\Windows\SYSTEM32\WINMM.dll +0x00007ffc4cd00000 - 0x00007ffc4cd6b000 C:\Windows\System32\WS2_32.dll +0x00007ffc47410000 - 0x00007ffc4741f000 E:\Java\jdk1.8.0_201\jre\bin\verify.dll +0x00007ffc473e0000 - 0x00007ffc47409000 E:\Java\jdk1.8.0_201\jre\bin\java.dll +0x00007ffc456a0000 - 0x00007ffc456c3000 E:\Java\jdk1.8.0_201\jre\bin\instrument.dll +0x00007ffc43d30000 - 0x00007ffc43d46000 E:\Java\jdk1.8.0_201\jre\bin\zip.dll +0x00007ffc4c590000 - 0x00007ffc4ccfe000 C:\Windows\System32\SHELL32.dll +0x00007ffc48c20000 - 0x00007ffc493c4000 C:\Windows\SYSTEM32\windows.storage.dll +0x00007ffc4ba30000 - 0x00007ffc4bd83000 C:\Windows\System32\combase.dll +0x00007ffc4a5d0000 - 0x00007ffc4a5fb000 C:\Windows\SYSTEM32\Wldp.dll +0x00007ffc4d350000 - 0x00007ffc4d41d000 C:\Windows\System32\OLEAUT32.dll +0x00007ffc4cd70000 - 0x00007ffc4ce1d000 C:\Windows\System32\SHCORE.dll +0x00007ffc4b930000 - 0x00007ffc4b98b000 C:\Windows\System32\shlwapi.dll +0x00007ffc4aad0000 - 0x00007ffc4aaf5000 C:\Windows\SYSTEM32\profapi.dll +0x00007ffbfbf40000 - 0x00007ffbfbf5a000 E:\Java\jdk1.8.0_201\jre\bin\net.dll +0x00007ffc3f5e0000 - 0x00007ffc3f7d0000 C:\Windows\SYSTEM32\urlmon.dll +0x00007ffc3f2f0000 - 0x00007ffc3f5af000 C:\Windows\SYSTEM32\iertutil.dll +0x00007ffc3f5b0000 - 0x00007ffc3f5d8000 C:\Windows\SYSTEM32\srvcli.dll +0x00007ffc4a000000 - 0x00007ffc4a00c000 C:\Windows\SYSTEM32\netutils.dll +0x00007ffc4a330000 - 0x00007ffc4a39a000 C:\Windows\system32\mswsock.dll +0x00007ffc4a010000 - 0x00007ffc4a0da000 C:\Windows\SYSTEM32\DNSAPI.dll +0x00007ffc49fc0000 - 0x00007ffc49ffb000 C:\Windows\SYSTEM32\IPHLPAPI.DLL +0x00007ffc4b530000 - 0x00007ffc4b538000 C:\Windows\System32\NSI.dll +0x00007ffc44d70000 - 0x00007ffc44d7a000 C:\Windows\System32\rasadhlp.dll +0x00007ffc43240000 - 0x00007ffc432c0000 C:\Windows\System32\fwpuclnt.dll +0x00007ffc45150000 - 0x00007ffc4515d000 E:\Java\jdk1.8.0_201\jre\bin\management.dll +0x00007ffbf80e0000 - 0x00007ffbf80f1000 E:\Java\jdk1.8.0_201\jre\bin\nio.dll +0x00007ffc4a520000 - 0x00007ffc4a538000 C:\Windows\SYSTEM32\CRYPTSP.dll +0x00007ffc49be0000 - 0x00007ffc49c18000 C:\Windows\system32\rsaenh.dll +0x00007ffc4aa90000 - 0x00007ffc4aabe000 C:\Windows\SYSTEM32\USERENV.dll +0x00007ffc4ad70000 - 0x00007ffc4adf2000 C:\Windows\System32\bcryptprimitives.dll +0x00007ffc4a540000 - 0x00007ffc4a54c000 C:\Windows\SYSTEM32\CRYPTBASE.dll +0x00007ffc451a0000 - 0x00007ffc451b7000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL +0x00007ffc45180000 - 0x00007ffc4519d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL +0x00007ffc34ce0000 - 0x00007ffc34cf7000 C:\Windows\system32\napinsp.dll +0x00007ffc302b0000 - 0x00007ffc302cb000 C:\Windows\system32\pnrpnsp.dll +0x00007ffc30290000 - 0x00007ffc302ad000 C:\Windows\system32\wshbth.dll +0x00007ffc455f0000 - 0x00007ffc4560d000 C:\Windows\system32\NLAapi.dll +0x00007ffc30270000 - 0x00007ffc30282000 C:\Windows\System32\winrnr.dll +0x00007ffc3abe0000 - 0x00007ffc3ac31000 C:\Windows\SYSTEM32\pdh.dll +0x00007ffc43d20000 - 0x00007ffc43d2f000 C:\Windows\System32\perfproc.dll +0x00007ffc1a870000 - 0x00007ffc1a87f000 C:\Windows\System32\perfos.dll +0x00007ffc1b9c0000 - 0x00007ffc1b9e4000 E:\Java\jdk1.8.0_201\jre\bin\sunec.dll +0x00007ffc35b60000 - 0x00007ffc35c08000 E:\Java\jdk1.8.0_201\bin\gdalalljni.dll +0x00007ffc359f0000 - 0x00007ffc35a7d000 E:\Java\jdk1.8.0_201\bin\MSVCP140.dll +0x00007ffbecbd0000 - 0x00007ffbee01d000 E:\Java\jdk1.8.0_201\bin\gdal.dll +0x00007ffc438e0000 - 0x00007ffc438fb000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140.dll +0x00007ffc43cf0000 - 0x00007ffc43cfc000 E:\Java\jdk1.8.0_201\bin\VCRUNTIME140_1.dll +0x00007ffc4afa0000 - 0x00007ffc4b0fd000 C:\Windows\System32\CRYPT32.dll +0x00007ffc433a0000 - 0x00007ffc433b9000 E:\Java\jdk1.8.0_201\bin\zlib.dll +0x00007ffc4c2f0000 - 0x00007ffc4c41b000 C:\Windows\System32\ole32.dll +0x00007ffc358c0000 - 0x00007ffc35953000 E:\Java\jdk1.8.0_201\bin\libcurl.dll +0x00007ffc249e0000 - 0x00007ffc24aa0000 C:\Windows\SYSTEM32\ODBC32.dll +0x00007ffc1c440000 - 0x00007ffc1c5a3000 E:\Java\jdk1.8.0_201\bin\libxml2.dll +0x00007ffbec6f0000 - 0x00007ffbecbc2000 E:\Java\jdk1.8.0_201\bin\libcrypto-3-x64.dll +0x00007ffc1c300000 - 0x00007ffc1c439000 E:\Java\jdk1.8.0_201\bin\libssl-3-x64.dll +0x00007ffc4c450000 - 0x00007ffc4c4af000 C:\Windows\System32\WLDAP32.dll +0x00007ffc257a0000 - 0x00007ffc25854000 E:\Java\jdk1.8.0_201\bin\zstd.dll +0x00007ffc1bfa0000 - 0x00007ffc1c2fa000 E:\Java\jdk1.8.0_201\bin\proj_9.dll +0x00007ffc19400000 - 0x00007ffc196ab000 E:\Java\jdk1.8.0_201\bin\xerces-c_3_2.dll +0x00007ffc3bec0000 - 0x00007ffc3bef5000 E:\Java\jdk1.8.0_201\bin\libpng16.dll +0x00007ffbf7f90000 - 0x00007ffbf80dd000 E:\Java\jdk1.8.0_201\bin\tiff.dll +0x0000000180000000 - 0x000000018004e000 E:\Java\jdk1.8.0_201\bin\LIBPQ.dll +0x00007ffc35b00000 - 0x00007ffc35b51000 E:\Java\jdk1.8.0_201\bin\openjp2.dll +0x00007ffbec420000 - 0x00007ffbec6e8000 E:\Java\jdk1.8.0_201\bin\sqlite3.dll +0x00007ffc3bea0000 - 0x00007ffc3bec0000 E:\Java\jdk1.8.0_201\bin\pcre.dll +0x00007ffc359c0000 - 0x00007ffc359e9000 E:\Java\jdk1.8.0_201\bin\freexl.dll +0x00007ffc35990000 - 0x00007ffc359b2000 E:\Java\jdk1.8.0_201\bin\ogdi.dll +0x00007ffbd1960000 - 0x00007ffbd264b000 E:\Java\jdk1.8.0_201\bin\spatialite.dll +0x00007ffbe86e0000 - 0x00007ffbe8d81000 E:\Java\jdk1.8.0_201\bin\libmysql.dll +0x00007ffc35890000 - 0x00007ffc358ba000 E:\Java\jdk1.8.0_201\bin\libexpat.dll +0x00007ffbfac00000 - 0x00007ffbfacff000 E:\Java\jdk1.8.0_201\bin\iconv-2.dll +0x00007ffc35830000 - 0x00007ffc3588c000 E:\Java\jdk1.8.0_201\bin\geos_c.dll +0x00007ffc3d020000 - 0x00007ffc3d02c000 C:\Windows\SYSTEM32\Secur32.dll +0x00007ffc4a990000 - 0x00007ffc4a99a000 C:\Windows\SYSTEM32\DPAPI.DLL +0x00007ffbe8500000 - 0x00007ffbe86d5000 E:\Java\jdk1.8.0_201\bin\geos.dll +0x00007ffc4aa50000 - 0x00007ffc4aa82000 C:\Windows\SYSTEM32\SSPICLI.DLL +0x00007ffc357a0000 - 0x00007ffc35807000 E:\gdal\bin\gdalplugins\ogr_FileGDB.dll +0x00007ffbb1770000 - 0x00007ffbb22f2000 E:\Java\jdk1.8.0_201\bin\FileGDBAPI.dll +0x00007ffc485d0000 - 0x00007ffc487d1000 C:\Windows\SYSTEM32\dbghelp.dll + +VM Arguments: +jvm_args: -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\lib\idea_rt.jar=56029 -Dfile.encoding=UTF-8 +java_command: cn.edu.whu.boot.BootApplication +java_class_path (initial): E:\Java\jdk1.8.0_201\jre\lib\charsets.jar;E:\Java\jdk1.8.0_201\jre\lib\deploy.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_201\jre\lib\javaws.jar;E:\Java\jdk1.8.0_201\jre\lib\jce.jar;E:\Java\jdk1.8.0_201\jre\lib\jfr.jar;E:\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_201\jre\lib\jsse.jar;E:\Java\jdk1.8.0_201\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_201\jre\lib\plugin.jar;E:\Java\jdk1.8.0_201\jre\lib\resources.jar;E:\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\503\TJ_project\lydc_backend\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.0.RELEASE\spring-boot-starter-web-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.0.RELEASE\spring-boot-starter-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot\2.3.0.RELEASE\spring-boot-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.0.RELEASE\spring-boot-starter-logging-2.3.0.RELEASE.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.2\log4j-to-slf4j-2.13.2.jar;C:\Users\Administrator\.m2\repository\org\apache\logging\log4j\log4j-a +Launcher Type: SUN_STANDARD + +Environment Variables: +JAVA_HOME=E:\Java\jdk1.8.0_201 +PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Git\cmd;E:\gdal\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;E:\Program Files\JetBrains\IntelliJ IDEA 2025.1.1.1\bin; +USERNAME=Administrator +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 183 Stepping 1, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 10.0 , 64 bit Build 19041 (10.0.19041.5915) + +CPU:total 28 (initial active 28) (14 cores per cpu, 2 threads per core) family 6 model 183 stepping 1, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx + +Memory: 4k page, physical 33338604k(21598564k free), swap 38319340k(23322232k free) + +vm_info: Java HotSpot(TM) 64-Bit Server VM (25.201-b09) for windows-amd64 JRE (1.8.0_201-b09), built on Dec 15 2018 18:36:39 by "java_re" with MS VC++ 10.0 (VS2010) + +time: Mon Nov 03 22:03:53 2025 +timezone: й׼ʱ +elapsed time: 4 seconds (0d 0h 0m 4s) + diff --git a/hs_err_pid26132.log b/hs_err_pid26132.log new file mode 100644 index 0000000..efc7976 --- /dev/null +++ b/hs_err_pid26132.log @@ -0,0 +1,335 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (malloc) failed to allocate 32744 bytes for ChunkPool::allocate +# Possible reasons: +# The system is out of physical RAM or swap space +# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Unscaled Compressed Oops mode in which the Java heap is +# placed in the first 4GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 4GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (allocation.cpp:273), pid=26132, tid=0x0000000000004654 +# +# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09) +# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops) +# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows +# + +--------------- T H R E A D --------------- + +Current thread (0x000000001a6d0800): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=18004, stack(0x000000001ac80000,0x000000001ad80000)] + +Stack: [0x000000001ac80000,0x000000001ad80000] +[error occurred during error reporting (printing stack bounds), id 0xc0000005] + +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) + + +Current CompileTask: +C2: 4016 2672 4 java.net.URLClassLoader$1::run (5 bytes) + + +--------------- P R O C E S S --------------- + +Java Threads: ( => current thread ) + 0x000000001a70c000 JavaThread "Service Thread" daemon [_thread_blocked, id=12020, stack(0x000000001b080000,0x000000001b180000)] + 0x000000001a707800 JavaThread "C1 CompilerThread3" daemon [_thread_blocked, id=2948, stack(0x000000001af80000,0x000000001b080000)] + 0x000000001a706800 JavaThread "C2 CompilerThread2" daemon [_thread_in_native, id=24492, stack(0x000000001ae80000,0x000000001af80000)] + 0x000000001a6a0000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=4248, stack(0x000000001ad80000,0x000000001ae80000)] +=>0x000000001a6d0800 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=18004, stack(0x000000001ac80000,0x000000001ad80000)] + 0x000000001a6cd000 JavaThread "Monitor Ctrl-Break" daemon [_thread_in_native, id=13804, stack(0x000000001ab80000,0x000000001ac80000)] + 0x0000000019c1a800 JavaThread "Attach Listener" daemon [_thread_blocked, id=14800, stack(0x000000001a280000,0x000000001a380000)] + 0x0000000019bc4000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=10388, stack(0x000000001a180000,0x000000001a280000)] + 0x0000000017da5800 JavaThread "Finalizer" daemon [_thread_blocked, id=24888, stack(0x000000001a080000,0x000000001a180000)] + 0x0000000019ba0800 JavaThread "Reference Handler" daemon [_thread_blocked, id=14852, stack(0x0000000019f80000,0x000000001a080000)] + 0x0000000002cbb000 JavaThread "main" [_thread_in_vm, id=11252, stack(0x0000000002ae0000,0x0000000002be0000)] + +Other Threads: + 0x0000000017d96800 VMThread [stack: 0x0000000019a80000,0x0000000019b80000] [id=23260] + 0x000000001a6a0800 WatcherThread [stack: 0x000000001b180000,0x000000001b280000] [id=6328] + +VM state:not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: None + +heap address: 0x0000000082800000, size: 2008 MB, Compressed Oops mode: 32-bit +Narrow klass base: 0x0000000000000000, Narrow klass shift: 3 +Compressed class space size: 1073741824 Address: 0x0000000100000000 + +Heap: + PSYoungGen total 70656K, used 48501K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 68% used [0x00000000d6300000,0x00000000d8edf6b0,0x00000000da300000) + from space 5120K, 69% used [0x00000000da300000,0x00000000da67ddb8,0x00000000da800000) + to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + ParOldGen total 61952K, used 8032K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd8168,0x0000000086480000) + Metaspace used 25650K, capacity 26730K, committed 27008K, reserved 1073152K + class space used 3158K, capacity 3363K, committed 3456K, reserved 1048576K + +Card table byte_map: [0x0000000012270000,0x0000000012660000] byte_map_base: 0x0000000011e5c000 + +Marking Bits: (ParMarkBitMap*) 0x00000000520a4ce0 + Begin Bits: [0x0000000013100000, 0x0000000015060000) + End Bits: [0x0000000015060000, 0x0000000016fc0000) + +Polling page: 0x0000000000990000 + +CodeCache: size=245760Kb used=9587Kb max_used=9596Kb free=236172Kb + bounds [0x0000000002eb0000, 0x0000000003820000, 0x0000000011eb0000] + total_blobs=3151 nmethods=2784 adapters=278 + compilation: enabled + +Compilation events (10 events): +Event: 3.991 Thread 0x000000001a707800 nmethod 2783 0x0000000003810f50 code [0x0000000003811100, 0x00000000038116d0] +Event: 3.993 Thread 0x000000001a707800 2784 3 sun.misc.ProxyGenerator$ProxyMethod:: (14 bytes) +Event: 3.993 Thread 0x000000001a707800 nmethod 2784 0x0000000003811990 code [0x0000000003811b00, 0x0000000003811c88] +Event: 3.993 Thread 0x000000001a707800 2785 3 sun.misc.ProxyGenerator$ProxyMethod:: (64 bytes) +Event: 3.993 Thread 0x000000001a707800 nmethod 2785 0x0000000003811d50 code [0x0000000003811f20, 0x00000000038127c8] +Event: 3.995 Thread 0x000000001a6a0000 nmethod 2780 0x0000000003815d90 code [0x0000000003815f00, 0x0000000003816458] +Event: 3.998 Thread 0x000000001a707800 2786 3 org.springframework.beans.factory.support.AbstractBeanDefinition::resolveBeanClass (24 bytes) +Event: 3.998 Thread 0x000000001a707800 nmethod 2786 0x0000000003815290 code [0x0000000003815440, 0x0000000003815b98] +Event: 3.998 Thread 0x000000001a707800 2787 1 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition::getFactoryMethodMetadata (5 bytes) +Event: 3.999 Thread 0x000000001a707800 nmethod 2787 0x000000000380d710 code [0x000000000380d860, 0x000000000380d970] + +GC Heap History (10 events): +Event: 3.025 GC heap before +{Heap before GC invocations=4 (full 0): + PSYoungGen total 70656K, used 53941K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 74% used [0x00000000d6300000,0x00000000d92afe28,0x00000000da300000) + from space 5120K, 99% used [0x00000000da300000,0x00000000da7fd7a0,0x00000000da800000) + to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + ParOldGen total 86016K, used 5530K [0x0000000082800000, 0x0000000087c00000, 0x00000000d6300000) + object space 86016K, 6% used [0x0000000082800000,0x0000000082d66800,0x0000000087c00000) + Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K + class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K +Event: 3.030 GC heap after +Heap after GC invocations=4 (full 0): + PSYoungGen total 70656K, used 5112K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000) + from space 5120K, 99% used [0x00000000da800000,0x00000000dacfe218,0x00000000dad00000) + to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000) + ParOldGen total 86016K, used 8494K [0x0000000082800000, 0x0000000087c00000, 0x00000000d6300000) + object space 86016K, 9% used [0x0000000082800000,0x000000008304b9e8,0x0000000087c00000) + Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K + class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K +} +Event: 3.030 GC heap before +{Heap before GC invocations=5 (full 1): + PSYoungGen total 70656K, used 5112K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000) + from space 5120K, 99% used [0x00000000da800000,0x00000000dacfe218,0x00000000dad00000) + to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000) + ParOldGen total 86016K, used 8494K [0x0000000082800000, 0x0000000087c00000, 0x00000000d6300000) + object space 86016K, 9% used [0x0000000082800000,0x000000008304b9e8,0x0000000087c00000) + Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K + class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K +Event: 3.067 GC heap after +Heap after GC invocations=5 (full 1): + PSYoungGen total 70656K, used 0K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000) + from space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000) + ParOldGen total 61952K, used 8008K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd2168,0x0000000086480000) + Metaspace used 20448K, capacity 21212K, committed 21296K, reserved 1069056K + class space used 2492K, capacity 2674K, committed 2688K, reserved 1048576K +} +Event: 3.218 GC heap before +{Heap before GC invocations=6 (full 1): + PSYoungGen total 70656K, used 65536K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 100% used [0x00000000d6300000,0x00000000da300000,0x00000000da300000) + from space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000) + ParOldGen total 61952K, used 8008K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd2168,0x0000000086480000) + Metaspace used 21384K, capacity 22234K, committed 22576K, reserved 1069056K + class space used 2605K, capacity 2819K, committed 2944K, reserved 1048576K +Event: 3.219 GC heap after +Heap after GC invocations=6 (full 1): + PSYoungGen total 70656K, used 1574K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000) + from space 5120K, 30% used [0x00000000da300000,0x00000000da489a78,0x00000000da800000) + to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + ParOldGen total 61952K, used 8016K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd4168,0x0000000086480000) + Metaspace used 21384K, capacity 22234K, committed 22576K, reserved 1069056K + class space used 2605K, capacity 2819K, committed 2944K, reserved 1048576K +} +Event: 3.318 GC heap before +{Heap before GC invocations=7 (full 1): + PSYoungGen total 70656K, used 67110K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 100% used [0x00000000d6300000,0x00000000da300000,0x00000000da300000) + from space 5120K, 30% used [0x00000000da300000,0x00000000da489a78,0x00000000da800000) + to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + ParOldGen total 61952K, used 8016K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd4168,0x0000000086480000) + Metaspace used 21584K, capacity 22454K, committed 22576K, reserved 1069056K + class space used 2627K, capacity 2827K, committed 2944K, reserved 1048576K +Event: 3.320 GC heap after +Heap after GC invocations=7 (full 1): + PSYoungGen total 70656K, used 1301K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000) + from space 5120K, 25% used [0x00000000da800000,0x00000000da9454b0,0x00000000dad00000) + to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000) + ParOldGen total 61952K, used 8024K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd6168,0x0000000086480000) + Metaspace used 21584K, capacity 22454K, committed 22576K, reserved 1069056K + class space used 2627K, capacity 2827K, committed 2944K, reserved 1048576K +} +Event: 3.567 GC heap before +{Heap before GC invocations=8 (full 1): + PSYoungGen total 70656K, used 66837K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 100% used [0x00000000d6300000,0x00000000da300000,0x00000000da300000) + from space 5120K, 25% used [0x00000000da800000,0x00000000da9454b0,0x00000000dad00000) + to space 5120K, 0% used [0x00000000da300000,0x00000000da300000,0x00000000da800000) + ParOldGen total 61952K, used 8024K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd6168,0x0000000086480000) + Metaspace used 23251K, capacity 24186K, committed 24320K, reserved 1071104K + class space used 2847K, capacity 3043K, committed 3072K, reserved 1048576K +Event: 3.569 GC heap after +Heap after GC invocations=8 (full 1): + PSYoungGen total 70656K, used 3575K [0x00000000d6300000, 0x00000000dad00000, 0x0000000100000000) + eden space 65536K, 0% used [0x00000000d6300000,0x00000000d6300000,0x00000000da300000) + from space 5120K, 69% used [0x00000000da300000,0x00000000da67ddb8,0x00000000da800000) + to space 5120K, 0% used [0x00000000da800000,0x00000000da800000,0x00000000dad00000) + ParOldGen total 61952K, used 8032K [0x0000000082800000, 0x0000000086480000, 0x00000000d6300000) + object space 61952K, 12% used [0x0000000082800000,0x0000000082fd8168,0x0000000086480000) + Metaspace used 23251K, capacity 24186K, committed 24320K, reserved 1071104K + class space used 2847K, capacity 3043K, committed 3072K, reserved 1048576K +} + +Deoptimization events (10 events): +Event: 3.304 Thread 0x0000000002cbb000 Uncommon trap: reason=array_check action=maybe_recompile pc=0x00000000035dfa40 method=java.util.AbstractCollection.toArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 119 +Event: 3.305 Thread 0x0000000002cbb000 Uncommon trap: reason=array_check action=maybe_recompile pc=0x00000000035dfa40 method=java.util.AbstractCollection.toArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 119 +Event: 3.305 Thread 0x0000000002cbb000 Uncommon trap: reason=array_check action=maybe_recompile pc=0x00000000035dfa40 method=java.util.AbstractCollection.toArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 119 +Event: 3.397 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000000003355080 method=java.util.regex.Matcher.reset()Ljava/util/regex/Matcher; @ 47 +Event: 3.408 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000000034e4868 method=org.springframework.core.annotation.MergedAnnotationsCollection.isMappingForType(Lorg/springframework/core/annotation/AnnotationTypeMapping;Ljava/lang/Object;)Z @ 13 +Event: 3.706 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000000036a5fec method=org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(Ljava/lang/String;)Lorg/springframework/beans/factory/support/RootBeanDefinition; +Event: 3.716 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000000036adb3c method=org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(Ljava/lang/String;Z)Ljava/lang/Object; @ 20 +Event: 3.904 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000000373f3a4 method=org.springframework.core.ResolvableType$1.isAssignableFrom(Ljava/lang/Class;)Z @ 15 +Event: 3.979 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000000003495788 method=org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(Lorg/springframework/util/ConcurrentReferenceHashMap$Reference;Ljava/lang/Object;I)Lorg/springframewo +Event: 3.979 Thread 0x0000000002cbb000 Uncommon trap: reason=unstable_if action=reinterpret pc=0x000000000348f468 method=org.springframework.util.ConcurrentReferenceHashMap$Segment.findInChain(Lorg/springframework/util/ConcurrentReferenceHashMap$Reference;Ljava/lang/Object;I)Lorg/springframewo + +Classes redefined (0 events): +No events + +Internal exceptions (10 events): +Event: 2.411 Thread 0x0000000002cbb000 Exception (0x00000000d9521960) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, line 210 +Event: 2.412 Thread 0x0000000002cbb000 Exception (0x00000000d954b098) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionar +Event: 2.412 Thread 0x0000000002cbb000 Exception (0x00000000d956dea0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, line 210 +Event: 2.413 Thread 0x0000000002cbb000 Exception (0x00000000d95922a8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, lin +Event: 2.413 Thread 0x0000000002cbb000 Exception (0x00000000d95b4f90) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\classfile\systemDictionary.cpp, line 210 +Event: 2.805 Thread 0x0000000002cbb000 Exception (0x00000000d6e032f8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\lin +Event: 2.928 Thread 0x0000000002cbb000 Exception (0x00000000d81e3a28) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolver.cp +Event: 2.967 Thread 0x0000000002cbb000 Exception (0x00000000d868ebe8) thrown at [C:\re\workspace\8-2-build-windows-amd64-cyg +Event: 2.968 Thread 0x0000000002cbb000 Exception (0x00000000d86a59a0) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\share\vm\interpreter\linkResolv +Event: 3.685 Thread 0x0000000002cbb000 Exception (0x00000000d6ca0680) thrown at [C:\re\workspace\8-2-build-windows-amd64-cygwin\jdk8u201\12322\hotspot\src\s + +Events (10 events): +Event: 4.012 loading class org/springframework/cglib/core/ObjectSwitchCallback +Event: 4.012 loading class org/springframework/cglib/core/ObjectSwitchCallback done +Event: 4.013 loading class org/springframework/cglib/proxy/Enhancer$1 +Event: 4.013 loading class org/springframework/cglib/proxy/Enhancer$1 done +Event: 4.013 loading class org/springframework/cglib/core/AbstractClassGenerator$Source +Event: 4.013 loading class org/springframework/cglib/core/AbstractClassGenerator$Source done +Event: 4.014 loading class org/springframework/cglib/proxy/Enhancer$EnhancerKey +Event: 4.014 loading class org/springframework/cglib/proxy/Enhancer$EnhancerKey done +Event: 4.014 loading class org/springframework/cglib/core/KeyFactory +Event: 4.014 loading class org/springframework/cglib/core/KeyFactory done + + +Dynamic libraries: +0x00007ff6c8260000 - 0x00007ff6c8297000 E:\Java\jdk1.8.0_201\bin\java.exe +0x00007ffd2e2d0000 - 0x00007ffd2e4c8000 C:\WINDOWS\SYSTEM32\ntdll.dll +0x00007ffd2c600000 - 0x00007ffd2c6c2000 C:\WINDOWS\System32\KERNEL32.DLL +0x00007ffd2be00000 - 0x00007ffd2c0ff000 C:\WINDOWS\System32\KERNELBASE.dll +0x00007ffd2d210000 - 0x00007ffd2d2c1000 C:\WINDOWS\System32\ADVAPI32.dll +0x00007ffd2cef0000 - 0x00007ffd2cf8e000 C:\WINDOWS\System32\msvcrt.dll +0x00007ffd2cde0000 - 0x00007ffd2ce7f000 C:\WINDOWS\System32\sechost.dll +0x00007ffd2c6f0000 - 0x00007ffd2c813000 C:\WINDOWS\System32\RPCRT4.dll +0x00007ffd2ba00000 - 0x00007ffd2ba27000 C:\WINDOWS\System32\bcrypt.dll +0x00007ffd2d010000 - 0x00007ffd2d1ad000 C:\WINDOWS\System32\USER32.dll +0x00007ffd2c220000 - 0x00007ffd2c242000 C:\WINDOWS\System32\win32u.dll +0x00007ffd2e260000 - 0x00007ffd2e28b000 C:\WINDOWS\System32\GDI32.dll +0x00007ffd2c100000 - 0x00007ffd2c217000 C:\WINDOWS\System32\gdi32full.dll +0x00007ffd2b960000 - 0x00007ffd2b9fd000 C:\WINDOWS\System32\msvcp_win.dll +0x00007ffd2bba0000 - 0x00007ffd2bca0000 C:\WINDOWS\System32\ucrtbase.dll +0x00007ffd1c6d0000 - 0x00007ffd1c96a000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.4355_none_60b8b9eb71f62e16\COMCTL32.dll +0x00007ffd2e230000 - 0x00007ffd2e25f000 C:\WINDOWS\System32\IMM32.DLL +0x0000000052620000 - 0x00000000526f1000 E:\Java\jdk1.8.0_201\jre\bin\msvcr100.dll +0x0000000051880000 - 0x0000000052124000 E:\Java\jdk1.8.0_201\jre\bin\server\jvm.dll +0x00007ffd2cd20000 - 0x00007ffd2cd28000 C:\WINDOWS\System32\PSAPI.DLL +0x00007ffd1eb90000 - 0x00007ffd1ebb7000 C:\WINDOWS\SYSTEM32\WINMM.dll +0x00007ffd24c90000 - 0x00007ffd24c9a000 C:\WINDOWS\SYSTEM32\VERSION.dll +0x00007ffd1b7f0000 - 0x00007ffd1b7f9000 C:\WINDOWS\SYSTEM32\WSOCK32.dll +0x00007ffd2ce80000 - 0x00007ffd2ceeb000 C:\WINDOWS\System32\WS2_32.dll +0x00007ffd247c0000 - 0x00007ffd247cf000 E:\Java\jdk1.8.0_201\jre\bin\verify.dll +0x00007ffd1e290000 - 0x00007ffd1e2b9000 E:\Java\jdk1.8.0_201\jre\bin\java.dll +0x00007ffd0c570000 - 0x00007ffd0c593000 E:\Java\jdk1.8.0_201\jre\bin\instrument.dll +0x00007ffd234f0000 - 0x00007ffd23506000 E:\Java\jdk1.8.0_201\jre\bin\zip.dll +0x00007ffd2d9f0000 - 0x00007ffd2e15e000 C:\WINDOWS\System32\SHELL32.dll +0x00007ffd299e0000 - 0x00007ffd2a184000 C:\WINDOWS\SYSTEM32\windows.storage.dll +0x00007ffd2c820000 - 0x00007ffd2cb75000 C:\WINDOWS\System32\combase.dll +0x00007ffd2b2c0000 - 0x00007ffd2b2ef000 C:\WINDOWS\SYSTEM32\Wldp.dll +0x00007ffd2e160000 - 0x00007ffd2e22d000 C:\WINDOWS\System32\OLEAUT32.dll +0x00007ffd2cd30000 - 0x00007ffd2cddd000 C:\WINDOWS\System32\SHCORE.dll +0x00007ffd2d400000 - 0x00007ffd2d455000 C:\WINDOWS\System32\shlwapi.dll +0x00007ffd2b890000 - 0x00007ffd2b8b4000 C:\WINDOWS\SYSTEM32\profapi.dll +0x00007ffd22910000 - 0x00007ffd2292a000 E:\Java\jdk1.8.0_201\jre\bin\net.dll +0x00007ffd225b0000 - 0x00007ffd227a1000 C:\WINDOWS\SYSTEM32\urlmon.dll +0x00007ffd21cb0000 - 0x00007ffd21f6f000 C:\WINDOWS\SYSTEM32\iertutil.dll +0x00007ffd21c80000 - 0x00007ffd21ca8000 C:\WINDOWS\SYSTEM32\srvcli.dll +0x00007ffd2ae10000 - 0x00007ffd2ae1c000 C:\WINDOWS\SYSTEM32\netutils.dll +0x00007ffd2b020000 - 0x00007ffd2b08a000 C:\WINDOWS\system32\mswsock.dll +0x00007ffd239a0000 - 0x00007ffd239ad000 E:\Java\jdk1.8.0_201\jre\bin\management.dll +0x00007ffd1d090000 - 0x00007ffd1d0a7000 C:\WINDOWS\system32\napinsp.dll +0x00007ffd1d030000 - 0x00007ffd1d04b000 C:\WINDOWS\system32\pnrpnsp.dll +0x00007ffd269b0000 - 0x00007ffd269c5000 C:\WINDOWS\system32\wshbth.dll +0x00007ffd26990000 - 0x00007ffd269ad000 C:\WINDOWS\system32\NLAapi.dll +0x00007ffd2ad00000 - 0x00007ffd2ad3b000 C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL +0x00007ffd2ad40000 - 0x00007ffd2ae0a000 C:\WINDOWS\SYSTEM32\DNSAPI.dll +0x00007ffd2cd10000 - 0x00007ffd2cd18000 C:\WINDOWS\System32\NSI.dll +0x00007ffd1cec0000 - 0x00007ffd1ced2000 C:\WINDOWS\System32\winrnr.dll +0x00007ffd24c10000 - 0x00007ffd24c1a000 C:\Windows\System32\rasadhlp.dll +0x00007ffd22470000 - 0x00007ffd224f0000 C:\WINDOWS\System32\fwpuclnt.dll +0x00007ffd20b10000 - 0x00007ffd20b21000 E:\Java\jdk1.8.0_201\jre\bin\nio.dll + +VM Arguments: +jvm_args: -javaagent:E:\IntelliJ IDEA Community Edition 2024.3.4\lib\idea_rt.jar=55795 -Dfile.encoding=UTF-8 +java_command: cn.edu.whu.boot.BootApplication +java_class_path (initial): E:\Java\jdk1.8.0_201\jre\lib\charsets.jar;E:\Java\jdk1.8.0_201\jre\lib\deploy.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_201\jre\lib\javaws.jar;E:\Java\jdk1.8.0_201\jre\lib\jce.jar;E:\Java\jdk1.8.0_201\jre\lib\jfr.jar;E:\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_201\jre\lib\jsse.jar;E:\Java\jdk1.8.0_201\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_201\jre\lib\plugin.jar;E:\Java\jdk1.8.0_201\jre\lib\resources.jar;E:\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\TJ\Դ\\target\classes;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.0.RELEASE\spring-boot-starter-web-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.0.RELEASE\spring-boot-starter-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot\2.3.0.RELEASE\spring-boot-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.0.RELEASE\spring-boot-starter-logging-2.3.0.RELEASE.jar;C:\Users\dbc\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\dbc\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\dbc\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.2\log4j-to-slf4j-2.13.2.jar;C:\Users\dbc\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.2\log4j-api-2.13.2.jar;C:\Users\dbc\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to +Launcher Type: SUN_STANDARD + +Environment Variables: +JAVA_HOME=E:\Java\jdk1.8.0_201 +PATH=C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\dotnet\;D:\Microsoft VS Code\bin;C:\Gridknow\zgdll32;C:\Gridknow\zgdll64;E:\Java\jdk1.8.0_201\bin;C:\Users\dbc\AppData\Local\Programs\Python\Python310;D:\Git\cmd;C:\Users\dbc\AppData\Local\Programs\Python\Python310\Scripts;D:\TJ\apache-maven-3.8.8-bin\apache-maven-3.8.8\bin;D:\nodejs\;C:\Program Files (x86)\Common Files\Intel\Shared Files\cpp\bin\Intel64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\IBM\SPSS\Statistics\25\JRE\bin;C:\Program Files (x86)\dotnet\;D:\Microsoft VS Code\bin;C:\Program Files\MATLAB\R2021a\bin;C:\Users\dbc\AppData\Local\Programs\Python\Python310\Scripts;C:\Program Files (x86)\Microsoft\Edge\Application;D:\pycharm\PyCharm Community Edition 2023.1.3\bin;;E:\IntelliJ IDEA Community Edition 2024.3.4\bin;;E:\WebStorm 2024.3.4\bin;;C:\Users\dbc\AppData\Roaming\npm +USERNAME=dbc +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 12, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 10.0 , 64 bit Build 19041 (10.0.19041.5198) + +CPU:total 8 (initial active 8) (4 cores per cpu, 2 threads per core) family 6 model 142 stepping 12, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx + +Memory: 4k page, physical 8218420k(1038732k free), swap 23270192k(1704k free) + +vm_info: Java HotSpot(TM) 64-Bit Server VM (25.201-b09) for windows-amd64 JRE (1.8.0_201-b09), built on Dec 15 2018 18:36:39 by "java_re" with MS VC++ 10.0 (VS2010) + +time: Fri Mar 07 23:36:20 2025 +timezone: й׼ʱ +elapsed time: 4 seconds (0d 0h 0m 4s) + diff --git a/libs/gdal.jar b/libs/gdal.jar new file mode 100644 index 0000000000000000000000000000000000000000..bb862d909052b5c663da222517a651accf9d21e7 GIT binary patch literal 207526 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

*R&?Y+zk{l3y;9px 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

-@Xk_h=hi-Zof8S*>EieCk^W&8y(9rro7&_&wv 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

N9Ho`+`zbfeRv$%VbgkF%P-hp>v8 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 VO+?L-wo67WIbMbTf2?i`{2wLPV4?s3 literal 0 HcmV?d00001 diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..8b9da3b --- /dev/null +++ b/mvnw @@ -0,0 +1,286 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..fef5a8f --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/nginx/conf/fastcgi.conf b/nginx/conf/fastcgi.conf new file mode 100644 index 0000000..091738c --- /dev/null +++ b/nginx/conf/fastcgi.conf @@ -0,0 +1,26 @@ + +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; diff --git a/nginx/conf/fastcgi_params b/nginx/conf/fastcgi_params new file mode 100644 index 0000000..28decb9 --- /dev/null +++ b/nginx/conf/fastcgi_params @@ -0,0 +1,25 @@ + +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param REQUEST_SCHEME $scheme; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; +fastcgi_param SERVER_PORT $server_port; +fastcgi_param SERVER_NAME $server_name; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; diff --git a/nginx/conf/koi-utf b/nginx/conf/koi-utf new file mode 100644 index 0000000..e7974ff --- /dev/null +++ b/nginx/conf/koi-utf @@ -0,0 +1,109 @@ + +# This map is not a full koi8-r <> utf8 map: it does not contain +# box-drawing and some other characters. Besides this map contains +# several koi8-u and Byelorussian letters which are not in koi8-r. +# If you need a full and standard map, use contrib/unicode2nginx/koi-utf +# map instead. + +charset_map koi8-r utf-8 { + + 80 E282AC ; # euro + + 95 E280A2 ; # bullet + + 9A C2A0 ; #   + + 9E C2B7 ; # · + + A3 D191 ; # small yo + A4 D194 ; # small Ukrainian ye + + A6 D196 ; # small Ukrainian i + A7 D197 ; # small Ukrainian yi + + AD D291 ; # small Ukrainian soft g + AE D19E ; # small Byelorussian short u + + B0 C2B0 ; # ° + + B3 D081 ; # capital YO + B4 D084 ; # capital Ukrainian YE + + B6 D086 ; # capital Ukrainian I + B7 D087 ; # capital Ukrainian YI + + B9 E28496 ; # numero sign + + BD D290 ; # capital Ukrainian soft G + BE D18E ; # capital Byelorussian short U + + BF C2A9 ; # (C) + + C0 D18E ; # small yu + C1 D0B0 ; # small a + C2 D0B1 ; # small b + C3 D186 ; # small ts + C4 D0B4 ; # small d + C5 D0B5 ; # small ye + C6 D184 ; # small f + C7 D0B3 ; # small g + C8 D185 ; # small kh + C9 D0B8 ; # small i + CA D0B9 ; # small j + CB D0BA ; # small k + CC D0BB ; # small l + CD D0BC ; # small m + CE D0BD ; # small n + CF D0BE ; # small o + + D0 D0BF ; # small p + D1 D18F ; # small ya + D2 D180 ; # small r + D3 D181 ; # small s + D4 D182 ; # small t + D5 D183 ; # small u + D6 D0B6 ; # small zh + D7 D0B2 ; # small v + D8 D18C ; # small soft sign + D9 D18B ; # small y + DA D0B7 ; # small z + DB D188 ; # small sh + DC D18D ; # small e + DD D189 ; # small shch + DE D187 ; # small ch + DF D18A ; # small hard sign + + E0 D0AE ; # capital YU + E1 D090 ; # capital A + E2 D091 ; # capital B + E3 D0A6 ; # capital TS + E4 D094 ; # capital D + E5 D095 ; # capital YE + E6 D0A4 ; # capital F + E7 D093 ; # capital G + E8 D0A5 ; # capital KH + E9 D098 ; # capital I + EA D099 ; # capital J + EB D09A ; # capital K + EC D09B ; # capital L + ED D09C ; # capital M + EE D09D ; # capital N + EF D09E ; # capital O + + F0 D09F ; # capital P + F1 D0AF ; # capital YA + F2 D0A0 ; # capital R + F3 D0A1 ; # capital S + F4 D0A2 ; # capital T + F5 D0A3 ; # capital U + F6 D096 ; # capital ZH + F7 D092 ; # capital V + F8 D0AC ; # capital soft sign + F9 D0AB ; # capital Y + FA D097 ; # capital Z + FB D0A8 ; # capital SH + FC D0AD ; # capital E + FD D0A9 ; # capital SHCH + FE D0A7 ; # capital CH + FF D0AA ; # capital hard sign +} diff --git a/nginx/conf/koi-win b/nginx/conf/koi-win new file mode 100644 index 0000000..72afabe --- /dev/null +++ b/nginx/conf/koi-win @@ -0,0 +1,103 @@ + +charset_map koi8-r windows-1251 { + + 80 88 ; # euro + + 95 95 ; # bullet + + 9A A0 ; #   + + 9E B7 ; # · + + A3 B8 ; # small yo + A4 BA ; # small Ukrainian ye + + A6 B3 ; # small Ukrainian i + A7 BF ; # small Ukrainian yi + + AD B4 ; # small Ukrainian soft g + AE A2 ; # small Byelorussian short u + + B0 B0 ; # ° + + B3 A8 ; # capital YO + B4 AA ; # capital Ukrainian YE + + B6 B2 ; # capital Ukrainian I + B7 AF ; # capital Ukrainian YI + + B9 B9 ; # numero sign + + BD A5 ; # capital Ukrainian soft G + BE A1 ; # capital Byelorussian short U + + BF A9 ; # (C) + + C0 FE ; # small yu + C1 E0 ; # small a + C2 E1 ; # small b + C3 F6 ; # small ts + C4 E4 ; # small d + C5 E5 ; # small ye + C6 F4 ; # small f + C7 E3 ; # small g + C8 F5 ; # small kh + C9 E8 ; # small i + CA E9 ; # small j + CB EA ; # small k + CC EB ; # small l + CD EC ; # small m + CE ED ; # small n + CF EE ; # small o + + D0 EF ; # small p + D1 FF ; # small ya + D2 F0 ; # small r + D3 F1 ; # small s + D4 F2 ; # small t + D5 F3 ; # small u + D6 E6 ; # small zh + D7 E2 ; # small v + D8 FC ; # small soft sign + D9 FB ; # small y + DA E7 ; # small z + DB F8 ; # small sh + DC FD ; # small e + DD F9 ; # small shch + DE F7 ; # small ch + DF FA ; # small hard sign + + E0 DE ; # capital YU + E1 C0 ; # capital A + E2 C1 ; # capital B + E3 D6 ; # capital TS + E4 C4 ; # capital D + E5 C5 ; # capital YE + E6 D4 ; # capital F + E7 C3 ; # capital G + E8 D5 ; # capital KH + E9 C8 ; # capital I + EA C9 ; # capital J + EB CA ; # capital K + EC CB ; # capital L + ED CC ; # capital M + EE CD ; # capital N + EF CE ; # capital O + + F0 CF ; # capital P + F1 DF ; # capital YA + F2 D0 ; # capital R + F3 D1 ; # capital S + F4 D2 ; # capital T + F5 D3 ; # capital U + F6 C6 ; # capital ZH + F7 C2 ; # capital V + F8 DC ; # capital soft sign + F9 DB ; # capital Y + FA C7 ; # capital Z + FB D8 ; # capital SH + FC DD ; # capital E + FD D9 ; # capital SHCH + FE D7 ; # capital CH + FF DA ; # capital hard sign +} diff --git a/nginx/conf/mime.types b/nginx/conf/mime.types new file mode 100644 index 0000000..2961256 --- /dev/null +++ b/nginx/conf/mime.types @@ -0,0 +1,97 @@ + +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/svg+xml svg svgz; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/webp webp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + + font/woff woff; + font/woff2 woff2; + + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.oasis.opendocument.graphics odg; + application/vnd.oasis.opendocument.presentation odp; + application/vnd.oasis.opendocument.spreadsheet ods; + application/vnd.oasis.opendocument.text odt; + application/vnd.openxmlformats-officedocument.presentationml.presentation + pptx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + xlsx; + application/vnd.openxmlformats-officedocument.wordprocessingml.document + docx; + application/vnd.wap.wmlc wmlc; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/nginx/conf/nginx.conf b/nginx/conf/nginx.conf new file mode 100644 index 0000000..ed82014 --- /dev/null +++ b/nginx/conf/nginx.conf @@ -0,0 +1,72 @@ +worker_processes auto; ## Default: 1 +worker_rlimit_nofile 8192; + +events { + worker_connections 1024; ## Default: 1024 +} + +http { + sendfile on; + tcp_nopush on; + log_not_found off; + gzip on; + include mime.types; # web pages might not be rendered properly if mime.types not included + default_type application/octet-stream; + client_max_body_size 500M; + keepalive_timeout 30s; + + upstream backend { + server localhost:9001; + } + + # the Connection header will be correctly set to close when the Upgrade header in the request is set to ''. + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + listen 9000; + + # This is the default block since / matches all requests. + # It should be used to serve static files. + location / { + # Search ./resources/xxx first; + # if not found, search ./resources/index.html instead; + # if still not found, respond 404. + root ./resources; + try_files $uri /index.html =404; + } + + # Both the trailing slashes in location and proxy_pass matter + # because if the proxy_pass directive is specified with a URI, + # then when a request is passed to the server, + # the part of a normalized request URI matching the location is replaced by a URI specified in the directive + location /api/ { + # /api/** will be forwarded to http://backend/** + proxy_pass http://backend/; + # For NGINX to send the Upgrade request from the client to the backend server, + # the Upgrade and Connection headers must be set explicitly + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + } + + location = /allocation/assignment { # This is an exact match. + # /allocation/assignment will be forwarded to http://backend/allocation/assignment + proxy_pass http://backend; + } + + location /get/ { + # /get/** will be forwarded to http://backend/get/** + proxy_pass http://backend; + } + + location = /export/taskTableDataExport { + proxy_pass http://backend; + } + + location = /task/createTaskByXmlFile { + proxy_pass http://backend; + } + } +} diff --git a/nginx/conf/scgi_params b/nginx/conf/scgi_params new file mode 100644 index 0000000..6d4ce4f --- /dev/null +++ b/nginx/conf/scgi_params @@ -0,0 +1,17 @@ + +scgi_param REQUEST_METHOD $request_method; +scgi_param REQUEST_URI $request_uri; +scgi_param QUERY_STRING $query_string; +scgi_param CONTENT_TYPE $content_type; + +scgi_param DOCUMENT_URI $document_uri; +scgi_param DOCUMENT_ROOT $document_root; +scgi_param SCGI 1; +scgi_param SERVER_PROTOCOL $server_protocol; +scgi_param REQUEST_SCHEME $scheme; +scgi_param HTTPS $https if_not_empty; + +scgi_param REMOTE_ADDR $remote_addr; +scgi_param REMOTE_PORT $remote_port; +scgi_param SERVER_PORT $server_port; +scgi_param SERVER_NAME $server_name; diff --git a/nginx/conf/uwsgi_params b/nginx/conf/uwsgi_params new file mode 100644 index 0000000..09c732c --- /dev/null +++ b/nginx/conf/uwsgi_params @@ -0,0 +1,17 @@ + +uwsgi_param QUERY_STRING $query_string; +uwsgi_param REQUEST_METHOD $request_method; +uwsgi_param CONTENT_TYPE $content_type; +uwsgi_param CONTENT_LENGTH $content_length; + +uwsgi_param REQUEST_URI $request_uri; +uwsgi_param PATH_INFO $document_uri; +uwsgi_param DOCUMENT_ROOT $document_root; +uwsgi_param SERVER_PROTOCOL $server_protocol; +uwsgi_param REQUEST_SCHEME $scheme; +uwsgi_param HTTPS $https if_not_empty; + +uwsgi_param REMOTE_ADDR $remote_addr; +uwsgi_param REMOTE_PORT $remote_port; +uwsgi_param SERVER_PORT $server_port; +uwsgi_param SERVER_NAME $server_name; diff --git a/nginx/conf/win-utf b/nginx/conf/win-utf new file mode 100644 index 0000000..ed8bc00 --- /dev/null +++ b/nginx/conf/win-utf @@ -0,0 +1,126 @@ + +# This map is not a full windows-1251 <> utf8 map: it does not +# contain Serbian and Macedonian letters. If you need a full map, +# use contrib/unicode2nginx/win-utf map instead. + +charset_map windows-1251 utf-8 { + + 82 E2809A ; # single low-9 quotation mark + + 84 E2809E ; # double low-9 quotation mark + 85 E280A6 ; # ellipsis + 86 E280A0 ; # dagger + 87 E280A1 ; # double dagger + 88 E282AC ; # euro + 89 E280B0 ; # per mille + + 91 E28098 ; # left single quotation mark + 92 E28099 ; # right single quotation mark + 93 E2809C ; # left double quotation mark + 94 E2809D ; # right double quotation mark + 95 E280A2 ; # bullet + 96 E28093 ; # en dash + 97 E28094 ; # em dash + + 99 E284A2 ; # trade mark sign + + A0 C2A0 ; #   + A1 D18E ; # capital Byelorussian short U + A2 D19E ; # small Byelorussian short u + + A4 C2A4 ; # currency sign + A5 D290 ; # capital Ukrainian soft G + A6 C2A6 ; # borken bar + A7 C2A7 ; # section sign + A8 D081 ; # capital YO + A9 C2A9 ; # (C) + AA D084 ; # capital Ukrainian YE + AB C2AB ; # left-pointing double angle quotation mark + AC C2AC ; # not sign + AD C2AD ; # soft hypen + AE C2AE ; # (R) + AF D087 ; # capital Ukrainian YI + + B0 C2B0 ; # ° + B1 C2B1 ; # plus-minus sign + B2 D086 ; # capital Ukrainian I + B3 D196 ; # small Ukrainian i + B4 D291 ; # small Ukrainian soft g + B5 C2B5 ; # micro sign + B6 C2B6 ; # pilcrow sign + B7 C2B7 ; # · + B8 D191 ; # small yo + B9 E28496 ; # numero sign + BA D194 ; # small Ukrainian ye + BB C2BB ; # right-pointing double angle quotation mark + + BF D197 ; # small Ukrainian yi + + C0 D090 ; # capital A + C1 D091 ; # capital B + C2 D092 ; # capital V + C3 D093 ; # capital G + C4 D094 ; # capital D + C5 D095 ; # capital YE + C6 D096 ; # capital ZH + C7 D097 ; # capital Z + C8 D098 ; # capital I + C9 D099 ; # capital J + CA D09A ; # capital K + CB D09B ; # capital L + CC D09C ; # capital M + CD D09D ; # capital N + CE D09E ; # capital O + CF D09F ; # capital P + + D0 D0A0 ; # capital R + D1 D0A1 ; # capital S + D2 D0A2 ; # capital T + D3 D0A3 ; # capital U + D4 D0A4 ; # capital F + D5 D0A5 ; # capital KH + D6 D0A6 ; # capital TS + D7 D0A7 ; # capital CH + D8 D0A8 ; # capital SH + D9 D0A9 ; # capital SHCH + DA D0AA ; # capital hard sign + DB D0AB ; # capital Y + DC D0AC ; # capital soft sign + DD D0AD ; # capital E + DE D0AE ; # capital YU + DF D0AF ; # capital YA + + E0 D0B0 ; # small a + E1 D0B1 ; # small b + E2 D0B2 ; # small v + E3 D0B3 ; # small g + E4 D0B4 ; # small d + E5 D0B5 ; # small ye + E6 D0B6 ; # small zh + E7 D0B7 ; # small z + E8 D0B8 ; # small i + E9 D0B9 ; # small j + EA D0BA ; # small k + EB D0BB ; # small l + EC D0BC ; # small m + ED D0BD ; # small n + EE D0BE ; # small o + EF D0BF ; # small p + + F0 D180 ; # small r + F1 D181 ; # small s + F2 D182 ; # small t + F3 D183 ; # small u + F4 D184 ; # small f + F5 D185 ; # small kh + F6 D186 ; # small ts + F7 D187 ; # small ch + F8 D188 ; # small sh + F9 D189 ; # small shch + FA D18A ; # small hard sign + FB D18B ; # small y + FC D18C ; # small soft sign + FD D18D ; # small e + FE D18E ; # small yu + FF D18F ; # small ya +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f0e23c0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,314 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.0.RELEASE + + + cn.edu.whu + boot + 3.0 + Android + + + jar + Demo project for Spring Boot + + + 1.8 + 1.8 + 1.8 + + 25.2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + jakarta.validation + jakarta.validation-api + + + + + + cn.hutool + hutool-all + 4.5.7 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.alibaba + fastjson + 1.2.44 + + + + + org.jdom + jdom + 1.1 + + + org.dom4j + dom4j + 2.1.1 + + + + + org.postgresql + postgresql + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.1 + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.2.3 + + + + commons-codec + commons-codec + 1.9 + + + + org.apache.commons + commons-lang3 + 3.8.1 + + + + commons-io + commons-io + 2.6 + + + + + net.lingala.zip4j + zip4j + 1.3.2 + + + + + org.springframework.session + spring-session-core + + + org.springframework.session + spring-session-jdbc + + + + org.apache.shiro + shiro-spring-boot-web-starter + 1.4.0 + + + + com.google.code.gson + gson + 2.8.5 + + + + org.springframework.boot + spring-boot-starter-mail + + + + + + com.esri.geometry + esri-geometry-api + 2.2.2 + + + + + org.locationtech.jts + jts-core + 1.18.2 + + + + org.apache.commons + commons-math3 + 3.6.1 + + + + + de.grundid.opendatalab + geojson-jackson + 1.8.1 + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-websocket + + + + org.springframework.boot + spring-boot-starter-cache + + + + + org.apache.poi + poi-ooxml + 4.1.0 + + + + + org.geotools + gt-shapefile + ${geotools.version} + + + org.geotools + gt-opengis + ${geotools.version} + + + + org.geotools + gt-main + ${geotools.version} + + + + org.geotools + gt-epsg-hsql + ${geotools.version} + + + + org.geotools + gt-geojson + ${geotools.version} + + + org.gdal + gdal + 3.10.3 + + + + + + + + + com.opencsv + opencsv + 4.6 + + + + org.jooq + jooq + 3.14.15 + + + + + + + + osgeo + OSGeo Release Repository + https://repo.osgeo.org/repository/release/ + false + true + + + osgeo-snapshot + OSGeo Snapshot Repository + https://repo.osgeo.org/repository/snapshot/ + true + false + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + diff --git a/postgres/Dockerfile b/postgres/Dockerfile new file mode 100644 index 0000000..c641316 --- /dev/null +++ b/postgres/Dockerfile @@ -0,0 +1,10 @@ +FROM postgres:12 + +# install PostGIS extension +RUN apt-get update && apt install -y postgis postgresql-12-postgis-3 + +RUN mkdir -p /docker-entrypoint-initdb.d + +# create app database and restore data +COPY ./schema.sql /docker-entrypoint-initdb.d/schema.sql +COPY ./tables.sql /docker-entrypoint-initdb.d/tables.sql \ No newline at end of file diff --git a/postgres/schema.sql b/postgres/schema.sql new file mode 100644 index 0000000..31b6492 --- /dev/null +++ b/postgres/schema.sql @@ -0,0 +1,954 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 10.9 +-- Dumped by pg_dump version 12.5 + +\c tj_project + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA public; + + +-- +-- Name: EXTENSION postgis; Type: COMMENT; Schema: -; Owner: +-- + +COMMENT ON EXTENSION postgis IS 'PostGIS geometry, geography, and raster spatial types and functions'; + + +-- +-- Name: trigger_set_timestamp(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION public.trigger_set_timestamp() RETURNS trigger + LANGUAGE plpgsql + AS $$ BEGIN + NEW.update_time = NOW(); +RETURN NEW; + +END;$$; + + +ALTER FUNCTION public.trigger_set_timestamp() OWNER TO postgres; + +-- +-- Name: apkversion; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.apkversion ( + versionid numeric(2,1), + version_code character varying(100), + apkpath character varying(100), + description text +); + + +ALTER TABLE public.apkversion OWNER TO postgres; + +-- +-- Name: task; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task ( + id integer NOT NULL, + task_name character varying(255), + operator character varying(255), + create_time timestamp(6) without time zone, + modify_time timestamp(6) without time zone, + xml_id integer, + has_create_tables smallint, + config text, + database_name character varying(255), + introduction character varying(255), + upload_deadline character varying(10), + create_tables_md5code character varying(255), + is_allocation_optional smallint DEFAULT 0, + is_reviewer_restricted smallint DEFAULT 1 +); + + +ALTER TABLE public.task OWNER TO postgres; + +-- +-- Name: COLUMN task.is_allocation_optional; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task.is_allocation_optional IS '0 表示该任务必须分配,1 表示无需分配'; + + +-- +-- Name: task_cell; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task_cell ( + id integer NOT NULL, + task_id integer NOT NULL, + geohash character varying(20) NOT NULL, + geojson text NOT NULL +); + + +ALTER TABLE public.task_cell OWNER TO postgres; + +-- +-- Name: task_cell_data; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task_cell_data ( + id integer NOT NULL, + task_id integer NOT NULL, + table_name character varying(255) NOT NULL, + data_id integer NOT NULL, + cell_geohash character varying(255) NOT NULL +); + + +ALTER TABLE public.task_cell_data OWNER TO postgres; + +-- +-- Name: TABLE task_cell_data; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.task_cell_data IS '网格和数据的对应关系'; + + +-- +-- Name: COLUMN task_cell_data.table_name; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_cell_data.table_name IS '数据所在的表'; + + +-- +-- Name: COLUMN task_cell_data.cell_geohash; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_cell_data.cell_geohash IS '网格的 Geohash,作为网格的标识'; + + +-- +-- Name: task_cell_data_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_cell_data_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.task_cell_data_id_seq OWNER TO postgres; + +-- +-- Name: task_cell_data_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_cell_data_id_seq OWNED BY public.task_cell_data.id; + + +-- +-- Name: task_cell_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_cell_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.task_cell_id_seq OWNER TO postgres; + +-- +-- Name: task_cell_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_cell_id_seq OWNED BY public.task_cell.id; + + +-- +-- Name: task_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + MAXVALUE 2147483647 + CACHE 1; + + +ALTER TABLE public.task_id_seq OWNER TO postgres; + +-- +-- Name: task_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_id_seq OWNED BY public.task.id; + + +-- +-- Name: task_image; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task_image ( + id integer NOT NULL, + file_name character varying(255) NOT NULL, + bbox public.geometry NOT NULL, + task_id integer NOT NULL +); + + +ALTER TABLE public.task_image OWNER TO postgres; + +-- +-- Name: TABLE task_image; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.task_image IS '加密影像'; + + +-- +-- Name: COLUMN task_image.file_name; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_image.file_name IS 'tpkx 文件的名称'; + + +-- +-- Name: COLUMN task_image.bbox; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_image.bbox IS '外接矩形'; + + +-- +-- Name: COLUMN task_image.task_id; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_image.task_id IS '任务ID'; + + +-- +-- Name: task_image_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_image_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.task_image_id_seq OWNER TO postgres; + +-- +-- Name: task_image_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_image_id_seq OWNED BY public.task_image.id; + + +-- +-- Name: task_select_id; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task_select_id ( + id bigint NOT NULL, + select_order smallint NOT NULL, + select_id text NOT NULL, + src_task_id integer NOT NULL, + src_table_name character varying(50) NOT NULL, + dest_task_id integer NOT NULL, + dest_table_name character varying(50) NOT NULL +); + + +ALTER TABLE public.task_select_id OWNER TO postgres; + +-- +-- Name: COLUMN task_select_id.select_order; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_select_id.select_order IS '抽取顺序'; + + +-- +-- Name: COLUMN task_select_id.select_id; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_select_id.select_id IS '抽取的id字符串,用逗号隔开'; + + +-- +-- Name: task_select_id_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_select_id_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.task_select_id_id_seq OWNER TO postgres; + +-- +-- Name: task_select_id_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_select_id_id_seq OWNED BY public.task_select_id.id; + + +-- +-- Name: task_user_cell; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task_user_cell ( + id integer NOT NULL, + task_id integer NOT NULL, + user_id integer NOT NULL, + cell_geohash character varying(255) NOT NULL +); + + +ALTER TABLE public.task_user_cell OWNER TO postgres; + +-- +-- Name: TABLE task_user_cell; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.task_user_cell IS '外业人员和在任务中分配到的网格的对应关系'; + + +-- +-- Name: COLUMN task_user_cell.cell_geohash; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_user_cell.cell_geohash IS '用来标识网格的 Geohash'; + + +-- +-- Name: task_user_cell_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_user_cell_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.task_user_cell_id_seq OWNER TO postgres; + +-- +-- Name: task_user_cell_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_user_cell_id_seq OWNED BY public.task_user_cell.id; + + +-- +-- Name: task_user_role; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.task_user_role ( + id integer NOT NULL, + task_id integer NOT NULL, + user_id integer NOT NULL, + work_role smallint DEFAULT 0 NOT NULL +); + + +ALTER TABLE public.task_user_role OWNER TO postgres; + +-- +-- Name: TABLE task_user_role; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.task_user_role IS '某个任务中外业人员的身份(审核人员或采集人员)'; + + +-- +-- Name: COLUMN task_user_role.work_role; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON COLUMN public.task_user_role.work_role IS '1:审核人员 0:采集人员'; + + +-- +-- Name: task_user_role_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.task_user_role_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.task_user_role_id_seq OWNER TO postgres; + +-- +-- Name: task_user_role_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.task_user_role_id_seq OWNED BY public.task_user_role.id; + + +-- +-- Name: upms_log_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.upms_log_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.upms_log_id_seq OWNER TO postgres; + +-- +-- Name: user_permission; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.user_permission ( + id integer NOT NULL, + description character varying NOT NULL, + create_time timestamp without time zone DEFAULT now() NOT NULL, + update_time timestamp without time zone DEFAULT now() NOT NULL +); + + +ALTER TABLE public.user_permission OWNER TO postgres; + +-- +-- Name: TABLE user_permission; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.user_permission IS '用户权限'; + + +-- +-- Name: user_permission_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.user_permission_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.user_permission_id_seq OWNER TO postgres; + +-- +-- Name: user_permission_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.user_permission_id_seq OWNED BY public.user_permission.id; + + +-- +-- Name: user_role; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.user_role ( + id integer NOT NULL, + name character varying NOT NULL, + create_time timestamp without time zone DEFAULT now() NOT NULL, + update_time timestamp without time zone DEFAULT now() NOT NULL, + code integer NOT NULL +); + + +ALTER TABLE public.user_role OWNER TO postgres; + +-- +-- Name: TABLE user_role; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.user_role IS '用户角色'; + + +-- +-- Name: user_role_code; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.user_role_code ( + id integer NOT NULL, + code integer NOT NULL, + role integer NOT NULL +); + + +ALTER TABLE public.user_role_code OWNER TO postgres; + +-- +-- Name: user_role_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.user_role_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.user_role_id_seq OWNER TO postgres; + +-- +-- Name: user_role_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.user_role_id_seq OWNED BY public.user_role.id; + + +-- +-- Name: user_role_permission; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.user_role_permission ( + id integer NOT NULL, + role integer NOT NULL, + permission integer NOT NULL, + create_time timestamp without time zone DEFAULT now() NOT NULL, + update_time timestamp without time zone DEFAULT now() NOT NULL +); + + +ALTER TABLE public.user_role_permission OWNER TO postgres; + +-- +-- Name: TABLE user_role_permission; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.user_role_permission IS '角色-权限对照'; + + +-- +-- Name: user_role_premission_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.user_role_premission_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.user_role_premission_id_seq OWNER TO postgres; + +-- +-- Name: user_role_premission_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.user_role_premission_id_seq OWNED BY public.user_role_permission.id; + + +-- +-- Name: user_staff; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.user_staff ( + id integer NOT NULL, + username character varying NOT NULL, + password character varying NOT NULL, + salt character varying NOT NULL, + phone character varying, + email character varying, + role integer NOT NULL, + create_time timestamp without time zone DEFAULT now() NOT NULL, + update_time timestamp without time zone DEFAULT now() NOT NULL, + real_name character varying(255) NOT NULL +); + + +ALTER TABLE public.user_staff OWNER TO postgres; + +-- +-- Name: TABLE user_staff; Type: COMMENT; Schema: public; Owner: postgres +-- + +COMMENT ON TABLE public.user_staff IS '人员信息'; + + +-- +-- Name: user_staff_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.user_staff_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.user_staff_id_seq OWNER TO postgres; + +-- +-- Name: user_staff_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.user_staff_id_seq OWNED BY public.user_staff.id; + + +-- +-- Name: userinfo_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.userinfo_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.userinfo_id_seq OWNER TO postgres; + +-- +-- Name: xml; Type: TABLE; Schema: public; Owner: postgres +-- + +CREATE TABLE public.xml ( + id integer NOT NULL, + file_name character varying(255), + md5_code character varying(255), + file_path text, + create_time timestamp(6) without time zone, + modify_time timestamp(6) without time zone +); + + +ALTER TABLE public.xml OWNER TO postgres; + +-- +-- Name: xml_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE public.xml_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + MAXVALUE 2147483647 + CACHE 1; + + +ALTER TABLE public.xml_id_seq OWNER TO postgres; + +-- +-- Name: xml_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE public.xml_id_seq OWNED BY public.xml.id; + + +-- +-- Name: task id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task ALTER COLUMN id SET DEFAULT nextval('public.task_id_seq'::regclass); + + +-- +-- Name: task_cell id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_cell ALTER COLUMN id SET DEFAULT nextval('public.task_cell_id_seq'::regclass); + + +-- +-- Name: task_cell_data id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_cell_data ALTER COLUMN id SET DEFAULT nextval('public.task_cell_data_id_seq'::regclass); + + +-- +-- Name: task_image id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_image ALTER COLUMN id SET DEFAULT nextval('public.task_image_id_seq'::regclass); + + +-- +-- Name: task_select_id id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_select_id ALTER COLUMN id SET DEFAULT nextval('public.task_select_id_id_seq'::regclass); + + +-- +-- Name: task_user_cell id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_user_cell ALTER COLUMN id SET DEFAULT nextval('public.task_user_cell_id_seq'::regclass); + + +-- +-- Name: task_user_role id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_user_role ALTER COLUMN id SET DEFAULT nextval('public.task_user_role_id_seq'::regclass); + + +-- +-- Name: user_permission id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_permission ALTER COLUMN id SET DEFAULT nextval('public.user_permission_id_seq'::regclass); + + +-- +-- Name: user_role id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_role ALTER COLUMN id SET DEFAULT nextval('public.user_role_id_seq'::regclass); + + +-- +-- Name: user_role_permission id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_role_permission ALTER COLUMN id SET DEFAULT nextval('public.user_role_premission_id_seq'::regclass); + + +-- +-- Name: user_staff id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_staff ALTER COLUMN id SET DEFAULT nextval('public.user_staff_id_seq'::regclass); + + +-- +-- Name: xml id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.xml ALTER COLUMN id SET DEFAULT nextval('public.xml_id_seq'::regclass); + + +-- +-- Name: task_cell_data task_cell_data_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_cell_data + ADD CONSTRAINT task_cell_data_pkey PRIMARY KEY (id); + + +-- +-- Name: task_cell task_cell_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_cell + ADD CONSTRAINT task_cell_pkey PRIMARY KEY (id); + + +-- +-- Name: task_image task_image_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_image + ADD CONSTRAINT task_image_pkey PRIMARY KEY (id); + + +-- +-- Name: task task_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task + ADD CONSTRAINT task_pkey PRIMARY KEY (id); + + +-- +-- Name: task_select_id task_select_id_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_select_id + ADD CONSTRAINT task_select_id_pkey PRIMARY KEY (id); + + +-- +-- Name: task_user_cell task_user_cell_pk; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_user_cell + ADD CONSTRAINT task_user_cell_pk UNIQUE (task_id, user_id, cell_geohash); + + +-- +-- Name: task_user_cell task_user_cell_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_user_cell + ADD CONSTRAINT task_user_cell_pkey PRIMARY KEY (id); + + +-- +-- Name: task_user_role task_user_role_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_user_role + ADD CONSTRAINT task_user_role_pkey PRIMARY KEY (id); + + +-- +-- Name: user_permission unique_description; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_permission + ADD CONSTRAINT unique_description UNIQUE (description); + + +-- +-- Name: user_staff unique_email; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_staff + ADD CONSTRAINT unique_email UNIQUE (email); + + +-- +-- Name: user_staff unique_phone; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_staff + ADD CONSTRAINT unique_phone UNIQUE (phone); + + +-- +-- Name: user_staff unique_username; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_staff + ADD CONSTRAINT unique_username UNIQUE (username); + + +-- +-- Name: user_permission user_permission_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_permission + ADD CONSTRAINT user_permission_pkey PRIMARY KEY (id); + + +-- +-- Name: user_role_code user_role_code_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_role_code + ADD CONSTRAINT user_role_code_pkey PRIMARY KEY (id); + + +-- +-- Name: user_role user_role_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_role + ADD CONSTRAINT user_role_pkey PRIMARY KEY (id); + + +-- +-- Name: user_role_permission user_role_premission_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_role_permission + ADD CONSTRAINT user_role_premission_pkey PRIMARY KEY (id); + + +-- +-- Name: user_staff user_staff_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.user_staff + ADD CONSTRAINT user_staff_pkey PRIMARY KEY (id); + + +-- +-- Name: xml xml_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.xml + ADD CONSTRAINT xml_pkey PRIMARY KEY (id); + + +-- +-- Name: geom_idx; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE INDEX geom_idx ON public.task_image USING gist (bbox); + + +-- +-- Name: task_user_role_task_id_user_id_uindex; Type: INDEX; Schema: public; Owner: postgres +-- + +CREATE UNIQUE INDEX task_user_role_task_id_user_id_uindex ON public.task_user_role USING btree (task_id, user_id); + + +-- +-- Name: user_permission update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_permission FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp(); + + +-- +-- Name: user_role update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_role FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp(); + + +-- +-- Name: user_role_permission update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_role_permission FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp(); + + +-- +-- Name: user_staff update_timestamp; Type: TRIGGER; Schema: public; Owner: postgres +-- + +CREATE TRIGGER update_timestamp BEFORE UPDATE ON public.user_staff FOR EACH ROW EXECUTE PROCEDURE public.trigger_set_timestamp(); + + +-- +-- Name: task_image task_image_task_id_fk; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY public.task_image + ADD CONSTRAINT task_image_task_id_fk FOREIGN KEY (task_id) REFERENCES public.task(id) ON UPDATE CASCADE ON DELETE CASCADE; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/postgres/tables.sql b/postgres/tables.sql new file mode 100644 index 0000000..dac4847 --- /dev/null +++ b/postgres/tables.sql @@ -0,0 +1,143 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 10.9 +-- Dumped by pg_dump version 12.5 + +\c tj_project + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Data for Name: user_permission; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.user_permission (id, description, create_time, update_time) FROM stdin; +1 task:assign 2019-08-31 14:19:35.575579 2019-10-02 10:31:40.271308 +5 task:changeCellToUser 2019-09-03 20:30:46.841232 2019-10-02 10:37:04.694562 +8 task:changeDataToUser 2019-09-06 17:07:08.275077 2019-10-02 10:38:06.45885 +9 image:readById 2019-09-17 13:56:53.821037 2019-10-02 10:38:21.167537 +10 image:readAll 2019-09-21 11:22:57.499138 2019-10-02 10:38:24.540783 +11 route:insert 2019-09-21 11:23:07.825939 2019-10-02 10:39:23.960188 +12 draft:insert 2019-09-22 17:32:04.898064 2019-10-02 10:40:00.7865 +13 draft:readField 2019-09-22 17:32:11.280443 2019-10-02 10:40:37.917048 +4 taskCell:readByUser 2019-09-03 18:15:23.726681 2019-10-02 10:41:50.32412 +3 taskCell:readAll 2019-08-31 14:19:35.575579 2019-10-02 10:42:16.975154 +2 task:read 2019-08-31 14:19:35.575579 2019-10-02 10:42:38.926339 +14 user:read 2019-09-22 17:32:15.992382 2019-10-02 10:44:23.348406 +15 user:readWorker 2019-09-22 17:32:35.548298 2019-10-02 10:44:33.080585 +16 user:changeRole 2019-09-26 12:47:46.917506 2019-10-02 10:45:25.811784 +17 image:upload 2019-10-05 14:36:39.893348 2019-10-05 14:36:39.893348 +20 task:readWorker 2019-10-28 10:19:27.442628 2019-10-28 10:19:27.442628 +21 task:checkWorkerStatus 2019-10-28 22:14:59.969087 2019-10-28 22:14:59.969087 +19 task:deleteWorker 2019-10-24 22:06:08.085745 2019-10-28 22:15:57.361321 +18 task:appendWorkersToTask 2019-10-24 22:05:51.995991 2019-10-28 22:16:25.889528 +23 task:deleteWorkerFromCell 2019-10-28 22:17:57.761998 2019-10-28 22:17:57.761998 +22 task:appendWorkersToCell 2019-10-28 22:16:28.807395 2019-12-02 15:40:56.904664 +24 user:new 2019-12-02 15:41:23.812324 2019-12-02 15:44:31.483289 +\. + + +-- +-- Data for Name: user_role; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.user_role (id, name, create_time, update_time, code) FROM stdin; +1 SuperAdmin 2019-08-31 14:18:26.330858 2019-10-28 16:26:56.834742 1234 +2 Leader 2019-08-31 14:18:26.330858 2019-10-28 16:26:58.388278 1235 +3 Admin 2019-08-31 14:18:26.330858 2019-10-28 16:27:03.116832 1236 +4 Worker 2019-08-31 14:18:26.330858 2019-10-28 16:27:16.036296 1237 +5 Operator 2019-12-13 10:40:31.519547 2019-12-13 10:40:31.519547 1238 +\. + + +-- +-- Data for Name: user_role_code; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.user_role_code (id, code, role) FROM stdin; +1 1234 1 +2 1235 2 +3 1236 3 +4 1237 4 +\. + + +-- +-- Data for Name: user_role_permission; Type: TABLE DATA; Schema: public; Owner: postgres +-- + +COPY public.user_role_permission (id, role, permission, create_time, update_time) FROM stdin; +4 3 4 2019-09-03 18:16:08.794205 2019-09-03 18:16:08.794205 +2 3 2 2019-08-31 14:15:36.318695 2019-09-03 19:52:45.774985 +1 3 1 2019-08-31 14:15:36.318695 2019-09-03 19:52:56.065802 +9 3 16 2019-09-03 20:31:19.021642 2019-10-02 10:52:25.439733 +3 3 3 2019-08-31 14:15:36.318695 2019-10-02 10:52:28.279986 +5 3 5 2019-09-03 19:53:59.515434 2019-10-02 10:52:29.78855 +6 3 8 2019-09-03 19:54:05.128648 2019-10-02 10:52:31.211962 +7 3 14 2019-09-03 19:54:10.39031 2019-10-02 10:52:32.402753 +8 3 15 2019-09-03 19:54:15.313807 2019-10-02 10:52:38.751726 +10 4 9 2019-09-06 17:07:41.129591 2019-10-02 10:52:57.190981 +11 4 10 2019-09-17 13:57:19.906336 2019-10-02 10:53:00.996116 +12 4 11 2019-09-21 11:23:56.517606 2019-10-02 10:53:12.855955 +13 4 12 2019-09-21 11:24:01.694544 2019-10-02 10:53:14.285944 +14 4 13 2019-09-22 17:32:59.032636 2019-10-02 10:53:16.372835 +15 3 9 2019-10-05 10:34:09.764426 2019-10-05 10:34:09.764426 +16 3 10 2019-10-05 10:34:17.086963 2019-10-05 10:34:26.680047 +17 3 17 2019-10-05 14:36:55.519405 2019-10-05 14:36:55.519405 +18 3 18 2019-10-24 22:06:39.062327 2019-10-24 22:06:39.062327 +19 3 19 2019-10-24 22:06:47.173313 2019-10-24 22:06:47.173313 +20 3 20 2019-10-28 10:19:40.53637 2019-10-28 10:19:40.53637 +22 3 22 2019-10-28 22:16:35.837969 2019-10-28 22:16:35.837969 +21 3 21 2019-10-28 22:15:10.604473 2019-10-28 22:16:37.872189 +23 3 23 2019-10-28 22:18:03.235823 2019-10-28 22:18:03.235823 +24 3 24 2019-12-02 15:41:37.668403 2019-12-02 15:41:47.024277 +25 5 1 2019-12-13 11:36:43.022671 2019-12-13 11:36:43.022671 +26 5 2 2019-12-13 11:36:51.911982 2019-12-13 11:36:51.911982 +27 5 3 2019-12-13 11:37:00.407219 2019-12-13 11:37:00.407219 +28 5 4 2019-12-13 11:37:08.260826 2019-12-13 11:37:08.260826 +29 5 5 2019-12-13 11:37:13.422231 2019-12-13 11:37:13.422231 +30 5 8 2019-12-13 11:37:21.09809 2019-12-13 11:37:21.09809 +31 5 18 2019-12-13 11:37:39.726519 2019-12-13 11:37:39.726519 +32 5 19 2019-12-13 11:37:44.602842 2019-12-13 11:37:44.602842 +33 5 20 2019-12-13 11:37:51.401845 2019-12-13 11:37:51.401845 +34 5 21 2019-12-13 11:37:56.59423 2019-12-13 11:37:56.59423 +35 5 22 2019-12-13 11:38:10.321722 2019-12-13 11:38:10.321722 +36 5 23 2019-12-13 11:38:17.356067 2019-12-13 11:38:17.356067 +\. + + +-- +-- Name: user_permission_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.user_permission_id_seq', 25, true); + + +-- +-- Name: user_role_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.user_role_id_seq', 6, false); + + +-- +-- Name: user_role_premission_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres +-- + +SELECT pg_catalog.setval('public.user_role_premission_id_seq', 37, true); + + +-- +-- PostgreSQL database dump complete +-- \ No newline at end of file diff --git a/replay_pid26132.log b/replay_pid26132.log new file mode 100644 index 0000000..c9edfc3 --- /dev/null +++ b/replay_pid26132.log @@ -0,0 +1,4030 @@ +JvmtiExport can_access_local_variables 0 +JvmtiExport can_hotswap_or_post_breakpoint 0 +JvmtiExport can_post_on_exceptions 0 +# 470 ciObject found +ciMethod java/lang/Object ()V 4097 1 345343 0 96 +ciMethod java/lang/Object hashCode ()I 5121 1 640 0 -1 +ciMethod java/lang/Object equals (Ljava/lang/Object;)Z 2089 1 5802 0 -1 +ciMethod java/lang/Object clone ()Ljava/lang/Object; 2049 1 256 0 -1 +ciMethod java/lang/String ([CII)V 4097 1 5888 0 704 +ciMethod java/lang/String ([BIILjava/lang/String;)V 3089 1 1148 0 -1 +ciMethod java/lang/String ([CZ)V 4097 1 11312 0 0 +ciMethod java/lang/String length ()I 4097 1 207858 0 64 +ciMethod java/lang/String charAt (I)C 4097 1 796479 0 -1 +ciMethod java/lang/String codePointAt (I)I 1 1 463 0 -1 +ciMethod java/lang/String getChars ([CI)V 2049 1 5401 0 0 +ciMethod java/lang/String equals (Ljava/lang/Object;)Z 4097 14865 14874 0 -1 +ciMethod java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 1337 1 5415 0 1952 +ciMethod java/lang/String regionMatches (ZILjava/lang/String;II)Z 2057 753 6553 0 2592 +ciMethod java/lang/String startsWith (Ljava/lang/String;I)Z 4097 1785 5912 0 256 +ciMethod java/lang/String startsWith (Ljava/lang/String;)Z 4097 1 91790 0 -1 +ciMethod java/lang/String endsWith (Ljava/lang/String;)Z 4097 1 23970 0 256 +ciMethod java/lang/String hashCode ()I 2961 32769 3598 0 416 +ciMethod java/lang/String indexOf (I)I 4097 1 61200 0 -1 +ciMethod java/lang/String indexOf (II)I 1681 49153 3593 0 -1 +ciMethod java/lang/String indexOfSupplementary (II)I 0 0 1 0 -1 +ciMethod java/lang/String lastIndexOf (I)I 4097 1 19237 0 288 +ciMethod java/lang/String lastIndexOf (II)I 1793 139265 1269 0 288 +ciMethod java/lang/String lastIndexOfSupplementary (II)I 0 0 1 0 -1 +ciMethod java/lang/String substring (II)Ljava/lang/String; 4097 1 5657 0 992 +ciMethod java/lang/String concat (Ljava/lang/String;)Ljava/lang/String; 2049 1 5393 0 896 +ciMethod java/lang/String replace (CC)Ljava/lang/String; 1697 122881 978 0 1056 +ciMethod java/lang/String toUpperCase (Ljava/util/Locale;)Ljava/lang/String; 1161 35649 1054 0 -1 +ciMethod java/lang/ClassLoader preDefineClass (Ljava/lang/String;Ljava/security/ProtectionDomain;)Ljava/security/ProtectionDomain; 3073 1 2567 0 -1 +ciMethod java/lang/ClassLoader defineClassSourceLocation (Ljava/security/ProtectionDomain;)Ljava/lang/String; 3105 1 2567 0 -1 +ciMethod java/lang/ClassLoader postDefineClass (Ljava/lang/Class;Ljava/security/ProtectionDomain;)V 3105 1 2567 0 -1 +ciMethod java/lang/ClassLoader defineClass (Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class; 2529 1 2543 0 -1 +ciMethod java/lang/ClassLoader defineClass1 (Ljava/lang/String;[BIILjava/security/ProtectionDomain;Ljava/lang/String;)Ljava/lang/Class; 3073 1 384 0 -1 +ciMethod java/lang/ClassLoader checkName (Ljava/lang/String;)Z 3073 1 5544 0 -1 +ciMethod java/lang/ClassLoader checkCerts (Ljava/lang/String;Ljava/security/CodeSource;)V 3073 1 2567 0 -1 +ciMethod java/lang/ClassLoader definePackage (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package; 481 1 407 0 0 +ciMethod java/lang/ClassLoader getPackage (Ljava/lang/String;)Ljava/lang/Package; 3073 1 3750 0 0 +ciMethod java/lang/System nanoTime ()J 5121 1 640 0 -1 +ciMethod java/lang/System arraycopy (Ljava/lang/Object;ILjava/lang/Object;II)V 107521 1 13440 0 -1 +ciMethod java/security/ProtectionDomain (Ljava/security/CodeSource;Ljava/security/PermissionCollection;Ljava/lang/ClassLoader;[Ljava/security/Principal;)V 169 1 98 0 -1 +ciMethod java/security/ProtectionDomain getCodeSource ()Ljava/security/CodeSource; 1025 1 128 0 -1 +ciMethod java/security/SecureClassLoader defineClass (Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class; 2529 1 2531 0 0 +ciMethod java/security/SecureClassLoader defineClass (Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/CodeSource;)Ljava/lang/Class; 0 0 1 0 -1 +ciMethod java/security/SecureClassLoader getPermissions (Ljava/security/CodeSource;)Ljava/security/PermissionCollection; 489 1 61 0 -1 +ciMethod java/security/SecureClassLoader getProtectionDomain (Ljava/security/CodeSource;)Ljava/security/ProtectionDomain; 2529 1 2543 0 -1 +ciMethod java/lang/NoClassDefFoundError (Ljava/lang/String;)V 0 0 1 0 -1 +ciMethod java/lang/ref/Reference get ()Ljava/lang/Object; 7225 1 903 0 -1 +ciMethod java/lang/ref/Reference (Ljava/lang/Object;)V 2105 1 5198 0 0 +ciMethod java/lang/ref/Reference (Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V 4097 1 17274 0 0 +ciMethod java/lang/ref/SoftReference (Ljava/lang/Object;)V 3057 1 1502 0 0 +ciMethod java/lang/ref/SoftReference get ()Ljava/lang/Object; 3321 1 17606 0 0 +ciMethod java/lang/Thread currentThread ()Ljava/lang/Thread; 4097 1 512 0 -1 +ciMethod java/lang/Thread interrupt ()V 0 0 1 0 -1 +ciMethod java/lang/Thread interrupted ()Z 3073 1 2572 0 -1 +ciMethod java/util/Map get (Ljava/lang/Object;)Ljava/lang/Object; 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/Hashtable get (Ljava/lang/Object;)Ljava/lang/Object; 2073 289 2886 0 -1 +ciMethod java/lang/StringBuilder ()V 4097 1 21866 0 -1 +ciMethod java/lang/StringBuilder append (Ljava/lang/Object;)Ljava/lang/StringBuilder; 2617 1 1901 0 -1 +ciMethod java/lang/StringBuilder append (Ljava/lang/String;)Ljava/lang/StringBuilder; 4097 1 77922 0 -1 +ciMethod java/lang/StringBuilder append (I)Ljava/lang/StringBuilder; 9 1 1180 0 -1 +ciMethod java/lang/StringBuilder append (F)Ljava/lang/StringBuilder; 0 0 1 0 -1 +ciMethod java/lang/StringBuilder toString ()Ljava/lang/String; 4097 1 27584 0 -1 +ciMethod sun/misc/Unsafe ensureClassInitialized (Ljava/lang/Class;)V 2049 1 256 0 -1 +ciMethod java/io/ByteArrayInputStream ([B)V 81 1 12 0 -1 +ciMethod java/io/InputStream read ([BII)I 0 0 1 0 -1 +ciMethod java/io/InputStream close ()V 0 0 1 0 -1 +ciMethod java/net/URLClassLoader getAndVerifyPackage (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package; 2049 1 2531 0 0 +ciMethod java/net/URLClassLoader definePackageInternal (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)V 2049 1 2529 0 0 +ciMethod java/net/URLClassLoader defineClass (Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class; 1505 1 2530 0 0 +ciMethod java/net/URLClassLoader definePackage (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package; 473 1 379 0 0 +ciMethod java/net/URLClassLoader isSealed (Ljava/lang/String;Ljava/util/jar/Manifest;)Z 1569 1 2065 0 0 +ciMethod java/net/URLClassLoader access$000 (Ljava/net/URLClassLoader;)Lsun/misc/URLClassPath; 1049 1 131 0 0 +ciMethod java/net/URLClassLoader access$100 (Ljava/net/URLClassLoader;Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class; 1505 1 2530 0 0 +ciMethod java/net/URL getRef ()Ljava/lang/String; 7289 1 911 0 -1 +ciMethod java/net/URL equals (Ljava/lang/Object;)Z 1937 1 2508 0 -1 +ciMethod java/util/jar/Manifest (Ljava/io/InputStream;)V 137 1 60 0 0 +ciMethod java/util/jar/Manifest (Ljava/util/jar/JarVerifier;Ljava/io/InputStream;)V 209 1 69 0 0 +ciMethod java/util/jar/Manifest getMainAttributes ()Ljava/util/jar/Attributes; 1073 1 134 0 0 +ciMethod java/util/jar/Manifest getEntries ()Ljava/util/Map; 1025 1 128 0 0 +ciMethod java/util/jar/Manifest getAttributes (Ljava/lang/String;)Ljava/util/jar/Attributes; 4097 1 2483 0 0 +ciMethod java/util/jar/Manifest getTrustedAttributes (Ljava/lang/String;)Ljava/util/jar/Attributes; 3201 1 2445 0 0 +ciMethod java/util/jar/Manifest read (Ljava/io/InputStream;)V 561 305 70 0 -1 +ciMethod java/util/jar/Manifest parseName ([BI)Ljava/lang/String; 305 1 38 0 -1 +ciMethod java/security/CodeSource (Ljava/net/URL;[Ljava/security/CodeSigner;)V 2049 1 2531 0 0 +ciMethod java/lang/Character charCount (I)I 377 1 6622 0 -1 +ciMethod java/lang/Character toChars (I[CI)I 0 0 1 0 -1 +ciMethod java/lang/Character toChars (I)[C 0 0 1 0 -1 +ciMethod java/lang/Character toLowerCase (C)C 4097 1 28549 0 -1 +ciMethod java/lang/Character toUpperCase (C)C 3441 1 10357 0 -1 +ciMethod java/lang/Character toUpperCaseEx (I)I 4097 1 22310 0 -1 +ciMethod java/lang/Character toUpperCaseCharArray (I)[C 0 0 1 0 -1 +ciMethod java/lang/Float isNaN (F)Z 2049 1 5815 0 -1 +ciMethod java/util/Comparator compare (Ljava/lang/Object;Ljava/lang/Object;)I 0 0 1 0 -1 +ciMethod java/security/AccessController doPrivileged (Ljava/security/PrivilegedAction;)Ljava/lang/Object; 2049 1 256 0 -1 +ciMethod java/util/ArrayList size ()I 10217 1 1277 0 -1 +ciMethod java/util/AbstractMap ()V 2377 1 14138 0 0 +ciMethod sun/misc/SharedSecrets javaUtilJarAccess ()Lsun/misc/JavaUtilJarAccess; 3201 1 5033 0 0 +ciMethod java/util/HashMap hash (Ljava/lang/Object;)I 4097 1 49421 0 160 +ciMethod java/util/HashMap tableSizeFor (I)I 2049 1 5389 0 -1 +ciMethod java/util/HashMap (IF)V 2913 1 5516 0 -1 +ciMethod java/util/HashMap (I)V 2049 1 2445 0 0 +ciMethod java/util/HashMap ()V 753 1 8132 0 0 +ciMethod java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 4097 1 15608 0 672 +ciMethod java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 4097 73 12533 0 512 +ciMethod java/util/HashMap put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 4097 1 17189 0 1568 +ciMethod java/util/HashMap putVal (ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; 4097 473 17032 0 -1 +ciMethod sun/misc/VM allowArraySyntax ()Z 3073 1 5545 0 -1 +ciMethod java/lang/Math max (II)I 4097 1 39168 0 -1 +ciMethod java/lang/Math min (II)I 4097 1 54010 0 -1 +ciMethod java/util/Arrays copyOf ([BI)[B 4097 1 15825 0 -1 +ciMethod java/util/Arrays copyOf ([CI)[C 4097 1 13206 0 0 +ciMethod java/util/Arrays copyOfRange ([CII)[C 4097 1 5746 0 512 +ciMethod sun/misc/ASCIICaseInsensitiveComparator compare (Ljava/lang/String;Ljava/lang/String;)I 4097 6513 12944 0 -1 +ciMethod sun/misc/ASCIICaseInsensitiveComparator lowerCaseHashCode (Ljava/lang/String;)I 1945 29289 1051 0 0 +ciMethod sun/misc/ASCIICaseInsensitiveComparator toLower (I)I 4097 1 40406 0 -1 +ciMethod sun/misc/ASCIICaseInsensitiveComparator compare (Ljava/lang/Object;Ljava/lang/Object;)I 4097 1 13747 0 928 +ciMethodData java/lang/String charAt (I)C 2 796594 orig 264 88 131 230 81 0 0 0 0 104 61 59 23 0 0 0 0 120 1 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 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 2 0 0 145 45 97 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 80 0 0 0 255 255 255 255 7 0 1 0 0 0 0 0 data 10 0x10007 0x0 0x40 0xc25b6 0xa0007 0xc25b7 0x30 0x0 0x120002 0x0 oops 0 +ciMethodData java/lang/String length ()I 2 207858 orig 264 88 131 230 81 0 0 0 0 24 60 59 23 0 0 0 0 32 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 145 79 25 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 data 0 oops 0 +ciMethodData sun/misc/ASCIICaseInsensitiveComparator compare (Ljava/lang/Object;Ljava/lang/Object;)I 2 13769 orig 264 88 131 230 81 0 0 0 0 144 36 78 23 0 0 0 0 232 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 73 158 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 144 0 0 0 255 255 255 255 4 0 2 0 0 0 0 0 data 18 0x20004 0x0 0x19bbf540 0x3090 0x0 0x0 0x60004 0x0 0x19bbf540 0x3090 0x0 0x0 0x90005 0x0 0x1bd44b50 0x33c9 0x0 0x0 oops 3 2 java/lang/String 8 java/lang/String 14 sun/misc/ASCIICaseInsensitiveComparator +ciMethodData sun/misc/ASCIICaseInsensitiveComparator compare (Ljava/lang/String;Ljava/lang/String;)I 2 31515 orig 264 88 131 230 81 0 0 0 0 184 32 78 23 0 0 0 0 88 3 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 3 0 0 129 132 1 0 105 191 3 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 64 0x10005 0x3090 0x0 0x0 0x0 0x0 0x60005 0x3090 0x0 0x0 0x0 0x0 0xe0007 0x1da9 0x38 0x12e7 0x120003 0x12e7 0x18 0x200007 0x95 0x168 0xa7e6 0x260005 0xa7e6 0x0 0x0 0x0 0x0 0x2e0005 0xa7e6 0x0 0x0 0x0 0x0 0x360007 0xa7e6 0x70 0x0 0x3d0007 0x0 0x40 0x0 0x440007 0x0 0x30 0x0 0x4b0002 0x0 0x530007 0x745f 0x60 0x3387 0x580002 0x3387 0x600002 0x3387 0x6a0007 0x38c 0x20 0x2ffb 0x760003 0x77eb 0xfffffffffffffeb0 oops 0 +ciMethodData java/lang/Object ()V 2 345343 orig 264 88 131 230 81 0 0 0 0 128 4 59 23 0 0 0 0 32 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 249 23 42 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 data 0 oops 0 +ciMethod java/io/PrintStream println (Ljava/lang/String;)V 65 1 8 0 -1 +ciMethod java/lang/IllegalArgumentException (Ljava/lang/String;)V 0 0 4 0 -1 +ciMethod sun/security/util/Debug println (Ljava/lang/String;)V 0 0 1 0 -1 +ciMethod java/util/Locale getLanguage ()Ljava/lang/String; 3177 1 1432 0 -1 +ciMethod java/util/HashMap$TreeNode getTreeNode (ILjava/lang/Object;)Ljava/util/HashMap$TreeNode; 0 0 1 0 -1 +ciMethod java/net/URLStreamHandler equals (Ljava/net/URL;Ljava/net/URL;)Z 1937 1 2508 0 -1 +ciMethod java/net/URLStreamHandler sameFile (Ljava/net/URL;Ljava/net/URL;)Z 2049 1 2508 0 -1 +ciMethodData java/lang/String hashCode ()I 2 101957 orig 264 88 131 230 81 0 0 0 0 184 79 59 23 0 0 0 0 152 1 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 225 100 0 0 41 242 11 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 120 0 0 0 255 255 255 255 7 0 6 0 0 0 0 0 data 15 0x60007 0x729 0x78 0x573 0xe0007 0x4 0x58 0x56f 0x1e0007 0x56e 0x38 0x17e43 0x2d0003 0x17e43 0xffffffffffffffe0 oops 0 +ciMethod sun/misc/URLClassPath getResource (Ljava/lang/String;Z)Lsun/misc/Resource; 1249 41225 1156 0 8352 +ciMethod sun/misc/URLClassPath getLookupCacheForClassLoader (Ljava/lang/ClassLoader;Ljava/lang/String;)[I 0 0 1 0 -1 +ciMethod sun/misc/URLClassPath getLookupCache (Ljava/lang/String;)[I 1273 1 1997 0 -1 +ciMethod sun/misc/URLClassPath ensureLoaderOpened (I)Z 0 0 1 0 -1 +ciMethod sun/misc/URLClassPath getNextLoader ([II)Lsun/misc/URLClassPath$Loader; 4097 1 9636 0 -1 +ciMethodData java/lang/String ([CII)V 2 5888 orig 264 88 131 230 81 0 0 0 0 88 49 59 23 0 0 0 0 80 2 0 0 208 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 168 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 14 0 2 0 0 0 240 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 30 0x10002 0x1500 0x50007 0x1500 0x30 0x0 0xd0002 0x0 0x120007 0x14f1 0x70 0xf 0x160007 0xf 0x30 0x0 0x1e0002 0x0 0x250007 0x0 0x20 0xf 0x370007 0x14f1 0x30 0x0 0x410002 0x0 0x4b0002 0x14f1 oops 0 +ciMethodData java/util/Arrays copyOfRange ([CII)[C 2 5746 orig 264 88 131 230 81 0 0 0 0 232 159 76 23 0 0 0 0 120 2 0 0 240 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 145 163 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 9 0 2 0 0 0 32 1 0 0 255 255 255 255 7 0 5 0 0 0 0 0 data 36 0x50007 0x1472 0x100 0x0 0x100002 0x0 0x140005 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x1d0005 0x0 0x0 0x0 0x0 0x0 0x200005 0x0 0x0 0x0 0x0 0x0 0x230002 0x0 0x360002 0x1472 0x390002 0x1472 oops 0 +ciMethodData java/lang/String indexOf (II)I 2 193483 orig 264 88 131 230 81 0 0 0 0 56 81 59 23 0 0 0 0 16 2 0 0 88 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 0 0 185 105 0 0 89 222 22 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 224 0 0 0 255 255 255 255 7 0 7 0 0 0 0 0 data 28 0x70007 0xd37 0x38 0x0 0xc0003 0x0 0x38 0x110007 0xb64 0x20 0x1d3 0x190007 0x0 0x78 0xb64 0x280007 0x95c 0x58 0x2ddcf 0x310007 0x2dbc8 0x20 0x207 0x3a0003 0x2dbc8 0xffffffffffffffc0 0x420002 0x0 oops 0 +ciMethodData java/util/HashMap hash (Ljava/lang/Object;)I 2 49422 orig 264 88 131 230 81 0 0 0 0 104 136 73 23 0 0 0 0 176 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 113 248 5 0 1 0 0 0 47 62 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 104 0 0 0 255 255 255 255 7 224 1 0 0 0 0 0 data 13 0x1e007 0xbea4 0x38 0x6c 0x50003 0x6c 0x48 0x90005 0x39d0 0x19bbf540 0x8299 0x2d919e0 0x23c oops 2 9 java/lang/String 11 java/io/File +ciMethodData java/lang/String indexOf (I)I 2 61200 orig 264 88 131 230 81 0 0 0 0 80 80 59 23 0 0 0 0 128 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 129 104 7 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 3 0 0 0 0 0 data 6 0x30005 0xb93 0x19bbf540 0xe17c 0x0 0x0 oops 1 2 java/lang/String +ciMethodData java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 2 12533 orig 264 88 131 230 81 0 0 0 0 24 146 73 23 0 0 0 0 8 4 0 0 112 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 17 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 2 0 0 169 119 1 0 201 22 0 0 41 22 0 0 79 1 0 0 2 0 0 0 1 0 37 0 2 0 0 0 176 2 0 0 255 255 255 255 7 0 6 0 0 0 0 0 data 86 0x60007 0x1d8 0x2b0 0x2d1d 0xe0007 0x0 0x290 0x2d1d 0x1c0007 0xb78 0x270 0x21a5 0x250007 0xaf8 0xb0 0x16ad 0x310007 0xaee 0x90 0xbbf 0x350007 0x0 0x70 0xbbf 0x3b0005 0x843 0x19bbf540 0x366 0x2d919e0 0x16 0x3e0007 0x10d 0x20 0xab2 0x4c0007 0x55b 0x1a0 0x6aa 0x510004 0xfffffffffffff956 0x1ab6e0c0 0x5e 0x1a826490 0xa4 0x540007 0x6aa 0x80 0x0 0x590004 0x0 0x0 0x0 0x0 0x0 0x5e0005 0x0 0x0 0x0 0x0 0x0 0x680007 0x343 0xb0 0x4db 0x740007 0x1e8 0x90 0x2f3 0x780007 0x0 0x70 0x2f3 0x7e0005 0x2d4 0x2d919e0 0x8 0x1ab6e170 0x17 0x81e007 0x17 0x20 0x2dd 0x8f0007 0x174 0xffffffffffffff50 0x1e6 oops 6 26 java/lang/String 28 java/io/File 40 java/util/LinkedHashMap$Entry 42 java/util/HashMap$Node 74 java/io/File 76 java/util/jar/Attributes$Name +ciMethodData java/lang/String substring (II)Ljava/lang/String; 2 5657 orig 264 88 131 230 81 0 0 0 0 112 92 59 23 0 0 0 0 40 2 0 0 208 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 201 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 15 0 2 0 0 0 248 0 0 0 255 255 255 255 7 0 1 0 0 0 0 0 data 31 0x10007 0x1419 0x30 0x0 0x90002 0x0 0x130007 0x1419 0x30 0x0 0x1b0002 0x0 0x240007 0x1419 0x30 0x0 0x2c0002 0x0 0x310007 0x63e 0x58 0xddb 0x3a0007 0x8e9 0x38 0x4f2 0x3e0003 0x4f2 0x28 0x4b0002 0xf27 oops 0 +ciMethod java/net/URLClassLoader$1 run ()Ljava/lang/Class; 3073 1 5503 0 0 +ciMethod java/net/URLClassLoader$1 run ()Ljava/lang/Object; 3073 1 5504 0 -1 +ciMethod sun/misc/URLClassPath$JarLoader access$600 (Lsun/misc/URLClassPath$JarLoader;)Ljava/net/URL; 3073 1 384 0 0 +ciMethod sun/misc/URLClassPath$JarLoader access$700 (Lsun/misc/URLClassPath$JarLoader;)Ljava/util/jar/JarFile; 2049 1 256 0 0 +ciMethod sun/misc/URLClassPath$Loader getBaseURL ()Ljava/net/URL; 1025 1 128 0 -1 +ciMethod sun/misc/URLClassPath$Loader getResource (Ljava/lang/String;Z)Lsun/misc/Resource; 0 0 1 0 -1 +ciMethod java/util/zip/ZipFile getEntry (J[BZ)J 9217 1 1152 0 -1 +ciMethod java/util/zip/ZipFile getInputStream (Ljava/util/zip/ZipEntry;)Ljava/io/InputStream; 2049 1 2973 0 0 +ciMethod java/util/zip/ZipFile getInflater ()Ljava/util/zip/Inflater; 1977 1 2957 0 -1 +ciMethod java/util/zip/ZipFile ensureOpen ()V 4097 1 5643 0 -1 +ciMethod java/util/zip/ZipFile getEntrySize (J)J 5121 1 640 0 -1 +ciMethod java/util/zip/ZipFile getEntryMethod (J)I 3073 1 384 0 -1 +ciMethod java/util/jar/JarFile getManifest ()Ljava/util/jar/Manifest; 1081 1 2449 0 0 +ciMethod java/util/jar/JarFile getManifestFromReference ()Ljava/util/jar/Manifest; 1081 1 2449 0 0 +ciMethod java/util/jar/JarFile getMetaInfEntryNames ()[Ljava/lang/String; 825 1 101 0 -1 +ciMethod java/util/jar/JarFile getJarEntry (Ljava/lang/String;)Ljava/util/jar/JarEntry; 4097 1 9566 0 -1 +ciMethod java/util/jar/JarFile getEntry (Ljava/lang/String;)Ljava/util/zip/ZipEntry; 4097 1 7693 0 -1 +ciMethod java/util/jar/JarFile maybeInstantiateVerifier ()V 3073 1489 5545 0 1056 +ciMethod java/util/jar/JarFile initializeVerifier ()V 0 0 1 0 -1 +ciMethod java/util/jar/JarFile getBytes (Ljava/util/zip/ZipEntry;)[B 1241 1 155 0 -1 +ciMethod java/util/jar/JarFile getManEntry ()Ljava/util/jar/JarEntry; 1377 1 215 0 0 +ciMethod java/util/jar/JarFile ensureInitialization ()V 4073 1 2438 0 0 +ciMethod sun/misc/JavaUtilJarAccess getTrustedAttributes (Ljava/util/jar/Manifest;Ljava/lang/String;)Ljava/util/jar/Attributes; 0 0 1 0 -1 +ciMethod sun/misc/JavaUtilJarAccess ensureInitialization (Ljava/util/jar/JarFile;)V 0 0 1 0 -1 +ciMethod java/util/jar/JavaUtilJarAccessImpl getTrustedAttributes (Ljava/util/jar/Manifest;Ljava/lang/String;)Ljava/util/jar/Attributes; 3201 1 2445 0 0 +ciMethod java/util/jar/JavaUtilJarAccessImpl ensureInitialization (Ljava/util/jar/JarFile;)V 4097 1 2441 0 0 +ciMethod java/util/zip/ZipCoder getBytes (Ljava/lang/String;)[B 4097 1 7024 0 -1 +ciMethod java/util/zip/ZipCoder getBytesUTF8 (Ljava/lang/String;)[B 0 0 1 0 -1 +ciMethod java/util/zip/ZipCoder isUTF8 ()Z 3073 1 384 0 -1 +ciMethod sun/misc/PerfCounter get ()J 4089 1 9161 0 -1 +ciMethod sun/misc/PerfCounter add (J)V 4089 1 9135 0 -1 +ciMethod sun/misc/PerfCounter addElapsedTimeFrom (J)V 2049 1 4793 0 0 +ciMethod sun/misc/PerfCounter getReadClassBytesTime ()Lsun/misc/PerfCounter; 2521 1 2531 0 0 +ciMethod java/nio/LongBuffer get (I)J 0 0 1 0 -1 +ciMethod java/nio/LongBuffer put (IJ)Ljava/nio/LongBuffer; 0 0 1 0 -1 +ciMethod java/util/jar/JarEntry getCodeSigners ()[Ljava/security/CodeSigner; 0 0 1 0 -1 +ciMethod java/util/zip/ZipFile$ZipFileInputStream (Ljava/util/zip/ZipFile;J)V 2049 1 2972 0 -1 +ciMethodData java/lang/String startsWith (Ljava/lang/String;I)Z 2 6932 orig 264 88 131 230 81 0 0 0 0 176 77 59 23 0 0 0 0 176 1 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 193 168 0 0 169 209 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 13 0 2 0 0 0 128 0 0 0 255 255 255 255 7 0 25 0 0 0 0 0 data 16 0x190007 0xd 0x40 0x150b 0x250007 0x14af 0x20 0x5c 0x2f0007 0x1e6 0x40 0x212e 0x410007 0xe65 0xffffffffffffffe0 0x12c9 oops 0 +ciMethodData java/lang/String lastIndexOf (II)I 2 67374 orig 264 88 131 230 81 0 0 0 0 136 83 59 23 0 0 0 0 240 1 0 0 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 68 0 0 169 32 0 0 113 25 6 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 14 0 2 0 0 0 152 0 0 0 255 255 255 255 7 0 3 0 0 0 0 0 data 19 0x30007 0x0 0x88 0x415 0x100002 0x415 0x170007 0x180 0x58 0xc59e 0x1f0007 0xc309 0x20 0x295 0x280003 0xc309 0xffffffffffffffc0 0x300002 0x0 oops 0 +ciMethod java/util/zip/ZipFile$ZipFileInflaterInputStream (Ljava/util/zip/ZipFile;Ljava/util/zip/ZipFile$ZipFileInputStream;Ljava/util/zip/Inflater;I)V 1977 1 2956 0 -1 +ciMethodData java/util/Arrays copyOf ([CI)[C 2 13206 orig 264 88 131 230 81 0 0 0 0 32 152 76 23 0 0 0 0 112 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 177 140 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 0 2 0 0 0 32 0 0 0 255 255 255 255 2 0 11 0 0 0 0 0 data 4 0xb0002 0x3197 0xe0002 0x3199 oops 0 +ciMethodData java/lang/String endsWith (Ljava/lang/String;)Z 2 23970 orig 264 88 131 230 81 0 0 0 0 232 78 59 23 0 0 0 0 128 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 17 221 2 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 13 0 0 0 0 0 data 6 0xd0005 0x4ae 0x19bbf540 0x56f9 0x0 0x0 oops 1 2 java/lang/String +ciMethodData java/util/HashMap put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 2 17216 orig 264 88 131 230 81 0 0 0 0 88 147 73 23 0 0 0 0 152 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1 10 2 0 1 0 0 0 116 41 0 0 0 0 0 0 2 0 0 0 0 0 7 0 2 0 0 0 64 0 0 0 255 255 255 255 2 0 2 0 0 0 0 0 data 8 0x20002 0x4141 0x90005 0x2088 0x1b977280 0x20b1 0x1ab31b50 0x8 oops 2 4 java/util/HashMap 6 java/io/ExpiringCache$1 +ciMethodData java/util/HashMap putVal (ILjava/lang/Object;Ljava/lang/Object;ZZ)Ljava/lang/Object; 2 17032 orig 264 88 131 230 81 0 0 0 0 56 149 73 23 0 0 0 0 176 6 0 0 176 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 65 4 2 0 105 24 0 0 129 42 0 0 193 2 0 0 2 0 0 0 1 0 50 0 2 0 0 0 64 5 0 0 255 255 255 255 7 0 7 0 0 0 0 0 data 168 0x70007 0x11a1 0x40 0x2ee7 0x100007 0x2ee7 0x50 0x0 0x140005 0x208 0x1b977280 0x425 0x1ab32520 0xb75 0x2c0007 0x124d 0x98 0x2e3b 0x380005 0x18f1 0x1b977280 0x1543 0x1ab31b50 0x7 0x3b0004 0x0 0x1a826490 0x1572 0x1ab6e0c0 0x18c9 0x3c0003 0x2e3b 0x3d0 0x450007 0xd16 0xc8 0x537 0x510007 0x428 0x90 0x10f 0x550007 0x0 0x88 0x10f 0x5b0005 0xcb 0x19bbf540 0x3e 0x2d919e0 0x6 0x5e0007 0x9c 0x38 0x73 0x650003 0x49b 0x278 0x6a0004 0xfffffffffffff24e 0x1a826490 0xec 0x1ab6e0c0 0x4 0x6d0007 0xdb2 0x98 0x0 0x720004 0x0 0x0 0x0 0x0 0x0 0x7b0005 0x0 0x0 0x0 0x0 0x0 0x800003 0x0 0x1b0 0x8e0007 0x401 0xb8 0xcbd 0x980005 0x3c6 0x1b977280 0x8f2 0x1ab31b50 0x5 0xa20007 0xcbe 0x148 0x0 0xa90005 0x0 0x0 0x0 0x0 0x0 0xac0003 0x0 0xf8 0xb50007 0x303 0xc8 0xfe 0xc1e007 0xf3 0xc0 0xd 0xc50007 0x0 0x88 0xd 0xcbc005 0x4 0x1ab325d0 0x9 0x19bbf540 0x5 0xce0007 0x9 0x38 0x9 0xd10003 0x9 0x30 0xdb0003 0x30c 0xfffffffffffffe80 0xe00007 0xcbd 0x90 0x597 0xec0007 0x596 0x40 0x1 0xf10007 0x1 0x20 0x0 0xfd0005 0x0 0x1b977280 0x4b4 0x1ab32520 0xe3 0x11c0007 0x3970 0x50 0x188 0x1200005 0x19 0x1b977280 0xd3 0x1ab32520 0x9c 0x1270005 0x1cb7 0x1b977280 0x1e35 0x1ab31b50 0xc oops 20 10 java/util/HashMap 12 java/util/LinkedHashMap 20 java/util/HashMap 22 java/io/ExpiringCache$1 26 java/util/HashMap$Node 28 java/util/LinkedHashMap$Entry 47 java/lang/String 49 java/io/File 60 java/util/HashMap$Node 62 java/util/LinkedHashMap$Entry 89 java/util/HashMap 91 java/io/ExpiringCache$1 120 sun/misc/ProxyGenerator$ConstantPool$IndirectEntry 122 java/lang/String 148 java/util/HashMap 150 java/util/LinkedHashMap 158 java/util/HashMap 160 java/util/LinkedHashMap 164 java/util/HashMap 166 java/io/ExpiringCache$1 +ciMethodData java/lang/ref/Reference (Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V 2 17274 orig 264 88 131 230 81 0 0 0 0 56 131 61 23 0 0 0 0 120 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 209 11 2 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 72 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 9 0x10002 0x417a 0xb0007 0x2d94 0x38 0x13e8 0x110003 0x13e8 0x18 oops 0 +ciMethodData java/lang/String ([CZ)V 2 11313 orig 264 88 131 230 81 0 0 0 0 128 59 59 23 0 0 0 0 64 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 137 81 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 2 0x10002 0x2a32 oops 0 +ciMethodData java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 2 15608 orig 264 88 131 230 81 0 0 0 0 232 144 73 23 0 0 0 0 200 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 17 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 2 0 0 193 215 1 0 1 0 0 0 166 20 0 0 0 0 0 0 2 0 0 0 0 0 10 0 2 0 0 0 120 0 0 0 255 255 255 255 2 0 2 0 0 0 0 0 data 15 0x20002 0x3af8 0x60005 0x254 0x1b977280 0x3879 0x1a826db0 0x2c 0xb0007 0x1d86 0x38 0x1d73 0xf0003 0x1d73 0x18 oops 2 4 java/util/HashMap 6 java/lang/ProcessEnvironment +ciMethod java/util/jar/JarVerifier ([B)V 73 1 9 0 -1 +ciMethod java/util/jar/JarVerifier isTrustedManifestEntry (Ljava/lang/String;)Z 0 0 1 0 0 +ciMethod java/util/jar/Attributes ()V 561 1 70 0 0 +ciMethod java/util/jar/Attributes (I)V 865 1 108 0 0 +ciMethod java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 2057 1 4737 0 0 +ciMethod java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 2057 1 4737 0 0 +ciMethod java/util/jar/Attributes size ()I 305 1 38 0 -1 +ciMethod java/util/jar/Attributes read (Ljava/util/jar/Manifest$FastInputStream;[B)V 809 133969 108 0 -1 +ciMethod java/util/jar/Manifest$FastInputStream (Ljava/io/InputStream;)V 561 1 70 0 -1 +ciMethod java/util/jar/Manifest$FastInputStream peek ()B 4097 1 2216 0 -1 +ciMethod java/util/jar/Manifest$FastInputStream readLine ([B)I 4097 1 2394 0 -1 +ciMethod java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 2065 1 1061 0 0 +ciMethod java/util/jar/Attributes$Name hashCode ()I 4097 1 5647 0 672 +ciMethodData java/lang/String replace (CC)Ljava/lang/String; 2 49457 orig 264 88 131 230 81 0 0 0 0 240 94 59 23 0 0 0 0 136 2 0 0 184 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 60 0 0 241 23 0 0 137 41 4 0 0 0 0 0 0 0 0 0 2 0 0 0 3 0 23 0 2 0 0 0 80 1 0 0 255 255 255 255 7 0 2 0 0 0 0 0 data 42 0x20007 0x0 0x150 0x2fe 0x1a0007 0xfb 0x58 0x1f89 0x230007 0x1d86 0xffffffffffffffe0 0x203 0x260003 0x203 0x18 0x2c0007 0xfb 0xd8 0x203 0x3b0007 0x203 0x38 0x3aa 0x4b0003 0x3aa 0xffffffffffffffe0 0x510007 0x203 0x70 0x6299 0x620007 0x5710 0x38 0xb89 0x660003 0xb89 0x18 0x6f0003 0x6299 0xffffffffffffffa8 0x790002 0x203 oops 0 +ciMethodData java/lang/String lastIndexOf (I)I 2 19239 orig 264 88 131 230 81 0 0 0 0 184 82 59 23 0 0 0 0 128 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 57 73 2 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 9 0 0 0 0 0 data 6 0x90005 0x109 0x19bbf540 0x481f 0x0 0x0 oops 1 2 java/lang/String +ciMethod sun/misc/URLClassPath$JarLoader$2 getCodeSourceURL ()Ljava/net/URL; 3105 1 2441 0 0 +ciMethod sun/misc/URLClassPath$JarLoader$2 getManifest ()Ljava/util/jar/Manifest; 4097 1 2440 0 0 +ciMethod sun/misc/URLClassPath$JarLoader$2 getCodeSigners ()[Ljava/security/CodeSigner; 4097 1 2454 0 0 +ciMethod sun/misc/Resource getCodeSourceURL ()Ljava/net/URL; 0 0 1 0 -1 +ciMethod sun/misc/Resource getInputStream ()Ljava/io/InputStream; 0 0 1 0 -1 +ciMethod sun/misc/Resource getContentLength ()I 0 0 1 0 -1 +ciMethod sun/misc/Resource cachedInputStream ()Ljava/io/InputStream; 2049 1 5086 0 -1 +ciMethod sun/misc/Resource getBytes ()[B 2529 5609 2529 0 0 +ciMethod sun/misc/Resource getByteBuffer ()Ljava/nio/ByteBuffer; 2529 1 2532 0 0 +ciMethod sun/misc/Resource getManifest ()Ljava/util/jar/Manifest; 713 1 89 0 0 +ciMethod sun/misc/Resource getCodeSigners ()[Ljava/security/CodeSigner; 713 1 89 0 0 +ciMethod java/lang/Package isSealed ()Z 1569 1 2126 0 0 +ciMethod java/lang/Package isSealed (Ljava/net/URL;)Z 0 0 1 0 -1 +ciMethod java/lang/Package (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/lang/ClassLoader;)V 2049 1 410 0 -1 +ciMethod java/lang/Package getSystemPackage (Ljava/lang/String;)Ljava/lang/Package; 865 1 815 0 0 +ciMethod java/lang/Package defineSystemPackage (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Package; 0 0 1 0 0 +ciMethod java/lang/Package getSystemPackage0 (Ljava/lang/String;)Ljava/lang/String; 3081 1 385 0 -1 +ciMethod sun/nio/ByteBuffered getByteBuffer ()Ljava/nio/ByteBuffer; 0 0 1 0 -1 +ciMethodData java/util/jar/JarFile getJarEntry (Ljava/lang/String;)Ljava/util/jar/JarEntry; 2 9566 orig 264 88 131 230 81 0 0 0 0 184 155 91 23 0 0 0 0 176 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 241 26 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 96 0 0 0 255 255 255 255 5 0 2 0 0 0 0 0 data 12 0x20005 0x0 0x1b7122f0 0x235e 0x0 0x0 0x50104 0x0 0x1d6e9070 0xc0 0x0 0x0 oops 2 2 java/util/jar/JarFile 8 java/util/jar/JarFile$JarFileEntry +ciMethodData java/util/Hashtable get (Ljava/lang/Object;)Ljava/lang/Object; 2 2894 orig 264 88 131 230 81 0 0 0 0 32 138 62 23 0 0 0 0 40 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 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 3 1 0 0 89 82 0 0 25 30 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 11 0 2 0 0 0 216 0 0 0 255 255 255 255 5 0 6 0 0 0 0 0 data 27 0x60005 0x0 0x19bbf540 0xa4b 0x0 0x0 0x1b0007 0x6b3 0xa8 0x75b 0x240007 0x3c3 0x70 0x398 0x2d0005 0x0 0x19bbf540 0x398 0x0 0x0 0x300007 0x0 0x20 0x398 0x400003 0x3c3 0xffffffffffffff70 oops 2 2 java/lang/String 16 java/lang/String +ciMethod sun/misc/URLClassPath$FileLoader$1 getCodeSourceURL ()Ljava/net/URL; 713 1 89 0 0 +ciMethodData java/util/HashMap ()V 2 8132 orig 264 88 131 230 81 0 0 0 0 32 141 73 23 0 0 0 0 48 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 94 0 0 0 49 251 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 2 0x10002 0x1f66 oops 0 +ciMethodData java/util/AbstractMap ()V 2 14138 orig 264 88 131 230 81 0 0 0 0 48 222 72 23 0 0 0 0 48 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 1 0 0 137 176 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 2 0x10002 0x3611 oops 0 +ciMethod java/lang/SecurityException (Ljava/lang/String;)V 9 1 1 0 -1 +ciMethodData java/lang/String regionMatches (ZILjava/lang/String;II)Z 2 6553 orig 264 88 131 230 81 0 0 0 0 208 76 59 23 0 0 0 0 24 3 0 0 96 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 193 196 0 0 33 20 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 24 0 2 0 0 0 168 1 0 0 255 255 255 255 7 0 21 0 0 0 0 0 data 53 0x150007 0x0 0x80 0x1898 0x190007 0x0 0x60 0x1898 0x290007 0x6bc 0x40 0x11dc 0x3a0007 0x11dc 0x20 0x0 0x440007 0x4d 0x128 0x1413 0x5f0007 0x11bf 0x38 0x254 0x620003 0x254 0xffffffffffffffc0 0x660007 0x0 0xd0 0x11bf 0x6b0002 0x11bf 0x720002 0x11be 0x7b0007 0x118e 0x38 0x30 0x7e0003 0x30 0xffffffffffffff48 0x830002 0x118e 0x880002 0x118b 0x8b0007 0x118b 0x38 0x0 0x8e0003 0x0 0xfffffffffffffef0 oops 0 +ciMethodData java/lang/String toUpperCase (Ljava/util/Locale;)Ljava/lang/String; 2 22155 orig 264 88 131 230 81 0 0 0 0 232 107 59 23 0 0 0 0 80 6 0 0 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 16 0 0 105 28 0 0 25 41 2 0 0 0 0 0 0 0 0 0 2 0 0 0 3 0 72 0 2 0 0 0 0 5 0 0 255 255 255 255 7 0 1 0 0 0 0 0 data 160 0x10007 0x38d 0x30 0x0 0x80002 0x0 0x160007 0xb4 0x138 0x17c1 0x250007 0x17c1 0x98 0x0 0x2c0007 0x0 0x78 0x0 0x310005 0x0 0x0 0x0 0x0 0x0 0x380002 0x0 0x3d0003 0x0 0x18 0x450002 0x17c1 0x4d0007 0x0 0x70 0x17c1 0x540007 0x14e8 0x38 0x2d9 0x570003 0x2d9 0x30 0x5f0003 0x14e8 0xfffffffffffffee0 0x750002 0x2d9 0x790005 0x24 0x1bb07930 0x2b5 0x0 0x0 0x820007 0x0 0x60 0x2d9 0x890007 0x0 0x40 0x2d9 0x900007 0x2d9 0x38 0x0 0x940003 0x0 0x18 0xa00007 0x2d9 0x2d0 0x3019 0xb10007 0x3019 0x98 0x0 0xb90007 0x0 0x78 0x0 0xbf0005 0x0 0x0 0x0 0x0 0x0 0xc60002 0x0 0xcb0003 0x0 0x18 0xd30007 0x3019 0x48 0x0 0xda0002 0x0 0xdf0003 0x0 0x28 0xe40002 0x3019 0xec0007 0x0 0x40 0x3019 0xf30007 0x3019 0x188 0x0 0xf90007 0x0 0x90 0x0 0xfe0007 0x0 0x48 0x0 0x1050002 0x0 0x10a0003 0x0 0x98 0x10f0002 0x0 0x1140003 0x0 0x70 0x11a0007 0x0 0x48 0x0 0x1280002 0x0 0x1310003 0x0 0xa8 0x1360002 0x0 0x1440007 0x0 0x30 0x0 0x15f0002 0x0 0x16d0007 0x0 0x38 0x0 0x1830003 0x0 0xffffffffffffffe0 0x1900003 0x0 0x18 0x1a50003 0x3019 0xfffffffffffffd48 0x1b30002 0x2d9 oops 1 49 java/util/Locale +ciMethodData java/lang/ref/SoftReference get ()Ljava/lang/Object; 2 17606 orig 264 88 131 230 81 0 0 0 0 16 136 61 23 0 0 0 0 112 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 159 1 0 0 57 25 2 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 8 0 2 0 0 0 80 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 10 0x10002 0x4328 0x60007 0x7 0x40 0x4321 0x110007 0x40c3 0x20 0x261 oops 0 +ciMethodData java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 2 5415 orig 264 88 131 230 81 0 0 0 0 32 73 59 23 0 0 0 0 48 2 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 167 0 0 0 1 164 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 13 0 2 0 0 0 224 0 0 0 255 255 255 255 7 0 2 0 0 0 0 0 data 28 0x20007 0x1006 0x38 0x47a 0x60003 0x47a 0xc0 0xa0007 0x3d4 0xa8 0xc31 0x170007 0x7f3 0x88 0x43f 0x240005 0x1e 0x19bbf540 0x421 0x0 0x0 0x270007 0x3f6 0x38 0x4a 0x2b0003 0x4a 0x18 oops 1 17 java/lang/String +ciMethodData sun/misc/PerfCounter addElapsedTimeFrom (J)V 2 4831 orig 264 88 131 230 81 0 0 0 0 160 119 92 23 0 0 0 0 152 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 249 142 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 5 0 2 0 0 0 64 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 8 0x10002 0x11df 0x60005 0x0 0x1b9d2900 0x11df 0x0 0x0 oops 1 4 sun/misc/PerfCounter +ciMethodData sun/misc/PerfCounter add (J)V 2 9161 orig 264 88 131 230 81 0 0 0 0 216 117 92 23 0 0 0 0 184 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 1 0 0 81 14 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 96 0 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 12 0x10005 0x0 0x1b9d2900 0x21ca 0x0 0x0 0xd0005 0x0 0x1ab33370 0x21ca 0x0 0x0 oops 2 2 sun/misc/PerfCounter 8 java/nio/DirectLongBufferU +ciMethodData sun/misc/PerfCounter get ()J 2 9161 orig 264 88 131 230 81 0 0 0 0 152 116 92 23 0 0 0 0 120 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 1 0 0 81 14 1 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 48 0 0 0 255 255 255 255 5 0 5 0 0 0 0 0 data 6 0x50005 0x0 0x1ab33370 0x21ca 0x0 0x0 oops 1 2 java/nio/DirectLongBufferU +ciMethodData java/lang/ClassLoader checkName (Ljava/lang/String;)Z 2 5544 orig 264 88 131 230 81 0 0 0 0 128 83 60 23 0 0 0 0 144 2 0 0 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 65 161 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 20 0 2 0 0 0 64 1 0 0 255 255 255 255 7 0 1 0 0 0 0 0 data 40 0x10007 0x0 0x70 0x1428 0x50005 0x0 0x19bbf540 0x1428 0x0 0x0 0x80007 0x1428 0x20 0x0 0x100005 0x0 0x19bbf540 0x1428 0x0 0x0 0x140007 0x0 0xa0 0x1429 0x170002 0x1429 0x1a0007 0x0 0x70 0x1429 0x1f0005 0x0 0x19bbf540 0x1429 0x0 0x0 0x240007 0x1429 0x20 0x0 oops 3 6 java/lang/String 16 java/lang/String 32 java/lang/String +ciMethodData java/lang/String concat (Ljava/lang/String;)Ljava/lang/String; 2 5393 orig 264 88 131 230 81 0 0 0 0 208 93 59 23 0 0 0 0 240 1 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 137 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 10 0 2 0 0 0 160 0 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 20 0x10005 0x1 0x19bbf540 0x1410 0x0 0x0 0x60007 0x1411 0x20 0x0 0x180002 0x1411 0x210005 0x1 0x19bbf540 0x1411 0x0 0x0 0x2b0002 0x1411 oops 2 2 java/lang/String 14 java/lang/String +ciMethodData java/lang/String getChars ([CI)V 2 5401 orig 264 88 131 230 81 0 0 0 0 232 64 59 23 0 0 0 0 104 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 201 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 12 0 0 0 0 0 data 2 0xc0002 0x1419 oops 0 +ciMethodData java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 2 4737 orig 264 88 131 230 81 0 0 0 0 16 231 95 23 0 0 0 0 176 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 1 140 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 96 0 0 0 255 255 255 255 5 0 2 0 0 0 0 0 data 12 0x20005 0x0 0x1b976f80 0x1180 0x0 0x0 0x50104 0x0 0x19bbf540 0x3ee 0x0 0x0 oops 2 2 java/util/jar/Attributes 8 java/lang/String +ciMethodData java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 2 4737 orig 264 88 131 230 81 0 0 0 0 216 229 95 23 0 0 0 0 128 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 1 140 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 48 0 0 0 255 255 255 255 5 0 5 0 0 0 0 0 data 6 0x50005 0x0 0x1b977280 0x1180 0x0 0x0 oops 1 2 java/util/HashMap +ciMethodData sun/misc/URLClassPath getResource (Ljava/lang/String;Z)Lsun/misc/Resource; 2 43367 orig 264 88 131 230 81 0 0 0 0 104 188 89 23 0 0 0 0 32 3 0 0 32 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33 20 0 0 65 31 0 0 49 170 4 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 9 0 2 0 0 0 200 1 0 0 255 255 255 255 7 0 3 0 0 0 0 0 data 57 0x30007 0x3e8 0x120 0x0 0xd0002 0x0 0x120005 0x0 0x0 0x0 0x0 0x0 0x160005 0x0 0x0 0x0 0x0 0x0 0x1b0005 0x0 0x0 0x0 0x0 0x0 0x1e0005 0x0 0x0 0x0 0x0 0x0 0x210005 0x0 0x0 0x0 0x0 0x0 0x260002 0x3e8 0x330002 0x9927 0x380007 0x206 0x88 0x9747 0x3e0005 0x0 0x1b9d9500 0x9559 0x1a8014e0 0x1f0 0x450007 0x953e 0x20 0x1e1 0x4e0003 0x9541 0xffffffffffffff80 oops 2 46 sun/misc/URLClassPath$JarLoader 48 sun/misc/URLClassPath$FileLoader +ciMethodData sun/misc/URLClassPath getLookupCache (Ljava/lang/String;)[I 2 1997 orig 264 88 131 230 81 0 0 0 0 136 195 89 23 0 0 0 0 144 3 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 159 0 0 0 113 57 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 16 0 2 0 0 0 64 2 0 0 255 255 255 255 7 0 4 0 0 0 0 0 data 72 0x40007 0x72e 0x40 0x0 0xa0007 0x0 0x20 0x0 0x140002 0x0 0x190007 0x0 0x1f0 0x0 0x1e0007 0x0 0x1d0 0x0 0x2a0002 0x0 0x2d0007 0x0 0x1a0 0x0 0x330007 0x0 0x180 0x0 0x3d0002 0x0 0x420005 0x0 0x0 0x0 0x0 0x0 0x490005 0x0 0x0 0x0 0x0 0x0 0x4c0005 0x0 0x0 0x0 0x0 0x0 0x510005 0x0 0x0 0x0 0x0 0x0 0x550005 0x0 0x0 0x0 0x0 0x0 0x580005 0x0 0x0 0x0 0x0 0x0 0x5b0005 0x0 0x0 0x0 0x0 0x0 oops 0 +ciMethodData java/util/zip/ZipFile getInputStream (Ljava/util/zip/ZipEntry;)Ljava/io/InputStream; 2 3014 orig 264 88 131 230 81 0 0 0 0 72 49 91 23 0 0 0 0 40 4 0 0 176 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 49 86 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 38 0 2 0 0 0 216 2 0 0 255 255 255 255 7 0 1 0 0 0 0 0 data 91 0x10007 0xac6 0x30 0x0 0xa0002 0x0 0x190002 0xac6 0x200005 0x1 0x1b4ea1c0 0xac5 0x0 0x0 0x230007 0xac6 0x98 0x0 0x2e0007 0x0 0x78 0x0 0x3d0005 0x0 0x0 0x0 0x0 0x0 0x410002 0x0 0x450003 0x0 0x58 0x540005 0x1 0x1b4ea1c0 0xac5 0x0 0x0 0x580002 0xac5 0x5f0007 0xac6 0x20 0x0 0x6d0002 0xac6 0x730002 0xac5 0x760008 0x6 0x0 0x140 0x0 0x40 0x1 0x88 0x9f0005 0x0 0x1a921c90 0x5 0x0 0x0 0xa80003 0x5 0x18 0xba0002 0xac0 0xc90007 0xaba 0x20 0x6 0xd50007 0xac0 0x20 0x0 0xde0002 0xac1 0xef0002 0xac1 0x1040005 0x0 0x1a921c90 0xac1 0x0 0x0 0x10d0003 0xac1 0x18 0x1240002 0x0 oops 4 10 java/util/zip/ZipCoder 35 java/util/zip/ZipCoder 59 java/util/WeakHashMap 82 java/util/WeakHashMap +ciMethodData java/util/jar/Attributes$Name hashCode ()I 2 5647 orig 264 88 131 230 81 0 0 0 0 152 26 96 23 0 0 0 0 120 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 121 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 48 0 0 0 255 255 255 255 7 0 5 0 0 0 0 0 data 6 0x50007 0x10e7 0x30 0x328 0xd0002 0x328 oops 0 +ciMethodData sun/misc/ASCIICaseInsensitiveComparator lowerCaseHashCode (Ljava/lang/String;)I 2 16476 orig 264 88 131 230 81 0 0 0 0 112 33 78 23 0 0 0 0 240 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 14 0 0 65 25 0 0 121 144 1 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 20 0 2 0 0 0 168 0 0 0 255 255 255 255 5 0 3 0 0 0 0 0 data 21 0x30005 0x4b 0x19bbf540 0x2dd 0x0 0x0 0xb0007 0x328 0x78 0x320f 0x140005 0x495 0x19bbf540 0x2d7a 0x0 0x0 0x170002 0x320f 0x1f0003 0x320f 0xffffffffffffffa0 oops 2 2 java/lang/String 12 java/lang/String +ciMethodData sun/misc/SharedSecrets javaUtilJarAccess ()Lsun/misc/JavaUtilJarAccess; 2 5033 orig 264 88 131 230 81 0 0 0 0 64 57 73 23 0 0 0 0 144 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 144 1 0 0 201 144 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 80 0 0 0 255 255 255 255 7 0 3 0 0 0 0 0 data 10 0x30007 0x121a 0x50 0x0 0xb0005 0x0 0x0 0x0 0x0 0x0 oops 0 +ciMethodData java/util/jar/JarFile maybeInstantiateVerifier ()V 2 5545 orig 264 88 131 230 81 0 0 0 0 184 158 91 23 0 0 0 0 144 3 0 0 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 73 161 0 0 97 14 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 23 0 2 0 0 0 72 2 0 0 255 255 255 255 7 0 4 0 0 0 0 0 data 73 0x40007 0x1429 0x20 0x0 0xc0007 0x13f5 0x228 0x34 0x100002 0x34 0x150007 0x0 0x1f8 0x34 0x1d0007 0x34 0x1d8 0x1cc 0x260005 0x72 0x19bbf540 0x15a 0x0 0x0 0x2d0005 0x72 0x19bbf540 0x15a 0x0 0x0 0x300007 0x0 0x110 0x1cc 0x360005 0x72 0x19bbf540 0x15a 0x0 0x0 0x390007 0x0 0xc0 0x1cc 0x3f0005 0x72 0x19bbf540 0x15a 0x0 0x0 0x420007 0x0 0x70 0x1cc 0x480005 0x72 0x19bbf540 0x15a 0x0 0x0 0x4b0007 0x1cc 0x50 0x0 0x4f0005 0x0 0x0 0x0 0x0 0x0 0x570003 0x1cc 0xfffffffffffffe40 oops 5 20 java/lang/String 26 java/lang/String 36 java/lang/String 46 java/lang/String 56 java/lang/String +ciMethodData java/util/jar/JarFile getManifest ()Ljava/util/jar/Manifest; 2 2449 orig 264 88 131 230 81 0 0 0 0 112 153 91 23 0 0 0 0 48 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 0 0 0 81 72 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 2 0x10002 0x90a oops 0 +ciMethodData java/util/jar/JarFile getManifestFromReference ()Ljava/util/jar/Manifest; 2 2449 orig 264 88 131 230 81 0 0 0 0 136 154 91 23 0 0 0 0 248 2 0 0 144 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 0 0 0 81 72 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 28 0 2 0 0 0 176 1 0 0 255 255 255 255 7 0 4 0 0 0 0 0 data 54 0x40007 0x2f 0x98 0x8db 0xb0005 0x0 0x19bc0400 0x8dd 0x0 0x0 0xe0004 0x0 0x2d91b90 0x8de 0x0 0x0 0x110003 0x8de 0x18 0x170007 0x8de 0x118 0x2f 0x1b0002 0x2f 0x200007 0x0 0xe8 0x2f 0x270007 0x2f 0x98 0x0 0x2c0002 0x0 0x340007 0x0 0x30 0x0 0x3d0002 0x0 0x500002 0x0 0x530002 0x0 0x570003 0x0 0x38 0x600002 0x2f 0x630002 0x2f 0x6d0002 0x2f oops 2 6 java/lang/ref/SoftReference 12 java/util/jar/Manifest +ciMethodData sun/misc/Resource cachedInputStream ()Ljava/io/InputStream; 2 5134 orig 264 88 131 230 81 0 0 0 0 216 145 96 23 0 0 0 0 152 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 113 152 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 80 0 0 0 255 255 255 255 7 0 4 0 0 0 0 0 data 10 0x40007 0x987 0x50 0x987 0x90005 0x0 0x1b9d39e0 0x92f 0x1b9d3a90 0x58 oops 2 6 sun/misc/URLClassPath$JarLoader$2 8 sun/misc/URLClassPath$FileLoader$1 +ciMethodData sun/misc/URLClassPath ensureLoaderOpened (I)Z 1 0 orig 264 88 131 230 81 0 0 0 0 112 196 89 23 0 0 0 0 112 3 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 32 2 0 0 255 255 255 255 5 0 4 0 0 0 0 0 data 68 0x40005 0x0 0x0 0x0 0x0 0x0 0x80007 0x0 0x1f0 0x0 0xd0002 0x0 0x100007 0x0 0x20 0x0 0x180007 0x0 0x20 0x0 0x200007 0x0 0x180 0x0 0x2a0002 0x0 0x2f0005 0x0 0x0 0x0 0x0 0x0 0x360005 0x0 0x0 0x0 0x0 0x0 0x390005 0x0 0x0 0x0 0x0 0x0 0x3e0005 0x0 0x0 0x0 0x0 0x0 0x420005 0x0 0x0 0x0 0x0 0x0 0x450005 0x0 0x0 0x0 0x0 0x0 0x480005 0x0 0x0 0x0 0x0 0x0 oops 0 +ciMethodData java/lang/ref/Reference (Ljava/lang/Object;)V 2 5198 orig 264 88 131 230 81 0 0 0 0 136 130 61 23 0 0 0 0 56 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 0 0 57 154 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 3 0 0 0 0 0 data 2 0x30002 0x1347 oops 0 +ciMethodData java/net/URLClassLoader$1 run ()Ljava/lang/Object; 2 5504 orig 264 88 131 230 81 0 0 0 0 104 174 90 23 0 0 0 0 120 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 1 160 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 6 0x10005 0x0 0x1b706110 0x13ff 0x0 0x0 oops 1 2 java/net/URLClassLoader$1 +ciMethodData java/net/URLClassLoader$1 run ()Ljava/lang/Class; 2 5503 orig 264 88 131 230 81 0 0 0 0 208 173 90 23 0 0 0 0 40 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 249 159 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 0 2 0 0 0 224 0 0 0 255 255 255 255 5 0 8 0 0 0 0 0 data 28 0x80005 0x0 0x19bbf540 0x13ff 0x0 0x0 0xd0005 0x0 0x19bbf540 0x1400 0x0 0x0 0x150002 0x1401 0x1a0005 0x0 0x1b709a80 0x1401 0x0 0x0 0x1f0007 0xadb 0x40 0x925 0x2b0002 0x926 0x390002 0x0 oops 3 2 java/lang/String 8 java/lang/String 16 sun/misc/URLClassPath +ciMethodData java/net/URLClassLoader access$100 (Ljava/net/URLClassLoader;Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class; 2 2530 orig 264 88 131 230 81 0 0 0 0 96 158 67 23 0 0 0 0 64 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 188 0 0 0 49 73 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 255 255 255 255 2 0 3 0 0 0 0 0 data 2 0x30002 0x926 oops 0 +ciMethodData java/net/URLClassLoader defineClass (Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class; 2 2531 orig 264 88 131 230 81 0 0 0 0 0 150 67 23 0 0 0 0 56 4 0 0 208 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 188 0 0 0 57 73 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 20 0 2 0 0 0 224 2 0 0 255 255 255 255 2 0 0 0 0 0 0 0 data 92 0x2 0x927 0x70005 0x85 0x19bbf540 0x8a3 0x0 0x0 0xd0005 0x0 0x1b9d39e0 0x8d0 0x1b9d3a90 0x58 0x150007 0x0 0x90 0x928 0x1c0005 0x85 0x19bbf540 0x8a3 0x0 0x0 0x220005 0x0 0x1b9d39e0 0x8d0 0x1b9d3a90 0x58 0x2e0002 0x928 0x320005 0x0 0x1b9d39e0 0x8d0 0x1b9d3a90 0x58 0x390007 0x927 0xd0 0x0 0x3d0005 0x0 0x0 0x0 0x0 0x0 0x4a0002 0x0 0x4f0002 0x0 0x530005 0x0 0x0 0x0 0x0 0x0 0x5c0005 0x0 0x0 0x0 0x0 0x0 0x610005 0x0 0x1b9d39e0 0x8ce 0x1b9d3a90 0x58 0x670005 0x0 0x1b9d39e0 0x8cf 0x1b9d3a90 0x58 0x740002 0x927 0x790002 0x927 0x7d0005 0x0 0x1b9d2900 0x927 0x0 0x0 0x8a0005 0x85 0x2d91cb0 0x8a2 0x0 0x0 oops 14 4 java/lang/String 10 sun/misc/URLClassPath$JarLoader$2 12 sun/misc/URLClassPath$FileLoader$1 20 java/lang/String 26 sun/misc/URLClassPath$JarLoader$2 28 sun/misc/URLClassPath$FileLoader$1 34 sun/misc/URLClassPath$JarLoader$2 36 sun/misc/URLClassPath$FileLoader$1 66 sun/misc/URLClassPath$JarLoader$2 68 sun/misc/URLClassPath$FileLoader$1 72 sun/misc/URLClassPath$JarLoader$2 74 sun/misc/URLClassPath$FileLoader$1 82 sun/misc/PerfCounter 88 sun/misc/Launcher$AppClassLoader +ciMethodData java/lang/ClassLoader getPackage (Ljava/lang/String;)Ljava/lang/Package; 2 3750 orig 264 88 131 230 81 0 0 0 0 32 107 60 23 0 0 0 0 96 3 0 0 224 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 49 105 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 23 0 2 0 0 0 16 2 0 0 255 255 255 255 5 0 12 0 0 0 0 0 data 66 0xc0005 0x0 0x1b977280 0xd29 0x0 0x0 0xf0104 0x0 0x1baf0d30 0x7a3 0x0 0x0 0x150003 0xd29 0x18 0x200007 0x7a3 0x198 0x586 0x270007 0x2c3 0x68 0x2c3 0x2f0005 0x0 0x2d91d40 0x2c3 0x0 0x0 0x330003 0x2c3 0x28 0x370002 0x2c3 0x3c0007 0x584 0x100 0x2 0x4b0005 0x0 0x1b977280 0x2 0x0 0x0 0x4e0104 0x0 0x0 0x0 0x0 0x0 0x550007 0x0 0x68 0x2 0x5e0005 0x0 0x1b977280 0x2 0x0 0x0 0x620003 0x2 0x18 0x6a0003 0x2 0x18 oops 5 2 java/util/HashMap 8 java/lang/Package 25 sun/misc/Launcher$ExtClassLoader 40 java/util/HashMap 56 java/util/HashMap +ciMethodData java/lang/Package getSystemPackage (Ljava/lang/String;)Ljava/lang/Package; 1 815 orig 264 88 131 230 81 0 0 0 0 240 190 96 23 0 0 0 0 104 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 108 0 0 0 25 22 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 12 0 2 0 0 0 32 1 0 0 255 255 255 255 5 0 10 0 0 0 0 0 data 36 0xa0005 0x0 0x1b977280 0x2c3 0x0 0x0 0xf0104 0x0 0x0 0x0 0x0 0x0 0x140007 0x0 0xc0 0x2c3 0x1c0005 0x81 0x19bbf540 0x242 0x0 0x0 0x210005 0x81 0x19bbf540 0x242 0x0 0x0 0x260002 0x2c3 0x2b0007 0x2c2 0x30 0x1 0x300002 0x1 oops 3 2 java/util/HashMap 18 java/lang/String 24 java/lang/String +ciMethodData java/net/URLClassLoader definePackageInternal (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)V 2 2530 orig 264 88 131 230 81 0 0 0 0 200 148 67 23 0 0 0 0 32 3 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 17 71 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 12 0 2 0 0 0 192 1 0 0 255 255 255 255 2 0 4 0 0 0 0 0 data 56 0x40002 0x8e2 0x70007 0x78a 0x1b0 0x15b 0xb0007 0x1b 0x68 0x140 0x120005 0x0 0x2d91cb0 0x140 0x0 0x0 0x160003 0x140 0x48 0x220005 0x0 0x2d91cb0 0x1b 0x0 0x0 0x260003 0x15b 0xf8 0x2f0002 0x0 0x320007 0x0 0xd0 0x0 0x3d0002 0x0 0x420005 0x0 0x0 0x0 0x0 0x0 0x460005 0x0 0x0 0x0 0x0 0x0 0x490005 0x0 0x0 0x0 0x0 0x0 0x4c0002 0x0 oops 2 12 sun/misc/Launcher$AppClassLoader 21 sun/misc/Launcher$AppClassLoader +ciMethodData java/net/URLClassLoader getAndVerifyPackage (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package; 2 2531 orig 264 88 131 230 81 0 0 0 0 208 147 67 23 0 0 0 0 96 4 0 0 192 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 25 71 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 22 0 2 0 0 0 0 3 0 0 255 255 255 255 5 0 2 0 0 0 0 0 data 96 0x20005 0x0 0x2d91cb0 0x8e3 0x0 0x0 0x90007 0x15b 0x2d0 0x78a 0xe0005 0x0 0x1baf0d30 0x78a 0x0 0x0 0x110007 0x78a 0x150 0x0 0x170005 0x0 0x0 0x0 0x0 0x0 0x1a0007 0x0 0x230 0x0 0x250002 0x0 0x2a0005 0x0 0x0 0x0 0x0 0x0 0x2e0005 0x0 0x0 0x0 0x0 0x0 0x330005 0x0 0x0 0x0 0x0 0x0 0x360005 0x0 0x0 0x0 0x0 0x0 0x390002 0x0 0x3e0007 0x3d 0x130 0x74d 0x440002 0x74d 0x470007 0x74d 0x100 0x0 0x520002 0x0 0x570005 0x0 0x0 0x0 0x0 0x0 0x5b0005 0x0 0x0 0x0 0x0 0x0 0x600005 0x0 0x0 0x0 0x0 0x0 0x630005 0x0 0x0 0x0 0x0 0x0 0x660002 0x0 oops 2 2 sun/misc/Launcher$AppClassLoader 12 java/lang/Package +ciMethodData java/net/URLClassLoader definePackage (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package; 1 379 orig 264 88 131 230 81 0 0 0 0 200 151 67 23 0 0 0 0 112 6 0 0 192 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 0 0 0 1 10 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 36 0 2 0 0 0 16 5 0 0 255 255 255 255 2 0 24 0 0 0 0 0 data 162 0x180002 0x140 0x210005 0x102 0x19bbf540 0x3e 0x0 0x0 0x260005 0x102 0x19bbf540 0x3e 0x0 0x0 0x290005 0x0 0x1b7130c0 0x140 0x0 0x0 0x320007 0x13f 0x170 0x1 0x3a0005 0x0 0x1b976f80 0x1 0x0 0x0 0x440005 0x0 0x1b976f80 0x1 0x0 0x0 0x4e0005 0x0 0x1b976f80 0x1 0x0 0x0 0x580005 0x0 0x1b976f80 0x1 0x0 0x0 0x620005 0x0 0x1b976f80 0x1 0x0 0x0 0x6c0005 0x0 0x1b976f80 0x1 0x0 0x0 0x760005 0x0 0x1b976f80 0x1 0x0 0x0 0x7c0005 0x0 0x2d91b90 0x140 0x0 0x0 0x830007 0x0 0x250 0x140 0x880007 0x1 0x50 0x13f 0x900005 0x0 0x1b976f80 0x13f 0x0 0x0 0x970007 0x1 0x50 0x13f 0x9f0005 0x0 0x1b976f80 0x13f 0x0 0x0 0xa60007 0x1 0x50 0x13f 0xae0005 0x0 0x1b976f80 0x13f 0x0 0x0 0xb50007 0x1 0x50 0x13f 0xbd0005 0x0 0x1b976f80 0x13f 0x0 0x0 0xc40007 0x1 0x50 0x13f 0xcc0005 0x0 0x1b976f80 0x13f 0x0 0x0 0xd30007 0x1 0x50 0x13f 0xdb0005 0x0 0x1b976f80 0x13f 0x0 0x0 0xe20007 0x0 0x50 0x140 0xea0005 0x0 0x1b976f80 0x140 0x0 0x0 0xf30005 0x102 0x19bbf540 0x3e 0x0 0x0 0xf60007 0x140 0x20 0x0 0x10c0005 0x0 0x2d91cb0 0x140 0x0 0x0 oops 20 4 java/lang/String 10 java/lang/String 16 java/util/jar/JavaUtilJarAccessImpl 26 java/util/jar/Attributes 32 java/util/jar/Attributes 38 java/util/jar/Attributes 44 java/util/jar/Attributes 50 java/util/jar/Attributes 56 java/util/jar/Attributes 62 java/util/jar/Attributes 68 java/util/jar/Manifest 82 java/util/jar/Attributes 92 java/util/jar/Attributes 102 java/util/jar/Attributes 112 java/util/jar/Attributes 122 java/util/jar/Attributes 132 java/util/jar/Attributes 142 java/util/jar/Attributes 148 java/lang/String 158 sun/misc/Launcher$AppClassLoader +ciMethodData java/lang/ClassLoader definePackage (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package; 1 418 orig 264 88 131 230 81 0 0 0 0 232 105 60 23 0 0 0 0 40 2 0 0 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 0 0 0 49 11 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 9 0 2 0 0 0 160 0 0 0 255 255 255 255 5 0 10 0 0 0 0 0 data 20 0xa0005 0x0 0x2d91cb0 0x166 0x0 0x0 0x110007 0x166 0x30 0x0 0x190002 0x0 0x2f0002 0x166 0x3b0005 0x0 0x1b977280 0x166 0x0 0x0 oops 2 2 sun/misc/Launcher$AppClassLoader 16 java/util/HashMap +ciMethodData java/lang/Package isSealed ()Z 2 2127 orig 264 88 131 230 81 0 0 0 0 240 175 96 23 0 0 0 0 88 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 196 0 0 0 89 60 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 56 0 0 0 255 255 255 255 7 0 4 0 0 0 0 0 data 7 0x40007 0x78b 0x38 0x0 0x80003 0x0 0x18 oops 0 +ciMethodData java/lang/Package isSealed (Ljava/net/URL;)Z 1 0 orig 264 88 131 230 81 0 0 0 0 136 176 96 23 0 0 0 0 128 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 48 0 0 0 255 255 255 255 5 0 5 0 0 0 0 0 data 6 0x50005 0x0 0x0 0x0 0x0 0x0 oops 0 +ciMethodData java/net/URL equals (Ljava/lang/Object;)Z 2 2508 orig 264 88 131 230 81 0 0 0 0 24 200 67 23 0 0 0 0 0 2 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 242 0 0 0 209 70 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 176 0 0 0 255 255 255 255 4 0 1 0 0 0 0 0 data 22 0x10004 0x0 0x2d91b00 0x8da 0x0 0x0 0x40007 0x8da 0x20 0x0 0xa0004 0x0 0x2d91b00 0x11 0x0 0x0 0x140005 0x0 0x1a91fce0 0x8da 0x0 0x0 oops 3 2 java/net/URL 12 java/net/URL 18 sun/net/www/protocol/file/Handler +ciMethodData java/net/URLStreamHandler equals (Ljava/net/URL;Ljava/net/URL;)Z 2 2508 orig 264 88 131 230 81 0 0 0 0 152 76 89 23 0 0 0 0 176 2 0 0 208 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 242 0 0 0 209 70 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 14 0 2 0 0 0 88 1 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 43 0x10005 0x101 0x2d91b00 0x7d9 0x0 0x0 0x60005 0x101 0x2d91b00 0x7d9 0x0 0x0 0xe0007 0x8da 0x90 0x0 0x120007 0x0 0xd8 0x0 0x180005 0x0 0x0 0x0 0x0 0x0 0x1b0007 0x0 0x88 0x0 0x210005 0x0 0x1a91fce0 0x8da 0x0 0x0 0x240007 0x0 0x38 0x8da 0x280003 0x8da 0x18 oops 3 2 java/net/URL 8 java/net/URL 32 sun/net/www/protocol/file/Handler +ciMethodData java/net/URLClassLoader isSealed (Ljava/lang/String;Ljava/util/jar/Manifest;)Z 2 2066 orig 264 88 131 230 81 0 0 0 0 168 152 67 23 0 0 0 0 24 3 0 0 96 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 196 0 0 0 113 58 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 15 0 2 0 0 0 192 1 0 0 255 255 255 255 2 0 0 0 0 0 0 0 data 56 0x2 0x74e 0x90005 0x81 0x19bbf540 0x6cd 0x0 0x0 0xe0005 0x81 0x19bbf540 0x6cd 0x0 0x0 0x110005 0x0 0x1b7130c0 0x74e 0x0 0x0 0x1b0007 0x74b 0x50 0x2 0x220005 0x0 0x1b976f80 0x2 0x0 0x0 0x290007 0x0 0xa0 0x74d 0x2d0005 0x0 0x2d91b90 0x74d 0x0 0x0 0x320007 0x0 0x50 0x74d 0x390005 0x0 0x1b976f80 0x74d 0x0 0x0 0x420005 0x81 0x19bbf540 0x6cd 0x0 0x0 oops 7 4 java/lang/String 10 java/lang/String 16 java/util/jar/JavaUtilJarAccessImpl 26 java/util/jar/Attributes 36 java/util/jar/Manifest 46 java/util/jar/Attributes 52 java/lang/String +ciMethodData java/security/CodeSource (Ljava/net/URL;[Ljava/security/CodeSigner;)V 2 2568 orig 264 88 131 230 81 0 0 0 0 184 49 68 23 0 0 0 0 232 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 65 72 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 6 0 2 0 0 0 144 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 18 0x10002 0x908 0x190007 0x908 0x80 0x0 0x1e0005 0x0 0x0 0x0 0x0 0x0 0x210004 0x0 0x0 0x0 0x0 0x0 oops 0 +ciMethodData sun/misc/Resource getByteBuffer ()Ljava/nio/ByteBuffer; 2 2567 orig 264 88 131 230 81 0 0 0 0 136 148 96 23 0 0 0 0 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 1 0 0 89 70 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 192 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 24 0x10002 0x8cb 0x60004 0xfffffffffffff737 0x1b9741b0 0x5 0x0 0x0 0x90007 0x8ca 0x80 0x0 0xd0004 0x0 0x0 0x0 0x0 0x0 0x100005 0x0 0x0 0x0 0x0 0x0 oops 1 4 java/util/zip/ZipFile$ZipFileInflaterInputStream +ciMethodData sun/misc/PerfCounter getReadClassBytesTime ()Lsun/misc/PerfCounter; 2 2543 orig 264 88 131 230 81 0 0 0 0 24 122 92 23 0 0 0 0 24 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 1 0 0 161 69 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 data 0 oops 0 +ciMethodData java/security/SecureClassLoader getProtectionDomain (Ljava/security/CodeSource;)Ljava/security/ProtectionDomain; 2 2567 orig 264 88 131 230 81 0 0 0 0 144 88 61 23 0 0 0 0 152 3 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 1 0 0 89 70 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 13 0 2 0 0 0 72 2 0 0 255 255 255 255 7 0 1 0 0 0 0 0 data 73 0x10007 0x8cb 0x20 0x0 0x140005 0x0 0x1b977280 0x8cb 0x0 0x0 0x170104 0x0 0x19bbfc00 0x8a0 0x0 0x0 0x1c0007 0x8a0 0x1b0 0x2b 0x210005 0x0 0x2d91cb0 0x2b 0x0 0x0 0x2f0002 0x2b 0x390005 0x0 0x1b977280 0x2b 0x0 0x0 0x400007 0x2b 0x120 0x0 0x4a0002 0x0 0x4f0005 0x0 0x0 0x0 0x0 0x0 0x530005 0x0 0x0 0x0 0x0 0x0 0x560005 0x0 0x0 0x0 0x0 0x0 0x590005 0x0 0x0 0x0 0x0 0x0 0x610005 0x0 0x0 0x0 0x0 0x0 0x660003 0x8cb 0x18 oops 4 6 java/util/HashMap 12 java/security/ProtectionDomain 22 sun/misc/Launcher$AppClassLoader 30 java/util/HashMap +ciMethodData sun/misc/Resource getBytes ()[B 2 6238 orig 264 88 131 230 81 0 0 0 0 216 147 96 23 0 0 0 0 48 5 0 0 112 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 2 0 0 73 70 0 0 9 173 0 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 64 0 2 0 0 0 232 3 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 125 0x10002 0x8c9 0x50002 0x8ca 0xa0005 0x0 0x1b9d39e0 0x871 0x1b9d3a90 0x58 0xf0003 0x8c8 0x40 0x140002 0x0 0x1a0003 0x0 0xffffffffffffffa8 0x240007 0x8c8 0x20 0x0 0x320007 0x8cb 0x1a0 0x159e 0x390007 0x52 0x78 0x154c 0x470002 0x154d 0x530007 0x0 0x48 0x154d 0x5c0002 0x154d 0x600003 0x154d 0x18 0x730005 0x0 0x1b9741b0 0x14ba 0x1d6eb8c0 0xe4 0x780003 0x15a1 0x28 0x7d0002 0x0 0x850007 0x15a1 0x98 0x0 0x8c0007 0x0 0x30 0x0 0x950002 0x0 0x9d0007 0x0 0x60 0x0 0xa30002 0x0 0xa70003 0x0 0x30 0xb10003 0x15a1 0xfffffffffffffe78 0xb50005 0x0 0x1b9741b0 0x873 0x1d6eb8c0 0x58 0xb80003 0x8cb 0x30 0xbf0003 0x0 0x18 0xc50007 0x8cb 0x138 0x0 0xc80002 0x0 0xcb0005 0x0 0x0 0x0 0x0 0x0 0xce0003 0x0 0xd8 0xd40005 0x0 0x0 0x0 0x0 0x0 0xd70003 0x0 0x30 0xde0003 0x0 0x18 0xe40007 0x0 0x60 0x0 0xe70002 0x0 0xea0005 0x0 0x0 0x0 0x0 0x0 oops 6 6 sun/misc/URLClassPath$JarLoader$2 8 sun/misc/URLClassPath$FileLoader$1 43 java/util/zip/ZipFile$ZipFileInflaterInputStream 45 java/io/FileInputStream 76 java/util/zip/ZipFile$ZipFileInflaterInputStream 78 java/io/FileInputStream +ciMethodData java/security/SecureClassLoader defineClass (Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class; 2 2567 orig 264 88 131 230 81 0 0 0 0 48 86 61 23 0 0 0 0 176 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 1 0 0 89 70 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 64 0 0 0 255 255 255 255 2 0 9 0 0 0 0 0 data 8 0x90002 0x8cb 0xc0005 0x5 0x2d91cb0 0x8c6 0x0 0x0 oops 1 4 sun/misc/Launcher$AppClassLoader +ciMethodData java/lang/ClassLoader defineClass (Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class; 2 2567 orig 264 88 131 230 81 0 0 0 0 208 79 60 23 0 0 0 0 136 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 1 0 0 89 70 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 15 0 2 0 0 0 64 0 0 0 255 255 255 255 2 0 4 0 0 0 0 0 data 8 0x40002 0x8cb 0xc0002 0x8cb 0x1b0002 0x8cb 0x250002 0x8cb oops 0 +ciMethodData java/util/jar/JarFile getManEntry ()Ljava/util/jar/JarEntry; 1 215 orig 264 88 131 230 81 0 0 0 0 136 163 91 23 0 0 0 0 232 2 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 172 0 0 0 89 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 160 1 0 0 255 255 255 255 7 0 4 0 0 0 0 0 data 52 0x40007 0x2a 0x1a0 0x1 0xb0005 0x0 0x1b7122f0 0x1 0x0 0x0 0x150007 0x1 0x150 0x0 0x190002 0x0 0x1e0007 0x0 0x120 0x0 0x260007 0x0 0x100 0x0 0x310005 0x0 0x0 0x0 0x0 0x0 0x340005 0x0 0x0 0x0 0x0 0x0 0x370007 0x0 0x68 0x0 0x3f0005 0x0 0x0 0x0 0x0 0x0 0x450003 0x0 0x30 0x4b0003 0x0 0xffffffffffffff18 oops 1 6 java/util/jar/JarFile +ciMethodData java/util/jar/Manifest (Ljava/util/jar/JarVerifier;Ljava/io/InputStream;)V 1 69 orig 264 88 131 230 81 0 0 0 0 32 231 67 23 0 0 0 0 184 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 0 0 0 89 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 96 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 12 0x10002 0x2b 0x90002 0x2b 0x140002 0x2b 0x1c0005 0x0 0x2d91b90 0x2b 0x0 0x0 oops 1 8 java/util/jar/Manifest +ciMethodData java/util/jar/Manifest (Ljava/io/InputStream;)V 1 60 orig 264 88 131 230 81 0 0 0 0 96 230 67 23 0 0 0 0 56 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 89 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 255 255 255 255 2 0 3 0 0 0 0 0 data 2 0x30002 0x2b oops 0 +ciMethodData java/lang/ref/SoftReference (Ljava/lang/Object;)V 2 1502 orig 264 88 131 230 81 0 0 0 0 192 134 61 23 0 0 0 0 56 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 126 1 0 0 1 35 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 2 0 0 0 0 0 data 2 0x20002 0x460 oops 0 +ciMethodData java/lang/ClassLoader preDefineClass (Ljava/lang/String;Ljava/security/ProtectionDomain;)Ljava/security/ProtectionDomain; 2 2567 orig 264 88 131 230 81 0 0 0 0 168 77 60 23 0 0 0 0 56 4 0 0 96 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 57 68 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 16 0 2 0 0 0 224 2 0 0 255 255 255 255 2 0 2 0 0 0 0 0 data 92 0x20002 0x887 0x50007 0x887 0xd0 0x0 0x100002 0x0 0x150005 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x1c0005 0x0 0x0 0x0 0x0 0x0 0x1f0002 0x0 0x240007 0x0 0x180 0x887 0x2a0005 0x0 0x19bbf540 0x887 0x0 0x0 0x2d0007 0x887 0x130 0x0 0x380002 0x0 0x3d0005 0x0 0x0 0x0 0x0 0x0 0x450005 0x0 0x0 0x0 0x0 0x0 0x480005 0x0 0x0 0x0 0x0 0x0 0x4b0005 0x0 0x0 0x0 0x0 0x0 0x4e0005 0x0 0x0 0x0 0x0 0x0 0x510002 0x0 0x560007 0x887 0x20 0x0 0x5f0007 0x0 0x60 0x887 0x650005 0x0 0x19bbfc00 0x887 0x0 0x0 0x680002 0x887 oops 2 34 java/lang/String 86 java/security/ProtectionDomain +ciMethodData java/lang/ClassLoader checkCerts (Ljava/lang/String;Ljava/security/CodeSource;)V 2 2567 orig 264 88 131 230 81 0 0 0 0 248 84 60 23 0 0 0 0 112 5 0 0 136 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 1 0 0 57 68 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 31 0 2 0 0 0 24 4 0 0 255 255 255 255 5 0 3 0 0 0 0 0 data 131 0x30005 0x3 0x19bbf540 0x884 0x0 0x0 0x90007 0x887 0x38 0x0 0xe0003 0x0 0x48 0x140005 0x3 0x19bbf540 0x884 0x0 0x0 0x1d0007 0x0 0x50 0x887 0x210005 0x3 0x2d91dd0 0x884 0x0 0x0 0x2d0007 0x887 0x138 0x0 0x3b0005 0x0 0x0 0x0 0x0 0x0 0x400004 0x0 0x0 0x0 0x0 0x0 0x470007 0x0 0x88 0x0 0x520007 0x0 0x38 0x0 0x580003 0x0 0x18 0x5d0005 0x0 0x0 0x0 0x0 0x0 0x660003 0x0 0x18 0x710003 0x0 0xe0 0x780004 0x0 0x1d5e3670 0x887 0x0 0x0 0x7f0007 0x0 0x38 0x887 0x850003 0x887 0x18 0x8a0005 0x0 0x1d5e3670 0x887 0x0 0x0 0x8d0104 0x0 0x1d5f1c40 0x732 0x0 0x0 0x940007 0x155 0x130 0x732 0x9c0002 0x732 0x9f0007 0x732 0x100 0x0 0xaa0002 0x0 0xaf0005 0x0 0x0 0x0 0x0 0x0 0xb30005 0x0 0x0 0x0 0x0 0x0 0xb80005 0x0 0x0 0x0 0x0 0x0 0xbb0005 0x0 0x0 0x0 0x0 0x0 0xbe0002 0x0 oops 6 2 java/lang/String 15 java/lang/String 25 java/security/CodeSource 70 java/util/concurrent/ConcurrentHashMap 83 java/util/concurrent/ConcurrentHashMap 89 [Ljava/security/cert/Certificate; +ciMethodData sun/misc/URLClassPath$JarLoader$2 getCodeSourceURL ()Ljava/net/URL; 2 2441 orig 264 88 131 230 81 0 0 0 0 80 134 96 23 0 0 0 0 88 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 1 0 0 41 64 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 4 0 0 0 0 0 data 2 0x40002 0x807 oops 0 +ciMethodData java/util/jar/JavaUtilJarAccessImpl getTrustedAttributes (Ljava/util/jar/Manifest;Ljava/lang/String;)Ljava/util/jar/Attributes; 2 2445 orig 264 88 131 230 81 0 0 0 0 152 205 91 23 0 0 0 0 136 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 144 1 0 0 233 63 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 2 0 0 0 0 0 data 6 0x20005 0x0 0x2d91b90 0x7fd 0x0 0x0 oops 1 2 java/util/jar/Manifest +ciMethodData java/util/jar/Manifest getTrustedAttributes (Ljava/lang/String;)Ljava/util/jar/Attributes; 2 2445 orig 264 88 131 230 81 0 0 0 0 152 234 67 23 0 0 0 0 192 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 144 1 0 0 233 63 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 10 0 2 0 0 0 112 1 0 0 255 255 255 255 5 0 2 0 0 0 0 0 data 46 0x20005 0x0 0x2d91b90 0x7fd 0x0 0x0 0x70007 0x7fa 0x140 0x3 0xe0007 0x3 0x120 0x0 0x160005 0x0 0x0 0x0 0x0 0x0 0x190007 0x0 0xd0 0x0 0x240002 0x0 0x290005 0x0 0x0 0x0 0x0 0x0 0x2d0005 0x0 0x0 0x0 0x0 0x0 0x300005 0x0 0x0 0x0 0x0 0x0 0x330002 0x0 oops 1 2 java/util/jar/Manifest +ciMethodData sun/misc/URLClassPath$JarLoader$2 getManifest ()Ljava/util/jar/Manifest; 2 2440 orig 264 88 131 230 81 0 0 0 0 56 136 96 23 0 0 0 0 216 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 65 60 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 7 0 2 0 0 0 144 0 0 0 255 255 255 255 2 0 0 0 0 0 0 0 data 18 0x2 0x789 0x70002 0x789 0xa0005 0x0 0x1b7130c0 0x789 0x0 0x0 0x130002 0x78a 0x160005 0x0 0x1b7122f0 0x78b 0x0 0x0 oops 2 6 java/util/jar/JavaUtilJarAccessImpl 14 java/util/jar/JarFile +ciMethodData java/util/jar/JavaUtilJarAccessImpl ensureInitialization (Ljava/util/jar/JarFile;)V 2 2441 orig 264 88 131 230 81 0 0 0 0 48 206 91 23 0 0 0 0 128 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 73 60 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 6 0x10005 0x0 0x1b7122f0 0x789 0x0 0x0 oops 1 2 java/util/jar/JarFile +ciMethodData java/util/jar/Manifest getAttributes (Ljava/lang/String;)Ljava/util/jar/Attributes; 2 2485 orig 264 88 131 230 81 0 0 0 0 200 233 67 23 0 0 0 0 224 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 169 61 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 144 0 0 0 255 255 255 255 5 0 1 0 0 0 0 0 data 18 0x10005 0x0 0x2d91b90 0x7b5 0x0 0x0 0x50005 0x0 0x1b977280 0x7b5 0x0 0x0 0xa0104 0x0 0x1b976f80 0x3 0x0 0x0 oops 3 2 java/util/jar/Manifest 8 java/util/HashMap 14 java/util/jar/Attributes +ciMethodData java/util/jar/JarFile ensureInitialization ()V 2 2438 orig 264 88 131 230 81 0 0 0 0 248 168 91 23 0 0 0 0 168 1 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 253 1 0 0 73 60 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 11 0 2 0 0 0 136 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 17 0x10002 0x78a 0x40003 0x788 0x28 0xd0002 0x0 0x150007 0x787 0x50 0x0 0x1c0007 0x0 0x30 0x0 0x200002 0x0 oops 0 +ciMethodData sun/misc/URLClassPath$JarLoader$2 getCodeSigners ()[Ljava/security/CodeSigner; 2 2478 orig 264 88 131 230 81 0 0 0 0 104 137 96 23 0 0 0 0 120 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 113 61 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 48 0 0 0 255 255 255 255 5 0 4 0 0 0 0 0 data 6 0x40005 0x0 0x1d6e9070 0x7ae 0x0 0x0 oops 1 2 java/util/jar/JarFile$JarFileEntry +ciMethodData java/util/jar/JarVerifier isTrustedManifestEntry (Ljava/lang/String;)Z 1 0 orig 264 88 131 230 81 0 0 0 0 112 167 95 23 0 0 0 0 8 3 0 0 48 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 184 1 0 0 255 255 255 255 5 0 6 0 0 0 0 0 data 55 0x60005 0x0 0x0 0x0 0x0 0x0 0x90004 0x0 0x0 0x0 0x0 0x0 0xe0007 0x0 0x20 0x0 0x180005 0x0 0x0 0x0 0x0 0x0 0x1b0004 0x0 0x0 0x0 0x0 0x0 0x200007 0x0 0x80 0x0 0x280005 0x0 0x0 0x0 0x0 0x0 0x2b0004 0x0 0x0 0x0 0x0 0x0 0x300007 0x0 0x58 0x0 0x370007 0x0 0x38 0x0 0x3b0003 0x0 0x18 oops 0 +ciMethodData java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 1 1061 orig 264 88 131 230 81 0 0 0 0 240 25 96 23 0 0 0 0 56 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 25 25 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 8 0 2 0 0 0 232 0 0 0 255 255 255 255 4 0 1 0 0 0 0 0 data 29 0x10004 0x0 0x1ab6e170 0x323 0x0 0x0 0x40007 0x0 0xb8 0x323 0x110004 0x0 0x1ab6e170 0x323 0x0 0x0 0x170005 0x0 0x1bd44b50 0x323 0x0 0x0 0x1c0007 0x0 0x38 0x323 0x200003 0x323 0x18 oops 3 2 java/util/jar/Attributes$Name 12 java/util/jar/Attributes$Name 18 sun/misc/ASCIICaseInsensitiveComparator +ciMethodData java/lang/Package defineSystemPackage (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Package; 1 1 orig 264 88 131 230 81 0 0 0 0 128 192 96 23 0 0 0 0 160 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 80 0 0 0 255 255 255 255 2 0 6 0 0 0 0 0 data 10 0x60002 0x1 0x90002 0x1 0xc0004 0x0 0x1baf0d30 0x1 0x0 0x0 oops 1 6 java/lang/Package +ciMethod java/lang/Package$1 (Ljava/lang/String;Ljava/lang/String;)V 9 1 1 0 -1 +ciMethodData java/util/HashMap (I)V 2 2450 orig 264 88 131 230 81 0 0 0 0 128 140 73 23 0 0 0 0 56 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 145 68 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 4 0 0 0 0 0 data 2 0x40002 0x892 oops 0 +ciMethodData java/util/HashMap (IF)V 2 5516 orig 264 88 131 230 81 0 0 0 0 232 139 73 23 0 0 0 0 104 3 0 0 240 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 108 1 0 0 1 161 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 17 0 2 0 0 0 16 2 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 66 0x10002 0x1420 0x50007 0x1420 0xd0 0x0 0x100002 0x0 0x150005 0x0 0x0 0x0 0x0 0x0 0x190005 0x0 0x0 0x0 0x0 0x0 0x1c0005 0x0 0x0 0x0 0x0 0x0 0x1f0002 0x0 0x260007 0x1420 0x20 0x0 0x2f0007 0x0 0x50 0x1420 0x330002 0x1420 0x360007 0x1420 0xd0 0x0 0x410002 0x0 0x460005 0x0 0x0 0x0 0x0 0x0 0x4a0005 0x0 0x0 0x0 0x0 0x0 0x4d0005 0x0 0x0 0x0 0x0 0x0 0x500002 0x0 0x5b0002 0x1420 oops 0 +ciMethod java/lang/AssertionError ()V 0 0 1 0 -1 +ciMethodData java/lang/Package (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/lang/ClassLoader;)V 1 418 orig 264 88 131 230 81 0 0 0 0 24 188 96 23 0 0 0 0 120 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 77 68 79 32 101 120 116 114 97 32 100 97 116 97 32 108 111 99 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 17 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 3 0 2 0 0 0 16 0 0 0 255 255 255 255 2 0 1 0 0 0 0 0 data 2 0x10002 0xa2 oops 0 +instanceKlass org/springframework/asm/ByteVector +instanceKlass org/springframework/asm/Symbol +instanceKlass org/springframework/asm/SymbolTable +instanceKlass org/springframework/asm/FieldVisitor +instanceKlass org/springframework/asm/RecordComponentVisitor +instanceKlass org/springframework/asm/ModuleVisitor +instanceKlass org/springframework/cglib/core/AsmApi +instanceKlass org/springframework/cglib/core/Constants +instanceKlass org/springframework/cglib/core/internal/LoadingCache$2 +instanceKlass java/util/concurrent/FutureTask$WaitNode +instanceKlass java/util/concurrent/FutureTask +instanceKlass java/util/concurrent/RunnableFuture +instanceKlass java/util/concurrent/Future +instanceKlass org/springframework/cglib/core/internal/LoadingCache$1 +instanceKlass org/springframework/cglib/core/internal/LoadingCache +instanceKlass org/springframework/cglib/core/AbstractClassGenerator$ClassLoaderData$3 +instanceKlass org/springframework/cglib/core/AbstractClassGenerator$ClassLoaderData$1 +instanceKlass org/springframework/cglib/core/AbstractClassGenerator$ClassLoaderData$2 +instanceKlass org/springframework/cglib/core/internal/Function +instanceKlass org/springframework/cglib/core/AbstractClassGenerator$ClassLoaderData +instanceKlass org/springframework/cglib/core/internal/CustomizerRegistry +instanceKlass org/springframework/cglib/core/DefaultNamingPolicy +instanceKlass org/springframework/cglib/core/DefaultGeneratorStrategy +instanceKlass org/springframework/cglib/core/KeyFactory$4 +instanceKlass org/springframework/cglib/core/KeyFactory$3 +instanceKlass org/springframework/cglib/core/KeyFactory$2 +instanceKlass org/springframework/cglib/core/KeyFactory$1 +instanceKlass org/springframework/cglib/core/Signature +instanceKlass org/springframework/cglib/core/CollectionUtils +instanceKlass org/springframework/cglib/core/TypeUtils +instanceKlass org/springframework/cglib/core/HashCodeCustomizer +instanceKlass org/springframework/cglib/core/FieldTypeCustomizer +instanceKlass org/springframework/cglib/core/Customizer +instanceKlass org/springframework/cglib/core/KeyFactory +instanceKlass org/springframework/cglib/proxy/Enhancer$EnhancerKey +instanceKlass org/springframework/cglib/core/AbstractClassGenerator$Source +instanceKlass org/springframework/cglib/proxy/Enhancer$1 +instanceKlass org/springframework/cglib/core/ObjectSwitchCallback +instanceKlass org/springframework/cglib/core/Transformer +instanceKlass org/springframework/cglib/proxy/CallbackGenerator$Context +instanceKlass org/springframework/cglib/core/ProcessSwitchCallback +instanceKlass org/springframework/cglib/core/Predicate +instanceKlass org/springframework/cglib/core/KeyFactoryCustomizer +instanceKlass org/springframework/cglib/core/AbstractClassGenerator +instanceKlass org/springframework/cglib/core/ClassGenerator +instanceKlass org/springframework/context/annotation/ConfigurationClassEnhancer$EnhancedConfiguration +instanceKlass org/springframework/aop/framework/autoproxy/AutoProxyUtils +instanceKlass org/springframework/objenesis/instantiator/ObjectInstantiator +instanceKlass org/springframework/objenesis/strategy/BaseInstantiatorStrategy +instanceKlass org/springframework/objenesis/strategy/InstantiatorStrategy +instanceKlass org/springframework/objenesis/SpringObjenesis +instanceKlass org/springframework/objenesis/Objenesis +instanceKlass org/springframework/context/annotation/ConfigurationClassEnhancer$ConditionalCallbackFilter +instanceKlass org/springframework/cglib/proxy/NoOp$1 +instanceKlass org/springframework/cglib/proxy/NoOp +instanceKlass org/springframework/context/annotation/ConfigurationClassEnhancer$BeanFactoryAwareMethodInterceptor +instanceKlass org/springframework/context/annotation/ConfigurationClassEnhancer$BeanMethodInterceptor +instanceKlass org/springframework/context/annotation/ConfigurationClassEnhancer$ConditionalCallback +instanceKlass org/springframework/cglib/proxy/MethodInterceptor +instanceKlass org/springframework/cglib/proxy/Callback +instanceKlass org/springframework/cglib/proxy/CallbackFilter +instanceKlass org/springframework/cglib/core/GeneratorStrategy +instanceKlass org/springframework/cglib/core/NamingPolicy +instanceKlass org/springframework/context/annotation/ConfigurationClassEnhancer +instanceKlass org/springframework/boot/autoconfigure/websocket/servlet/WebSocketMessagingAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/websocket/servlet/WebSocketMessagingAutoConfiguration$WebSocketMessageConverterConfiguration +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties$Reactive +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties$Servlet +instanceKlass org/springframework/boot/autoconfigure/task/TaskSchedulingProperties$Shutdown +instanceKlass org/springframework/boot/autoconfigure/task/TaskSchedulingProperties$Pool +instanceKlass org/springframework/boot/autoconfigure/session/SessionProperties$Servlet +instanceKlass org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties$Opaquetoken +instanceKlass org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties$Jwt +instanceKlass org/springframework/boot/autoconfigure/jdbc/JdbcProperties$Template +instanceKlass org/springframework/boot/autoconfigure/info/ProjectInfoProperties$Git +instanceKlass org/springframework/boot/autoconfigure/info/ProjectInfoProperties$Build +instanceKlass org/springframework/boot/autoconfigure/data/web/SpringDataWebProperties$Pageable +instanceKlass org/springframework/boot/autoconfigure/data/web/SpringDataWebProperties$Sort +instanceKlass com/google/gson/FieldNamingStrategy +instanceKlass org/springframework/data/keyvalue/core/KeyValueCallback +instanceKlass org/springframework/data/keyvalue/core/IdentifierGenerator +instanceKlass org/springframework/data/redis/core/RedisKeyValueAdapter$RedisUpdateObject +instanceKlass org/springframework/data/redis/core/TimeToLive +instanceKlass org/springframework/data/util/CloseableIterator +instanceKlass org/springframework/data/redis/core/RedisCallback +instanceKlass org/springframework/data/keyvalue/core/QueryEngine +instanceKlass org/springframework/data/mapping/Association +instanceKlass org/springframework/data/redis/core/PartialUpdate$PropertyUpdate +instanceKlass org/springframework/data/redis/core/PartialUpdate +instanceKlass org/springframework/data/redis/core/convert/Bucket +instanceKlass org/springframework/data/mapping/PersistentPropertyAccessor +instanceKlass org/springframework/data/redis/core/convert/RedisData +instanceKlass org/springframework/data/mapping/model/ParameterValueProvider +instanceKlass org/springframework/data/mapping/model/PropertyValueProvider +instanceKlass org/springframework/data/redis/core/convert/IndexResolver +instanceKlass org/springframework/data/redis/core/convert/RedisTypeMapper +instanceKlass org/springframework/data/convert/TypeMapper +instanceKlass org/springframework/data/mapping/model/SimpleTypeHolder +instanceKlass org/springframework/data/mapping/model/Property +instanceKlass org/springframework/data/redis/core/mapping/RedisPersistentEntity +instanceKlass org/springframework/data/mapping/model/AbstractPersistentProperty +instanceKlass org/springframework/data/redis/core/TimeToLiveAccessor +instanceKlass org/springframework/data/keyvalue/core/mapping/KeySpaceResolver +instanceKlass org/springframework/data/keyvalue/core/mapping/KeyValuePersistentEntity +instanceKlass org/springframework/data/mapping/model/MutablePersistentEntity +instanceKlass org/springframework/data/mapping/PersistentProperty +instanceKlass org/springframework/util/ReflectionUtils$FieldCallback +instanceKlass org/springframework/data/util/TypeInformation +instanceKlass org/springframework/data/mapping/PersistentEntity +instanceKlass org/springframework/data/spel/EvaluationContextProvider +instanceKlass org/springframework/data/mapping/model/PersistentPropertyAccessorFactory +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisProperties$Lettuce +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisProperties$Cluster +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisProperties$Jedis +instanceKlass org/apache/ibatis/session/Configuration +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceProperties$Xa +instanceKlass org/springframework/boot/autoconfigure/web/ResourceProperties$Cache +instanceKlass org/springframework/boot/autoconfigure/task/TaskExecutionProperties$Shutdown +instanceKlass org/springframework/boot/autoconfigure/task/TaskExecutionProperties$Pool +instanceKlass org/springframework/boot/context/properties/DeprecatedConfigurationProperty +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties$View +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties$Contentnegotiation +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties$Async +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties$Pathmatch +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties$Format +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties$Servlet +instanceKlass org/springframework/boot/autoconfigure/web/ServerProperties$Tomcat +instanceKlass org/springframework/boot/autoconfigure/web/ServerProperties$Netty +instanceKlass org/springframework/boot/web/server/Compression +instanceKlass org/springframework/boot/autoconfigure/web/ServerProperties$Jetty +instanceKlass org/springframework/boot/web/server/Http2 +instanceKlass org/springframework/boot/autoconfigure/web/ServerProperties$Undertow +instanceKlass org/springframework/boot/autoconfigure/web/ErrorProperties +instanceKlass org/springframework/boot/web/server/Ssl +instanceKlass org/springframework/boot/autoconfigure/web/ServerProperties$Servlet +instanceKlass org/springframework/web/multipart/commons/CommonsFileUploadSupport +instanceKlass org/springframework/boot/autoconfigure/web/servlet/MultipartAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration$LocaleCharsetMappingsCustomizer +instanceKlass org/springframework/boot/autoconfigure/web/servlet/MultipartProperties +instanceKlass org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer +instanceKlass org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration$TomcatWebServerFactoryCustomizerConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/client/RestTemplateAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration +instanceKlass org/thymeleaf/templateresolver/AbstractTemplateResolver +instanceKlass org/thymeleaf/templateresolver/ITemplateResolver +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration$DefaultTemplateResolverConfiguration +instanceKlass org/springframework/boot/web/client/RestTemplateBuilder +instanceKlass org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration$ThymeleafDefaultConfiguration +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration$ThymeleafWebMvcConfiguration +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration$ThymeleafWebMvcConfiguration$ThymeleafViewResolverConfiguration +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration$ThymeleafJava8TimeDialect +instanceKlass org/springframework/boot/task/TaskSchedulerBuilder +instanceKlass java/util/concurrent/ScheduledExecutorService +instanceKlass org/springframework/boot/autoconfigure/task/TaskSchedulingAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/DefaultCookieSerializerCustomizer +instanceKlass org/springframework/session/web/http/DefaultCookieSerializer +instanceKlass org/springframework/boot/autoconfigure/task/TaskSchedulingProperties +instanceKlass org/springframework/boot/autoconfigure/web/reactive/HttpHandlerAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/hazelcast/HazelcastAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$ServletSessionConfiguration +instanceKlass org/springframework/session/web/http/CookieHttpSessionIdResolver +instanceKlass org/springframework/boot/autoconfigure/session/SessionRepositoryFilterConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$AbstractSessionRepositoryValidator +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$ServletSessionConfiguration$ServletSessionRepositoryConfiguration +instanceKlass org/springframework/asm/Label +instanceKlass org/springframework/core/LocalVariableTableParameterNameDiscoverer$$Lambda$264 +instanceKlass org/springframework/session/web/http/SessionEventHttpSessionListenerAdapter +instanceKlass org/springframework/session/config/SessionRepositoryCustomizer +instanceKlass org/springframework/session/IndexResolver +instanceKlass org/springframework/boot/autoconfigure/session/SessionProperties +instanceKlass org/springframework/jdbc/support/lob/LobHandler +instanceKlass org/springframework/session/web/http/CookieSerializer +instanceKlass org/springframework/session/web/http/HttpSessionIdResolver +instanceKlass org/springframework/session/config/annotation/web/http/SpringHttpSessionConfiguration +instanceKlass org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration$SessionCleanupConfiguration +instanceKlass org/springframework/scheduling/annotation/SchedulingConfigurer +instanceKlass org/springframework/boot/jdbc/AbstractDataSourceInitializer +instanceKlass org/springframework/boot/autoconfigure/session/JdbcSessionProperties +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$AbstractSessionRepositoryImplementationValidator +instanceKlass org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/OAuth2ResourceServerAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/mail/MailSenderAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/Oauth2ResourceServerConfiguration$OpaqueTokenConfiguration +instanceKlass org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/Oauth2ResourceServerConfiguration$JwtConfiguration +instanceKlass org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties +instanceKlass org/springframework/boot/autoconfigure/security/servlet/UserDetailsServiceAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/security/servlet/SecurityAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/mail/MailSenderJndiConfiguration +instanceKlass org/springframework/boot/autoconfigure/mail/MailProperties +instanceKlass org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration +instanceKlass org/jooq/impl/DefaultExecuteListenerProvider +instanceKlass org/jooq/impl/DataSourceConnectionProvider +instanceKlass org/springframework/boot/autoconfigure/jooq/SpringTransactionProvider +instanceKlass org/jooq/TransactionProvider +instanceKlass org/jooq/ExecuteListener +instanceKlass org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration +instanceKlass org/jooq/impl/AbstractScope +instanceKlass org/jooq/TransactionListenerProvider +instanceKlass org/jooq/impl/DefaultConfiguration +instanceKlass org/jooq/ConnectionProvider +instanceKlass org/jooq/RecordListenerProvider +instanceKlass org/jooq/ExecuteListenerProvider +instanceKlass org/jooq/VisitListenerProvider +instanceKlass org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration$DslContextConfiguration +instanceKlass org/jooq/Configuration +instanceKlass org/springframework/boot/autoconfigure/jooq/JooqProperties +instanceKlass org/springframework/transaction/reactive/TransactionalOperator +instanceKlass org/springframework/transaction/ReactiveTransactionManager +instanceKlass org/springframework/boot/autoconfigure/transaction/TransactionAutoConfiguration +instanceKlass org/springframework/transaction/support/DefaultTransactionDefinition +instanceKlass org/springframework/transaction/TransactionDefinition +instanceKlass org/springframework/boot/autoconfigure/transaction/TransactionProperties +instanceKlass org/springframework/boot/autoconfigure/transaction/PlatformTransactionManagerCustomizer +instanceKlass org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/transaction/jta/JtaAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/transaction/TransactionAutoConfiguration$TransactionTemplateConfiguration +instanceKlass org/springframework/transaction/support/TransactionOperations +instanceKlass org/springframework/boot/autoconfigure/transaction/TransactionAutoConfiguration$EnableTransactionManagementConfiguration +instanceKlass org/springframework/boot/autoconfigure/transaction/TransactionAutoConfiguration$EnableTransactionManagementConfiguration$CglibAutoProxyConfiguration +instanceKlass org/springframework/transaction/event/TransactionalEventListenerFactory +instanceKlass org/springframework/transaction/interceptor/TransactionAspectSupport +instanceKlass org/springframework/transaction/interceptor/TransactionAttributeSource +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/transaction/TransactionManagerCustomizers +instanceKlass org/springframework/transaction/support/AbstractPlatformTransactionManager +instanceKlass org/springframework/transaction/support/ResourceTransactionManager +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration$DataSourceTransactionManagerConfiguration +instanceKlass org/springframework/boot/autoconfigure/jdbc/JdbcTemplateAutoConfiguration +instanceKlass org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate +instanceKlass org/springframework/boot/autoconfigure/jdbc/NamedParameterJdbcTemplateConfiguration +instanceKlass org/springframework/jdbc/core/namedparam/NamedParameterJdbcOperations +instanceKlass org/springframework/boot/autoconfigure/jdbc/JdbcProperties +instanceKlass org/springframework/boot/autoconfigure/jdbc/JdbcTemplateConfiguration +instanceKlass org/springframework/boot/autoconfigure/info/ProjectInfoAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/condition/OnBeanCondition$SingleCandidateSpec$$Lambda$263 +instanceKlass org/springframework/boot/autoconfigure/info/ProjectInfoProperties +instanceKlass org/springframework/data/domain/Pageable +instanceKlass org/springframework/boot/autoconfigure/data/web/SpringDataWebAutoConfiguration +instanceKlass org/springframework/data/web/config/SpringDataJacksonConfiguration +instanceKlass org/springframework/data/web/config/SortHandlerMethodArgumentResolverCustomizer +instanceKlass org/springframework/data/web/SortHandlerMethodArgumentResolverSupport +instanceKlass org/springframework/data/web/SortArgumentResolver +instanceKlass org/springframework/data/web/config/ProjectingArgumentResolverRegistrar$ProjectingArgumentResolverBeanPostProcessor +instanceKlass org/springframework/data/web/config/PageableHandlerMethodArgumentResolverCustomizer +instanceKlass org/springframework/boot/autoconfigure/data/rest/RepositoryRestMvcAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/data/web/SpringDataWebProperties +instanceKlass org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/http/JsonbHttpMessageConvertersConfiguration +instanceKlass org/springframework/boot/autoconfigure/http/GsonHttpMessageConvertersConfiguration +instanceKlass org/springframework/boot/autoconfigure/jsonb/JsonbAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration +instanceKlass org/springframework/boot/autoconfigure/http/JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration +instanceKlass org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperConfiguration +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$ParameterNamesModuleConfiguration +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration$StandardJackson2ObjectMapperBuilderCustomizer +instanceKlass org/springframework/boot/autoconfigure/jackson/Jackson2ObjectMapperBuilderCustomizer +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration +instanceKlass org/springframework/boot/autoconfigure/jackson/JacksonProperties +instanceKlass org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration$StandardGsonBuilderCustomizer +instanceKlass org/springframework/boot/autoconfigure/gson/GsonBuilderCustomizer +instanceKlass org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration +instanceKlass org/springframework/data/redis/core/convert/ReferenceResolverImpl +instanceKlass org/springframework/data/redis/core/convert/ReferenceResolver +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisRepositoriesAutoConfiguration +instanceKlass com/google/gson/GsonBuilder +instanceKlass org/springframework/boot/autoconfigure/gson/GsonProperties +instanceKlass org/springframework/util/StopWatch$TaskInfo +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSourceSupport$$Lambda$262 +instanceKlass org/springframework/data/util/Streamable$$Lambda$261 +instanceKlass org/springframework/util/MethodInvoker +instanceKlass org/springframework/beans/factory/support/ConstructorResolver$ArgumentsHolder +instanceKlass org/springframework/beans/factory/support/ConstructorResolver$ConstructorPropertiesChecker +instanceKlass org/springframework/beans/factory/support/AutowireUtils$$Lambda$260 +instanceKlass org/springframework/beans/factory/support/AutowireUtils +instanceKlass org/springframework/beans/Mergeable +instanceKlass org/springframework/beans/factory/config/RuntimeBeanNameReference +instanceKlass java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1 +instanceKlass org/springframework/beans/factory/support/ConstructorResolver +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSourceSupport$$Lambda$259 +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSourceSupport$$Lambda$258 +instanceKlass org/springframework/data/repository/NoRepositoryBean +instanceKlass org/springframework/data/repository/RepositoryDefinition +instanceKlass org/springframework/data/repository/Repository +instanceKlass org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource$$Lambda$257 +instanceKlass org/springframework/data/util/LazyStreamable +instanceKlass org/springframework/data/util/Streamable +instanceKlass org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource$$Lambda$256 +instanceKlass org/springframework/data/util/Lazy$$Lambda$255 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/data/util/Lazy +instanceKlass org/springframework/data/repository/config/CustomRepositoryImplementationDetector$$Lambda$254 +instanceKlass org/springframework/data/repository/config/ImplementationLookupConfiguration +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSourceSupport$SpringImplementationDetectionConfiguration +instanceKlass org/springframework/data/repository/config/CustomRepositoryImplementationDetector +instanceKlass org/springframework/data/repository/config/FragmentMetadata +instanceKlass org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder +instanceKlass org/springframework/data/keyvalue/repository/config/KeyValueRepositoryConfigurationExtension$$Lambda$253 +instanceKlass org/springframework/data/keyvalue/core/KeyValueTemplate +instanceKlass org/springframework/data/keyvalue/core/KeyValueOperations +instanceKlass org/springframework/data/keyvalue/repository/config/KeyValueRepositoryConfigurationExtension$$Lambda$252 +instanceKlass org/springframework/data/keyvalue/core/AbstractKeyValueAdapter +instanceKlass org/springframework/data/keyvalue/core/KeyValueAdapter +instanceKlass org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension$$Lambda$251 +instanceKlass org/springframework/data/redis/core/convert/MappingRedisConverter +instanceKlass org/springframework/data/redis/core/convert/RedisConverter +instanceKlass org/springframework/data/convert/EntityConverter +instanceKlass org/springframework/data/convert/EntityWriter +instanceKlass org/springframework/data/convert/EntityReader +instanceKlass org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension$$Lambda$250 +instanceKlass org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension$$Lambda$249 +instanceKlass org/springframework/data/convert/CustomConversions +instanceKlass org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension$$Lambda$248 +instanceKlass org/springframework/data/redis/core/convert/MappingConfiguration +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSource$$Lambda$247 +instanceKlass org/springframework/data/mapping/context/AbstractMappingContext +instanceKlass org/springframework/data/mapping/context/MappingContext +instanceKlass org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension$$Lambda$246 +instanceKlass org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource$$Lambda$245 +instanceKlass org/slf4j/helpers/FormattingTuple +instanceKlass org/slf4j/helpers/MessageFormatter +instanceKlass org/springframework/data/repository/config/RepositoryConfiguration +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport +instanceKlass org/springframework/data/repository/core/support/RepositoryFactorySupport +instanceKlass java/util/stream/MatchOps$$Lambda$244 +instanceKlass org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource$$Lambda$243 +instanceKlass org/springframework/data/repository/query/parser/AbstractQueryCreator +instanceKlass org/springframework/data/keyvalue/repository/query/KeyValuePartTreeQuery +instanceKlass org/springframework/data/repository/query/RepositoryQuery +instanceKlass org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport +instanceKlass org/springframework/data/repository/config/SpringDataAnnotationBeanNameGenerator +instanceKlass org/springframework/data/repository/config/RepositoryBeanNameGenerator +instanceKlass org/springframework/data/config/ConfigurationUtils +instanceKlass org/springframework/data/repository/config/ImplementationDetectionConfiguration +instanceKlass org/springframework/data/keyvalue/repository/config/QueryCreatorType +instanceKlass org/springframework/data/repository/config/DefaultRepositoryBaseClass +instanceKlass org/springframework/data/redis/core/convert/KeyspaceConfiguration +instanceKlass org/springframework/data/redis/core/index/IndexConfiguration +instanceKlass org/springframework/data/redis/core/index/ConfigurableIndexDefinitionProvider +instanceKlass org/springframework/data/redis/core/index/IndexDefinitionRegistry +instanceKlass org/springframework/data/redis/core/index/IndexDefinitionProvider +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisRepositoriesRegistrar$EnableRedisRepositoriesConfiguration +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationDelegate +instanceKlass org/springframework/data/repository/core/support/RepositoryFactoryBeanSupport +instanceKlass org/springframework/data/repository/core/support/RepositoryFactoryInformation +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/dao/PersistenceExceptionTranslationAutoConfiguration +instanceKlass org/springframework/context/support/DefaultLifecycleProcessor +instanceKlass org/springframework/boot/autoconfigure/context/LifecycleAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/context/ConfigurationPropertiesAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/context/LifecycleProperties +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration +instanceKlass org/springframework/data/redis/connection/RedisSentinelConfiguration +instanceKlass org/springframework/data/redis/connection/RedisConfiguration$SentinelConfiguration +instanceKlass org/springframework/data/redis/connection/RedisClusterConfiguration +instanceKlass org/springframework/data/redis/connection/RedisConfiguration$ClusterConfiguration +instanceKlass org/springframework/data/redis/connection/RedisStandaloneConfiguration +instanceKlass org/springframework/data/redis/connection/RedisConfiguration$WithDatabaseIndex +instanceKlass org/springframework/data/redis/connection/RedisConfiguration$WithPassword +instanceKlass org/springframework/data/redis/connection/RedisConfiguration$WithHostAndPort +instanceKlass org/springframework/data/redis/connection/RedisConfiguration +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisProperties$Sentinel +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration$ConnectionInfo +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisProperties +instanceKlass io/lettuce/core/resource/DefaultClientResources +instanceKlass org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisProperties$Pool +instanceKlass org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory +instanceKlass org/springframework/boot/autoconfigure/data/redis/LettuceClientConfigurationBuilderCustomizer +instanceKlass org/springframework/data/redis/connection/lettuce/LettuceClientConfiguration$LettuceClientConfigurationBuilder +instanceKlass io/lettuce/core/ClientOptions$Builder +instanceKlass org/springframework/boot/autoconfigure/data/redis/RedisConnectionConfiguration +instanceKlass org/springframework/boot/availability/ApplicationAvailabilityBean +instanceKlass org/springframework/boot/availability/ApplicationAvailability +instanceKlass org/springframework/boot/autoconfigure/availability/ApplicationAvailabilityAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/aop/AopAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/aop/AopAutoConfiguration$AspectJAutoProxyingConfiguration +instanceKlass org/springframework/boot/autoconfigure/aop/AopAutoConfiguration$AspectJAutoProxyingConfiguration$CglibAutoProxyConfiguration +instanceKlass io/lettuce/core/resource/ClientResources +instanceKlass org/apache/shiro/spring/web/config/AbstractShiroWebFilterConfiguration +instanceKlass org/apache/shiro/spring/ShiroEventBusBeanPostProcessor +instanceKlass org/apache/shiro/event/EventBus +instanceKlass org/apache/shiro/spring/config/AbstractShiroBeanConfiguration +instanceKlass org/apache/shiro/spring/web/config/ShiroFilterChainDefinition +instanceKlass org/apache/shiro/mgt/RememberMeManager +instanceKlass org/apache/shiro/mgt/SessionStorageEvaluator +instanceKlass org/apache/shiro/session/mgt/SessionFactory +instanceKlass org/apache/shiro/mgt/SubjectFactory +instanceKlass org/apache/shiro/mgt/SubjectDAO +instanceKlass org/apache/shiro/authc/pam/AuthenticationStrategy +instanceKlass org/apache/shiro/spring/config/AbstractShiroConfiguration +instanceKlass org/apache/shiro/spring/config/AbstractShiroAnnotationProcessorConfiguration +instanceKlass org/apache/ibatis/plugin/Interceptor +instanceKlass com/github/pagehelper/autoconfigure/PageHelperAutoConfiguration +instanceKlass com/github/pagehelper/autoconfigure/PageHelperProperties +instanceKlass org/mybatis/spring/SqlSessionTemplate +instanceKlass org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration +instanceKlass org/mybatis/spring/boot/autoconfigure/MybatisProperties +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration +instanceKlass org/springframework/boot/jdbc/metadata/DataSourcePoolMetadataProvider +instanceKlass org/springframework/boot/jdbc/metadata/DataSourcePoolMetadata +instanceKlass org/springframework/boot/autoconfigure/jdbc/metadata/DataSourcePoolMetadataProvidersConfiguration$HikariPoolDataSourceMetadataProviderConfiguration +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$PooledDataSourceConfiguration +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration +instanceKlass org/springframework/boot/autoconfigure/jdbc/metadata/DataSourcePoolMetadataProvidersConfiguration +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceProperties +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceInitializerPostProcessor +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceInitializerInvoker +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceJmxConfiguration +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Generic +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Dbcp2 +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari +instanceKlass javax/sql/XADataSource +instanceKlass org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration +instanceKlass org/springframework/web/context/request/RequestContextListener +instanceKlass javax/servlet/ServletRequestListener +instanceKlass org/springframework/boot/autoconfigure/http/HttpMessageConverters +instanceKlass org/springframework/web/servlet/config/annotation/ResourceHandlerRegistration +instanceKlass org/springframework/boot/web/servlet/filter/OrderedFilter +instanceKlass org/springframework/web/servlet/LocaleResolver +instanceKlass org/springframework/validation/MessageCodeFormatter +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter +instanceKlass sun/misc/ProxyGenerator$1 +instanceKlass org/springframework/web/servlet/handler/HandlerMappingIntrospector +instanceKlass org/springframework/web/cors/CorsConfigurationSource +instanceKlass org/springframework/web/servlet/function/support/HandlerFunctionAdapter +instanceKlass org/springframework/web/servlet/mvc/SimpleControllerHandlerAdapter +instanceKlass org/springframework/web/servlet/mvc/HttpRequestHandlerAdapter +instanceKlass org/springframework/web/method/support/CompositeUriComponentsContributor +instanceKlass org/springframework/web/method/support/UriComponentsContributor +instanceKlass org/springframework/web/util/UrlPathHelper +instanceKlass org/springframework/web/servlet/config/annotation/ResourceHandlerRegistry +instanceKlass org/springframework/web/servlet/config/annotation/ViewResolverRegistry +instanceKlass org/springframework/validation/MessageCodesResolver +instanceKlass org/springframework/web/servlet/config/annotation/AsyncSupportConfigurer +instanceKlass org/springframework/web/servlet/config/annotation/DefaultServletHandlerConfigurer +instanceKlass org/springframework/web/servlet/config/annotation/ContentNegotiationConfigurer +instanceKlass org/springframework/web/servlet/config/annotation/PathMatchConfigurer +instanceKlass org/springframework/web/servlet/config/annotation/ViewControllerRegistry +instanceKlass org/springframework/web/servlet/config/annotation/CorsRegistry +instanceKlass org/springframework/web/servlet/config/annotation/InterceptorRegistry +instanceKlass org/springframework/web/servlet/resource/ResourceUrlProvider +instanceKlass org/springframework/web/accept/ContentNegotiationManager +instanceKlass org/springframework/web/accept/MediaTypeFileExtensionResolver +instanceKlass org/springframework/web/accept/ContentNegotiationStrategy +instanceKlass org/springframework/web/bind/support/ConfigurableWebBindingInitializer +instanceKlass org/springframework/web/servlet/handler/AbstractHandlerExceptionResolver +instanceKlass org/springframework/web/servlet/HandlerAdapter +instanceKlass org/springframework/web/servlet/handler/MatchableHandlerMapping +instanceKlass org/springframework/web/bind/support/WebBindingInitializer +instanceKlass org/springframework/web/servlet/HandlerInterceptor +instanceKlass org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/AbstractErrorController +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration$ErrorPageCustomizer +instanceKlass org/springframework/boot/web/server/ErrorPageRegistrar +instanceKlass org/springframework/boot/web/servlet/error/DefaultErrorAttributes +instanceKlass org/springframework/web/servlet/HandlerExceptionResolver +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration$PreserveErrorControllerTargetClassPostProcessor +instanceKlass org/springframework/boot/web/servlet/error/ErrorController +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewResolver +instanceKlass org/springframework/boot/web/servlet/error/ErrorAttributes +instanceKlass org/springframework/boot/autoconfigure/web/ResourceProperties +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/ErrorViewResolver +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration +instanceKlass org/springframework/web/servlet/View +instanceKlass org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration +instanceKlass org/springframework/context/support/ApplicationObjectSupport +instanceKlass org/springframework/web/servlet/ViewResolver +instanceKlass org/springframework/boot/autoconfigure/condition/OnBeanCondition$$Lambda$242 +instanceKlass org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/DispatcherServletPath +instanceKlass org/springframework/boot/task/TaskExecutorBuilder +instanceKlass org/springframework/boot/autoconfigure/task/TaskExecutionProperties +instanceKlass org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration$DispatcherServletConfiguration +instanceKlass org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties +instanceKlass org/springframework/boot/web/server/ErrorPageRegistrarBeanPostProcessor +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryCustomizer +instanceKlass org/springframework/boot/autoconfigure/web/servlet/TomcatServletWebServerFactoryCustomizer +instanceKlass org/springframework/boot/web/server/AbstractConfigurableWebServerFactory +instanceKlass org/springframework/boot/web/servlet/server/ConfigurableServletWebServerFactory +instanceKlass org/springframework/boot/web/embedded/tomcat/ConfigurableTomcatWebServerFactory +instanceKlass org/springframework/boot/web/server/ConfigurableWebServerFactory +instanceKlass org/springframework/boot/web/server/ErrorPageRegistry +instanceKlass org/springframework/boot/web/server/WebServerFactory +instanceKlass org/springframework/boot/web/server/WebServerFactoryCustomizerBeanPostProcessor +instanceKlass org/springframework/boot/context/properties/ConstructorBinding +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBindConstructorProvider +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar$$Lambda$241 +instanceKlass org/springframework/boot/context/properties/EnableConfigurationPropertiesRegistrar$$Lambda$240 +instanceKlass org/springframework/boot/context/properties/EnableConfigurationPropertiesRegistrar$$Lambda$239 +instanceKlass org/springframework/boot/context/properties/EnableConfigurationPropertiesRegistrar$$Lambda$238 +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBeanRegistrar +instanceKlass org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBeanDefinitionValidator +instanceKlass org/springframework/boot/context/properties/BoundConfigurationProperties +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBinder$Factory +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBinder +instanceKlass org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedUndertow +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedJetty +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedTomcat +instanceKlass org/springframework/boot/autoconfigure/web/ServerProperties +instanceKlass org/springframework/boot/autoconfigure/websocket/servlet/WebSocketServletAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/websocket/servlet/TomcatWebSocketServletWebServerCustomizer +instanceKlass org/springframework/boot/web/server/WebServerFactoryCustomizer +instanceKlass org/springframework/boot/autoconfigure/websocket/servlet/WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration +instanceKlass org/springframework/boot/web/servlet/server/ServletWebServerFactory +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryAutoConfiguration +instanceKlass org/springframework/boot/autoconfigure/context/PropertyPlaceholderAutoConfiguration +instanceKlass org/springframework/beans/factory/config/ConstructorArgumentValues$$Lambda$237 +instanceKlass org/springframework/beans/factory/config/ConstructorArgumentValues$$Lambda$236 +instanceKlass org/springframework/beans/factory/config/ConstructorArgumentValues$$Lambda$235 +instanceKlass org/springframework/cache/annotation/CachingConfigurer +instanceKlass org/aopalliance/intercept/MethodInterceptor +instanceKlass org/aopalliance/intercept/Interceptor +instanceKlass org/springframework/aop/support/AbstractPointcutAdvisor +instanceKlass org/aopalliance/aop/Advice +instanceKlass org/springframework/cache/interceptor/CacheOperationSource +instanceKlass org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory$FactoryBeanMethodTypeFinder +instanceKlass org/springframework/aop/support/StaticMethodMatcher +instanceKlass org/springframework/aop/MethodMatcher +instanceKlass org/springframework/aop/Pointcut +instanceKlass org/springframework/aop/PointcutAdvisor +instanceKlass org/springframework/aop/Advisor +instanceKlass org/apache/shiro/spring/LifecycleBeanPostProcessor +instanceKlass org/apache/shiro/codec/CodecSupport +instanceKlass org/apache/shiro/spring/web/ShiroFilterFactoryBean +instanceKlass org/apache/shiro/web/mgt/WebSecurityManager +instanceKlass org/apache/shiro/mgt/CachingSecurityManager +instanceKlass org/apache/shiro/event/EventBusAware +instanceKlass org/apache/shiro/util/Destroyable +instanceKlass org/apache/shiro/web/servlet/Cookie +instanceKlass org/apache/shiro/session/mgt/eis/SessionDAO +instanceKlass org/apache/shiro/authc/credential/CredentialsMatcher +instanceKlass org/apache/shiro/mgt/SecurityManager +instanceKlass org/apache/shiro/session/mgt/SessionManager +instanceKlass org/apache/shiro/authc/Authenticator +instanceKlass org/springframework/lang/Nullable +instanceKlass org/springframework/messaging/core/AbstractMessageSendingTemplate +instanceKlass org/springframework/messaging/converter/CompositeMessageConverter +instanceKlass org/springframework/messaging/simp/user/UserDestinationMessageHandler +instanceKlass org/springframework/messaging/converter/AbstractMessageConverter +instanceKlass org/springframework/messaging/converter/SmartMessageConverter +instanceKlass org/springframework/web/socket/config/WebSocketMessageBrokerStats +instanceKlass org/springframework/beans/factory/config/CustomScopeConfigurer +instanceKlass org/springframework/messaging/simp/config/MessageBrokerRegistry +instanceKlass org/springframework/messaging/simp/config/ChannelRegistration +instanceKlass org/springframework/web/socket/config/annotation/WebSocketTransportRegistration +instanceKlass org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler +instanceKlass org/springframework/web/socket/WebSocketHandler +instanceKlass org/springframework/web/servlet/HandlerMapping +instanceKlass org/springframework/web/socket/config/annotation/StompEndpointRegistry +instanceKlass org/springframework/messaging/simp/user/SimpUserRegistry +instanceKlass org/springframework/validation/Validator +instanceKlass org/springframework/messaging/simp/SimpMessageSendingOperations +instanceKlass org/springframework/messaging/core/MessageSendingOperations +instanceKlass org/springframework/messaging/simp/user/UserDestinationResolver +instanceKlass org/springframework/messaging/converter/MessageConverter +instanceKlass org/springframework/messaging/simp/broker/AbstractBrokerMessageHandler +instanceKlass org/springframework/context/SmartLifecycle +instanceKlass org/springframework/context/Phased +instanceKlass org/springframework/messaging/support/AbstractMessageChannel +instanceKlass org/springframework/messaging/support/InterceptableChannel +instanceKlass org/springframework/messaging/SubscribableChannel +instanceKlass org/springframework/messaging/MessageChannel +instanceKlass org/springframework/messaging/MessageHandler +instanceKlass org/springframework/messaging/converter/ContentTypeResolver +instanceKlass org/springframework/scheduling/annotation/ScheduledAnnotationBeanPostProcessor +instanceKlass org/springframework/scheduling/config/ScheduledTaskHolder +instanceKlass org/springframework/core/annotation/AnnotatedElementUtils +instanceKlass org/springframework/context/annotation/BeanAnnotationHelper +instanceKlass org/springframework/cache/support/AbstractCacheManager +instanceKlass org/springframework/data/redis/serializer/RedisSerializer +instanceKlass org/springframework/util/ReflectionUtils$$Lambda$234 +instanceKlass org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory$$Lambda$233 +instanceKlass org/springframework/boot/autoconfigure/condition/OnBeanCondition$MatchResult +instanceKlass org/springframework/core/io/support/PropertiesLoaderSupport +instanceKlass org/springframework/boot/autoconfigure/condition/OnBeanCondition$Spec$$Lambda$232 +instanceKlass org/springframework/aop/config/AopConfigUtils +instanceKlass org/mybatis/spring/mapper/ClassPathMapperScanner$3 +instanceKlass org/mybatis/spring/mapper/ClassPathMapperScanner$2 +instanceKlass org/apache/ibatis/session/SqlSession +instanceKlass org/springframework/beans/factory/config/ConstructorArgumentValues$ValueHolder +instanceKlass org/springframework/beans/factory/config/ConstructorArgumentValues +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationPackages$BasePackages +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationPackages +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationPackages$PackageImports +instanceKlass org/springframework/core/type/StandardMethodMetadata +instanceKlass org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader$$Lambda$231 +instanceKlass org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader$$Lambda$230 +instanceKlass org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader$TrackedConditionEvaluator +instanceKlass org/thymeleaf/dialect/AbstractDialect +instanceKlass org/thymeleaf/dialect/IExpressionObjectDialect +instanceKlass org/thymeleaf/dialect/IDialect +instanceKlass org/springframework/session/web/http/OncePerRequestFilter +instanceKlass org/springframework/boot/autoconfigure/session/AbstractSessionCondition$$Lambda$229 +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings$$Lambda$228 +instanceKlass java/util/EnumMap$EntryIterator$Entry +instanceKlass java/util/EnumMap$EnumMapIterator +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings$$Lambda$227 +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings$$Lambda$226 +instanceKlass org/springframework/session/jdbc/JdbcIndexedSessionRepository +instanceKlass org/springframework/session/FindByIndexNameSessionRepository +instanceKlass org/springframework/session/SessionRepository +instanceKlass org/springframework/data/redis/core/RedisAccessor +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings$1 +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings$$Lambda$225 +instanceKlass org/springframework/boot/autoconfigure/session/NoOpReactiveSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/NoOpSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/HazelcastSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/MongoReactiveSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/MongoSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/RedisReactiveSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/RedisSessionConfiguration +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings$Configurations +instanceKlass org/springframework/boot/autoconfigure/session/SessionStoreMappings +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 org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$SessionConfigurationImportSelector$$Lambda$224 +instanceKlass java/util/function/IntFunction +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$SessionConfigurationImportSelector$$Lambda$223 +instanceKlass org/springframework/boot/autoconfigure/session/SessionAutoConfiguration$SessionConfigurationImportSelector +instanceKlass javax/mail/Session +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnJndi +instanceKlass org/springframework/transaction/annotation/AbstractTransactionManagementConfiguration +instanceKlass org/springframework/transaction/annotation/TransactionManagementConfigurationSelector$1 +instanceKlass org/springframework/transaction/annotation/EnableTransactionManagement +instanceKlass org/springframework/data/querydsl/QuerydslUtils +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$222 +instanceKlass org/springframework/data/web/config/SpringDataJacksonModules +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$221 +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$220 +instanceKlass org/springframework/data/web/config/SpringDataWebConfiguration +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$219 +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$218 +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$217 +instanceKlass org/springframework/data/web/config/ProjectingArgumentResolverRegistrar +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector$$Lambda$216 +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$QuerydslActivator +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport$SpringDataWebConfigurationImportSelector +instanceKlass org/springframework/data/web/config/EnableSpringDataWebSupport +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationExtension +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSourceSupport +instanceKlass org/springframework/data/repository/config/RepositoryConfigurationSource +instanceKlass org/springframework/boot/autoconfigure/data/AbstractRepositoryConfigurationSourceSupport +instanceKlass org/springframework/cache/Cache +instanceKlass org/springframework/boot/autoconfigure/cache/CacheConfigurations$$Lambda$215 +instanceKlass org/springframework/boot/autoconfigure/cache/NoOpCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/SimpleCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/CaffeineCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/RedisCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/CouchbaseCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/InfinispanCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/HazelcastCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/EhCacheCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/GenericCacheConfiguration +instanceKlass org/springframework/boot/autoconfigure/cache/CacheConfigurations +instanceKlass org/springframework/boot/autoconfigure/cache/CacheAutoConfiguration$CacheConfigurationImportSelector +instanceKlass org/springframework/data/redis/connection/AbstractRedisConnection +instanceKlass org/springframework/data/redis/connection/DefaultedRedisConnection +instanceKlass org/springframework/data/redis/connection/RedisConnection +instanceKlass org/springframework/data/redis/connection/RedisCommands +instanceKlass org/springframework/data/redis/connection/RedisHyperLogLogCommands +instanceKlass org/springframework/data/redis/connection/RedisGeoCommands +instanceKlass org/springframework/data/redis/connection/RedisScriptingCommands +instanceKlass org/springframework/data/redis/connection/RedisStreamCommands +instanceKlass org/springframework/data/redis/connection/RedisServerCommands +instanceKlass org/springframework/data/redis/connection/RedisConnectionCommands +instanceKlass org/springframework/data/redis/connection/RedisPubSubCommands +instanceKlass org/springframework/data/redis/connection/RedisTxCommands +instanceKlass org/springframework/data/redis/connection/RedisHashCommands +instanceKlass org/springframework/data/redis/connection/RedisZSetCommands +instanceKlass org/springframework/data/redis/connection/RedisSetCommands +instanceKlass org/springframework/data/redis/connection/RedisListCommands +instanceKlass org/springframework/data/redis/connection/RedisStringCommands +instanceKlass org/springframework/data/redis/connection/RedisKeyCommands +instanceKlass io/lettuce/core/AbstractRedisClient +instanceKlass org/springframework/context/annotation/AspectJAutoProxyRegistrar +instanceKlass org/springframework/context/annotation/EnableAspectJAutoProxy +instanceKlass org/aspectj/weaver/ShadowMunger +instanceKlass org/aspectj/weaver/IHasPosition +instanceKlass org/aspectj/util/PartialOrder$PartialComparable +instanceKlass org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration$AutoConfiguredMapperScannerRegistrar +instanceKlass org/mybatis/spring/SqlSessionFactoryBean +instanceKlass org/apache/ibatis/session/SqlSessionFactory +instanceKlass org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration$Registrar +instanceKlass com/zaxxer/hikari/HikariConfig +instanceKlass com/zaxxer/hikari/HikariConfigMXBean +instanceKlass org/springframework/boot/jdbc/DataSourceBuilder +instanceKlass org/springframework/boot/autoconfigure/condition/AbstractNestedCondition$MemberOutcomes +instanceKlass org/springframework/boot/autoconfigure/condition/AbstractNestedCondition$MemberConditions$$Lambda$214 +instanceKlass org/springframework/boot/autoconfigure/condition/AbstractNestedCondition$MemberMatchOutcomes +instanceKlass org/springframework/boot/autoconfigure/condition/AbstractNestedCondition$MemberConditions +instanceKlass org/springframework/boot/autoconfigure/web/ResourceProperties$Chain +instanceKlass org/springframework/boot/autoconfigure/web/ConditionalOnEnabledResourceChain +instanceKlass org/springframework/boot/autoconfigure/web/servlet/JspTemplateAvailabilityProvider +instanceKlass org/springframework/boot/autoconfigure/thymeleaf/ThymeleafTemplateAvailabilityProvider +instanceKlass org/springframework/boot/autoconfigure/mustache/MustacheTemplateAvailabilityProvider +instanceKlass org/springframework/boot/autoconfigure/template/PathBasedTemplateAvailabilityProvider$TemplateAvailabilityProperties +instanceKlass org/springframework/boot/autoconfigure/template/PathBasedTemplateAvailabilityProvider +instanceKlass org/springframework/boot/autoconfigure/template/TemplateAvailabilityProviders$NoTemplateAvailabilityProvider +instanceKlass org/springframework/boot/autoconfigure/template/TemplateAvailabilityProvider +instanceKlass org/springframework/boot/autoconfigure/template/TemplateAvailabilityProviders +instanceKlass org/springframework/boot/autoconfigure/condition/OnPropertyCondition$Spec +instanceKlass org/springframework/boot/autoconfigure/condition/OnPropertyCondition$$Lambda$213 +instanceKlass cn/edu/whu/boot/xml/service/impl/XmlEnityServiceImpl +instanceKlass cn/edu/whu/boot/xml/service/IXmlEnityService +instanceKlass cn/edu/whu/boot/xml/service/impl/TaskServiceImpl +instanceKlass cn/edu/whu/boot/xml/service/ITaskService +instanceKlass cn/edu/whu/boot/xml/service/impl/TableServiceImpl +instanceKlass cn/edu/whu/boot/xml/service/ITableService +instanceKlass cn/edu/whu/boot/xml/controller/XmlFileManagementController +instanceKlass cn/edu/whu/boot/xml/controller/TaskManagementController +instanceKlass cn/edu/whu/boot/xml/controller/DataBaseTableController +instanceKlass cn/edu/whu/boot/user/services/impl/UserServiceImpl +instanceKlass cn/edu/whu/boot/user/services/UserService +instanceKlass cn/edu/whu/boot/user/services/impl/SessionServiceImpl +instanceKlass cn/edu/whu/boot/user/services/SessionService +instanceKlass cn/edu/whu/boot/user/services/impl/RoleToPermissionServiceImpl +instanceKlass cn/edu/whu/boot/user/services/RoleToPermissionService +instanceKlass cn/edu/whu/boot/user/services/impl/RoleServiceImpl +instanceKlass cn/edu/whu/boot/user/services/RoleService +instanceKlass cn/edu/whu/boot/user/services/impl/PermissionServiceImpl +instanceKlass cn/edu/whu/boot/user/services/PermissionService +instanceKlass cn/edu/whu/boot/user/services/impl/PermissionCacheServiceImpl +instanceKlass cn/edu/whu/boot/user/services/PermissionCacheService +instanceKlass org/apache/shiro/realm/CachingRealm +instanceKlass org/apache/shiro/authc/LogoutAware +instanceKlass org/apache/shiro/cache/CacheManagerAware +instanceKlass org/apache/shiro/util/Nameable +instanceKlass org/apache/shiro/realm/Realm +instanceKlass org/apache/shiro/authz/permission/RolePermissionResolverAware +instanceKlass org/apache/shiro/authz/permission/PermissionResolverAware +instanceKlass org/apache/shiro/util/Initializable +instanceKlass org/apache/shiro/authz/Authorizer +instanceKlass cn/edu/whu/boot/user/controllers/UserController +instanceKlass cn/edu/whu/boot/user/config/ShiroConfig +instanceKlass cn/edu/whu/boot/user/config/CORSConfig +instanceKlass cn/edu/whu/boot/user/components/CustomSessionListener +instanceKlass org/apache/shiro/session/SessionListener +instanceKlass cn/edu/whu/boot/statistics/service/ReportService +instanceKlass cn/edu/whu/boot/statistics/service/ProgressStatService +instanceKlass cn/edu/whu/boot/statistics/service/BasicStatService +instanceKlass cn/edu/whu/boot/statistics/controller/ReportController +instanceKlass cn/edu/whu/boot/statistics/controller/ProgressStatController +instanceKlass cn/edu/whu/boot/statistics/controller/BasicStatController +instanceKlass cn/edu/whu/boot/statistics/bean/RouteLine +instanceKlass cn/edu/whu/boot/statistics/bean/Collector +instanceKlass cn/edu/whu/boot/message/controller/LocationController +instanceKlass cn/edu/whu/boot/message/controller/GreetingController +instanceKlass cn/edu/whu/boot/message/controller/ChatController +instanceKlass cn/edu/whu/boot/message/configure/WebSocketConfig +instanceKlass cn/edu/whu/boot/message/configure/SchedulerConfig +instanceKlass cn/edu/whu/boot/common/service/impl/RedisServiceImpl +instanceKlass cn/edu/whu/boot/common/service/RedisService +instanceKlass cn/edu/whu/boot/common/service/impl/CacheServiceImpl +instanceKlass cn/edu/whu/boot/common/service/CacheService +instanceKlass cn/edu/whu/boot/common/domain/GlobalExceptionHandler +instanceKlass cn/edu/whu/boot/common/domain/CommonConstant +instanceKlass cn/edu/whu/boot/common/config/BaseRedisConfig +instanceKlass cn/edu/whu/boot/common/component/WebLogAspect +instanceKlass cn/edu/whu/boot/collection/service/impl/SearchPageServiceImpl +instanceKlass cn/edu/whu/boot/collection/service/ISearchPageService +instanceKlass cn/edu/whu/boot/collection/service/impl/MultimediaServiceImpl +instanceKlass cn/edu/whu/boot/collection/service/IMultimediaService +instanceKlass cn/edu/whu/boot/collection/service/impl/ImportServiceImpl +instanceKlass cn/edu/whu/boot/collection/service/ImportService +instanceKlass cn/edu/whu/boot/collection/service/impl/ITaskSelectIdServiceImpl +instanceKlass cn/edu/whu/boot/collection/service/ITaskSelectIdService +instanceKlass cn/edu/whu/boot/collection/service/impl/ExportServiceImpl +instanceKlass cn/edu/whu/boot/collection/service/ExportService +instanceKlass cn/edu/whu/boot/collection/service/impl/CSVExportWriterService +instanceKlass cn/edu/whu/boot/collection/service/ExportWriterService +instanceKlass cn/edu/whu/boot/collection/service/impl/BaseServiceImpl +instanceKlass cn/edu/whu/boot/collection/service/IBaseService +instanceKlass cn/edu/whu/boot/collection/controller/ImportController +instanceKlass cn/edu/whu/boot/collection/controller/GetController +instanceKlass cn/edu/whu/boot/collection/controller/ExportController +instanceKlass cn/edu/whu/boot/collection/controller/DefaultController +instanceKlass cn/edu/whu/boot/collection/controller/BaseController +instanceKlass cn/edu/whu/boot/apkversion/service/ApkVersionService +instanceKlass cn/edu/whu/boot/apkversion/controller/ApkVersionController +instanceKlass cn/edu/whu/boot/allocation/services/impl/TaskUserRoleImpl +instanceKlass cn/edu/whu/boot/allocation/services/TaskUserRoleService +instanceKlass cn/edu/whu/boot/allocation/services/impl/TaskUserCellServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/TaskUserCellService +instanceKlass cn/edu/whu/boot/allocation/services/impl/TaskInfoServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/TaskInfoService +instanceKlass cn/edu/whu/boot/allocation/services/impl/TaskCellServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/TaskCellService +instanceKlass cn/edu/whu/boot/allocation/services/impl/TaskCellDataServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/TaskCellDataService +instanceKlass cn/edu/whu/boot/allocation/services/impl/RouteLineServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/RouteLineService +instanceKlass cn/edu/whu/boot/allocation/services/impl/ImageServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/ImageService +instanceKlass cn/edu/whu/boot/allocation/services/impl/DraftServiceImpl +instanceKlass cn/edu/whu/boot/allocation/services/DraftService +instanceKlass cn/edu/whu/boot/allocation/controllers/TaskController +instanceKlass cn/edu/whu/boot/allocation/controllers/RouteLineController +instanceKlass cn/edu/whu/boot/allocation/controllers/ImageController +instanceKlass cn/edu/whu/boot/allocation/controllers/DraftController +instanceKlass org/apache/coyote/UpgradeProtocol +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryAutoConfiguration$BeanPostProcessorsRegistrar +instanceKlass org/springframework/boot/web/servlet/RegistrationBean +instanceKlass org/springframework/boot/web/servlet/ServletContextInitializer +instanceKlass org/springframework/boot/autoconfigure/web/servlet/ConditionalOnMissingFilterBean +instanceKlass org/apache/tomcat/websocket/server/WsSci +instanceKlass javax/servlet/ServletContainerInitializer +instanceKlass org/apache/catalina/startup/Tomcat +instanceKlass org/springframework/boot/autoconfigure/condition/OnWebApplicationCondition$1 +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnMissingClass +instanceKlass org/springframework/core/annotation/MergedAnnotationCollectors$$Lambda$212 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/core/annotation/TypeMappedAnnotation$$Lambda$211 +instanceKlass org/springframework/core/annotation/MergedAnnotationCollectors$$Lambda$210 +instanceKlass org/springframework/core/annotation/MergedAnnotationCollectors$$Lambda$209 +instanceKlass org/springframework/core/annotation/MergedAnnotationCollectors$$Lambda$208 +instanceKlass java/util/function/Function$$Lambda$207 +instanceKlass org/springframework/core/annotation/MergedAnnotationCollectors +instanceKlass org/springframework/core/type/AnnotatedTypeMetadata$$Lambda$206 +instanceKlass org/springframework/core/type/AnnotatedTypeMetadata$$Lambda$205 +instanceKlass org/springframework/core/annotation/MergedAnnotationPredicates$UniquePredicate +instanceKlass org/springframework/core/annotation/MergedAnnotationPredicates +instanceKlass org/springframework/core/type/AnnotatedTypeMetadata$$Lambda$204 +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorGroupingHandler$$Lambda$203 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$202 +instanceKlass org/springframework/context/annotation/DeferredImportSelector$Group$Entry +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationSorter$AutoConfigurationClasses$$Lambda$201 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/autoconfigure/AutoConfigureOrder +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationSorter$$Lambda$200 +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnResource +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnProperty +instanceKlass org/springframework/boot/context/properties/ConfigurationProperties +instanceKlass org/springframework/boot/autoconfigure/AutoConfigureBefore +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean +instanceKlass javax/annotation/PostConstruct +instanceKlass org/springframework/boot/autoconfigure/AutoConfigureAfter +instanceKlass org/springframework/boot/context/properties/EnableConfigurationPropertiesRegistrar +instanceKlass org/springframework/boot/context/properties/EnableConfigurationProperties +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationSorter$AutoConfigurationClass +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationSorter$AutoConfigurationClasses +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationSorter +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$199 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$198 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$197 +instanceKlass java/util/HashMap$HashMapSpliterator +instanceKlass java/util/stream/Collectors$$Lambda$196 +instanceKlass java/util/stream/Collectors$$Lambda$195 +instanceKlass java/util/stream/Collectors$$Lambda$194 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$193 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$192 +instanceKlass java/util/ArrayList$ArrayListSpliterator +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportAutoConfigurationImportListener +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportListener +instanceKlass org/springframework/mail/javamail/JavaMailSenderImpl +instanceKlass org/springframework/mail/javamail/JavaMailSender +instanceKlass org/springframework/data/redis/connection/RedisConnectionFactory +instanceKlass org/springframework/cache/interceptor/AbstractCacheInvoker +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnWebApplication +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport$ConditionAndOutcome +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport$ConditionAndOutcomes +instanceKlass org/springframework/oxm/Unmarshaller +instanceKlass org/springframework/oxm/Marshaller +instanceKlass org/springframework/web/socket/config/annotation/WebSocketMessageBrokerConfigurer +instanceKlass javax/websocket/server/ServerContainer +instanceKlass javax/websocket/WebSocketContainer +instanceKlass org/springframework/web/multipart/support/StandardServletMultipartResolver +instanceKlass org/springframework/web/multipart/MultipartResolver +instanceKlass javax/servlet/MultipartConfigElement +instanceKlass org/springframework/web/filter/GenericFilterBean +instanceKlass javax/servlet/Filter +instanceKlass javax/servlet/GenericServlet +instanceKlass javax/servlet/ServletConfig +instanceKlass org/springframework/http/ReactiveHttpInputMessage +instanceKlass org/springframework/http/server/reactive/HttpHandler +instanceKlass org/springframework/http/client/support/HttpAccessor +instanceKlass org/springframework/web/client/RestOperations +instanceKlass javax/validation/executable/ExecutableValidator +instanceKlass org/thymeleaf/TemplateEngine +instanceKlass org/thymeleaf/spring5/ISpringTemplateEngine +instanceKlass org/thymeleaf/ITemplateEngine +instanceKlass org/springframework/scheduling/TaskScheduler +instanceKlass org/springframework/util/CustomizableThreadCreator +instanceKlass java/util/concurrent/ThreadFactory +instanceKlass org/springframework/scheduling/SchedulingTaskExecutor +instanceKlass org/springframework/core/task/AsyncListenableTaskExecutor +instanceKlass org/springframework/core/task/AsyncTaskExecutor +instanceKlass org/springframework/core/task/TaskExecutor +instanceKlass org/springframework/session/Session +instanceKlass org/springframework/http/codec/CodecConfigurer +instanceKlass org/springframework/web/servlet/config/annotation/WebMvcConfigurer +instanceKlass io/netty/buffer/AbstractByteBufAllocator +instanceKlass io/netty/buffer/ByteBufAllocator +instanceKlass org/springframework/data/web/PageableHandlerMethodArgumentResolverSupport +instanceKlass io/netty/buffer/ByteBufAllocatorMetricProvider +instanceKlass org/springframework/data/web/PageableArgumentResolver +instanceKlass org/springframework/web/method/support/HandlerMethodArgumentResolver +instanceKlass org/springframework/data/redis/repository/configuration/EnableRedisRepositories +instanceKlass org/springframework/data/redis/core/ReactiveRedisTemplate +instanceKlass org/springframework/data/redis/core/ReactiveRedisOperations +instanceKlass org/springframework/mail/MailSender +instanceKlass javax/mail/Message +instanceKlass org/springframework/data/redis/connection/ReactiveRedisConnectionFactory +instanceKlass org/springframework/dao/support/PersistenceExceptionTranslator +instanceKlass javax/mail/internet/MimePart +instanceKlass javax/mail/Part +instanceKlass reactor/core/publisher/Flux +instanceKlass reactor/core/CorePublisher +instanceKlass org/reactivestreams/Publisher +instanceKlass javax/activation/MimeType +instanceKlass org/jooq/DSLContext +instanceKlass org/springframework/data/redis/core/RedisOperations +instanceKlass org/jooq/Scope +instanceKlass javax/naming/ldap/LdapContext +instanceKlass javax/naming/directory/DirContext +instanceKlass javax/servlet/ServletRegistration +instanceKlass javax/servlet/Registration +instanceKlass org/springframework/jmx/support/MBeanRegistrationSupport +instanceKlass org/springframework/jmx/export/MBeanExportOperations +instanceKlass org/springframework/aop/framework/ProxyConfig +instanceKlass org/springframework/transaction/PlatformTransactionManager +instanceKlass org/springframework/transaction/TransactionManager +instanceKlass org/springframework/jdbc/support/JdbcAccessor +instanceKlass org/springframework/jdbc/core/JdbcOperations +instanceKlass org/springframework/cache/CacheManager +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionMessage$ItemsBuilder +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionMessage$Builder +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionMessage +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnClass +instanceKlass javax/sql/DataSource +instanceKlass java/sql/Wrapper +instanceKlass javax/sql/CommonDataSource +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$$Lambda$191 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$$Lambda$190 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup$$Lambda$189 +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorGroupingHandler$$Lambda$188 +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorGrouping +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationGroup +instanceKlass org/springframework/context/annotation/DeferredImportSelector$Group +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorHandler$$Lambda$187 +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorGroupingHandler +instanceKlass javax/servlet/ServletContext +instanceKlass org/springframework/boot/web/servlet/support/SpringBootServletInitializer$WebEnvironmentPropertySourceInitializer +instanceKlass org/springframework/boot/builder/SpringApplicationBuilder +instanceKlass org/springframework/context/annotation/AutoProxyRegistrar +instanceKlass org/springframework/cache/annotation/CachingConfigurationSelector$1 +instanceKlass org/springframework/cache/annotation/AbstractCachingConfiguration +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnSingleCandidate +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionalOnBean +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionOutcome +instanceKlass org/springframework/boot/autoconfigure/condition/OnClassCondition$ThreadedOutcomesResolver$$Lambda$186 +instanceKlass org/springframework/boot/autoconfigure/condition/OnClassCondition$ThreadedOutcomesResolver +instanceKlass org/springframework/boot/autoconfigure/condition/OnClassCondition$StandardOutcomesResolver +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationMetadataLoader$PropertiesAutoConfigurationMetadata +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationMetadata +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationMetadataLoader +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$ConfigurationClassFilter +instanceKlass org/springframework/boot/autoconfigure/condition/OnClassCondition$OutcomesResolver +instanceKlass org/springframework/boot/autoconfigure/condition/OnBeanCondition$Spec +instanceKlass org/springframework/boot/autoconfigure/condition/SpringBootCondition +instanceKlass org/springframework/context/annotation/ConfigurationCondition +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportFilter +instanceKlass org/springframework/scheduling/annotation/AbstractAsyncConfiguration +instanceKlass org/springframework/context/annotation/ImportAware +instanceKlass org/springframework/scheduling/annotation/AsyncConfigurationSelector$1 +instanceKlass java/util/function/Predicate$$Lambda$185 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$$Lambda$184 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector$AutoConfigurationEntry +instanceKlass org/springframework/context/annotation/ConfigurationMethod +instanceKlass org/springframework/core/annotation/MergedAnnotationsCollection$AnnotationsSpliterator +instanceKlass org/springframework/core/type/classreading/MergedAnnotationReadingVisitor$ArrayVisitor$$Lambda$183 +instanceKlass org/springframework/scheduling/annotation/Schedules +instanceKlass org/springframework/scheduling/annotation/Scheduled +instanceKlass org/springframework/messaging/handler/annotation/SendTo +instanceKlass org/springframework/messaging/handler/annotation/MessageMapping +instanceKlass org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration +instanceKlass org/springframework/web/socket/config/annotation/EnableWebSocketMessageBroker +instanceKlass org/springframework/scheduling/annotation/SchedulingConfiguration +instanceKlass org/springframework/scheduling/annotation/EnableScheduling +instanceKlass org/springframework/web/bind/annotation/ExceptionHandler +instanceKlass org/springframework/web/bind/annotation/ControllerAdvice +instanceKlass java/lang/Deprecated +instanceKlass org/aspectj/lang/annotation/Pointcut +instanceKlass org/aspectj/lang/annotation/Aspect +instanceKlass org/springframework/beans/factory/annotation/Autowired +instanceKlass org/springframework/transaction/annotation/Transactional +instanceKlass org/springframework/stereotype/Service +instanceKlass org/apache/ibatis/annotations/Insert +instanceKlass org/apache/ibatis/annotations/Update +instanceKlass org/apache/ibatis/annotations/Delete +instanceKlass org/springframework/core/type/classreading/MergedAnnotationReadingVisitor$$Lambda$182 +instanceKlass org/apache/ibatis/annotations/Options +instanceKlass org/apache/ibatis/type/TypeReference +instanceKlass org/apache/ibatis/type/TypeHandler +instanceKlass org/apache/ibatis/annotations/Many +instanceKlass org/apache/ibatis/annotations/One +instanceKlass org/apache/ibatis/annotations/Result +instanceKlass org/springframework/core/type/classreading/MergedAnnotationReadingVisitor$ArrayVisitor$$Lambda$181 +instanceKlass org/apache/ibatis/annotations/Results +instanceKlass org/apache/ibatis/annotations/Select +instanceKlass org/springframework/beans/factory/annotation/Lookup +instanceKlass org/springframework/stereotype/Repository +instanceKlass org/springframework/validation/annotation/Validated +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$180 +instanceKlass org/springframework/core/type/classreading/SimpleMethodMetadataReadingVisitor$Source +instanceKlass org/springframework/core/type/classreading/SimpleMethodMetadataReadingVisitor$$Lambda$179 +instanceKlass org/springframework/core/type/classreading/SimpleMethodMetadataReadingVisitor$$Lambda$178 +instanceKlass org/springframework/web/bind/annotation/Mapping +instanceKlass org/springframework/web/bind/annotation/RequestMapping +instanceKlass org/springframework/web/bind/annotation/ResponseBody +instanceKlass org/springframework/stereotype/Controller +instanceKlass org/springframework/web/bind/annotation/RestController +instanceKlass org/springframework/core/type/classreading/SimpleAnnotationMetadata +instanceKlass org/springframework/core/annotation/MergedAnnotationsCollection +instanceKlass org/springframework/core/type/classreading/SimpleAnnotationMetadataReadingVisitor$$Lambda$177 +instanceKlass org/springframework/core/type/classreading/SimpleMethodMetadata +instanceKlass org/springframework/core/type/MethodMetadata +instanceKlass org/springframework/core/type/classreading/MergedAnnotationReadingVisitor$$Lambda$176 +instanceKlass org/springframework/core/annotation/TypeMappedAnnotation$$Lambda$175 +instanceKlass org/springframework/asm/Type +instanceKlass org/springframework/asm/AnnotationVisitor +instanceKlass org/springframework/core/type/classreading/SimpleAnnotationMetadataReadingVisitor$$Lambda$174 +instanceKlass org/springframework/core/type/classreading/SimpleAnnotationMetadataReadingVisitor$$Lambda$173 +instanceKlass org/springframework/core/type/classreading/SimpleAnnotationMetadataReadingVisitor$Source +instanceKlass org/springframework/asm/Context +instanceKlass org/springframework/asm/Attribute +instanceKlass sun/nio/ch/IOStatus +instanceKlass java/nio/DirectByteBuffer$Deallocator +instanceKlass sun/nio/ch/Util$BufferCache +instanceKlass sun/nio/ch/Util$2 +instanceKlass sun/nio/ch/Util +instanceKlass sun/nio/ch/NativeThread +instanceKlass java/nio/channels/spi/AbstractInterruptibleChannel$1 +instanceKlass org/springframework/asm/ClassReader +instanceKlass java/nio/channels/Channels +instanceKlass sun/nio/ch/FileDispatcherImpl$1 +instanceKlass sun/nio/ch/NativeDispatcher +instanceKlass sun/nio/ch/NativeThreadSet +instanceKlass sun/nio/ch/IOUtil$1 +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 sun/nio/fs/NativeBuffer$Deallocator +instanceKlass sun/nio/fs/NativeBuffer +instanceKlass sun/nio/fs/NativeBuffers +instanceKlass sun/nio/fs/WindowsNativeDispatcher$BackupResult +instanceKlass sun/nio/fs/WindowsNativeDispatcher$CompletionStatus +instanceKlass sun/nio/fs/WindowsNativeDispatcher$AclInformation +instanceKlass sun/nio/fs/WindowsNativeDispatcher$Account +instanceKlass sun/nio/fs/WindowsNativeDispatcher$DiskFreeSpace +instanceKlass sun/nio/fs/WindowsNativeDispatcher$VolumeInformation +instanceKlass sun/nio/fs/WindowsNativeDispatcher$FirstStream +instanceKlass sun/nio/fs/WindowsNativeDispatcher$FirstFile +instanceKlass sun/nio/fs/WindowsNativeDispatcher$1 +instanceKlass sun/nio/fs/WindowsNativeDispatcher +instanceKlass sun/nio/fs/WindowsChannelFactory$Flags +instanceKlass sun/nio/fs/WindowsChannelFactory$1 +instanceKlass sun/nio/fs/WindowsChannelFactory +instanceKlass sun/nio/fs/WindowsSecurityDescriptor +instanceKlass java/nio/file/attribute/FileAttribute +instanceKlass java/nio/file/Files +instanceKlass java/nio/file/OpenOption +instanceKlass org/springframework/asm/MethodVisitor +instanceKlass org/springframework/core/type/classreading/SimpleMetadataReader +instanceKlass sun/nio/fs/AbstractPath +instanceKlass sun/nio/fs/Util +instanceKlass sun/nio/fs/WindowsPathParser$Result +instanceKlass sun/nio/fs/WindowsPathParser +instanceKlass java/nio/file/FileSystem +instanceKlass java/nio/file/spi/FileSystemProvider +instanceKlass sun/nio/fs/DefaultFileSystemProvider +instanceKlass java/nio/file/FileSystems$DefaultFileSystemHolder$1 +instanceKlass java/nio/file/FileSystems$DefaultFileSystemHolder +instanceKlass java/nio/file/FileSystems +instanceKlass org/springframework/util/AntPathMatcher$AntPathStringMatcher +instanceKlass org/springframework/core/io/support/PathMatchingResourcePatternResolver$$Lambda$172 +instanceKlass org/springframework/context/annotation/ParserStrategyUtils +instanceKlass org/springframework/context/annotation/ComponentScanAnnotationParser$2 +instanceKlass org/springframework/context/annotation/PropertySource +instanceKlass org/springframework/context/annotation/PropertySources +instanceKlass org/springframework/context/annotation/ConfigurationClass +instanceKlass org/springframework/context/annotation/ComponentScanAnnotationParser +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$SourceClass +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorHandler +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$$Lambda$171 +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$DeferredImportSelectorHolder +instanceKlass org/springframework/context/annotation/ConfigurationClassParser$$Lambda$170 +instanceKlass org/springframework/core/io/support/DefaultPropertySourceFactory +instanceKlass org/springframework/context/annotation/ImportRegistry +instanceKlass org/springframework/beans/factory/parsing/Problem +instanceKlass org/springframework/core/io/support/PropertySourceFactory +instanceKlass org/springframework/context/annotation/ConfigurationClassParser +instanceKlass org/springframework/context/annotation/ConfigurationClassPostProcessor$$Lambda$169 +instanceKlass org/springframework/core/annotation/AnnotationUtils +instanceKlass org/springframework/context/annotation/Bean +instanceKlass org/springframework/beans/BeanMetadataAttribute +instanceKlass org/springframework/aop/framework/AopInfrastructureBean +instanceKlass org/springframework/context/annotation/ImportResource +instanceKlass org/springframework/core/Conventions +instanceKlass org/springframework/context/annotation/ConfigurationClassUtils +instanceKlass org/springframework/beans/AbstractNestablePropertyAccessor$PropertyTokenHolder +instanceKlass org/springframework/beans/factory/config/TypedStringValue +instanceKlass org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader +instanceKlass org/springframework/core/convert/Property +instanceKlass org/springframework/core/SerializableTypeWrapper$MethodInvokeTypeProvider +instanceKlass java/lang/reflect/Proxy$1 +instanceKlass java/lang/reflect/Proxy$KeyX +instanceKlass org/springframework/core/SerializableTypeWrapper$TypeProxyInvocationHandler +instanceKlass org/springframework/core/GraalDetector +instanceKlass org/springframework/core/SerializableTypeWrapper$MethodParameterTypeProvider +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/core/MethodParameter$$Lambda$168 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/core/MethodParameter +instanceKlass org/springframework/core/BridgeMethodResolver +instanceKlass java/beans/SimpleBeanInfo +instanceKlass java/util/TreeMap$PrivateEntryIterator +instanceKlass com/sun/beans/WildcardTypeImpl +instanceKlass sun/reflect/generics/tree/MethodTypeSignature +instanceKlass com/sun/beans/TypeResolver +instanceKlass java/beans/MethodRef +instanceKlass com/sun/beans/util/Cache$CacheEntry +instanceKlass com/sun/beans/util/Cache +instanceKlass com/sun/beans/finder/AbstractFinder +instanceKlass com/sun/beans/finder/ClassFinder +instanceKlass org/springframework/beans/ExtendedBeanInfo +instanceKlass java/beans/BeanInfo +instanceKlass org/springframework/beans/ExtendedBeanInfoFactory +instanceKlass org/springframework/beans/BeanInfoFactory +instanceKlass org/springframework/beans/CachedIntrospectionResults +instanceKlass org/springframework/beans/PropertyAccessorUtils +instanceKlass org/springframework/beans/factory/support/DefaultSingletonBeanRegistry$$Lambda$167 +instanceKlass org/springframework/beans/factory/support/DefaultSingletonBeanRegistry$$Lambda$166 +instanceKlass org/springframework/beans/factory/support/DisposableBeanAdapter +instanceKlass org/springframework/expression/spel/support/StandardTypeConverter +instanceKlass org/springframework/expression/spel/support/StandardTypeLocator +instanceKlass org/springframework/context/expression/BeanFactoryResolver +instanceKlass org/springframework/context/expression/EnvironmentAccessor +instanceKlass org/springframework/context/expression/MapAccessor +instanceKlass org/springframework/expression/spel/CompilablePropertyAccessor +instanceKlass org/springframework/asm/Opcodes +instanceKlass org/springframework/context/expression/BeanFactoryAccessor +instanceKlass org/springframework/expression/spel/support/ReflectivePropertyAccessor +instanceKlass org/springframework/context/expression/BeanExpressionContextAccessor +instanceKlass org/springframework/expression/TypedValue +instanceKlass org/springframework/expression/spel/support/StandardOperatorOverloader +instanceKlass org/springframework/expression/spel/support/StandardTypeComparator +instanceKlass org/springframework/expression/OperatorOverloader +instanceKlass org/springframework/expression/TypeComparator +instanceKlass org/springframework/expression/spel/support/StandardEvaluationContext +instanceKlass org/springframework/expression/common/LiteralExpression +instanceKlass org/springframework/beans/factory/config/AutowiredPropertyMarker +instanceKlass org/springframework/beans/factory/support/BeanDefinitionValueResolver +instanceKlass org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory$$Lambda$165 +instanceKlass org/springframework/beans/AbstractNestablePropertyAccessor$PropertyHandler +instanceKlass org/springframework/beans/factory/parsing/PassThroughSourceExtractor +instanceKlass org/springframework/beans/factory/support/AbstractBeanFactory$$Lambda$164 +instanceKlass org/springframework/beans/factory/support/NullBean +instanceKlass org/springframework/beans/factory/BeanFactoryUtils$$Lambda$163 +instanceKlass org/springframework/core/annotation/AnnotationAttributes$$Lambda$162 +instanceKlass org/springframework/core/annotation/TypeMappedAnnotation$$Lambda$161 +instanceKlass org/springframework/beans/factory/config/RuntimeBeanReference +instanceKlass org/springframework/beans/factory/config/BeanReference +instanceKlass org/springframework/beans/MutablePropertyValues +instanceKlass org/springframework/beans/factory/support/BeanDefinitionBuilder +instanceKlass org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor$$Lambda$160 +instanceKlass org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer$SharedMetadataReaderFactoryBean +instanceKlass org/springframework/context/support/PostProcessorRegistrationDelegate +instanceKlass org/springframework/boot/web/servlet/context/ServletWebServerApplicationContext$ExistingWebApplicationScopes$$Lambda$159 +instanceKlass org/springframework/web/context/support/WebApplicationContextUtils$WebRequestObjectFactory +instanceKlass org/springframework/web/context/request/WebRequest +instanceKlass org/springframework/web/context/request/RequestAttributes +instanceKlass org/springframework/web/context/support/WebApplicationContextUtils$SessionObjectFactory +instanceKlass javax/servlet/http/HttpSession +instanceKlass org/springframework/web/context/support/WebApplicationContextUtils$ResponseObjectFactory +instanceKlass javax/servlet/ServletResponse +instanceKlass org/springframework/web/context/support/WebApplicationContextUtils$RequestObjectFactory +instanceKlass javax/servlet/ServletRequest +instanceKlass org/springframework/web/context/request/AbstractRequestAttributesScope +instanceKlass org/springframework/boot/web/servlet/context/ServletWebServerApplicationContext$ExistingWebApplicationScopes +instanceKlass org/springframework/web/context/ServletContextAware +instanceKlass org/springframework/web/context/support/ServletContextAwareProcessor +instanceKlass org/springframework/context/support/ApplicationListenerDetector +instanceKlass org/springframework/context/MessageSourceAware +instanceKlass org/springframework/context/ApplicationEventPublisherAware +instanceKlass org/springframework/beans/factory/config/BeanExpressionContext +instanceKlass org/springframework/beans/factory/config/EmbeddedValueResolver +instanceKlass org/springframework/util/StringValueResolver +instanceKlass org/springframework/context/support/ApplicationContextAwareProcessor +instanceKlass org/springframework/beans/support/ResourceEditorRegistrar +instanceKlass org/springframework/expression/spel/SpelParserConfiguration +instanceKlass org/springframework/expression/Expression +instanceKlass org/springframework/expression/common/TemplateAwareExpressionParser +instanceKlass org/springframework/context/expression/StandardBeanExpressionResolver$1 +instanceKlass org/springframework/expression/EvaluationContext +instanceKlass org/springframework/expression/TypeConverter +instanceKlass org/springframework/expression/TypeLocator +instanceKlass org/springframework/expression/BeanResolver +instanceKlass org/springframework/expression/PropertyAccessor +instanceKlass org/springframework/expression/ExpressionParser +instanceKlass org/springframework/expression/ParserContext +instanceKlass org/springframework/context/expression/StandardBeanExpressionResolver +instanceKlass org/springframework/web/context/request/RequestContextHolder +instanceKlass org/springframework/web/context/support/WebApplicationContextUtils +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$PropertySourceOrderingPostProcessor +instanceKlass org/springframework/boot/logging/DeferredLog$1 +instanceKlass org/springframework/beans/factory/support/BeanDefinitionReaderUtils +instanceKlass org/springframework/context/annotation/Description +instanceKlass org/springframework/context/annotation/Role +instanceKlass org/springframework/context/annotation/DependsOn +instanceKlass org/springframework/context/annotation/Primary +instanceKlass org/springframework/context/annotation/Lazy +instanceKlass java/beans/FeatureDescriptor +instanceKlass com/sun/beans/WeakCache +instanceKlass java/beans/Introspector +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$158 +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$157 +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$156 +instanceKlass org/springframework/context/annotation/AnnotationBeanNameGenerator$$Lambda$155 +instanceKlass org/springframework/core/annotation/AbstractMergedAnnotation$$Lambda$154 +instanceKlass org/springframework/core/annotation/TypeMappedAnnotation$$Lambda$153 +instanceKlass java/util/stream/Collectors$$Lambda$152 +instanceKlass java/util/stream/Collectors$$Lambda$151 +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$150 +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$149 +instanceKlass org/springframework/core/type/AnnotationMetadata$$Lambda$148 +instanceKlass org/springframework/core/annotation/TypeMappedAnnotations$Aggregate +instanceKlass org/springframework/core/annotation/TypeMappedAnnotations$AggregatesCollector +instanceKlass org/springframework/core/annotation/TypeMappedAnnotations$AggregatesSpliterator +instanceKlass org/springframework/core/annotation/AnnotationTypeMappings$$Lambda$147 +instanceKlass org/springframework/context/annotation/ScopeMetadata +instanceKlass org/springframework/context/annotation/AdviceModeImportSelector +instanceKlass org/mybatis/spring/annotation/MapperScannerRegistrar +instanceKlass org/springframework/context/annotation/Conditional +instanceKlass org/springframework/core/type/StandardClassMetadata +instanceKlass org/springframework/core/type/AnnotationMetadata +instanceKlass org/springframework/core/type/ClassMetadata +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationPackages$Registrar +instanceKlass org/springframework/boot/context/annotation/DeterminableImports +instanceKlass org/springframework/context/annotation/ImportBeanDefinitionRegistrar +instanceKlass org/springframework/context/annotation/ComponentScans +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationImportSelector +instanceKlass org/springframework/context/annotation/DeferredImportSelector +instanceKlass org/springframework/context/annotation/ImportSelector +instanceKlass org/springframework/core/annotation/AnnotationTypeMapping$$Lambda$146 +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationExcludeFilter +instanceKlass org/springframework/boot/context/TypeExcludeFilter +instanceKlass java/lang/annotation/Repeatable +instanceKlass org/springframework/boot/autoconfigure/AutoConfigurationPackage +instanceKlass sun/reflect/ClassDefiner$1 +instanceKlass sun/reflect/ClassDefiner +instanceKlass sun/reflect/MethodAccessorGenerator$1 +instanceKlass sun/reflect/Label$PatchInfo +instanceKlass sun/reflect/Label +instanceKlass sun/reflect/UTF8 +instanceKlass sun/reflect/ClassFileAssembler +instanceKlass sun/reflect/ByteVectorImpl +instanceKlass sun/reflect/ByteVector +instanceKlass sun/reflect/ByteVectorFactory +instanceKlass sun/reflect/AccessorGenerator +instanceKlass sun/reflect/ClassFileConstants +instanceKlass org/springframework/context/annotation/Configuration +instanceKlass org/springframework/context/annotation/ComponentScan$Filter +instanceKlass org/springframework/core/annotation/AnnotationTypeMapping$$Lambda$145 +instanceKlass org/springframework/cache/annotation/EnableCaching +instanceKlass org/springframework/scheduling/annotation/EnableAsync +instanceKlass org/springframework/context/annotation/Import +instanceKlass org/springframework/dao/support/DaoSupport +instanceKlass org/springframework/beans/factory/InitializingBean +instanceKlass org/mybatis/spring/annotation/MapperScan +instanceKlass org/springframework/context/annotation/ComponentScan +instanceKlass org/springframework/boot/autoconfigure/EnableAutoConfiguration +instanceKlass org/springframework/boot/SpringBootConfiguration +instanceKlass org/springframework/boot/autoconfigure/SpringBootApplication +instanceKlass org/springframework/core/annotation/TypeMappedAnnotations$IsPresent +instanceKlass org/springframework/util/xml/XmlValidationModeDetector +instanceKlass org/springframework/util/xml/SimpleSaxErrorHandler +instanceKlass org/springframework/beans/factory/xml/DefaultDocumentLoader +instanceKlass org/springframework/beans/factory/parsing/NullSourceExtractor +instanceKlass org/springframework/beans/factory/parsing/EmptyReaderEventListener +instanceKlass org/springframework/beans/factory/parsing/FailFastProblemReporter +instanceKlass org/springframework/beans/factory/xml/DefaultBeanDefinitionDocumentReader +instanceKlass org/springframework/beans/factory/xml/BeanDefinitionDocumentReader +instanceKlass org/springframework/beans/factory/support/DefaultBeanNameGenerator +instanceKlass org/springframework/core/Constants +instanceKlass org/springframework/beans/factory/xml/NamespaceHandlerResolver +instanceKlass org/xml/sax/ErrorHandler +instanceKlass org/springframework/beans/factory/xml/DocumentLoader +instanceKlass org/springframework/beans/factory/parsing/SourceExtractor +instanceKlass org/springframework/beans/factory/parsing/ReaderEventListener +instanceKlass org/springframework/beans/factory/parsing/ProblemReporter +instanceKlass org/springframework/beans/factory/support/AbstractBeanDefinitionReader +instanceKlass org/springframework/beans/factory/support/BeanDefinitionReader +instanceKlass org/springframework/boot/BeanDefinitionLoader +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$144 +instanceKlass ch/qos/logback/core/pattern/SpacePadder +instanceKlass java/text/DontCareFieldPosition$1 +instanceKlass java/text/Format$FieldDelegate +instanceKlass ch/qos/logback/classic/util/LogbackMDCAdapter +instanceKlass org/slf4j/impl/StaticMDCBinder +instanceKlass org/slf4j/spi/MDCAdapter +instanceKlass org/slf4j/MDC +instanceKlass ch/qos/logback/classic/spi/EventArgUtil +instanceKlass ch/qos/logback/classic/spi/IThrowableProxy +instanceKlass ch/qos/logback/classic/spi/LoggingEvent +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$143 +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$142 +instanceKlass org/springframework/boot/system/ApplicationHome +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$141 +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$140 +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$139 +instanceKlass java/util/concurrent/Callable +instanceKlass org/springframework/core/log/LogMessage +instanceKlass org/springframework/boot/StartupInfoLogger$$Lambda$138 +instanceKlass org/springframework/boot/StartupInfoLogger +instanceKlass org/springframework/beans/factory/FactoryBean +instanceKlass org/springframework/beans/factory/BeanFactoryUtils +instanceKlass org/springframework/boot/autoconfigure/logging/ConditionEvaluationReportLoggingListener$ConditionEvaluationReportListener +instanceKlass org/springframework/boot/rsocket/context/RSocketPortInfoApplicationContextInitializer$Listener +instanceKlass org/springframework/boot/context/ConfigurationWarningsApplicationContextInitializer$ComponentScanPackageCheck +instanceKlass org/springframework/boot/context/ConfigurationWarningsApplicationContextInitializer$Check +instanceKlass org/springframework/boot/context/ConfigurationWarningsApplicationContextInitializer$ConfigurationWarningsPostProcessor +instanceKlass org/springframework/boot/context/ContextIdApplicationContextInitializer$ContextId +instanceKlass org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer$CachingMetadataReaderFactoryPostProcessor +instanceKlass org/springframework/beans/factory/support/DefaultListableBeanFactory$$Lambda$137 +instanceKlass org/springframework/beans/factory/support/DefaultListableBeanFactory$$Lambda$136 +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport$AncestorsMatchedCondition +instanceKlass org/springframework/context/annotation/Condition +instanceKlass org/springframework/boot/autoconfigure/condition/ConditionEvaluationReport +instanceKlass org/springframework/validation/BindingResult +instanceKlass org/springframework/validation/Errors +instanceKlass org/springframework/boot/diagnostics/AbstractFailureAnalyzer +instanceKlass org/springframework/boot/diagnostics/FailureAnalyzer +instanceKlass org/springframework/boot/diagnostics/FailureAnalyzers +instanceKlass org/springframework/boot/SpringBootExceptionReporter +instanceKlass org/springframework/context/index/CandidateComponentsIndexLoader$$Lambda$135 +instanceKlass org/springframework/context/index/CandidateComponentsIndex +instanceKlass org/springframework/context/index/CandidateComponentsIndexLoader +instanceKlass org/springframework/core/io/DefaultResourceLoader$$Lambda$134 +instanceKlass org/springframework/core/type/classreading/MetadataReader +instanceKlass org/springframework/core/type/classreading/SimpleMetadataReaderFactory +instanceKlass org/springframework/core/io/support/ResourcePatternUtils +instanceKlass javax/annotation/ManagedBean +instanceKlass java/lang/Package$1 +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer$CharsetInitializer +instanceKlass org/springframework/stereotype/Indexed +instanceKlass org/springframework/stereotype/Component +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer$JacksonInitializer +instanceKlass org/springframework/core/type/filter/AbstractTypeHierarchyTraversingFilter +instanceKlass org/springframework/core/type/filter/TypeFilter +instanceKlass org/springframework/http/converter/json/Jackson2ObjectMapperBuilder$$Lambda$133 +instanceKlass org/springframework/http/converter/json/Jackson2ObjectMapperBuilder$$Lambda$132 +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass org/springframework/beans/factory/support/BeanDefinitionDefaults +instanceKlass org/springframework/http/converter/json/Jackson2ObjectMapperBuilder$$Lambda$131 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/core/type/classreading/MetadataReaderFactory +instanceKlass com/fasterxml/jackson/databind/deser/ValueInstantiators$Base +instanceKlass org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider +instanceKlass org/springframework/context/event/DefaultEventListenerFactory +instanceKlass org/springframework/context/event/EventListenerFactory +instanceKlass org/springframework/context/event/EventListenerMethodProcessor +instanceKlass org/springframework/beans/factory/SmartInitializingSingleton +instanceKlass org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor +instanceKlass org/springframework/beans/factory/config/DestructionAwareBeanPostProcessor +instanceKlass com/fasterxml/jackson/databind/util/ArrayBuilders +instanceKlass org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessorAdapter +instanceKlass org/springframework/beans/factory/config/SmartInstantiationAwareBeanPostProcessor +instanceKlass org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor +instanceKlass org/springframework/beans/factory/support/MergedBeanDefinitionPostProcessor +instanceKlass org/springframework/beans/factory/config/BeanDefinitionHolder +instanceKlass org/springframework/beans/factory/support/DefaultListableBeanFactory$$Lambda$130 +instanceKlass org/springframework/beans/factory/support/DefaultListableBeanFactory$$Lambda$129 +instanceKlass com/fasterxml/jackson/databind/ObjectMapper$1 +instanceKlass org/springframework/beans/factory/support/MethodOverrides +instanceKlass com/fasterxml/jackson/datatype/jdk8/PackageVersion +instanceKlass org/springframework/context/annotation/ConfigurationClassPostProcessor +instanceKlass org/springframework/context/EnvironmentAware +instanceKlass org/springframework/context/ResourceLoaderAware +instanceKlass org/springframework/beans/factory/support/BeanDefinitionRegistryPostProcessor +instanceKlass com/fasterxml/jackson/databind/module/SimpleKeyDeserializers +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/ZonedDateTimeSerializer$$Lambda$128 +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/ZonedDateTimeSerializer$$Lambda$127 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/ZonedDateTimeSerializer$$Lambda$126 +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/OffsetDateTimeSerializer$$Lambda$125 +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/OffsetDateTimeSerializer$$Lambda$124 +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/OffsetDateTimeSerializer$$Lambda$123 +instanceKlass org/springframework/beans/factory/annotation/Qualifier +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/beans/factory/annotation/Value +instanceKlass org/springframework/aop/TargetSource +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/InstantSerializer$$Lambda$122 +instanceKlass java/util/function/ToIntFunction +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/InstantSerializer$$Lambda$121 +instanceKlass com/fasterxml/jackson/datatype/jsr310/ser/InstantSerializer$$Lambda$120 +instanceKlass java/util/function/ToLongFunction +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass com/fasterxml/jackson/databind/ser/Serializers$Base +instanceKlass javax/annotation/Resource +instanceKlass org/springframework/context/annotation/AnnotationConfigUtils +instanceKlass org/springframework/context/annotation/ConditionEvaluator$ConditionContextImpl +instanceKlass org/springframework/context/annotation/ConditionContext +instanceKlass com/fasterxml/jackson/databind/type/ClassKey +instanceKlass org/springframework/context/annotation/ConditionEvaluator +instanceKlass com/fasterxml/jackson/databind/deser/Deserializers$Base +instanceKlass org/springframework/context/annotation/Scope +instanceKlass org/springframework/context/annotation/AnnotationScopeMetadataResolver +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$119 +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$118 +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$117 +instanceKlass org/springframework/context/annotation/AnnotationBeanNameGenerator +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$116 +instanceKlass org/springframework/beans/factory/annotation/AnnotatedBeanDefinition +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$115 +instanceKlass org/springframework/core/type/AnnotatedTypeMetadata +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$114 +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$113 +instanceKlass org/springframework/context/annotation/ScopeMetadataResolver +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$112 +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$111 +instanceKlass org/springframework/beans/factory/support/BeanNameGenerator +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$110 +instanceKlass org/springframework/context/annotation/AnnotatedBeanDefinitionReader +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$FromDecimalArguments +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$109 +instanceKlass org/springframework/beans/factory/support/SimpleAutowireCandidateResolver +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$FromIntegerArguments +instanceKlass org/springframework/beans/factory/BeanNameAware +instanceKlass com/fasterxml/jackson/datatype/jsr310/deser/InstantDeserializer$$Lambda$108 +instanceKlass org/springframework/asm/ClassVisitor +instanceKlass org/springframework/core/LocalVariableTableParameterNameDiscoverer +instanceKlass org/springframework/core/StandardReflectionParameterNameDiscoverer +instanceKlass org/springframework/core/PrioritizedParameterNameDiscoverer +instanceKlass org/springframework/beans/factory/support/SimpleInstantiationStrategy +instanceKlass com/fasterxml/jackson/core/Version +instanceKlass com/fasterxml/jackson/core/util/VersionUtil +instanceKlass com/fasterxml/jackson/datatype/jsr310/PackageVersion +instanceKlass org/springframework/beans/factory/ObjectProvider +instanceKlass org/springframework/beans/factory/ObjectFactory +instanceKlass org/springframework/core/OrderComparator$OrderSourceProvider +instanceKlass org/springframework/beans/factory/support/AutowireCandidateResolver +instanceKlass org/springframework/core/AttributeAccessorSupport +instanceKlass org/springframework/beans/factory/InjectionPoint +instanceKlass org/springframework/beans/PropertyValues +instanceKlass org/springframework/util/ReflectionUtils$MethodCallback +instanceKlass org/springframework/beans/BeanWrapper +instanceKlass org/springframework/beans/ConfigurablePropertyAccessor +instanceKlass org/springframework/beans/PropertyAccessor +instanceKlass org/springframework/core/ParameterNameDiscoverer +instanceKlass org/springframework/beans/factory/support/InstantiationStrategy +instanceKlass org/springframework/beans/factory/DisposableBean +instanceKlass com/fasterxml/jackson/databind/type/TypeModifier +instanceKlass com/fasterxml/jackson/databind/ser/BeanSerializerModifier +instanceKlass com/fasterxml/jackson/databind/ser/Serializers +instanceKlass com/fasterxml/jackson/databind/cfg/SerializerFactoryConfig +instanceKlass org/springframework/core/SimpleAliasRegistry +instanceKlass com/fasterxml/jackson/databind/ser/std/StdJdkSerializers +instanceKlass org/springframework/beans/factory/config/Scope +instanceKlass org/springframework/beans/factory/config/ConfigurableListableBeanFactory +instanceKlass org/springframework/beans/factory/config/ConfigurableBeanFactory +instanceKlass org/springframework/beans/factory/config/SingletonBeanRegistry +instanceKlass org/springframework/beans/factory/config/BeanDefinition +instanceKlass org/springframework/beans/BeanMetadataElement +instanceKlass org/springframework/core/AttributeAccessor +instanceKlass org/springframework/context/LifecycleProcessor +instanceKlass org/springframework/core/SmartClassLoader +instanceKlass org/springframework/beans/factory/config/BeanPostProcessor +instanceKlass org/springframework/beans/PropertyEditorRegistrar +instanceKlass org/springframework/beans/factory/config/BeanExpressionResolver +instanceKlass com/fasterxml/jackson/databind/ser/std/NumberSerializers +instanceKlass org/springframework/beans/factory/config/AutowireCapableBeanFactory +instanceKlass org/springframework/beans/factory/support/BeanDefinitionRegistry +instanceKlass org/springframework/core/AliasRegistry +instanceKlass org/springframework/ui/context/ThemeSource +instanceKlass org/springframework/boot/web/context/ConfigurableWebServerApplicationContext +instanceKlass org/springframework/boot/web/context/WebServerApplicationContext +instanceKlass org/springframework/context/annotation/AnnotationConfigRegistry +instanceKlass org/springframework/boot/SpringApplicationBannerPrinter$PrintedBanner +instanceKlass java/io/Console$2 +instanceKlass sun/misc/JavaIOAccess +instanceKlass java/io/Console$1 +instanceKlass java/io/Console +instanceKlass org/springframework/boot/SpringBootVersion +instanceKlass org/springframework/core/io/ContextResource +instanceKlass org/springframework/boot/SpringApplicationBannerPrinter$Banners +instanceKlass org/springframework/boot/SpringBootBanner +instanceKlass org/springframework/boot/Banner +instanceKlass org/springframework/boot/SpringApplicationBannerPrinter +instanceKlass org/springframework/boot/EnvironmentConverter +instanceKlass org/springframework/boot/context/properties/bind/Bindable$$Lambda$107 +instanceKlass org/springframework/boot/context/properties/bind/Bindable$$Lambda$106 +instanceKlass org/springframework/boot/context/logging/LoggingApplicationListener$$Lambda$105 +instanceKlass org/springframework/boot/context/logging/LoggingApplicationListener$$Lambda$104 +instanceKlass java/util/RegularEnumSet$EnumSetIterator +instanceKlass java/util/stream/Sink$ChainedInt +instanceKlass org/springframework/boot/convert/LenientObjectToEnumConverterFactory$LenientToEnumConverter$$Lambda$103 +instanceKlass org/springframework/boot/convert/LenientObjectToEnumConverterFactory$LenientToEnumConverter$$Lambda$102 +instanceKlass java/util/function/IntUnaryOperator +instanceKlass org/springframework/boot/convert/LenientObjectToEnumConverterFactory$LenientToEnumConverter$$Lambda$101 +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass org/springframework/boot/context/properties/bind/MapBinder$EntryBinder$$Lambda$100 +instanceKlass com/fasterxml/jackson/databind/deser/DeserializerCache +instanceKlass org/springframework/boot/convert/LenientObjectToEnumConverterFactory$LenientToEnumConverter +instanceKlass org/springframework/boot/convert/LenientObjectToEnumConverterFactory$$Lambda$99 +instanceKlass org/springframework/boot/context/logging/LoggingApplicationListener$$Lambda$98 +instanceKlass org/springframework/boot/context/logging/LoggingApplicationListener$$Lambda$97 +instanceKlass com/fasterxml/jackson/databind/KeyDeserializer +instanceKlass com/fasterxml/jackson/databind/deser/std/StdKeyDeserializers +instanceKlass org/springframework/boot/context/properties/bind/MapBinder$EntryBinder +instanceKlass com/fasterxml/jackson/databind/deser/KeyDeserializers +instanceKlass com/fasterxml/jackson/databind/deser/ValueInstantiators +instanceKlass org/springframework/boot/context/properties/bind/MapBinder$$Lambda$96 +instanceKlass com/fasterxml/jackson/databind/AbstractTypeResolver +instanceKlass com/fasterxml/jackson/databind/deser/BeanDeserializerModifier +instanceKlass com/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig +instanceKlass ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator +instanceKlass com/fasterxml/jackson/databind/PropertyName +instanceKlass ch/qos/logback/core/pattern/ConverterUtil +instanceKlass com/fasterxml/jackson/databind/deser/Deserializers +instanceKlass ch/qos/logback/classic/pattern/Abbreviator +instanceKlass com/fasterxml/jackson/annotation/ObjectIdGenerator +instanceKlass ch/qos/logback/core/pattern/FormatInfo +instanceKlass ch/qos/logback/core/pattern/util/AsIsEscapeUtil +instanceKlass ch/qos/logback/core/pattern/parser/OptionTokenizer +instanceKlass ch/qos/logback/core/pattern/parser/TokenStream$1 +instanceKlass ch/qos/logback/core/pattern/util/RestrictedEscapeUtil +instanceKlass ch/qos/logback/core/pattern/parser/TokenStream +instanceKlass ch/qos/logback/core/pattern/util/RegularEscapeUtil +instanceKlass ch/qos/logback/classic/pattern/EnsureExceptionHandling +instanceKlass com/fasterxml/jackson/databind/deser/ResolvableDeserializer +instanceKlass ch/qos/logback/core/pattern/parser/Token +instanceKlass ch/qos/logback/core/pattern/parser/Node +instanceKlass ch/qos/logback/core/pattern/util/IEscapeUtil +instanceKlass com/fasterxml/jackson/databind/deser/ValueInstantiator$Gettable +instanceKlass ch/qos/logback/core/pattern/PostCompileProcessor +instanceKlass java/util/Vector$Itr +instanceKlass ch/qos/logback/core/subst/NodeToStringTransformer$1 +instanceKlass ch/qos/logback/core/CoreConstants +instanceKlass ch/qos/logback/core/subst/Node +instanceKlass ch/qos/logback/core/subst/Parser$1 +instanceKlass ch/qos/logback/core/subst/Parser +instanceKlass ch/qos/logback/core/subst/Token +instanceKlass ch/qos/logback/core/subst/Tokenizer$1 +instanceKlass ch/qos/logback/core/subst/Tokenizer +instanceKlass ch/qos/logback/core/subst/NodeToStringTransformer +instanceKlass com/fasterxml/jackson/databind/deser/ContextualDeserializer +instanceKlass ch/qos/logback/classic/jul/JULHelper +instanceKlass com/fasterxml/jackson/databind/JsonDeserializer +instanceKlass com/fasterxml/jackson/databind/deser/NullValueProvider +instanceKlass ch/qos/logback/core/rolling/RollingPolicy +instanceKlass org/springframework/boot/logging/logback/DefaultLogbackConfiguration +instanceKlass com/fasterxml/jackson/databind/ser/SerializerCache +instanceKlass com/fasterxml/jackson/databind/ser/ResolvableSerializer +instanceKlass org/springframework/core/env/AbstractPropertyResolver$$Lambda$95 +instanceKlass ch/qos/logback/core/LifeCycleManager +instanceKlass com/fasterxml/jackson/databind/ser/ContextualSerializer +instanceKlass org/springframework/boot/logging/LoggingInitializationContext +instanceKlass org/springframework/boot/logging/LoggerGroup +instanceKlass org/springframework/boot/logging/LoggerGroups$$Lambda$94 +instanceKlass com/fasterxml/jackson/databind/jsonschema/SchemaAware +instanceKlass org/springframework/boot/logging/LoggerGroups +instanceKlass org/springframework/boot/logging/LogFile +instanceKlass com/fasterxml/jackson/databind/JsonSerializer +instanceKlass com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitable +instanceKlass java/util/ArrayList$SubList$1 +instanceKlass java/net/InetAddress$CacheEntry +instanceKlass sun/net/InetAddressCachePolicy$2 +instanceKlass sun/net/InetAddressCachePolicy$1 +instanceKlass sun/net/InetAddressCachePolicy +instanceKlass java/net/Inet4AddressImpl +instanceKlass com/fasterxml/jackson/databind/node/JsonNodeFactory +instanceKlass com/fasterxml/jackson/databind/node/JsonNodeCreator +instanceKlass com/fasterxml/jackson/databind/cfg/ContextAttributes +instanceKlass com/fasterxml/jackson/core/util/Separators +instanceKlass com/fasterxml/jackson/core/util/DefaultPrettyPrinter$NopIndenter +instanceKlass com/fasterxml/jackson/databind/cfg/ConfigFeature +instanceKlass com/fasterxml/jackson/databind/cfg/ConfigOverride +instanceKlass com/fasterxml/jackson/annotation/JsonFormat$Features +instanceKlass com/fasterxml/jackson/annotation/JsonFormat$Value +instanceKlass sun/management/RuntimeImpl +instanceKlass java/lang/management/RuntimeMXBean +instanceKlass java/lang/management/PlatformManagedObject +instanceKlass sun/management/VMManagementImpl +instanceKlass sun/management/VMManagement +instanceKlass com/fasterxml/jackson/databind/introspect/VisibilityChecker$Std +instanceKlass sun/management/ManagementFactoryHelper$4 +instanceKlass sun/management/ManagementFactoryHelper +instanceKlass com/fasterxml/jackson/annotation/JsonSetter$Value +instanceKlass java/lang/management/ManagementFactory +instanceKlass org/springframework/boot/system/ApplicationPid +instanceKlass com/fasterxml/jackson/annotation/JsonInclude$Value +instanceKlass com/fasterxml/jackson/annotation/JacksonAnnotationValue +instanceKlass org/springframework/boot/logging/LoggingSystemProperties +instanceKlass com/fasterxml/jackson/databind/cfg/ConfigOverrides +instanceKlass org/springframework/boot/ansi/AnsiElement +instanceKlass org/springframework/boot/context/config/AnsiOutputApplicationListener$$Lambda$93 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/ansi/AnsiOutput +instanceKlass com/fasterxml/jackson/databind/introspect/AnnotatedClass$Creators +instanceKlass org/springframework/boot/context/properties/bind/JavaBeanBinder$Bean +instanceKlass com/fasterxml/jackson/databind/introspect/AnnotationCollector$NoAnnotations +instanceKlass org/springframework/boot/context/properties/bind/ValueObjectBinder$ValueObject +instanceKlass org/springframework/boot/context/properties/bind/Binder$$Lambda$92 +instanceKlass com/fasterxml/jackson/databind/util/Annotations +instanceKlass org/springframework/boot/context/properties/bind/Binder$$Lambda$91 +instanceKlass com/fasterxml/jackson/databind/introspect/AnnotationCollector +instanceKlass org/springframework/boot/context/properties/bind/DataObjectPropertyBinder +instanceKlass com/fasterxml/jackson/databind/introspect/AnnotatedClassResolver +instanceKlass java/util/stream/ForEachOps$ForEachOp +instanceKlass java/util/stream/ForEachOps +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$90 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$89 +instanceKlass com/fasterxml/jackson/databind/cfg/MapperConfig +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$88 +instanceKlass java/util/LinkedList$LLSpliterator +instanceKlass com/fasterxml/jackson/databind/BeanDescription +instanceKlass com/fasterxml/jackson/databind/introspect/SimpleMixInResolver +instanceKlass com/fasterxml/jackson/databind/introspect/ClassIntrospector$MixInResolver +instanceKlass com/fasterxml/jackson/databind/util/RootNameLookup +instanceKlass com/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer$TableInfo +instanceKlass com/fasterxml/jackson/core/sym/ByteQuadsCanonicalizer +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$87 +instanceKlass com/fasterxml/jackson/core/sym/CharsToNameCanonicalizer$Bucket +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$86 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$85 +instanceKlass com/fasterxml/jackson/core/sym/CharsToNameCanonicalizer$TableInfo +instanceKlass com/fasterxml/jackson/core/sym/CharsToNameCanonicalizer +instanceKlass com/fasterxml/jackson/core/io/CharTypes +instanceKlass com/fasterxml/jackson/core/io/JsonStringEncoder +instanceKlass com/fasterxml/jackson/core/io/SerializedString +instanceKlass com/fasterxml/jackson/core/util/DefaultPrettyPrinter +instanceKlass com/fasterxml/jackson/core/util/Instantiatable +instanceKlass com/fasterxml/jackson/core/async/ByteArrayFeeder +instanceKlass com/fasterxml/jackson/core/async/NonBlockingInputFeeder +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$84 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$83 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$82 +instanceKlass java/util/NavigableSet +instanceKlass org/springframework/core/CollectionFactory +instanceKlass com/fasterxml/jackson/core/TSFBuilder +instanceKlass com/fasterxml/jackson/core/SerializableString +instanceKlass org/springframework/boot/convert/Delimiter +instanceKlass org/springframework/core/convert/support/ConversionUtils +instanceKlass com/fasterxml/jackson/core/Base64Variant +instanceKlass com/fasterxml/jackson/core/Base64Variants +instanceKlass java/util/SortedSet +instanceKlass com/fasterxml/jackson/databind/type/TypeBindings +instanceKlass com/fasterxml/jackson/databind/type/TypeParser +instanceKlass org/springframework/util/AntPathMatcher$PathSeparatorPatternCache +instanceKlass org/springframework/util/AntPathMatcher +instanceKlass org/springframework/util/PathMatcher +instanceKlass com/fasterxml/jackson/databind/type/TypeFactory +instanceKlass org/springframework/core/io/support/PathMatchingResourcePatternResolver +instanceKlass com/fasterxml/jackson/databind/cfg/BaseSettings +instanceKlass com/fasterxml/jackson/databind/util/LRUMap +instanceKlass java/beans/ConstructorProperties +instanceKlass java/beans/Transient +instanceKlass com/fasterxml/jackson/databind/util/ClassUtil$Ctor +instanceKlass com/fasterxml/jackson/databind/util/ClassUtil +instanceKlass com/fasterxml/jackson/databind/ext/Java7Support +instanceKlass com/fasterxml/jackson/annotation/JsonMerge +instanceKlass com/fasterxml/jackson/databind/annotation/JsonDeserialize +instanceKlass org/springframework/core/convert/support/GenericConversionService$ConverterCacheKey +instanceKlass com/fasterxml/jackson/annotation/JsonManagedReference +instanceKlass org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolver$$Lambda$81 +instanceKlass com/fasterxml/jackson/annotation/JsonBackReference +instanceKlass org/springframework/util/PropertyPlaceholderHelper$PlaceholderResolver +instanceKlass com/fasterxml/jackson/annotation/JsonUnwrapped +instanceKlass org/springframework/boot/context/properties/source/ConfigurationProperty +instanceKlass com/fasterxml/jackson/annotation/JsonRawValue +instanceKlass org/springframework/boot/origin/PropertySourceOrigin +instanceKlass com/fasterxml/jackson/annotation/JsonTypeInfo +instanceKlass com/fasterxml/jackson/annotation/JsonFormat +instanceKlass com/fasterxml/jackson/annotation/JsonView +instanceKlass com/fasterxml/jackson/databind/annotation/JsonSerialize +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$80 +instanceKlass java/util/Collections$2 +instanceKlass com/fasterxml/jackson/databind/introspect/ConcreteBeanPropertyBase +instanceKlass com/fasterxml/jackson/databind/BeanProperty +instanceKlass org/springframework/boot/origin/OriginTrackedValue +instanceKlass org/springframework/boot/origin/TextResourceOrigin +instanceKlass org/springframework/boot/origin/TextResourceOrigin$Location +instanceKlass com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition +instanceKlass com/fasterxml/jackson/databind/util/Named +instanceKlass sun/net/DefaultProgressMeteringPolicy +instanceKlass sun/net/ProgressMeteringPolicy +instanceKlass sun/net/ProgressMonitor +instanceKlass org/springframework/boot/env/OriginTrackedPropertiesLoader$CharacterReader +instanceKlass org/springframework/boot/env/OriginTrackedPropertiesLoader +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$DocumentsCacheKey +instanceKlass com/fasterxml/jackson/databind/introspect/TypeResolutionContext +instanceKlass com/fasterxml/jackson/databind/introspect/Annotated +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$79 +instanceKlass java/io/FileFilter +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/logging/DeferredLog$Line +instanceKlass java/nio/channels/WritableByteChannel +instanceKlass org/springframework/core/io/WritableResource +instanceKlass com/fasterxml/jackson/databind/introspect/VisibilityChecker +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$78 +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$77 +instanceKlass com/fasterxml/jackson/databind/introspect/ClassIntrospector +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$76 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$75 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$DocumentConsumer +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Document +instanceKlass com/fasterxml/jackson/core/JsonParser +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$74 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$73 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$DocumentFilterFactory +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$DocumentFilter +instanceKlass java/util/stream/ReduceOps$Box +instanceKlass java/util/stream/ReduceOps$AccumulatingSink +instanceKlass java/util/stream/ReduceOps$ReduceOp +instanceKlass java/util/stream/ReduceOps +instanceKlass java/util/stream/Collectors$$Lambda$72 +instanceKlass java/util/stream/Collectors$$Lambda$71 +instanceKlass java/util/function/BinaryOperator +instanceKlass java/util/stream/Collectors$$Lambda$70 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/stream/Collectors$$Lambda$69 +instanceKlass java/util/stream/Collectors$CollectorImpl +instanceKlass java/util/stream/Collector +instanceKlass java/util/stream/Collectors +instanceKlass com/fasterxml/jackson/databind/JsonSerializable$Base +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$68 +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$67 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass com/fasterxml/jackson/core/TreeNode +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Profile +instanceKlass com/fasterxml/jackson/databind/JsonSerializable +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$66 +instanceKlass org/springframework/boot/context/properties/bind/BindResult +instanceKlass com/fasterxml/jackson/core/type/ResolvedType +instanceKlass com/fasterxml/jackson/databind/Module$SetupContext +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/properties/bind/Binder$$Lambda$65 +instanceKlass com/fasterxml/jackson/databind/jsontype/TypeResolverBuilder +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/stream/StreamSpliterators$WrappingSpliterator$$Lambda$64 +instanceKlass java/util/function/BooleanSupplier +instanceKlass java/util/stream/StreamSpliterators$WrappingSpliterator$$Lambda$63 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/stream/AbstractSpinedBuffer +instanceKlass java/util/Spliterators$1Adapter +instanceKlass com/fasterxml/jackson/databind/jsontype/PolymorphicTypeValidator +instanceKlass java/util/stream/StreamSpliterators$AbstractWrappingSpliterator +instanceKlass java/util/stream/AbstractPipeline$$Lambda$62 +instanceKlass org/springframework/boot/context/properties/source/SpringIterableConfigurationPropertySource$$Lambda$61 +instanceKlass org/springframework/boot/context/properties/source/FilteredConfigurationPropertiesSource +instanceKlass org/springframework/boot/context/properties/bind/IndexedElementsBinder$$Lambda$60 +instanceKlass com/fasterxml/jackson/databind/AnnotationIntrospector +instanceKlass org/springframework/boot/context/properties/bind/ArrayBinder$$Lambda$59 +instanceKlass org/springframework/boot/context/properties/bind/AggregateBinder$AggregateSupplier +instanceKlass org/springframework/boot/context/properties/bind/Binder$$Lambda$58 +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass org/springframework/boot/context/properties/bind/Binder$$Lambda$57 +instanceKlass org/springframework/boot/context/properties/bind/AggregateElementBinder +instanceKlass com/fasterxml/jackson/databind/ser/SerializerFactory +instanceKlass org/springframework/boot/context/properties/bind/BindConverter$CompositeConversionService +instanceKlass org/springframework/beans/TypeConverterDelegate +instanceKlass org/springframework/beans/PropertyEditorRegistrySupport +instanceKlass org/springframework/beans/PropertyEditorRegistry +instanceKlass org/springframework/beans/TypeConverter +instanceKlass org/springframework/boot/context/properties/bind/BindConverter$TypeConverterConverter +instanceKlass com/fasterxml/jackson/databind/deser/DeserializerFactory +instanceKlass java/beans/PropertyEditorSupport +instanceKlass java/beans/PropertyEditor +instanceKlass com/fasterxml/jackson/databind/DatabindContext +instanceKlass org/springframework/boot/context/properties/bind/BindConverter +instanceKlass org/springframework/boot/context/properties/bind/Binder$Context +instanceKlass org/springframework/boot/context/properties/bind/JavaBeanBinder +instanceKlass org/springframework/boot/context/properties/bind/ValueObjectBinder +instanceKlass org/springframework/boot/context/properties/bind/DataObjectBinder +instanceKlass org/springframework/boot/context/properties/bind/DefaultBindConstructorProvider +instanceKlass com/fasterxml/jackson/databind/jsontype/SubtypeResolver +instanceKlass org/springframework/boot/context/properties/bind/BindConstructorProvider +instanceKlass org/springframework/boot/context/properties/bind/BindHandler$1 +instanceKlass org/springframework/boot/context/properties/bind/BindHandler +instanceKlass com/fasterxml/jackson/core/TokenStreamFactory +instanceKlass com/fasterxml/jackson/databind/cfg/HandlerInstantiator +instanceKlass org/springframework/boot/context/properties/bind/AggregateBinder +instanceKlass org/springframework/boot/origin/OriginProvider +instanceKlass com/fasterxml/jackson/databind/Module +instanceKlass org/springframework/boot/context/properties/bind/BindContext +instanceKlass org/springframework/boot/context/properties/bind/Binder +instanceKlass org/springframework/http/converter/json/Jackson2ObjectMapperBuilder +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader$$Lambda$56 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/env/YamlPropertySourceLoader +instanceKlass org/springframework/boot/env/PropertiesPropertySourceLoader +instanceKlass org/springframework/boot/env/PropertySourceLoader +instanceKlass com/fasterxml/jackson/core/PrettyPrinter +instanceKlass org/springframework/util/PropertyPlaceholderHelper +instanceKlass com/fasterxml/jackson/core/util/DefaultPrettyPrinter$Indenter +instanceKlass org/springframework/boot/context/properties/bind/PropertySourcesPlaceholdersResolver +instanceKlass org/springframework/http/converter/GenericHttpMessageConverter +instanceKlass org/springframework/boot/context/properties/bind/PlaceholdersResolver +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$Loader +instanceKlass org/springframework/http/converter/xml/Jaxb2RootElementHttpMessageConverter$$Lambda$55 +instanceKlass java/util/Random +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertyName$$Lambda$54 +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertyName$ElementCharPredicate +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass com/sun/org/apache/xalan/internal/utils/XMLSecurityManager +instanceKlass com/sun/org/apache/xalan/internal/utils/SecuritySupport$9 +instanceKlass com/sun/org/apache/xalan/internal/utils/SecuritySupport$4 +instanceKlass com/sun/org/apache/xalan/internal/utils/SecuritySupport +instanceKlass org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor$$Lambda$53 +instanceKlass com/sun/org/apache/xalan/internal/utils/FeaturePropertyBase +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass jdk/xml/internal/SecuritySupport$2 +instanceKlass jdk/xml/internal/SecuritySupport$1 +instanceKlass jdk/xml/internal/SecuritySupport +instanceKlass jdk/xml/internal/JdkXmlFeatures +instanceKlass javax/xml/transform/ErrorListener +instanceKlass com/sun/org/apache/xalan/internal/xsltc/compiler/SourceLoader +instanceKlass javax/xml/transform/SecuritySupport$1 +instanceKlass java/util/stream/Sink$OfInt +instanceKlass java/util/function/IntConsumer +instanceKlass javax/xml/transform/FactoryFinder$1 +instanceKlass java/util/Spliterators$IntIteratorSpliterator +instanceKlass java/lang/CharSequence$1CharIterator +instanceKlass java/util/PrimitiveIterator$OfInt +instanceKlass javax/xml/transform/SecuritySupport$5 +instanceKlass java/util/PrimitiveIterator +instanceKlass javax/xml/transform/SecuritySupport$2 +instanceKlass javax/xml/transform/SecuritySupport +instanceKlass javax/xml/transform/FactoryFinder +instanceKlass java/util/stream/MatchOps$$Lambda$52 +instanceKlass javax/xml/transform/TransformerFactory +instanceKlass java/util/stream/MatchOps$BooleanTerminalSink +instanceKlass javax/xml/transform/stream/StreamSource +instanceKlass java/util/stream/MatchOps$MatchOp +instanceKlass javax/xml/transform/stax/StAXSource +instanceKlass java/util/stream/MatchOps +instanceKlass javax/xml/transform/sax/SAXSource +instanceKlass javax/xml/transform/dom/DOMSource +instanceKlass org/springframework/boot/context/properties/source/SystemEnvironmentPropertyMapper$$Lambda$51 +instanceKlass java/util/function/IntPredicate +instanceKlass org/springframework/http/converter/xml/SourceHttpMessageConverter$$Lambda$50 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass javax/xml/stream/XMLResolver +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/stream/IntStream +instanceKlass org/springframework/http/converter/xml/SourceHttpMessageConverter$$Lambda$49 +instanceKlass org/xml/sax/EntityResolver +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass sun/invoke/util/VerifyAccess$1 +instanceKlass java/lang/CharSequence$$Lambda$48 +instanceKlass org/springframework/boot/context/properties/source/SystemEnvironmentPropertyMapper$$Lambda$47 +instanceKlass org/xml/sax/InputSource +instanceKlass org/w3c/dom/Node +instanceKlass java/util/function/BiPredicate$$Lambda$46 +instanceKlass javax/xml/transform/Source +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/properties/source/SystemEnvironmentPropertyMapper$$Lambda$45 +instanceKlass javax/xml/transform/Result +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/properties/source/SpringIterableConfigurationPropertySource$Mappings$$Lambda$44 +instanceKlass org/springframework/boot/context/properties/source/SpringIterableConfigurationPropertySource$$Lambda$43 +instanceKlass org/springframework/boot/context/properties/source/SpringIterableConfigurationPropertySource$$Lambda$42 +instanceKlass java/util/function/UnaryOperator +instanceKlass org/springframework/boot/context/properties/source/SpringIterableConfigurationPropertySource$$Lambda$41 +instanceKlass org/springframework/boot/context/properties/source/SpringIterableConfigurationPropertySource$Mappings +instanceKlass org/springframework/core/log/CompositeLog$$Lambda$40 +instanceKlass org/springframework/boot/context/properties/source/DefaultPropertyMapper$LastMapping +instanceKlass org/springframework/core/log/CompositeLog$$Lambda$39 +instanceKlass org/springframework/core/log/CompositeLog$$Lambda$38 +instanceKlass org/springframework/core/log/CompositeLog$$Lambda$37 +instanceKlass java/time/Clock +instanceKlass org/springframework/core/log/CompositeLog$$Lambda$36 +instanceKlass org/springframework/core/log/CompositeLog$$Lambda$35 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/apache/commons/logging/impl/NoOpLog +instanceKlass org/springframework/boot/context/properties/source/SoftReferenceConfigurationPropertyCache +instanceKlass org/springframework/core/log/CompositeLog +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertyCaching +instanceKlass org/springframework/core/log/LogDelegateFactory +instanceKlass org/springframework/boot/context/properties/source/SystemEnvironmentPropertyMapper +instanceKlass org/springframework/http/HttpLogging +instanceKlass org/springframework/boot/context/properties/source/PropertyMapper$$Lambda$34 +instanceKlass java/util/function/BiPredicate +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/boot/context/properties/source/DefaultPropertyMapper +instanceKlass org/springframework/http/converter/AbstractHttpMessageConverter +instanceKlass org/springframework/boot/context/properties/source/PropertyMapper +instanceKlass org/springframework/boot/context/properties/source/CachingConfigurationPropertySource +instanceKlass org/springframework/boot/context/properties/source/IterableConfigurationPropertySource +instanceKlass com/google/gson/Gson +instanceKlass org/springframework/boot/context/properties/source/SpringConfigurationPropertySource +instanceKlass org/springframework/boot/context/properties/source/SpringConfigurationPropertySources$$Lambda$33 +instanceKlass org/springframework/boot/context/properties/source/SpringConfigurationPropertySources$SourcesIterator +instanceKlass com/fasterxml/jackson/core/JsonGenerator +instanceKlass org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor$$Lambda$32 +instanceKlass org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor$$Lambda$31 +instanceKlass com/fasterxml/jackson/core/TreeCodec +instanceKlass org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor$JsonPropertyValue +instanceKlass java/util/Spliterators$ArraySpliterator +instanceKlass org/springframework/boot/origin/Origin +instanceKlass com/fasterxml/jackson/core/Versioned +instanceKlass org/springframework/boot/reactor/DebugAgentEnvironmentPostProcessor +instanceKlass org/springframework/boot/env/SystemEnvironmentPropertySourceEnvironmentPostProcessor +instanceKlass javax/xml/bind/Binder +instanceKlass org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor +instanceKlass org/springframework/util/MimeType$SpecificityComparator +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertySource +instanceKlass org/springframework/http/MediaType$$Lambda$30 +instanceKlass org/springframework/boot/context/properties/source/SpringConfigurationPropertySources +instanceKlass org/springframework/util/MimeType$$Lambda$29 +instanceKlass java/util/function/BiConsumer +instanceKlass org/springframework/boot/origin/OriginLookup +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/util/LinkedCaseInsensitiveMap +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertySources +instanceKlass java/util/concurrent/CopyOnWriteArrayList$COWIterator +instanceKlass org/springframework/util/MimeType +instanceKlass org/springframework/boot/convert/LenientObjectToEnumConverterFactory +instanceKlass sun/reflect/generics/tree/ByteSignature +instanceKlass org/springframework/boot/convert/InputStreamSourceToByteArrayConverter +instanceKlass org/springframework/core/io/DefaultResourceLoader +instanceKlass org/springframework/boot/convert/StringToFileConverter +instanceKlass org/springframework/http/HttpOutputMessage +instanceKlass org/springframework/http/HttpMessage +instanceKlass org/springframework/boot/convert/NumberToDataSizeConverter +instanceKlass org/springframework/util/unit/DataSize +instanceKlass org/springframework/boot/convert/StringToDataSizeConverter +instanceKlass org/springframework/http/converter/FormHttpMessageConverter +instanceKlass org/springframework/http/converter/HttpMessageConverter +instanceKlass org/springframework/boot/convert/NumberToPeriodConverter +instanceKlass org/springframework/boot/convert/PeriodToStringConverter +instanceKlass org/springframework/boot/convert/StringToPeriodConverter +instanceKlass org/springframework/boot/convert/DurationToNumberConverter +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer$MessageConverterInitializer +instanceKlass org/springframework/boot/convert/NumberToDurationConverter +instanceKlass org/springframework/boot/convert/DurationToStringConverter +instanceKlass org/springframework/boot/convert/StringToDurationConverter +instanceKlass javax/validation/spi/ValidationProvider +instanceKlass org/springframework/boot/convert/DelimitedStringToCollectionConverter +instanceKlass javax/validation/Validation$GetValidationProviderListAction +instanceKlass org/springframework/boot/convert/DelimitedStringToArrayConverter +instanceKlass javax/validation/Validation$DefaultValidationProviderResolver +instanceKlass javax/validation/ValidationProviderResolver +instanceKlass org/springframework/boot/convert/CollectionToDelimitedStringConverter +instanceKlass org/springframework/boot/convert/ArrayToDelimitedStringConverter +instanceKlass javax/validation/Validation$GenericBootstrapImpl +instanceKlass javax/validation/spi/BootstrapState +instanceKlass org/springframework/boot/convert/IsoOffsetFormatter +instanceKlass javax/validation/bootstrap/GenericBootstrap +instanceKlass org/springframework/boot/convert/InetAddressFormatter +instanceKlass javax/validation/bootstrap/ProviderSpecificBootstrap +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass javax/validation/Validation +instanceKlass org/springframework/format/support/FormattingConversionService$$Lambda$28 +instanceKlass sun/reflect/generics/tree/ArrayTypeSignature +instanceKlass sun/reflect/generics/tree/CharSignature +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer$ValidationInitializer +instanceKlass org/springframework/boot/convert/CharArrayFormatter +instanceKlass org/springframework/format/annotation/DateTimeFormat +instanceKlass org/springframework/format/datetime/standard/MonthDayFormatter +instanceKlass java/time/MonthDay +instanceKlass org/springframework/format/datetime/standard/YearMonthFormatter +instanceKlass java/time/YearMonth +instanceKlass org/springframework/format/datetime/standard/MonthFormatter +instanceKlass org/springframework/format/datetime/standard/YearFormatter +instanceKlass java/time/Year +instanceKlass org/springframework/format/datetime/standard/DurationFormatter +instanceKlass org/springframework/format/datetime/standard/PeriodFormatter +instanceKlass org/springframework/format/datetime/standard/InstantFormatter +instanceKlass java/time/OffsetTime +instanceKlass org/springframework/format/support/FormattingConversionService$ParserConverter +instanceKlass org/springframework/format/support/FormattingConversionService$PrinterConverter +instanceKlass org/springframework/format/datetime/standard/TemporalAccessorParser +instanceKlass org/springframework/format/datetime/standard/TemporalAccessorPrinter +instanceKlass java/time/format/DateTimeFormatterBuilder$LocalizedPrinterParser +instanceKlass java/time/format/DateTimeFormatter$$Lambda$27 +instanceKlass java/time/format/DateTimeFormatter$$Lambda$26 +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/util/AbstractMap$SimpleImmutableEntry +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$FractionPrinterParser +instanceKlass java/time/format/DateTimeFormatterBuilder$OffsetIdPrinterParser +instanceKlass java/time/format/DecimalStyle +instanceKlass java/time/format/DateTimeFormatterBuilder$CompositePrinterParser +instanceKlass java/time/chrono/AbstractChronology$$Lambda$25 +instanceKlass java/time/chrono/AbstractChronology$$Lambda$24 +instanceKlass java/time/chrono/AbstractChronology$$Lambda$23 +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/format/DateTimeFormatterBuilder$2 +instanceKlass java/time/temporal/IsoFields +instanceKlass java/time/temporal/ValueRange +instanceKlass java/time/Duration +instanceKlass java/time/temporal/TemporalAmount +instanceKlass java/time/temporal/TemporalUnit +instanceKlass java/time/temporal/TemporalField +instanceKlass java/time/format/DateTimeFormatterBuilder$$Lambda$22 +instanceKlass java/time/temporal/TemporalQuery +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/time/format/DateTimeFormatterBuilder +instanceKlass java/time/format/DateTimeFormatter +instanceKlass org/springframework/format/datetime/standard/DateTimeFormatterRegistrar$1 +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$InstantToLongConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$LongToInstantConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$CalendarToInstantConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$CalendarToLocalDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$CalendarToLocalTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$CalendarToLocalDateConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$CalendarToOffsetDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$CalendarToZonedDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$OffsetDateTimeToInstantConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$OffsetDateTimeToZonedDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$OffsetDateTimeToLocalDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$OffsetDateTimeToLocalTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$OffsetDateTimeToLocalDateConverter +instanceKlass java/time/Instant +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$ZonedDateTimeToInstantConverter +instanceKlass java/time/OffsetDateTime +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$ZonedDateTimeToOffsetDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$ZonedDateTimeToLocalDateTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$ZonedDateTimeToLocalTimeConverter +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$ZonedDateTimeToLocalDateConverter +instanceKlass java/time/LocalTime +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$LocalDateTimeToLocalTimeConverter +instanceKlass java/time/LocalDate +instanceKlass java/time/chrono/ChronoLocalDate +instanceKlass java/time/LocalDateTime +instanceKlass java/time/chrono/ChronoLocalDateTime +instanceKlass java/time/temporal/TemporalAdjuster +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters$LocalDateTimeToLocalDateConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar$LongToCalendarConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar$LongToDateConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar$CalendarToLongConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar$CalendarToDateConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar$DateToCalendarConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar$DateToLongConverter +instanceKlass org/springframework/format/datetime/DateFormatterRegistrar +instanceKlass org/springframework/format/datetime/standard/DateTimeConverters +instanceKlass org/springframework/format/datetime/standard/DateTimeFormatterFactory +instanceKlass org/springframework/format/datetime/standard/DateTimeFormatterRegistrar +instanceKlass org/springframework/format/FormatterRegistrar +instanceKlass org/springframework/format/support/FormattingConversionService$AnnotationParserConverter +instanceKlass org/springframework/format/support/FormattingConversionService$AnnotationPrinterConverter +instanceKlass org/springframework/util/NumberUtils +instanceKlass org/springframework/core/GenericTypeResolver$$Lambda$21 +instanceKlass org/springframework/format/annotation/NumberFormat +instanceKlass org/springframework/core/GenericTypeResolver +instanceKlass org/springframework/context/support/EmbeddedValueResolutionSupport +instanceKlass org/springframework/core/convert/support/ObjectToOptionalConverter +instanceKlass org/springframework/core/convert/support/FallbackObjectToStringConverter +instanceKlass org/springframework/core/convert/support/IdToEntityConverter +instanceKlass org/springframework/core/convert/support/ObjectToObjectConverter +instanceKlass java/time/ZonedDateTime +instanceKlass java/time/chrono/ChronoZonedDateTime +instanceKlass java/time/temporal/Temporal +instanceKlass java/time/temporal/TemporalAccessor +instanceKlass org/springframework/core/convert/support/ZonedDateTimeToCalendarConverter +instanceKlass java/time/ZoneId +instanceKlass org/springframework/core/convert/support/ZoneIdToTimeZoneConverter +instanceKlass org/springframework/core/convert/support/StringToTimeZoneConverter +instanceKlass org/springframework/core/convert/support/ByteBufferConverter +instanceKlass org/springframework/core/convert/TypeDescriptor$AnnotatedElementAdapter +instanceKlass org/springframework/core/convert/TypeDescriptor +instanceKlass org/springframework/core/convert/support/StreamConverter +instanceKlass org/springframework/core/convert/support/ObjectToCollectionConverter +instanceKlass org/springframework/core/convert/support/CollectionToObjectConverter +instanceKlass org/springframework/core/convert/support/StringToCollectionConverter +instanceKlass org/springframework/core/convert/support/ObjectToArrayConverter +instanceKlass org/springframework/core/convert/support/ArrayToObjectConverter +instanceKlass org/springframework/core/convert/support/StringToArrayConverter +instanceKlass org/springframework/core/convert/support/CollectionToStringConverter +instanceKlass org/springframework/core/convert/support/ArrayToStringConverter +instanceKlass org/springframework/core/convert/support/MapToMapConverter +instanceKlass org/springframework/core/convert/support/CollectionToCollectionConverter +instanceKlass org/springframework/core/convert/support/ArrayToArrayConverter +instanceKlass org/springframework/core/convert/support/CollectionToArrayConverter +instanceKlass org/springframework/core/convert/support/ArrayToCollectionConverter +instanceKlass java/util/UUID +instanceKlass org/springframework/core/convert/support/StringToUUIDConverter +instanceKlass org/springframework/core/convert/support/PropertiesToStringConverter +instanceKlass org/springframework/core/convert/support/StringToPropertiesConverter +instanceKlass sun/nio/ch/Interruptible +instanceKlass java/util/concurrent/locks/LockSupport +instanceKlass org/springframework/core/convert/support/StringToCurrencyConverter +instanceKlass org/springframework/core/convert/support/StringToCharsetConverter +instanceKlass org/springframework/core/convert/support/StringToLocaleConverter +instanceKlass org/springframework/core/convert/support/IntegerToEnumConverterFactory +instanceKlass sun/reflect/generics/tree/Wildcard +instanceKlass sun/reflect/generics/tree/BottomSignature +instanceKlass org/springframework/core/convert/support/AbstractConditionalEnumConverter +instanceKlass org/springframework/core/convert/support/StringToEnumConverterFactory +instanceKlass org/springframework/core/convert/support/StringToBooleanConverter +instanceKlass org/springframework/core/convert/support/CharacterToNumberFactory +instanceKlass org/springframework/core/convert/support/NumberToCharacterConverter +instanceKlass org/springframework/core/convert/support/StringToCharacterConverter +instanceKlass java/lang/ProcessEnvironment$CheckedEntry +instanceKlass java/lang/ProcessEnvironment$CheckedEntrySet$1 +instanceKlass org/springframework/core/convert/support/GenericConversionService$ConverterAdapter +instanceKlass java/lang/ProcessEnvironment$EntryComparator +instanceKlass org/springframework/core/convert/support/ObjectToStringConverter +instanceKlass java/lang/ProcessEnvironment$NameComparator +instanceKlass org/springframework/core/convert/support/StringToNumberConverterFactory +instanceKlass javax/naming/spi/NamingManager +instanceKlass org/springframework/core/convert/support/GenericConversionService$Converters$$Lambda$20 +instanceKlass org/springframework/core/convert/support/GenericConversionService$ConvertersForPair +instanceKlass com/sun/naming/internal/VersionHelper12$5 +instanceKlass com/sun/naming/internal/VersionHelper12$InputStreamEnumeration$1 +instanceKlass org/springframework/core/convert/converter/GenericConverter$ConvertiblePair +instanceKlass com/sun/naming/internal/VersionHelper12$InputStreamEnumeration +instanceKlass javax/naming/NamingEnumeration +instanceKlass com/sun/naming/internal/VersionHelper12$6 +instanceKlass com/sun/naming/internal/VersionHelper12$7 +instanceKlass com/sun/naming/internal/VersionHelper12$3 +instanceKlass org/springframework/core/convert/support/GenericConversionService$ConverterFactoryAdapter +instanceKlass org/springframework/core/convert/converter/ConditionalGenericConverter +instanceKlass com/sun/naming/internal/VersionHelper12$1 +instanceKlass com/sun/naming/internal/VersionHelper +instanceKlass com/sun/naming/internal/ResourceManager +instanceKlass org/springframework/core/convert/support/NumberToNumberConverterFactory +instanceKlass org/springframework/core/convert/converter/ConditionalConverter +instanceKlass javax/naming/InitialContext +instanceKlass javax/naming/Context +instanceKlass org/springframework/core/convert/converter/ConverterFactory +instanceKlass org/springframework/core/SpringProperties +instanceKlass org/springframework/core/convert/converter/Converter +instanceKlass org/springframework/jndi/JndiAccessor +instanceKlass org/springframework/core/convert/support/GenericConversionService$Converters +instanceKlass org/springframework/core/convert/support/GenericConversionService$NoOpConverter +instanceKlass org/springframework/core/env/AbstractPropertyResolver +instanceKlass org/springframework/format/Formatter +instanceKlass org/springframework/format/AnnotationFormatterFactory +instanceKlass org/springframework/core/env/MutablePropertySources +instanceKlass org/springframework/format/Parser +instanceKlass java/util/Collections$1 +instanceKlass org/springframework/format/Printer +instanceKlass org/springframework/core/env/PropertySources +instanceKlass org/springframework/core/env/AbstractEnvironment +instanceKlass org/springframework/core/convert/converter/GenericConverter +instanceKlass org/springframework/core/convert/support/GenericConversionService +instanceKlass org/springframework/core/convert/support/ConfigurableConversionService +instanceKlass org/springframework/core/convert/ConversionService +instanceKlass org/springframework/web/context/ConfigurableWebEnvironment +instanceKlass org/springframework/boot/SpringApplication$1 +instanceKlass org/springframework/core/env/CommandLineArgs +instanceKlass org/springframework/context/EmbeddedValueResolverAware +instanceKlass org/springframework/format/FormatterRegistry +instanceKlass org/springframework/core/convert/converter/ConverterRegistry +instanceKlass org/springframework/core/env/SimpleCommandLineArgsParser +instanceKlass org/springframework/boot/DefaultApplicationArguments +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer$ConversionServiceInitializer +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer$1 +instanceKlass sun/util/logging/LoggingSupport$2 +instanceKlass java/util/logging/Formatter +instanceKlass java/util/logging/ErrorManager +instanceKlass java/util/logging/LogManager$5 +instanceKlass java/util/logging/LoggingProxyImpl +instanceKlass sun/util/logging/LoggingProxy +instanceKlass sun/util/logging/LoggingSupport$1 +instanceKlass sun/util/logging/LoggingSupport +instanceKlass sun/util/logging/PlatformLogger$LoggerProxy +instanceKlass sun/util/logging/PlatformLogger$1 +instanceKlass sun/util/logging/PlatformLogger +instanceKlass java/util/logging/LogManager$LoggerContext$1 +instanceKlass java/util/logging/Logger$LoggerBundle +instanceKlass java/util/logging/Logger +instanceKlass java/util/logging/LogManager$3 +instanceKlass java/util/logging/LogManager$2 +instanceKlass java/lang/Shutdown$Lock +instanceKlass java/lang/Shutdown +instanceKlass java/lang/ApplicationShutdownHooks$1 +instanceKlass java/lang/ApplicationShutdownHooks +instanceKlass java/util/logging/LogManager$LogNode +instanceKlass java/util/logging/LogManager$LoggerContext +instanceKlass java/util/logging/LogManager$1 +instanceKlass java/util/logging/Level$KnownLevel +instanceKlass java/util/logging/Level +instanceKlass java/util/logging/LogManager +instanceKlass java/util/logging/Handler +instanceKlass java/util/Formattable +instanceKlass java/util/Formatter$Conversion +instanceKlass java/util/Formatter$Flags +instanceKlass java/util/Formatter$FormatSpecifier +instanceKlass java/util/Formatter$FixedString +instanceKlass java/util/Formatter$FormatString +instanceKlass java/util/regex/ASCII +instanceKlass java/util/regex/Matcher +instanceKlass java/util/regex/MatchResult +instanceKlass java/util/regex/Pattern$TreeInfo +instanceKlass java/util/regex/Pattern$Node +instanceKlass java/util/regex/Pattern +instanceKlass java/util/Formatter +instanceKlass org/springframework/boot/logging/LoggingSystem$$Lambda$19 +instanceKlass org/springframework/boot/logging/AbstractLoggingSystem$LogLevels +instanceKlass org/springframework/boot/logging/LoggerConfigurationComparator +instanceKlass ch/qos/logback/classic/spi/LoggerContextListener +instanceKlass org/springframework/boot/logging/logback/LogbackConfigurator +instanceKlass java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry +instanceKlass java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$$Lambda$18 +instanceKlass java/util/stream/Sink$ChainedReference +instanceKlass java/util/stream/FindOps$$Lambda$17 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/stream/FindOps$FindSink +instanceKlass java/util/stream/TerminalSink +instanceKlass java/util/stream/Sink +instanceKlass java/util/stream/FindOps$$Lambda$16 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/stream/FindOps$FindOp +instanceKlass java/util/stream/TerminalOp +instanceKlass java/util/stream/FindOps +instanceKlass org/springframework/boot/logging/LoggingSystem$$Lambda$15 +instanceKlass org/springframework/boot/logging/LoggingSystem$$Lambda$14 +instanceKlass java/util/function/Predicate +instanceKlass java/util/EnumMap$1 +instanceKlass java/util/stream/StreamOpFlag$MaskBuilder +instanceKlass java/util/stream/PipelineHelper +instanceKlass java/util/stream/Stream +instanceKlass java/util/stream/BaseStream +instanceKlass java/util/stream/StreamSupport +instanceKlass java/util/Spliterators$IteratorSpliterator +instanceKlass java/util/Spliterator$OfDouble +instanceKlass java/util/Spliterator$OfLong +instanceKlass java/util/Spliterator$OfInt +instanceKlass java/util/Spliterator$OfPrimitive +instanceKlass java/util/Spliterators$EmptySpliterator +instanceKlass java/util/Spliterators +instanceKlass java/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntrySetSpliterator +instanceKlass org/springframework/boot/logging/LoggingSystem +instanceKlass org/springframework/aop/SpringProxy +instanceKlass org/springframework/aop/support/AopUtils +instanceKlass org/springframework/core/ResolvableType$WildcardBounds +instanceKlass org/springframework/context/event/GenericApplicationListenerAdapter +instanceKlass org/springframework/context/event/AbstractApplicationEventMulticaster$ListenerCacheKey +instanceKlass org/springframework/core/ResolvableTypeProvider +instanceKlass org/springframework/aop/framework/Advised +instanceKlass org/springframework/aop/TargetClassAware +instanceKlass org/springframework/aop/framework/AopProxyUtils +instanceKlass org/springframework/context/event/AbstractApplicationEventMulticaster$ListenerRetriever +instanceKlass org/springframework/context/event/AbstractApplicationEventMulticaster +instanceKlass org/springframework/beans/factory/BeanFactoryAware +instanceKlass org/springframework/beans/factory/BeanClassLoaderAware +instanceKlass org/springframework/context/event/ApplicationEventMulticaster +instanceKlass org/springframework/util/ErrorHandler +instanceKlass org/springframework/boot/availability/AvailabilityState +instanceKlass org/springframework/boot/context/event/EventPublishingRunListener +instanceKlass org/springframework/boot/SpringApplicationRunListener +instanceKlass org/springframework/boot/SpringApplicationRunListeners +instanceKlass org/springframework/util/StopWatch +instanceKlass org/springframework/core/annotation/TypeMappedAnnotation$$Lambda$13 +instanceKlass org/springframework/core/annotation/ValueExtractor +instanceKlass org/springframework/core/annotation/AnnotationTypeMappings$$Lambda$12 +instanceKlass java/util/function/Consumer +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/core/annotation/AliasFor +instanceKlass org/springframework/core/annotation/AnnotationTypeMapping$MirrorSets +instanceKlass org/springframework/core/annotation/AnnotationTypeMapping$MirrorSets$MirrorSet +instanceKlass org/springframework/core/annotation/AnnotationTypeMapping +instanceKlass org/springframework/core/annotation/AnnotationTypeMappings$Cache$$Lambda$11 +instanceKlass org/springframework/core/annotation/AnnotationTypeMappings$$Lambda$10 +instanceKlass org/springframework/core/annotation/AnnotationTypeMappings$Cache +instanceKlass org/springframework/core/annotation/AnnotationTypeMappings +instanceKlass org/springframework/core/annotation/RepeatableContainers$StandardRepeatableContainers$$Lambda$9 +instanceKlass org/springframework/core/annotation/AttributeMethods$$Lambda$8 +instanceKlass org/springframework/core/annotation/AttributeMethods$$Lambda$7 +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/core/annotation/AttributeMethods +instanceKlass java/util/concurrent/CountDownLatch +instanceKlass org/springframework/boot/autoconfigure/BackgroundPreinitializer +instanceKlass org/springframework/boot/liquibase/LiquibaseServiceLocatorApplicationListener +instanceKlass org/springframework/core/ResolvableType$DefaultVariableResolver +instanceKlass sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertyName$ElementsParser +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertyName$Elements +instanceKlass org/springframework/boot/context/properties/source/ConfigurationPropertyName +instanceKlass org/springframework/boot/context/logging/LoggingApplicationListener +instanceKlass org/springframework/boot/context/logging/ClasspathLoggingApplicationListener +instanceKlass org/springframework/context/event/GenericApplicationListener +instanceKlass org/springframework/boot/context/config/DelegatingApplicationListener +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/util/Comparator$$Lambda$6 +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener$$Lambda$5 +instanceKlass org/springframework/core/ResolvableType$TypeVariablesVariableResolver +instanceKlass org/springframework/core/ResolvableType$SyntheticParameterizedType +instanceKlass org/springframework/core/SerializableTypeWrapper$SerializableTypeProxy +instanceKlass java/lang/reflect/WildcardType +instanceKlass java/lang/reflect/ParameterizedType +instanceKlass org/springframework/core/SerializableTypeWrapper +instanceKlass sun/reflect/generics/reflectiveObjects/LazyReflectiveObjectGenerator +instanceKlass java/lang/reflect/TypeVariable +instanceKlass sun/reflect/generics/tree/TypeVariableSignature +instanceKlass sun/reflect/generics/tree/ClassSignature +instanceKlass sun/reflect/generics/tree/Signature +instanceKlass sun/reflect/generics/tree/FormalTypeParameter +instanceKlass org/springframework/core/ResolvableType$EmptyType +instanceKlass org/springframework/core/SerializableTypeWrapper$TypeProvider +instanceKlass org/springframework/core/ResolvableType$VariableResolver +instanceKlass org/springframework/core/ResolvableType +instanceKlass org/springframework/boot/context/properties/bind/Bindable +instanceKlass org/springframework/boot/context/config/ConfigFileApplicationListener +instanceKlass org/springframework/context/event/SmartApplicationListener +instanceKlass org/springframework/boot/context/config/AnsiOutputApplicationListener +instanceKlass org/springframework/boot/context/FileEncodingApplicationListener +instanceKlass org/springframework/boot/logging/DeferredLog +instanceKlass org/springframework/boot/cloud/CloudFoundryVcapEnvironmentPostProcessor +instanceKlass org/springframework/boot/env/EnvironmentPostProcessor +instanceKlass org/springframework/boot/builder/ParentContextCloserApplicationListener +instanceKlass org/springframework/context/ApplicationContextAware +instanceKlass org/springframework/beans/factory/Aware +instanceKlass org/springframework/boot/ClearCachesApplicationListener +instanceKlass java/lang/annotation/Target +instanceKlass java/lang/reflect/WeakCache$Value +instanceKlass sun/misc/ProxyGenerator$ExceptionTableEntry +instanceKlass sun/misc/ProxyGenerator$PrimitiveTypeInfo +instanceKlass sun/misc/ProxyGenerator$FieldInfo +instanceKlass java/io/DataOutput +instanceKlass sun/misc/ProxyGenerator$ConstantPool$Entry +instanceKlass sun/misc/ProxyGenerator$MethodInfo +instanceKlass sun/misc/ProxyGenerator$ProxyMethod +instanceKlass sun/misc/ProxyGenerator$ConstantPool +instanceKlass sun/misc/ProxyGenerator +instanceKlass java/lang/reflect/WeakCache$Factory +instanceKlass java/util/function/Supplier +instanceKlass java/lang/reflect/Proxy$ProxyClassFactory +instanceKlass java/lang/reflect/Proxy$KeyFactory +instanceKlass java/util/function/BiFunction +instanceKlass java/lang/reflect/WeakCache +instanceKlass java/lang/reflect/Proxy +instanceKlass sun/reflect/annotation/AnnotationInvocationHandler +instanceKlass java/lang/reflect/InvocationHandler +instanceKlass sun/reflect/annotation/AnnotationParser$1 +instanceKlass sun/reflect/annotation/ExceptionProxy +instanceKlass java/lang/annotation/Documented +instanceKlass java/lang/annotation/Inherited +instanceKlass java/lang/annotation/Retention +instanceKlass sun/reflect/annotation/AnnotationType$1 +instanceKlass java/lang/reflect/GenericArrayType +instanceKlass java/lang/FunctionalInterface +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 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/TypeTree +instanceKlass sun/reflect/generics/tree/Tree +instanceKlass sun/reflect/generics/parser/SignatureParser +instanceKlass org/springframework/util/ObjectUtils +instanceKlass org/springframework/core/DecoratingProxy +instanceKlass org/springframework/core/annotation/AbstractMergedAnnotation +instanceKlass sun/reflect/annotation/AnnotationParser +instanceKlass org/springframework/core/annotation/AnnotationsScanner$1 +instanceKlass org/springframework/core/annotation/MergedAnnotationSelectors$FirstDirectlyDeclared +instanceKlass org/springframework/core/annotation/MergedAnnotationSelectors$Nearest +instanceKlass org/springframework/core/annotation/MergedAnnotationSelector +instanceKlass org/springframework/core/annotation/MergedAnnotationSelectors +instanceKlass org/springframework/core/annotation/MergedAnnotation +instanceKlass org/springframework/core/annotation/TypeMappedAnnotations$MergedAnnotationFinder +instanceKlass org/springframework/core/annotation/Order +instanceKlass org/springframework/core/annotation/OrderUtils +instanceKlass org/springframework/core/annotation/AnnotationsScanner +instanceKlass java/util/Spliterator +instanceKlass org/springframework/core/annotation/AnnotationsProcessor +instanceKlass org/springframework/core/annotation/TypeMappedAnnotations +instanceKlass org/springframework/core/annotation/AnnotationFilter$2 +instanceKlass org/springframework/core/annotation/AnnotationFilter$1 +instanceKlass java/util/ComparableTimSort +instanceKlass org/springframework/core/annotation/PackagesAnnotationFilter +instanceKlass org/springframework/core/annotation/AnnotationFilter +instanceKlass org/springframework/core/annotation/RepeatableContainers +instanceKlass org/springframework/core/annotation/MergedAnnotations +instanceKlass org/springframework/core/PriorityOrdered +instanceKlass java/util/TimSort +instanceKlass java/util/Arrays$LegacyMergeSort +instanceKlass org/springframework/core/OrderComparator +instanceKlass org/springframework/boot/autoconfigure/logging/ConditionEvaluationReportLoggingListener +instanceKlass org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer +instanceKlass org/springframework/boot/web/context/ServerPortInfoApplicationContextInitializer +instanceKlass org/springframework/context/ApplicationListener +instanceKlass org/springframework/boot/rsocket/context/RSocketPortInfoApplicationContextInitializer +instanceKlass org/springframework/boot/context/config/DelegatingApplicationContextInitializer +instanceKlass org/springframework/boot/context/ContextIdApplicationContextInitializer +instanceKlass org/springframework/core/Ordered +instanceKlass org/springframework/core/KotlinDetector +instanceKlass org/springframework/util/ReflectionUtils$$Lambda$4 +instanceKlass org/springframework/util/ReflectionUtils$FieldFilter +instanceKlass org/springframework/util/ReflectionUtils$$Lambda$3 +instanceKlass org/springframework/util/ReflectionUtils$MethodFilter +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/util/ReflectionUtils +instanceKlass java/util/Collections$UnmodifiableMap +instanceKlass org/springframework/beans/BeanUtils +instanceKlass org/springframework/boot/context/ConfigurationWarningsApplicationContextInitializer +instanceKlass java/util/LinkedList$ListItr +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$Entry +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$Segment$$Lambda$2 +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$Entries +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/Class$4 +instanceKlass java/util/zip/ZipFile$ZipEntryIterator +instanceKlass java/util/jar/JarFile$JarEntryIterator +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/InnerClassLambdaMetafactory$1 +instanceKlass org/springframework/util/LinkedMultiValueMap$$Lambda$1 +instanceKlass java/lang/invoke/InfoFromMemberName +instanceKlass java/lang/invoke/MethodHandleInfo +instanceKlass java/security/AccessController$1 +instanceKlass java/lang/invoke/AbstractValidatingLambdaMetafactory +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass sun/reflect/UnsafeFieldAccessorFactory +instanceKlass jdk/internal/org/objectweb/asm/FieldVisitor +instanceKlass java/lang/invoke/BoundMethodHandle$Factory$1 +instanceKlass java/lang/invoke/BoundMethodHandle$SpeciesData$1 +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaFormBuffer +instanceKlass java/lang/invoke/LambdaFormEditor +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/MethodHandleImpl$Lazy +instanceKlass java/lang/invoke/LambdaForm$BMH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/util/SubList$1 +instanceKlass java/util/ListIterator +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/LambdaForm$MH +instanceKlass java/lang/invoke/InvokerBytecodeGenerator$CpPatch +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass java/lang/invoke/LambdaForm$DMH +instanceKlass sun/invoke/empty/Empty +instanceKlass sun/invoke/util/VerifyType +instanceKlass java/lang/invoke/InvokerBytecodeGenerator$2 +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 jdk/internal/org/objectweb/asm/Item +instanceKlass jdk/internal/org/objectweb/asm/ByteVector +instanceKlass jdk/internal/org/objectweb/asm/ClassVisitor +instanceKlass java/lang/invoke/InvokerBytecodeGenerator +instanceKlass java/lang/invoke/DirectMethodHandle$Lazy +instanceKlass sun/invoke/util/BytecodeDescriptor +instanceKlass java/lang/invoke/BoundMethodHandle$Factory +instanceKlass java/lang/invoke/BoundMethodHandle$SpeciesData +instanceKlass java/lang/invoke/LambdaForm$NamedFunction +instanceKlass java/lang/invoke/LambdaForm$Name +instanceKlass sun/invoke/util/ValueConversions +instanceKlass sun/invoke/util/VerifyAccess +instanceKlass java/lang/Long$LongCache +instanceKlass java/lang/Character$CharacterCache +instanceKlass java/lang/Short$ShortCache +instanceKlass java/lang/Byte$ByteCache +instanceKlass sun/invoke/util/Wrapper$Format +instanceKlass java/lang/invoke/MethodHandles +instanceKlass java/lang/invoke/Invokers +instanceKlass java/lang/invoke/MethodTypeForm +instanceKlass java/lang/invoke/MethodType$ConcurrentWeakInternSet +instanceKlass java/lang/invoke/MethodHandles$Lookup +instanceKlass java/lang/invoke/LambdaMetafactory +instanceKlass org/springframework/util/ResourceUtils +instanceKlass sun/net/www/protocol/jar/JarFileFactory +instanceKlass sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController +instanceKlass org/springframework/util/PropertiesPersister +instanceKlass org/springframework/core/io/support/PropertiesLoaderUtils +instanceKlass org/springframework/util/CollectionUtils +instanceKlass org/springframework/util/StringUtils +instanceKlass java/nio/channels/ReadableByteChannel +instanceKlass java/nio/channels/Channel +instanceKlass org/springframework/core/io/AbstractResource +instanceKlass org/springframework/util/LinkedMultiValueMap +instanceKlass org/springframework/core/io/Resource +instanceKlass org/springframework/core/io/InputStreamSource +instanceKlass org/springframework/util/MultiValueMap +instanceKlass org/springframework/core/io/support/SpringFactoriesLoader +instanceKlass org/springframework/context/ApplicationContextInitializer +instanceKlass org/springframework/web/context/ConfigurableWebApplicationContext +instanceKlass org/springframework/context/ConfigurableApplicationContext +instanceKlass org/springframework/context/Lifecycle +instanceKlass org/springframework/web/context/WebApplicationContext +instanceKlass javax/servlet/Servlet +instanceKlass java/io/Externalizable +instanceKlass java/util/Optional +instanceKlass java/util/IdentityHashMap$EntryIterator$Entry +instanceKlass java/util/IdentityHashMap$IdentityHashMapIterator +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$Reference +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$ReferenceManager +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$Task +instanceKlass org/springframework/util/ClassUtils +instanceKlass java/util/AbstractList$Itr +instanceKlass org/springframework/util/Assert +instanceKlass org/apache/commons/logging/LogAdapter$Slf4jLog +instanceKlass ch/qos/logback/classic/util/LoggerNameUtil +instanceKlass ch/qos/logback/classic/selector/DefaultContextSelector +instanceKlass ch/qos/logback/core/util/StatusPrinter +instanceKlass ch/qos/logback/core/status/StatusUtil +instanceKlass ch/qos/logback/core/spi/AppenderAttachableImpl +instanceKlass ch/qos/logback/core/util/EnvUtil +instanceKlass ch/qos/logback/core/pattern/Converter +instanceKlass java/util/Date +instanceKlass java/text/DigitList +instanceKlass java/text/FieldPosition +instanceKlass java/util/Currency$CurrencyNameGetter +instanceKlass java/util/Currency$1 +instanceKlass java/util/Currency +instanceKlass java/text/DecimalFormatSymbols +instanceKlass java/util/concurrent/atomic/AtomicMarkableReference$Pair +instanceKlass java/util/concurrent/atomic/AtomicMarkableReference +instanceKlass java/text/DateFormatSymbols +instanceKlass sun/util/calendar/CalendarUtils +instanceKlass sun/util/calendar/CalendarDate +instanceKlass java/util/Collections$EmptyIterator +instanceKlass sun/util/locale/LanguageTag +instanceKlass java/util/ResourceBundle$CacheKeyReference +instanceKlass java/util/ResourceBundle$CacheKey +instanceKlass java/util/ResourceBundle$RBClassLoader$1 +instanceKlass java/util/spi/ResourceBundleControlProvider +instanceKlass java/util/ResourceBundle +instanceKlass java/util/ResourceBundle$Control +instanceKlass sun/util/resources/LocaleData$1 +instanceKlass sun/util/resources/LocaleData +instanceKlass sun/util/locale/provider/LocaleResources +instanceKlass sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter +instanceKlass sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter +instanceKlass sun/util/locale/provider/SPILocaleProviderAdapter$1 +instanceKlass sun/util/locale/provider/LocaleServiceProviderPool +instanceKlass sun/util/locale/provider/CalendarDataUtility +instanceKlass java/util/Calendar$Builder +instanceKlass sun/util/locale/provider/JRELocaleProviderAdapter$1 +instanceKlass sun/util/locale/provider/LocaleDataMetaInfo +instanceKlass sun/util/locale/provider/AvailableLanguageTags +instanceKlass sun/util/locale/provider/LocaleProviderAdapter$1 +instanceKlass java/util/Collections$UnmodifiableCollection$1 +instanceKlass sun/util/locale/provider/ResourceBundleBasedAdapter +instanceKlass sun/util/locale/provider/LocaleProviderAdapter +instanceKlass java/util/spi/LocaleServiceProvider +instanceKlass java/util/Calendar +instanceKlass java/util/TimeZone$1 +instanceKlass java/util/zip/CRC32 +instanceKlass java/util/zip/Checksum +instanceKlass sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule +instanceKlass java/io/DataInput +instanceKlass sun/util/calendar/ZoneInfoFile$1 +instanceKlass sun/util/calendar/ZoneInfoFile +instanceKlass sun/util/calendar/CalendarSystem +instanceKlass java/util/TimeZone +instanceKlass java/util/Locale$1 +instanceKlass java/text/AttributedCharacterIterator$Attribute +instanceKlass java/text/Format +instanceKlass ch/qos/logback/core/util/CachingDateFormatter +instanceKlass ch/qos/logback/core/util/COWArrayList +instanceKlass ch/qos/logback/core/spi/FilterAttachableImpl +instanceKlass ch/qos/logback/core/Appender +instanceKlass ch/qos/logback/core/spi/FilterAttachable +instanceKlass ch/qos/logback/core/encoder/Encoder +instanceKlass ch/qos/logback/core/Layout +instanceKlass ch/qos/logback/core/spi/ContextAwareBase +instanceKlass java/util/ServiceLoader$1 +instanceKlass java/util/ServiceLoader$LazyIterator +instanceKlass java/util/ServiceLoader +instanceKlass ch/qos/logback/classic/util/EnvUtil +instanceKlass ch/qos/logback/classic/spi/Configurator +instanceKlass ch/qos/logback/core/spi/ContextAware +instanceKlass ch/qos/logback/core/status/StatusBase +instanceKlass java/net/URLClassLoader$2 +instanceKlass java/util/Collections$3 +instanceKlass java/util/HashMap$HashIterator +instanceKlass java/security/PermissionsEnumerator +instanceKlass sun/security/provider/PolicyFile$7 +instanceKlass sun/security/provider/PolicyFile$5 +instanceKlass sun/security/util/SecurityConstants +instanceKlass sun/security/provider/PolicyFile$PolicyEntry +instanceKlass java/util/Vector$1 +instanceKlass sun/security/provider/PolicyParser$PermissionEntry +instanceKlass sun/security/provider/PolicyParser$GrantEntry +instanceKlass java/io/StreamTokenizer +instanceKlass sun/security/util/PolicyUtil +instanceKlass sun/security/provider/PolicyParser +instanceKlass sun/security/util/PropertyExpander +instanceKlass sun/security/provider/PolicyFile$3 +instanceKlass java/security/ProtectionDomain$2$1 +instanceKlass sun/misc/JavaSecurityProtectionDomainAccess$ProtectionDomainCache +instanceKlass java/util/Collections$SynchronizedMap +instanceKlass sun/security/provider/PolicyFile$PolicyInfo +instanceKlass sun/security/provider/PolicyFile$1 +instanceKlass java/security/Security$1 +instanceKlass java/security/Security +instanceKlass java/security/Policy$1 +instanceKlass java/security/Policy$PolicyInfo +instanceKlass java/util/concurrent/atomic/AtomicReference +instanceKlass java/security/Policy +instanceKlass ch/qos/logback/core/util/Loader$1 +instanceKlass ch/qos/logback/core/util/Loader +instanceKlass ch/qos/logback/core/util/OptionHelper +instanceKlass ch/qos/logback/core/status/StatusListener +instanceKlass ch/qos/logback/core/util/StatusListenerConfigHelper +instanceKlass ch/qos/logback/classic/util/ContextInitializer +instanceKlass ch/qos/logback/classic/selector/ContextSelector +instanceKlass ch/qos/logback/classic/util/ContextSelectorStaticBinder +instanceKlass ch/qos/logback/classic/Level +instanceKlass ch/qos/logback/classic/spi/ILoggingEvent +instanceKlass ch/qos/logback/core/spi/DeferredProcessingAware +instanceKlass ch/qos/logback/classic/Logger +instanceKlass ch/qos/logback/core/spi/AppenderAttachable +instanceKlass ch/qos/logback/classic/spi/LoggerContextVO +instanceKlass java/util/concurrent/CopyOnWriteArrayList +instanceKlass ch/qos/logback/core/spi/LogbackLock +instanceKlass ch/qos/logback/core/helpers/CyclicBuffer +instanceKlass ch/qos/logback/core/BasicStatusManager +instanceKlass ch/qos/logback/core/status/Status +instanceKlass java/util/concurrent/ExecutorService +instanceKlass java/util/concurrent/Executor +instanceKlass ch/qos/logback/core/status/StatusManager +instanceKlass ch/qos/logback/core/ContextBase +instanceKlass ch/qos/logback/core/spi/LifeCycle +instanceKlass ch/qos/logback/core/Context +instanceKlass ch/qos/logback/core/spi/PropertyContainer +instanceKlass org/slf4j/impl/StaticLoggerBinder +instanceKlass org/slf4j/spi/LoggerFactoryBinder +instanceKlass java/net/URLClassLoader$3$1 +instanceKlass sun/misc/CompoundEnumeration +instanceKlass java/net/URLClassLoader$3 +instanceKlass sun/misc/URLClassPath$1 +instanceKlass java/lang/ClassLoader$2 +instanceKlass sun/misc/URLClassPath$2 +instanceKlass sun/misc/Launcher$BootClassPathHolder$1 +instanceKlass sun/misc/Launcher$BootClassPathHolder +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/locks/AbstractQueuedSynchronizer$Node +instanceKlass java/util/concurrent/locks/AbstractOwnableSynchronizer +instanceKlass java/util/concurrent/BlockingQueue +instanceKlass org/slf4j/helpers/SubstituteLoggerFactory +instanceKlass org/slf4j/ILoggerFactory +instanceKlass org/slf4j/event/LoggingEvent +instanceKlass org/slf4j/LoggerFactory +instanceKlass org/apache/commons/logging/Log +instanceKlass org/apache/commons/logging/LogAdapter$Slf4jAdapter +instanceKlass org/apache/commons/logging/LogAdapter$1 +instanceKlass org/slf4j/spi/LocationAwareLogger +instanceKlass org/slf4j/Logger +instanceKlass org/apache/logging/log4j/spi/Provider +instanceKlass org/apache/logging/log4j/spi/ExtendedLogger +instanceKlass org/apache/logging/log4j/Logger +instanceKlass org/apache/commons/logging/LogAdapter +instanceKlass org/apache/commons/logging/LogFactory +instanceKlass org/springframework/core/env/PropertySource +instanceKlass org/springframework/core/env/ConfigurableEnvironment +instanceKlass org/springframework/core/env/ConfigurablePropertyResolver +instanceKlass org/springframework/core/env/Environment +instanceKlass org/springframework/core/env/PropertyResolver +instanceKlass org/springframework/beans/factory/config/BeanFactoryPostProcessor +instanceKlass java/util/EventObject +instanceKlass org/springframework/context/ApplicationContext +instanceKlass org/springframework/core/io/support/ResourcePatternResolver +instanceKlass org/springframework/core/io/ResourceLoader +instanceKlass org/springframework/context/ApplicationEventPublisher +instanceKlass org/springframework/context/MessageSource +instanceKlass org/springframework/beans/factory/HierarchicalBeanFactory +instanceKlass org/springframework/beans/factory/ListableBeanFactory +instanceKlass org/springframework/beans/factory/BeanFactory +instanceKlass java/net/Socket$2 +instanceKlass org/springframework/core/env/EnvironmentCapable +instanceKlass sun/net/NetHooks +instanceKlass java/util/ArrayList$Itr +instanceKlass java/net/Proxy +instanceKlass sun/net/spi/DefaultProxySelector$3 +instanceKlass sun/net/spi/DefaultProxySelector$NonProxyInfo +instanceKlass java/net/URI$Parser +instanceKlass java/net/URI +instanceKlass org/springframework/boot/ApplicationArguments +instanceKlass org/springframework/boot/SpringApplication +instanceKlass java/util/Properties$LineReader +instanceKlass sun/net/NetProperties$1 +instanceKlass sun/net/NetProperties +instanceKlass java/lang/Void +instanceKlass sun/net/spi/DefaultProxySelector$1 +instanceKlass java/util/EventListener +instanceKlass java/net/ProxySelector +instanceKlass java/lang/Class$MethodArray +instanceKlass java/net/SocksSocketImpl$3 +instanceKlass sun/launcher/LauncherHelper$FXHelper +instanceKlass java/net/Inet6Address$Inet6AddressHolder +instanceKlass org/springframework/boot/web/servlet/support/SpringBootServletInitializer +instanceKlass org/springframework/web/WebApplicationInitializer +instanceKlass sun/misc/FloatingDecimal$ASCIIToBinaryBuffer +instanceKlass sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer +instanceKlass sun/misc/FloatingDecimal$ASCIIToBinaryConverter +instanceKlass sun/misc/FloatingDecimal$BinaryToASCIIBuffer +instanceKlass sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer +instanceKlass sun/misc/FloatingDecimal$BinaryToASCIIConverter +instanceKlass org/springframework/boot/CommandLineRunner +instanceKlass sun/misc/FloatingDecimal +instanceKlass java/net/PlainSocketImpl$1 +instanceKlass java/net/AbstractPlainSocketImpl$1 +instanceKlass java/net/SocketImpl +instanceKlass java/net/SocketOptions +instanceKlass java/net/SocksConsts +instanceKlass sun/net/util/IPAddressUtil +instanceKlass java/net/InetAddress$2 +instanceKlass sun/net/spi/nameservice/NameService +instanceKlass java/net/Inet6AddressImpl +instanceKlass java/net/InetAddressImpl +instanceKlass java/net/InetAddressImplFactory +instanceKlass java/net/InetAddress$Cache +instanceKlass java/net/InetAddress$InetAddressHolder +instanceKlass java/io/FileOutputStream$1 +instanceKlass sun/usagetracker/UsageTrackerClient$3 +instanceKlass sun/usagetracker/UsageTrackerClient$2 +instanceKlass sun/usagetracker/UsageTrackerClient$4 +instanceKlass sun/usagetracker/UsageTrackerClient$1 +instanceKlass java/util/concurrent/atomic/AtomicBoolean +instanceKlass sun/usagetracker/UsageTrackerClient +instanceKlass sun/misc/PostVMInitHook$1 +instanceKlass jdk/internal/util/EnvUtils +instanceKlass sun/misc/PostVMInitHook$2 +instanceKlass sun/misc/PostVMInitHook +instanceKlass java/lang/invoke/MethodHandleStatics$1 +instanceKlass java/lang/invoke/MethodHandleStatics +instanceKlass java/lang/invoke/MemberName$Factory +instanceKlass java/net/InetAddress$1 +instanceKlass java/lang/ClassValue$Version +instanceKlass java/lang/ClassValue$Identity +instanceKlass sun/security/action/GetBooleanAction +instanceKlass java/net/InetSocketAddress$InetSocketAddressHolder +instanceKlass java/lang/ClassValue +instanceKlass java/net/InetAddress +instanceKlass java/lang/invoke/MethodHandleImpl$3 +instanceKlass java/lang/invoke/MethodHandleImpl$2 +instanceKlass java/util/function/Function +instanceKlass java/net/SocketAddress +instanceKlass java/lang/invoke/MethodHandleImpl$1 +instanceKlass java/lang/invoke/MethodHandleImpl +instanceKlass java/net/Socket +instanceKlass com/intellij/rt/execution/application/AppMainV2 +instanceKlass sun/instrument/InstrumentationImpl$1 +instanceKlass com/intellij/rt/execution/application/AppMainV2$Agent +instanceKlass java/io/FilePermission$1 +instanceKlass sun/net/www/MessageHeader +instanceKlass java/net/URLConnection +instanceKlass java/security/PermissionCollection +instanceKlass sun/nio/ByteBuffered +instanceKlass java/lang/Package +instanceKlass sun/misc/Resource +instanceKlass java/util/jar/Attributes$Name +instanceKlass java/util/jar/Attributes +instanceKlass java/util/jar/JarVerifier$3 +instanceKlass java/security/CodeSigner +instanceKlass java/util/jar/JarVerifier +instanceKlass java/nio/file/attribute/FileTime +instanceKlass java/util/zip/ZipUtils +instanceKlass sun/nio/cs/ThreadLocalCoders$Cache +instanceKlass sun/nio/cs/ThreadLocalCoders +instanceKlass java/util/LinkedList$Node +instanceKlass java/util/zip/ZStreamRef +instanceKlass java/util/zip/Inflater +instanceKlass sun/misc/IOUtils +instanceKlass java/util/zip/ZipEntry +instanceKlass sun/misc/ExtensionDependency +instanceKlass sun/misc/JarIndex +instanceKlass sun/nio/ch/DirectBuffer +instanceKlass sun/misc/PerfCounter$CoreCounters +instanceKlass sun/misc/Perf +instanceKlass sun/misc/Perf$GetPerfAction +instanceKlass sun/misc/PerfCounter +instanceKlass java/util/zip/ZipCoder +instanceKlass java/util/Deque +instanceKlass java/util/Queue +instanceKlass java/nio/charset/StandardCharsets +instanceKlass java/util/jar/JavaUtilJarAccessImpl +instanceKlass sun/misc/JavaUtilJarAccess +instanceKlass sun/misc/FileURLMapper +instanceKlass sun/misc/URLClassPath$JarLoader$1 +instanceKlass java/util/zip/ZipFile$1 +instanceKlass sun/misc/JavaUtilZipFileAccess +instanceKlass java/util/zip/ZipFile +instanceKlass java/util/zip/ZipConstants +instanceKlass sun/misc/URLClassPath$Loader +instanceKlass sun/misc/URLClassPath$3 +instanceKlass sun/net/util/URLUtil +instanceKlass java/net/URLClassLoader$1 +instanceKlass sun/instrument/TransformerManager$TransformerInfo +instanceKlass sun/instrument/TransformerManager +instanceKlass sun/instrument/InstrumentationImpl +instanceKlass java/lang/instrument/Instrumentation +instanceKlass java/lang/SystemClassLoaderAction +instanceKlass java/util/LinkedHashMap$LinkedHashIterator +instanceKlass sun/misc/Launcher$AppClassLoader$1 +instanceKlass sun/misc/URLClassPath +instanceKlass java/security/Principal +instanceKlass java/security/ProtectionDomain$Key +instanceKlass java/security/ProtectionDomain$2 +instanceKlass sun/misc/JavaSecurityProtectionDomainAccess +instanceKlass java/security/ProtectionDomain$JavaSecurityAccessImpl +instanceKlass sun/misc/JavaSecurityAccess +instanceKlass java/net/URLStreamHandler +instanceKlass java/net/Parts +instanceKlass java/util/BitSet +instanceKlass sun/net/www/ParseUtil +instanceKlass java/io/FileInputStream$1 +instanceKlass java/lang/CharacterData +instanceKlass sun/util/locale/LocaleUtils +instanceKlass java/util/Locale$LocaleKey +instanceKlass sun/util/locale/BaseLocale$Key +instanceKlass sun/util/locale/BaseLocale +instanceKlass java/util/concurrent/ConcurrentHashMap$CollectionView +instanceKlass java/util/concurrent/ConcurrentHashMap$CounterCell +instanceKlass java/util/concurrent/ConcurrentHashMap$Node +instanceKlass java/util/concurrent/locks/ReentrantLock +instanceKlass java/util/concurrent/locks/Lock +instanceKlass java/util/concurrent/ConcurrentMap +instanceKlass sun/util/locale/LocaleObjectCache +instanceKlass java/util/Locale +instanceKlass java/lang/reflect/Array +instanceKlass java/io/Reader +instanceKlass sun/misc/MetaIndex +instanceKlass java/util/StringTokenizer +instanceKlass sun/misc/Launcher$ExtClassLoader$1 +instanceKlass java/net/URLClassLoader$7 +instanceKlass sun/misc/JavaNetAccess +instanceKlass java/lang/ClassLoader$ParallelLoaders +instanceKlass sun/security/util/Debug +instanceKlass sun/misc/Launcher$Factory +instanceKlass java/net/URLStreamHandlerFactory +instanceKlass java/lang/Compiler$1 +instanceKlass java/lang/Compiler +instanceKlass java/lang/System$2 +instanceKlass sun/misc/JavaLangAccess +instanceKlass sun/io/Win32ErrorMode +instanceKlass sun/misc/OSEnvironment +instanceKlass java/lang/Integer$IntegerCache +instanceKlass sun/misc/NativeSignalHandler +instanceKlass sun/misc/Signal +instanceKlass java/lang/Terminator$1 +instanceKlass sun/misc/SignalHandler +instanceKlass java/lang/Terminator +instanceKlass java/lang/ClassLoader$NativeLibrary +instanceKlass java/io/ExpiringCache$Entry +instanceKlass java/lang/ClassLoader$3 +instanceKlass java/nio/charset/CoderResult$Cache +instanceKlass java/nio/charset/CoderResult +instanceKlass java/lang/Readable +instanceKlass java/lang/StringCoding$StringEncoder +instanceKlass java/nio/file/Path +instanceKlass java/nio/file/Watchable +instanceKlass java/lang/Enum +instanceKlass java/io/ExpiringCache +instanceKlass java/io/FileSystem +instanceKlass java/io/DefaultFileSystem +instanceKlass java/nio/Bits$1 +instanceKlass sun/misc/JavaNioAccess +instanceKlass java/nio/ByteOrder +instanceKlass java/nio/Bits +instanceKlass java/nio/charset/CharsetEncoder +instanceKlass sun/nio/cs/ArrayEncoder +instanceKlass sun/security/action/GetPropertyAction +instanceKlass java/io/Writer +instanceKlass sun/reflect/misc/ReflectUtil +instanceKlass java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1 +instanceKlass java/security/PrivilegedExceptionAction +instanceKlass java/util/concurrent/atomic/AtomicReferenceFieldUpdater +instanceKlass java/io/OutputStream +instanceKlass java/io/Flushable +instanceKlass java/io/FileDescriptor$1 +instanceKlass sun/misc/JavaIOFileDescriptorAccess +instanceKlass java/io/FileDescriptor +instanceKlass sun/misc/Version +instanceKlass java/lang/Runtime +instanceKlass java/util/Hashtable$Enumerator +instanceKlass java/util/Iterator +instanceKlass java/util/Enumeration +instanceKlass java/util/Objects +instanceKlass java/util/Collections$SynchronizedCollection +instanceKlass java/nio/charset/CodingErrorAction +instanceKlass java/nio/charset/CharsetDecoder +instanceKlass sun/nio/cs/ArrayDecoder +instanceKlass sun/nio/cs/ext/DelegatableDecoder +instanceKlass sun/nio/cs/ext/DoubleByte +instanceKlass java/lang/StringCoding$StringDecoder +instanceKlass java/lang/ThreadLocal$ThreadLocalMap +instanceKlass java/lang/StringCoding +instanceKlass sun/nio/cs/HistoricallyNamedCharset +instanceKlass java/util/TreeMap$Entry +instanceKlass sun/misc/ASCIICaseInsensitiveComparator +instanceKlass java/util/NavigableMap +instanceKlass java/util/SortedMap +instanceKlass sun/reflect/ReflectionFactory$1 +instanceKlass java/lang/Class$1 +instanceKlass java/nio/charset/Charset$ExtendedProviderHolder$1 +instanceKlass java/nio/charset/Charset$ExtendedProviderHolder +instanceKlass java/util/Arrays +instanceKlass java/lang/reflect/ReflectAccess +instanceKlass sun/reflect/LangReflectAccess +instanceKlass java/lang/reflect/Modifier +instanceKlass sun/reflect/annotation/AnnotationType +instanceKlass java/lang/Class$AnnotationData +instanceKlass sun/reflect/generics/repository/AbstractRepository +instanceKlass java/lang/Class$Atomic +instanceKlass java/lang/Class$ReflectionData +instanceKlass java/lang/Class$3 +instanceKlass java/lang/ThreadLocal +instanceKlass java/nio/charset/spi/CharsetProvider +instanceKlass java/nio/charset/Charset +instanceKlass java/lang/Math +instanceKlass java/util/Hashtable$Entry +instanceKlass sun/misc/VM +instanceKlass java/util/HashMap$Node +instanceKlass java/util/Map$Entry +instanceKlass sun/reflect/Reflection +instanceKlass sun/misc/SharedSecrets +instanceKlass java/lang/ref/Reference$1 +instanceKlass sun/misc/JavaLangRefAccess +instanceKlass java/lang/ref/ReferenceQueue$Lock +instanceKlass java/util/Collections$UnmodifiableCollection +instanceKlass java/util/AbstractMap +instanceKlass java/util/Set +instanceKlass java/util/Collections +instanceKlass java/lang/ref/Reference$Lock +instanceKlass sun/reflect/ReflectionFactory +instanceKlass java/util/AbstractCollection +instanceKlass java/util/RandomAccess +instanceKlass java/util/List +instanceKlass java/util/Collection +instanceKlass java/lang/Iterable +instanceKlass java/security/cert/Certificate +instanceKlass sun/reflect/ReflectionFactory$GetReflectionFactoryAction +instanceKlass java/security/PrivilegedAction +instanceKlass java/security/AccessController +instanceKlass java/security/Permission +instanceKlass java/security/Guard +instanceKlass java/lang/String$CaseInsensitiveComparator +instanceKlass java/util/Comparator +instanceKlass java/io/ObjectStreamField +instanceKlass java/lang/Number +instanceKlass java/lang/Character +instanceKlass java/lang/Boolean +instanceKlass java/nio/Buffer +instanceKlass java/lang/StackTraceElement +instanceKlass java/security/CodeSource +instanceKlass sun/misc/Launcher +instanceKlass java/util/jar/Manifest +instanceKlass java/net/URL +instanceKlass java/io/File +instanceKlass java/io/InputStream +instanceKlass java/io/Closeable +instanceKlass java/lang/AutoCloseable +instanceKlass sun/misc/Unsafe +instanceKlass java/lang/AbstractStringBuilder +instanceKlass java/lang/Appendable +instanceKlass java/lang/invoke/CallSite +instanceKlass java/lang/invoke/MethodType +instanceKlass java/lang/invoke/LambdaForm +instanceKlass java/lang/invoke/MethodHandleNatives +instanceKlass java/lang/invoke/MemberName +instanceKlass java/lang/invoke/MethodHandle +instanceKlass sun/reflect/CallerSensitive +instanceKlass java/lang/annotation/Annotation +instanceKlass sun/reflect/FieldAccessor +instanceKlass sun/reflect/ConstantPool +instanceKlass sun/reflect/ConstructorAccessor +instanceKlass sun/reflect/MethodAccessor +instanceKlass sun/reflect/MagicAccessorImpl +instanceKlass java/lang/reflect/Parameter +instanceKlass java/lang/reflect/Member +instanceKlass java/lang/reflect/AccessibleObject +instanceKlass java/util/Dictionary +instanceKlass java/util/Map +instanceKlass java/lang/ThreadGroup +instanceKlass java/lang/Thread$UncaughtExceptionHandler +instanceKlass java/lang/Thread +instanceKlass java/lang/Runnable +instanceKlass java/lang/ref/ReferenceQueue +instanceKlass java/lang/ref/Reference +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/reflect/Type +instanceKlass java/lang/reflect/GenericDeclaration +instanceKlass java/lang/reflect/AnnotatedElement +instanceKlass java/lang/String +instanceKlass java/lang/CharSequence +instanceKlass java/lang/Comparable +instanceKlass java/io/Serializable +ciInstanceKlass java/lang/Object 1 1 78 3 8 8 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 100 100 100 100 7 7 100 100 1 1 1 12 12 12 12 12 12 12 12 12 12 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/io/Serializable 1 0 7 1 1 1 100 100 1 +ciInstanceKlass java/lang/String 1 1 540 3 3 3 3 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 7 7 100 7 100 7 7 100 100 100 100 100 100 100 100 100 7 100 7 7 100 7 100 100 7 100 7 100 100 7 7 7 7 100 7 7 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 1 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/lang/Class 1 1 1190 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 5 0 8 8 8 8 8 7 7 7 100 100 100 7 7 100 7 100 7 7 7 7 100 7 7 100 7 100 100 100 7 100 100 100 100 100 100 100 7 7 7 100 100 100 7 7 7 100 100 7 7 100 100 7 7 100 7 100 7 7 100 100 7 7 7 7 7 7 7 7 7 100 7 7 7 7 7 100 100 7 7 7 7 100 7 100 7 7 100 100 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 1 1 1 1 1 1 +staticfield java/lang/Class serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField; +ciInstanceKlass java/lang/Cloneable 1 0 7 1 1 1 100 100 1 +instanceKlass org/springframework/core/DecoratingClassLoader +instanceKlass java/util/ResourceBundle$RBClassLoader +instanceKlass sun/reflect/DelegatingClassLoader +instanceKlass java/security/SecureClassLoader +ciInstanceKlass java/lang/ClassLoader 1 1 842 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 7 7 100 100 100 100 7 100 100 7 7 7 7 100 7 100 100 100 100 7 7 100 100 7 100 7 7 100 100 100 100 7 100 100 7 7 100 7 7 100 7 7 7 7 7 100 7 7 7 7 7 7 7 100 7 7 7 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 1 1 +staticfield java/lang/ClassLoader nocerts [Ljava/security/cert/Certificate; 0 [Ljava/security/cert/Certificate; +ciInstanceKlass java/lang/System 1 1 369 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 7 7 100 7 100 100 100 100 100 100 7 7 100 100 7 100 100 7 7 7 7 100 100 100 7 100 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +staticfield java/lang/System in Ljava/io/InputStream; java/io/BufferedInputStream +staticfield java/lang/System out Ljava/io/PrintStream; java/io/PrintStream +staticfield java/lang/System err Ljava/io/PrintStream; java/io/PrintStream +instanceKlass java/lang/Exception +instanceKlass java/lang/Error +ciInstanceKlass java/lang/Throwable 1 1 327 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 7 100 100 100 100 100 100 7 100 100 100 100 7 7 100 100 100 100 100 100 100 100 100 7 7 100 100 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 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$UnmodifiableRandomAccessList +staticfield java/lang/Throwable EMPTY_THROWABLE_ARRAY [Ljava/lang/Throwable; 0 [Ljava/lang/Throwable; +staticfield java/lang/Throwable $assertionsDisabled Z 1 +instanceKlass java/lang/AssertionError +instanceKlass java/util/ServiceConfigurationError +instanceKlass java/lang/VirtualMachineError +instanceKlass java/lang/LinkageError +instanceKlass java/lang/ThreadDeath +ciInstanceKlass java/lang/Error 1 1 30 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 1 1 12 12 12 12 12 10 10 10 10 10 1 +ciInstanceKlass java/lang/ThreadDeath 0 0 18 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 10 1 +instanceKlass java/util/concurrent/ExecutionException +instanceKlass org/springframework/core/NestedCheckedException +instanceKlass java/beans/PropertyVetoException +instanceKlass java/beans/IntrospectionException +instanceKlass org/springframework/expression/AccessException +instanceKlass org/springframework/validation/BindException +instanceKlass javax/servlet/ServletException +instanceKlass javax/xml/bind/JAXBException +instanceKlass javax/xml/stream/XMLStreamException +instanceKlass org/xml/sax/SAXException +instanceKlass javax/xml/parsers/ParserConfigurationException +instanceKlass javax/xml/transform/TransformerException +instanceKlass java/text/ParseException +instanceKlass javax/naming/NamingException +instanceKlass java/net/URISyntaxException +instanceKlass ch/qos/logback/core/boolex/EvaluationException +instanceKlass java/security/GeneralSecurityException +instanceKlass ch/qos/logback/core/util/DynamicClassLoadingException +instanceKlass ch/qos/logback/core/util/IncompatibleClassException +instanceKlass ch/qos/logback/core/spi/ScanException +instanceKlass ch/qos/logback/core/joran/spi/JoranException +instanceKlass java/sql/SQLException +instanceKlass java/security/PrivilegedActionException +instanceKlass java/io/IOException +instanceKlass java/lang/InterruptedException +instanceKlass java/lang/ReflectiveOperationException +instanceKlass java/lang/RuntimeException +ciInstanceKlass java/lang/Exception 1 1 30 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 1 1 12 12 12 12 12 10 10 10 10 10 1 +instanceKlass org/springframework/cglib/core/CodeGenerationException +instanceKlass org/springframework/objenesis/ObjenesisException +instanceKlass org/springframework/data/mapping/MappingException +instanceKlass java/lang/TypeNotPresentException +instanceKlass org/springframework/boot/autoconfigure/condition/OnBeanCondition$BeanTypeDeductionException +instanceKlass org/springframework/expression/ExpressionException +instanceKlass org/springframework/boot/autoconfigure/session/NonUniqueSessionRepositoryException +instanceKlass org/springframework/boot/autoconfigure/flyway/FlywayMigrationScriptMissingException +instanceKlass org/apache/shiro/spring/boot/autoconfigure/exception/NoRealmBeanConfiguredException +instanceKlass org/springframework/boot/context/properties/source/InvalidConfigurationPropertyValueException +instanceKlass org/springframework/boot/web/server/WebServerException +instanceKlass org/springframework/boot/context/properties/bind/validation/BindValidationException +instanceKlass java/time/DateTimeException +instanceKlass java/nio/file/FileSystemNotFoundException +instanceKlass org/springframework/boot/context/properties/bind/UnboundConfigurationPropertiesException +instanceKlass org/springframework/boot/context/properties/bind/BindException +instanceKlass java/util/ConcurrentModificationException +instanceKlass javax/validation/ValidationException +instanceKlass java/util/MissingResourceException +instanceKlass java/lang/UnsupportedOperationException +instanceKlass org/springframework/boot/context/properties/source/InvalidConfigurationPropertyNameException +instanceKlass java/util/NoSuchElementException +instanceKlass java/lang/reflect/UndeclaredThrowableException +instanceKlass org/springframework/core/NestedRuntimeException +instanceKlass java/lang/invoke/WrongMethodTypeException +instanceKlass ch/qos/logback/core/LogbackException +instanceKlass java/lang/IndexOutOfBoundsException +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 30 1 1 1 1 1 1 1 1 1 1 1 1 5 0 7 100 1 1 12 12 12 12 12 10 10 10 10 10 1 +ciInstanceKlass java/lang/SecurityManager 0 0 375 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/security/ProtectionDomain 1 1 272 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 7 100 100 7 100 100 100 100 100 100 100 100 100 7 7 7 7 7 100 7 7 7 100 100 100 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 1 1 +staticfield java/security/ProtectionDomain debug Lsun/security/util/Debug; null +ciInstanceKlass java/security/AccessControlContext 1 1 305 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 100 7 100 7 100 100 100 7 100 7 7 100 100 7 7 7 100 100 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 1 +instanceKlass java/net/URLClassLoader +ciInstanceKlass java/security/SecureClassLoader 1 1 130 8 8 8 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 7 100 100 100 100 7 100 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield java/security/SecureClassLoader debug Lsun/security/util/Debug; null +instanceKlass java/lang/NoSuchFieldException +instanceKlass java/lang/InstantiationException +instanceKlass java/lang/IllegalAccessException +instanceKlass java/lang/reflect/InvocationTargetException +instanceKlass java/lang/NoSuchMethodException +instanceKlass java/lang/ClassNotFoundException +ciInstanceKlass java/lang/ReflectiveOperationException 1 1 27 1 1 1 1 1 1 1 1 1 1 1 1 5 0 7 100 1 12 12 12 12 10 10 10 10 1 +ciInstanceKlass java/lang/ClassNotFoundException 1 1 32 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 100 1 1 1 12 12 12 9 10 10 1 +instanceKlass java/lang/ClassFormatError +instanceKlass java/lang/IncompatibleClassChangeError +instanceKlass java/lang/BootstrapMethodError +instanceKlass java/lang/NoClassDefFoundError +ciInstanceKlass java/lang/LinkageError 1 1 24 1 1 1 1 1 1 1 1 1 1 1 5 0 7 100 1 12 12 12 10 10 10 1 +ciInstanceKlass java/lang/NoClassDefFoundError 0 0 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/lang/ClassCastException 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/lang/ArrayStoreException 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +instanceKlass java/lang/InternalError +instanceKlass java/lang/StackOverflowError +instanceKlass java/lang/OutOfMemoryError +ciInstanceKlass java/lang/VirtualMachineError 1 1 27 1 1 1 1 1 1 1 1 1 1 1 1 5 0 7 100 1 12 12 12 12 10 10 10 10 1 +ciInstanceKlass java/lang/OutOfMemoryError 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/lang/StackOverflowError 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/lang/IllegalMonitorStateException 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +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 134 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 100 7 100 7 7 100 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 +instanceKlass org/springframework/util/ConcurrentReferenceHashMap$SoftEntryReference +instanceKlass java/lang/invoke/LambdaFormEditor$Transform +instanceKlass sun/util/locale/provider/LocaleResources$ResourceReference +instanceKlass java/util/ResourceBundle$BundleReference +instanceKlass sun/util/locale/LocaleObjectCache$CacheEntry +ciInstanceKlass java/lang/ref/SoftReference 1 1 35 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 7 1 1 1 1 12 12 12 12 12 9 9 10 10 10 1 +instanceKlass java/util/logging/LogManager$LoggerWeakRef +instanceKlass java/lang/reflect/WeakCache$CacheValue +instanceKlass java/lang/reflect/Proxy$Key1 +instanceKlass java/lang/reflect/WeakCache$CacheKey +instanceKlass java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry +instanceKlass java/util/ResourceBundle$LoaderReference +instanceKlass java/lang/ClassValue$Entry +instanceKlass java/util/WeakHashMap$Entry +instanceKlass java/lang/ThreadLocal$ThreadLocalMap$Entry +ciInstanceKlass java/lang/ref/WeakReference 1 1 20 1 1 1 1 1 1 1 1 7 100 1 1 1 1 12 12 10 10 1 +instanceKlass java/lang/ref/Finalizer +ciInstanceKlass java/lang/ref/FinalReference 1 1 16 1 1 1 1 1 1 1 100 7 1 1 1 12 10 1 +instanceKlass sun/misc/Cleaner +ciInstanceKlass java/lang/ref/PhantomReference 1 1 19 1 1 1 1 1 1 1 1 1 1 100 7 1 1 1 12 10 1 +ciInstanceKlass sun/misc/Cleaner 1 1 74 1 1 1 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 7 7 100 7 100 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 11 1 +staticfield sun/misc/Cleaner dummyQueue Ljava/lang/ref/ReferenceQueue; java/lang/ref/ReferenceQueue +ciInstanceKlass java/lang/ref/Finalizer 1 1 150 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 7 100 7 7 100 100 100 7 7 100 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 +staticfield java/lang/ref/Finalizer lock Ljava/lang/Object; java/lang/Object +instanceKlass java/lang/ref/ReferenceQueue$Null +ciInstanceKlass java/lang/ref/ReferenceQueue 1 1 130 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 100 100 7 100 100 7 7 100 7 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 +staticfield java/lang/ref/ReferenceQueue $assertionsDisabled Z 1 +instanceKlass org/springframework/context/support/AbstractApplicationContext$1 +instanceKlass java/util/logging/LogManager$Cleaner +instanceKlass com/intellij/rt/execution/application/AppMainV2$1 +instanceKlass java/lang/ref/Finalizer$FinalizerThread +instanceKlass java/lang/ref/Reference$ReferenceHandler +ciInstanceKlass java/lang/Thread 1 1 539 3 3 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 100 100 100 100 100 100 7 100 100 100 100 100 7 7 7 100 7 100 7 7 100 100 100 100 100 100 7 100 100 100 100 100 100 100 7 100 100 100 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 1 1 1 1 1 +staticfield java/lang/Thread EMPTY_STACK_TRACE [Ljava/lang/StackTraceElement; 0 [Ljava/lang/StackTraceElement; +staticfield java/lang/Thread SUBCLASS_IMPLEMENTATION_PERMISSION Ljava/lang/RuntimePermission; java/lang/RuntimePermission +ciInstanceKlass java/lang/ThreadGroup 1 1 268 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 100 100 7 100 100 7 7 100 100 7 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 +ciInstanceKlass java/util/Map 1 1 132 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 7 7 7 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 +instanceKlass java/util/Hashtable +ciInstanceKlass java/util/Dictionary 1 1 31 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 100 1 1 1 1 1 1 12 10 1 +instanceKlass java/util/Properties +ciInstanceKlass java/util/Hashtable 1 1 416 3 3 4 4 8 8 8 8 8 8 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 3 3 3 5 0 100 100 100 100 100 100 100 100 100 100 7 100 100 7 100 7 100 100 100 7 100 7 7 100 7 7 7 7 100 7 7 7 100 7 100 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 1 1 1 +instanceKlass org/springframework/beans/factory/support/ManagedProperties +instanceKlass org/springframework/core/SortedProperties +ciInstanceKlass java/util/Properties 1 1 263 3 8 8 8 8 8 8 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 1 1 1 1 1 1 1 5 0 100 100 100 100 100 100 100 100 100 100 100 7 100 100 100 100 7 7 100 100 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 1 1 +staticfield java/util/Properties hexDigit [C 16 +instanceKlass java/lang/reflect/Executable +instanceKlass java/lang/reflect/Field +ciInstanceKlass java/lang/reflect/AccessibleObject 1 1 144 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 100 100 7 7 100 7 100 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 +staticfield java/lang/reflect/AccessibleObject ACCESS_PERMISSION Ljava/security/Permission; java/lang/reflect/ReflectPermission +staticfield java/lang/reflect/AccessibleObject reflectionFactory Lsun/reflect/ReflectionFactory; sun/reflect/ReflectionFactory +ciInstanceKlass java/lang/reflect/Field 1 1 362 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 100 100 100 7 7 100 100 100 100 100 7 7 7 7 7 7 100 100 100 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 +ciInstanceKlass java/lang/reflect/Parameter 1 1 210 8 8 8 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 100 100 7 7 100 100 100 7 100 7 100 100 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 1 +instanceKlass java/lang/reflect/Constructor +instanceKlass java/lang/reflect/Method +ciInstanceKlass java/lang/reflect/Executable 1 1 378 3 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 100 100 7 100 7 100 100 100 7 7 7 7 7 100 100 100 7 7 7 100 7 7 7 7 7 100 100 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 1 1 +ciInstanceKlass java/lang/reflect/Method 1 1 346 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 100 100 100 7 7 100 7 100 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 1 +ciInstanceKlass java/lang/reflect/Constructor 1 1 330 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 100 100 100 7 100 100 7 7 100 100 100 100 100 7 7 7 100 100 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 1 +instanceKlass sun/reflect/FieldAccessorImpl +instanceKlass sun/reflect/ConstructorAccessorImpl +instanceKlass sun/reflect/MethodAccessorImpl +ciInstanceKlass sun/reflect/MagicAccessorImpl 1 1 13 1 1 1 1 1 1 1 7 100 12 10 1 +instanceKlass sun/reflect/GeneratedMethodAccessor22 +instanceKlass sun/reflect/GeneratedMethodAccessor21 +instanceKlass sun/reflect/GeneratedMethodAccessor20 +instanceKlass sun/reflect/GeneratedMethodAccessor19 +instanceKlass sun/reflect/GeneratedMethodAccessor18 +instanceKlass sun/reflect/GeneratedMethodAccessor17 +instanceKlass sun/reflect/GeneratedMethodAccessor16 +instanceKlass sun/reflect/GeneratedMethodAccessor15 +instanceKlass sun/reflect/GeneratedMethodAccessor14 +instanceKlass sun/reflect/GeneratedMethodAccessor13 +instanceKlass sun/reflect/GeneratedMethodAccessor12 +instanceKlass sun/reflect/GeneratedMethodAccessor11 +instanceKlass sun/reflect/GeneratedMethodAccessor10 +instanceKlass sun/reflect/GeneratedMethodAccessor9 +instanceKlass sun/reflect/GeneratedMethodAccessor8 +instanceKlass sun/reflect/GeneratedMethodAccessor7 +instanceKlass sun/reflect/GeneratedMethodAccessor6 +instanceKlass sun/reflect/GeneratedMethodAccessor5 +instanceKlass sun/reflect/GeneratedMethodAccessor4 +instanceKlass sun/reflect/GeneratedMethodAccessor3 +instanceKlass sun/reflect/GeneratedMethodAccessor2 +instanceKlass sun/reflect/GeneratedMethodAccessor1 +instanceKlass sun/reflect/DelegatingMethodAccessorImpl +instanceKlass sun/reflect/NativeMethodAccessorImpl +ciInstanceKlass sun/reflect/MethodAccessorImpl 1 1 22 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 7 100 100 12 10 1 +instanceKlass sun/reflect/GeneratedConstructorAccessor13 +instanceKlass sun/reflect/GeneratedConstructorAccessor12 +instanceKlass sun/reflect/GeneratedConstructorAccessor11 +instanceKlass sun/reflect/GeneratedConstructorAccessor10 +instanceKlass sun/reflect/GeneratedConstructorAccessor9 +instanceKlass sun/reflect/GeneratedConstructorAccessor8 +instanceKlass sun/reflect/GeneratedConstructorAccessor7 +instanceKlass sun/reflect/GeneratedConstructorAccessor6 +instanceKlass sun/reflect/GeneratedConstructorAccessor5 +instanceKlass sun/reflect/GeneratedConstructorAccessor4 +instanceKlass sun/reflect/GeneratedConstructorAccessor3 +instanceKlass sun/reflect/GeneratedConstructorAccessor2 +instanceKlass sun/reflect/BootstrapConstructorAccessorImpl +instanceKlass sun/reflect/GeneratedConstructorAccessor1 +instanceKlass sun/reflect/DelegatingConstructorAccessorImpl +instanceKlass sun/reflect/NativeConstructorAccessorImpl +ciInstanceKlass sun/reflect/ConstructorAccessorImpl 1 1 24 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 100 7 12 10 1 +ciInstanceKlass sun/reflect/DelegatingClassLoader 1 1 13 1 1 1 1 1 1 1 7 100 1 12 10 +ciInstanceKlass sun/reflect/ConstantPool 1 1 106 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +instanceKlass sun/reflect/UnsafeFieldAccessorImpl +ciInstanceKlass sun/reflect/FieldAccessorImpl 1 1 56 1 1 1 1 1 1 1 1 1 1 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 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 12 10 1 +instanceKlass sun/reflect/UnsafeStaticFieldAccessorImpl +ciInstanceKlass sun/reflect/UnsafeFieldAccessorImpl 1 1 229 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 100 100 100 100 100 100 100 100 100 100 100 100 100 100 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield sun/reflect/UnsafeFieldAccessorImpl unsafe Lsun/misc/Unsafe; sun/misc/Unsafe +instanceKlass sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl +instanceKlass sun/reflect/UnsafeStaticObjectFieldAccessorImpl +ciInstanceKlass sun/reflect/UnsafeStaticFieldAccessorImpl 1 1 38 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 7 7 1 1 1 1 12 12 12 12 12 9 9 10 10 10 1 +ciInstanceKlass sun/reflect/CallerSensitive 0 0 17 1 1 1 1 1 1 1 1 100 100 100 1 1 1 1 1 +instanceKlass java/lang/invoke/DelegatingMethodHandle +instanceKlass java/lang/invoke/BoundMethodHandle +instanceKlass java/lang/invoke/DirectMethodHandle +ciInstanceKlass java/lang/invoke/MethodHandle 1 1 438 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 100 100 100 100 7 100 100 100 7 100 100 7 7 7 100 7 7 7 7 100 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 1 +staticfield java/lang/invoke/MethodHandle FORM_OFFSET J 20 +staticfield java/lang/invoke/MethodHandle $assertionsDisabled Z 1 +instanceKlass java/lang/invoke/DirectMethodHandle$Constructor +instanceKlass java/lang/invoke/DirectMethodHandle$Special +instanceKlass java/lang/invoke/DirectMethodHandle$Accessor +instanceKlass java/lang/invoke/DirectMethodHandle$Interface +ciInstanceKlass java/lang/invoke/DirectMethodHandle 1 1 701 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 7 100 7 100 7 7 100 7 7 100 7 7 7 7 7 7 100 7 7 100 7 7 100 7 7 7 100 100 100 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 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 ACCESSOR_FORMS [Ljava/lang/invoke/LambdaForm; 132 [Ljava/lang/invoke/LambdaForm; +staticfield java/lang/invoke/DirectMethodHandle $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/MemberName 1 1 642 3 3 3 3 3 3 3 3 3 3 3 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 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 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 7 7 100 100 100 7 7 100 100 100 100 100 100 100 100 100 7 100 7 7 7 7 7 100 7 7 100 100 100 100 7 100 100 100 7 7 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 1 +staticfield java/lang/invoke/MemberName $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/MethodHandleNatives 1 1 427 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 100 100 7 7 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 100 100 100 100 7 100 100 100 100 100 100 100 100 100 100 100 100 100 7 100 7 100 100 100 7 7 7 7 7 7 100 7 7 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 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 +staticfield java/lang/invoke/MethodHandleNatives COUNT_GWT Z 1 +staticfield java/lang/invoke/MethodHandleNatives $assertionsDisabled Z 1 +ciInstanceKlass java/lang/invoke/LambdaForm 1 1 967 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 3 8 100 100 100 100 7 7 100 100 100 7 100 100 100 100 100 100 100 100 7 7 7 100 7 7 100 100 100 7 100 7 100 100 7 7 7 7 7 100 100 7 7 7 7 100 100 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 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_identityForm [Ljava/lang/invoke/LambdaForm; 6 [Ljava/lang/invoke/LambdaForm; +staticfield java/lang/invoke/LambdaForm LF_zeroForm [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 DEBUG_NAME_COUNTERS 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/MethodType 1 1 593 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 5 0 7 100 100 100 7 100 100 7 100 7 100 100 100 100 100 7 7 7 7 100 100 7 7 7 7 7 7 7 7 7 7 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 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 serialPersistentFields [Ljava/io/ObjectStreamField; 0 [Ljava/io/ObjectStreamField; +staticfield java/lang/invoke/MethodType rtypeOffset J 12 +staticfield java/lang/invoke/MethodType ptypesOffset J 16 +staticfield java/lang/invoke/MethodType $assertionsDisabled Z 1 +ciInstanceKlass java/lang/BootstrapMethodError 0 0 38 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 1 1 12 12 12 12 12 10 10 10 10 10 1 +instanceKlass java/lang/invoke/VolatileCallSite +instanceKlass java/lang/invoke/MutableCallSite +instanceKlass java/lang/invoke/ConstantCallSite +ciInstanceKlass java/lang/invoke/CallSite 1 1 311 8 8 8 8 8 8 8 8 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 100 100 100 100 7 100 100 100 100 100 100 7 100 7 100 7 7 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +staticfield java/lang/invoke/CallSite GET_TARGET Ljava/lang/invoke/MethodHandle; java/lang/invoke/DirectMethodHandle +staticfield java/lang/invoke/CallSite THROW_UCS Ljava/lang/invoke/MethodHandle; java/lang/invoke/MethodHandleImpl$AsVarargsCollector +staticfield java/lang/invoke/CallSite TARGET_OFFSET J 12 +ciInstanceKlass java/lang/invoke/ConstantCallSite 1 1 42 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 7 7 1 1 12 12 12 12 12 12 9 9 10 10 10 10 10 1 +ciInstanceKlass java/lang/invoke/MutableCallSite 0 0 57 1 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 100 100 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/lang/invoke/VolatileCallSite 0 0 33 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 1 1 1 12 12 12 12 12 12 10 10 10 10 10 10 1 +instanceKlass java/lang/StringBuilder +instanceKlass java/lang/StringBuffer +ciInstanceKlass java/lang/AbstractStringBuilder 1 1 318 3 3 3 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 100 7 100 100 100 7 7 7 100 7 100 100 100 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 +ciInstanceKlass java/lang/StringBuffer 1 1 371 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 100 7 100 7 7 100 100 7 7 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 1 +staticfield java/lang/StringBuffer serialPersistentFields [Ljava/io/ObjectStreamField; 3 [Ljava/io/ObjectStreamField; +ciInstanceKlass java/lang/StringBuilder 1 1 326 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 100 7 100 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +ciInstanceKlass sun/misc/Unsafe 1 1 389 8 8 7 7 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 100 100 7 100 7 100 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield sun/misc/Unsafe theUnsafe Lsun/misc/Unsafe; sun/misc/Unsafe +staticfield sun/misc/Unsafe ARRAY_BOOLEAN_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_BYTE_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_SHORT_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_CHAR_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_INT_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_LONG_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_FLOAT_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_DOUBLE_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_OBJECT_BASE_OFFSET I 16 +staticfield sun/misc/Unsafe ARRAY_BOOLEAN_INDEX_SCALE I 1 +staticfield sun/misc/Unsafe ARRAY_BYTE_INDEX_SCALE I 1 +staticfield sun/misc/Unsafe ARRAY_SHORT_INDEX_SCALE I 2 +staticfield sun/misc/Unsafe ARRAY_CHAR_INDEX_SCALE I 2 +staticfield sun/misc/Unsafe ARRAY_INT_INDEX_SCALE I 4 +staticfield sun/misc/Unsafe ARRAY_LONG_INDEX_SCALE I 8 +staticfield sun/misc/Unsafe ARRAY_FLOAT_INDEX_SCALE I 4 +staticfield sun/misc/Unsafe ARRAY_DOUBLE_INDEX_SCALE I 8 +staticfield sun/misc/Unsafe ARRAY_OBJECT_INDEX_SCALE I 4 +staticfield sun/misc/Unsafe ADDRESS_SIZE I 8 +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 61 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 3 5 0 100 100 100 100 100 100 100 7 12 12 12 12 12 10 10 10 10 10 10 10 1 +ciInstanceKlass java/io/ByteArrayInputStream 1 1 62 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 100 100 100 7 1 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 1 +ciInstanceKlass java/io/File 1 1 578 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 7 100 7 100 100 7 100 100 100 100 100 100 100 7 100 100 100 100 100 7 100 100 100 100 7 7 7 100 100 7 100 100 7 7 100 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 1 1 1 1 +staticfield java/io/File fs Ljava/io/FileSystem; java/io/WinNTFileSystem +staticfield java/io/File separatorChar C 92 +staticfield java/io/File separator Ljava/lang/String; "\" +staticfield java/io/File pathSeparatorChar C 59 +staticfield java/io/File pathSeparator Ljava/lang/String; ";" +staticfield java/io/File PATH_OFFSET J 16 +staticfield java/io/File PREFIX_LENGTH_OFFSET J 12 +staticfield java/io/File UNSAFE Lsun/misc/Unsafe; sun/misc/Unsafe +staticfield java/io/File $assertionsDisabled Z 1 +instanceKlass sun/misc/Launcher$ExtClassLoader +instanceKlass sun/misc/Launcher$AppClassLoader +ciInstanceKlass java/net/URLClassLoader 1 1 527 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 100 100 100 7 7 7 100 100 7 100 100 100 7 7 7 100 7 100 7 7 7 7 7 100 100 100 7 7 100 100 100 7 7 7 7 100 7 100 100 100 7 7 7 100 7 7 7 7 7 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 +ciInstanceKlass java/net/URL 1 1 550 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 100 100 7 100 7 7 100 100 100 100 100 7 7 100 7 7 100 100 100 7 7 100 100 7 100 7 100 7 100 100 7 7 7 100 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +staticfield java/net/URL serialPersistentFields [Ljava/io/ObjectStreamField; 7 [Ljava/io/ObjectStreamField; +ciInstanceKlass java/util/jar/Manifest 1 1 256 8 8 8 8 8 8 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 1 1 1 100 100 100 100 100 100 7 7 100 7 100 100 100 7 100 7 100 100 7 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 1 1 +ciInstanceKlass sun/misc/Launcher 1 1 218 8 8 8 8 8 8 8 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 100 100 7 100 100 100 100 100 100 100 100 7 100 7 100 7 7 100 7 7 100 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 1 +ciInstanceKlass sun/misc/Launcher$AppClassLoader 1 1 201 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 100 100 7 7 100 7 100 7 7 100 100 7 100 7 100 7 100 7 7 7 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +staticfield sun/misc/Launcher$AppClassLoader $assertionsDisabled Z 1 +ciInstanceKlass sun/misc/Launcher$ExtClassLoader 1 1 237 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 100 7 100 7 100 7 7 100 100 100 7 7 100 100 100 7 100 100 100 7 7 7 7 7 100 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 +ciInstanceKlass java/security/CodeSource 1 1 324 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 100 100 100 100 100 7 7 100 100 7 100 7 100 100 100 100 100 100 100 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 1 +ciInstanceKlass java/lang/StackTraceElement 1 1 98 8 8 8 8 8 8 8 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 5 0 100 100 7 100 100 100 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 1 +instanceKlass java/nio/LongBuffer +instanceKlass java/nio/CharBuffer +instanceKlass java/nio/ByteBuffer +ciInstanceKlass java/nio/Buffer 1 1 103 8 8 8 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 3 100 100 7 100 7 100 100 100 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/lang/Boolean 1 1 110 8 8 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 5 0 100 7 7 100 100 100 7 100 7 7 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 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 +ciInstanceKlass java/lang/Character 1 1 459 3 3 3 3 3 3 3 3 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 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 5 0 5 0 100 100 7 7 100 100 100 7 100 7 100 100 100 100 7 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 1 1 1 1 +staticfield java/lang/Character TYPE Ljava/lang/Class; java/lang/Class +staticfield java/lang/Character $assertionsDisabled Z 1 +instanceKlass java/math/BigDecimal +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 34 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 7 12 12 10 10 1 +ciInstanceKlass java/lang/Float 1 1 169 3 3 3 4 4 4 4 8 8 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 3 3 3 3 4 4 5 0 7 100 100 7 100 7 100 100 7 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield java/lang/Float TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Double 1 1 223 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 5 0 5 0 5 0 5 0 5 0 6 0 6 0 6 0 6 0 6 0 6 0 6 0 7 100 7 100 100 7 100 100 100 100 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield java/lang/Double TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Byte 1 1 153 8 8 8 8 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 3 3 3 3 5 0 5 0 7 7 7 100 100 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +staticfield java/lang/Byte TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Short 1 1 159 3 3 8 8 8 8 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 3 3 3 3 5 0 5 0 7 100 100 7 100 7 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +staticfield java/lang/Short TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/Integer 1 1 309 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 5 0 5 0 5 0 100 7 7 100 100 7 7 100 7 100 7 100 100 100 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 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 [C 100 +staticfield java/lang/Integer DigitOnes [C 100 +staticfield java/lang/Integer sizeTable [I 10 +ciInstanceKlass java/lang/Long 1 1 356 3 3 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 100 100 7 100 100 7 7 7 7 100 7 100 100 100 7 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +staticfield java/lang/Long TYPE Ljava/lang/Class; java/lang/Class +ciInstanceKlass java/lang/NullPointerException 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/lang/ArithmeticException 1 1 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/util/Comparator 1 1 262 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 3 3 7 7 100 100 100 100 100 100 7 100 100 100 100 7 100 100 100 7 7 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 15 15 15 15 15 15 15 16 18 18 18 18 18 18 1 1 1 1 +ciInstanceKlass java/security/AccessController 1 1 187 8 8 8 8 8 8 8 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 100 100 100 100 100 100 7 100 7 7 100 100 100 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/security/PrivilegedAction 1 0 12 1 1 1 1 1 1 1 100 100 1 1 +ciInstanceKlass java/security/cert/Certificate 0 0 108 8 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 5 0 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +instanceKlass org/springframework/beans/factory/support/ManagedList +ciInstanceKlass java/util/ArrayList 1 1 356 3 3 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 5 0 100 100 100 100 100 100 100 100 100 100 7 7 100 100 7 100 7 7 7 7 100 7 7 100 7 100 100 7 100 7 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 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; +instanceKlass java/util/Collections$SingletonMap +instanceKlass java/util/EnumMap +instanceKlass org/springframework/util/ConcurrentReferenceHashMap +instanceKlass java/util/IdentityHashMap +instanceKlass java/util/concurrent/ConcurrentHashMap +instanceKlass java/util/TreeMap +instanceKlass java/util/WeakHashMap +instanceKlass sun/util/PreHashedMap +instanceKlass java/util/HashMap +instanceKlass java/util/Collections$EmptyMap +ciInstanceKlass java/util/AbstractMap 1 1 152 8 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 100 100 100 7 100 100 7 7 100 100 100 100 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 1 +ciInstanceKlass sun/misc/SharedSecrets 1 1 168 7 100 100 100 100 100 100 100 7 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 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 1 +staticfield sun/misc/SharedSecrets unsafe Lsun/misc/Unsafe; sun/misc/Unsafe +instanceKlass java/lang/ProcessEnvironment +instanceKlass java/util/LinkedHashMap +ciInstanceKlass java/util/HashMap 1 1 482 3 3 4 4 4 4 4 8 8 8 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 3 5 0 100 7 100 100 100 100 100 100 100 100 100 7 100 100 100 100 7 100 100 100 7 100 100 7 100 7 100 100 100 100 7 100 7 7 100 100 7 7 7 7 7 7 100 7 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 1 1 1 1 1 1 1 1 1 1 1 +instanceKlass java/util/LinkedHashMap$Entry +ciInstanceKlass java/util/HashMap$Node 1 1 85 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 7 100 100 7 100 100 7 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 11 11 1 +ciInstanceKlass sun/misc/VM 1 1 242 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 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 3 3 3 3 3 3 5 0 5 0 100 100 100 100 100 100 7 7 7 100 100 100 100 7 100 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +staticfield sun/misc/VM lock Ljava/lang/Object; java/lang/Object +staticfield sun/misc/VM savedProps Ljava/util/Properties; java/util/Properties +ciInstanceKlass java/lang/Math 1 1 281 3 3 3 3 3 3 4 4 4 4 4 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 5 0 6 0 6 0 6 0 6 0 6 0 6 0 6 0 6 0 6 0 100 100 7 7 7 100 100 100 100 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +staticfield java/lang/Math $assertionsDisabled Z 1 +instanceKlass java/lang/ClassValue$ClassValueMap +ciInstanceKlass java/util/WeakHashMap 1 1 320 3 3 4 8 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 1 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 7 7 100 7 7 100 100 7 7 100 100 100 100 7 100 100 100 7 100 7 100 100 100 100 100 7 100 100 100 100 100 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 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/util/WeakHashMap NULL_KEY Ljava/lang/Object; java/lang/Object +ciInstanceKlass java/util/Arrays 1 1 800 3 8 8 8 8 8 8 8 8 100 100 100 100 100 100 7 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 100 100 100 7 7 100 100 100 7 7 100 100 7 100 100 100 7 100 100 100 100 100 7 7 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 7 100 100 100 100 100 100 100 100 100 7 7 100 100 100 100 100 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 15 15 15 15 15 16 18 18 18 18 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/util/Arrays $assertionsDisabled Z 1 +ciInstanceKlass sun/misc/ASCIICaseInsensitiveComparator 1 1 67 7 1 1 1 1 1 1 1 1 1 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 7 7 7 100 1 1 1 1 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 1 +staticfield sun/misc/ASCIICaseInsensitiveComparator CASE_INSENSITIVE_ORDER Ljava/util/Comparator; sun/misc/ASCIICaseInsensitiveComparator +staticfield sun/misc/ASCIICaseInsensitiveComparator $assertionsDisabled Z 1 +instanceKlass java/net/SocketInputStream +ciInstanceKlass java/io/FileInputStream 1 1 151 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 7 7 7 7 100 100 7 100 7 100 100 7 100 100 100 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/io/PrintStream 1 1 282 8 8 8 8 8 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 100 7 100 100 100 7 100 100 7 7 7 100 100 100 100 100 100 7 100 100 100 100 100 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 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 +instanceKlass java/nio/MappedByteBuffer +instanceKlass java/nio/HeapByteBuffer +ciInstanceKlass java/nio/ByteBuffer 1 1 254 8 8 8 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 1 1 1 1 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 100 100 100 100 100 100 100 100 7 7 100 100 7 7 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +instanceKlass org/springframework/beans/factory/support/ManagedMap +instanceKlass org/springframework/boot/autoconfigure/template/TemplateAvailabilityProviders$1 +instanceKlass org/springframework/core/annotation/AnnotationAttributes +instanceKlass org/springframework/core/type/classreading/CachingMetadataReaderFactory$LocalResourceCache +instanceKlass org/springframework/util/LinkedCaseInsensitiveMap$1 +instanceKlass java/io/ExpiringCache$1 +ciInstanceKlass java/util/LinkedHashMap 1 1 230 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 100 100 7 7 100 7 7 100 7 100 100 7 100 7 100 100 100 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/io/ExpiringCache$1 1 1 45 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 7 100 7 100 100 1 1 1 1 1 1 12 12 12 12 12 9 10 10 10 1 +instanceKlass java/util/HashMap$TreeNode +ciInstanceKlass java/util/LinkedHashMap$Entry 1 1 27 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 100 100 1 1 1 1 1 12 10 1 +instanceKlass org/springframework/core/Constants$ConstantException +instanceKlass org/springframework/http/InvalidMediaTypeException +instanceKlass org/springframework/util/InvalidMimeTypeException +instanceKlass java/lang/NumberFormatException +ciInstanceKlass java/lang/IllegalArgumentException 1 1 27 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 1 12 12 12 12 10 10 10 10 1 +ciInstanceKlass sun/security/util/Debug 1 1 297 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 100 100 100 100 7 100 100 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield sun/security/util/Debug hexDigits [C 16 +ciInstanceKlass java/util/Locale 1 1 891 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 3 3 3 5 0 8 8 8 8 100 100 100 100 100 100 100 100 7 100 100 100 7 100 100 100 100 7 100 100 7 100 7 100 100 7 100 100 100 100 100 7 7 7 100 7 7 100 100 7 100 100 100 100 7 7 100 7 100 100 100 7 100 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 1 1 1 1 1 1 1 1 1 1 1 +staticfield java/util/Locale LOCALECACHE Ljava/util/Locale$Cache; java/util/Locale$Cache +staticfield java/util/Locale ENGLISH Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale FRENCH Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale GERMAN Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale ITALIAN Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale JAPANESE Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale KOREAN Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale CHINESE Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale SIMPLIFIED_CHINESE Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale TRADITIONAL_CHINESE Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale FRANCE Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale GERMANY Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale ITALY Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale JAPAN Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale KOREA Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale CHINA Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale PRC Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale TAIWAN Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale UK Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale US Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale CANADA Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale CANADA_FRENCH Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale ROOT Ljava/util/Locale; java/util/Locale +staticfield java/util/Locale serialPersistentFields [Ljava/io/ObjectStreamField; 6 [Ljava/io/ObjectStreamField; +staticfield java/util/Locale $assertionsDisabled Z 1 +ciInstanceKlass java/util/concurrent/ConcurrentHashMap 1 1 1012 3 3 3 4 8 8 8 8 7 7 100 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 3 3 3 3 3 5 0 5 0 5 0 5 0 5 0 5 0 8 8 8 8 8 8 100 100 100 100 100 100 7 100 100 7 100 100 100 100 100 7 100 100 7 7 100 100 100 100 100 7 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 7 100 7 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 7 100 100 100 7 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 MAX_RESIZERS I 65535 +staticfield java/util/concurrent/ConcurrentHashMap RESIZE_STAMP_SHIFT I 16 +staticfield java/util/concurrent/ConcurrentHashMap NCPU I 8 +staticfield java/util/concurrent/ConcurrentHashMap serialPersistentFields [Ljava/io/ObjectStreamField; 3 [Ljava/io/ObjectStreamField; +staticfield java/util/concurrent/ConcurrentHashMap U Lsun/misc/Unsafe; sun/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 J 16 +staticfield java/util/concurrent/ConcurrentHashMap ASHIFT I 2 +ciInstanceKlass java/util/HashMap$TreeNode 0 0 177 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 100 100 100 100 100 100 100 100 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 +instanceKlass sun/net/www/protocol/jar/Handler +instanceKlass sun/net/www/protocol/file/Handler +ciInstanceKlass java/net/URLStreamHandler 1 1 230 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 100 100 100 7 100 7 7 7 100 100 7 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass sun/net/www/protocol/file/Handler 1 1 126 8 8 8 8 8 8 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 7 100 7 100 100 7 100 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/security/Principal 0 0 30 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 100 1 1 12 12 10 11 1 +ciInstanceKlass sun/misc/URLClassPath 1 1 515 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 8 100 100 100 100 7 100 100 7 100 100 7 100 7 100 100 100 7 100 7 100 7 100 7 7 100 7 100 100 100 7 100 7 7 7 7 100 100 7 7 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 1 1 1 1 +staticfield sun/misc/URLClassPath JAVA_VERSION Ljava/lang/String; "1.8.0_201" +staticfield sun/misc/URLClassPath DEBUG Z 0 +staticfield sun/misc/URLClassPath DEBUG_LOOKUP_CACHE Z 0 +staticfield sun/misc/URLClassPath DISABLE_JAR_CHECKING Z 0 +staticfield sun/misc/URLClassPath DISABLE_ACC_CHECKING Z 0 +staticfield sun/misc/URLClassPath DISABLE_CP_URL_CHECK Z 1 +staticfield sun/misc/URLClassPath DEBUG_CP_URL_CHECK Z 0 +ciInstanceKlass java/net/URLClassLoader$1 1 1 78 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 100 100 100 7 7 7 7 100 100 7 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 +instanceKlass sun/misc/URLClassPath$FileLoader +instanceKlass sun/misc/URLClassPath$JarLoader +ciInstanceKlass sun/misc/URLClassPath$Loader 1 1 123 8 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 100 100 100 100 100 7 100 100 100 100 100 100 100 100 100 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 +ciInstanceKlass sun/misc/URLClassPath$JarLoader 1 1 522 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 7 7 100 100 100 100 7 7 7 100 100 100 7 100 100 100 100 7 7 100 7 7 7 7 7 7 7 7 100 7 7 7 7 7 100 7 7 100 7 7 7 7 7 7 7 100 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 1 1 1 +staticfield sun/misc/URLClassPath$JarLoader zipAccess Lsun/misc/JavaUtilZipFileAccess; java/util/zip/ZipFile$1 +instanceKlass java/util/jar/JarFile +ciInstanceKlass java/util/zip/ZipFile 1 1 512 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 3 3 3 3 5 0 5 0 5 0 5 0 100 100 7 100 100 100 100 100 100 7 100 100 100 7 100 100 7 7 7 100 100 7 100 100 100 7 100 7 7 100 7 100 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 1 1 1 1 +staticfield java/util/zip/ZipFile usemmap Z 1 +staticfield java/util/zip/ZipFile ensuretrailingslash Z 1 +instanceKlass sun/net/www/protocol/jar/URLJarFile +ciInstanceKlass java/util/jar/JarFile 1 1 453 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 100 7 7 100 7 7 100 7 7 100 100 100 7 100 7 100 7 100 100 100 7 7 7 100 7 7 100 7 7 7 7 7 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 1 1 1 +staticfield java/util/jar/JarFile CLASSPATH_CHARS [C 10 +staticfield java/util/jar/JarFile CLASSPATH_LASTOCC [I 128 +staticfield java/util/jar/JarFile CLASSPATH_OPTOSFT [I 10 +ciInstanceKlass sun/misc/JavaUtilJarAccess 1 0 32 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 1 1 1 1 1 1 1 1 1 1 1 1 1 +ciInstanceKlass java/util/jar/JavaUtilJarAccessImpl 1 1 71 1 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 7 7 100 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/util/zip/ZipCoder 1 1 194 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 100 100 100 7 7 100 100 7 7 7 100 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 +ciInstanceKlass sun/misc/PerfCounter 1 1 152 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 3 3 3 7 100 7 7 7 7 7 7 7 7 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 1 +staticfield sun/misc/PerfCounter perf Lsun/misc/Perf; sun/misc/Perf +ciInstanceKlass sun/misc/PerfCounter$CoreCounters 1 1 53 8 8 8 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 7 7 1 1 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 1 1 +staticfield sun/misc/PerfCounter$CoreCounters pdt Lsun/misc/PerfCounter; sun/misc/PerfCounter +staticfield sun/misc/PerfCounter$CoreCounters lc Lsun/misc/PerfCounter; sun/misc/PerfCounter +staticfield sun/misc/PerfCounter$CoreCounters lct Lsun/misc/PerfCounter; sun/misc/PerfCounter +staticfield sun/misc/PerfCounter$CoreCounters rcbt Lsun/misc/PerfCounter; sun/misc/PerfCounter +staticfield sun/misc/PerfCounter$CoreCounters zfc Lsun/misc/PerfCounter; sun/misc/PerfCounter +staticfield sun/misc/PerfCounter$CoreCounters zfot Lsun/misc/PerfCounter; sun/misc/PerfCounter +instanceKlass java/nio/DirectLongBufferU +ciInstanceKlass java/nio/LongBuffer 1 1 177 8 8 8 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 100 100 100 100 100 100 100 100 100 7 100 100 100 7 100 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +ciInstanceKlass java/nio/DirectLongBufferU 1 1 201 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 100 7 100 100 100 100 7 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +staticfield java/nio/DirectLongBufferU unsafe Lsun/misc/Unsafe; sun/misc/Unsafe +staticfield java/nio/DirectLongBufferU arrayBaseOffset J 16 +staticfield java/nio/DirectLongBufferU unaligned Z 1 +staticfield java/nio/DirectLongBufferU $assertionsDisabled Z 1 +instanceKlass java/util/jar/JarEntry +ciInstanceKlass java/util/zip/ZipEntry 1 1 226 3 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 5 0 5 0 5 0 5 0 100 7 100 100 100 100 7 7 100 7 100 100 7 7 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +instanceKlass sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry +instanceKlass java/util/jar/JarFile$JarFileEntry +ciInstanceKlass java/util/jar/JarEntry 1 1 47 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 100 100 100 7 7 1 1 1 1 1 1 12 12 12 12 12 12 9 9 9 10 10 10 10 10 1 +ciInstanceKlass java/util/jar/JarFile$JarFileEntry 1 1 82 1 1 1 1 1 1 1 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 100 100 7 7 7 100 100 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 1 1 +ciInstanceKlass java/util/zip/ZipFile$ZipFileInputStream 1 1 97 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 5 0 100 100 7 100 100 7 7 7 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 11 1 1 +ciInstanceKlass java/util/zip/Inflater 1 1 153 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 7 100 7 100 100 100 7 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 +staticfield java/util/zip/Inflater defaultBuf [B 0 +staticfield java/util/zip/Inflater $assertionsDisabled Z 1 +ciInstanceKlass java/util/zip/ZipFile$ZipFileInflaterInputStream 1 1 112 3 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 5 0 100 100 7 100 100 7 7 7 7 7 7 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 11 1 1 1 +ciInstanceKlass sun/misc/URLClassPath$FileLoader 1 1 125 8 8 8 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 7 100 100 100 7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 1 1 1 +ciInstanceKlass java/util/jar/JarVerifier 1 1 553 8 8 8 8 8 8 8 8 8 8 8 8 8 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 100 7 100 100 7 100 100 100 7 100 100 100 100 100 100 7 100 100 7 100 7 100 100 100 100 100 100 100 7 100 100 7 100 100 100 7 100 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 1 +staticfield java/util/jar/JarVerifier debug Lsun/security/util/Debug; null +ciInstanceKlass java/security/CodeSigner 0 0 110 8 8 8 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 5 0 100 100 100 100 100 100 100 100 100 100 100 100 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +ciInstanceKlass java/util/jar/Attributes 1 1 251 8 8 8 8 8 8 8 8 8 8 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 100 100 100 100 100 7 7 100 100 7 7 100 7 100 100 7 100 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 1 1 +ciInstanceKlass java/util/jar/Manifest$FastInputStream 1 1 79 1 1 1 1 1 1 1 1 1 1 1 1 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 7 100 7 100 7 100 7 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 10 1 1 +ciInstanceKlass java/util/jar/Attributes$Name 1 1 172 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 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 100 100 7 7 7 100 7 7 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +staticfield java/util/jar/Attributes$Name MANIFEST_VERSION Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name SIGNATURE_VERSION Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name CONTENT_TYPE Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name CLASS_PATH Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name MAIN_CLASS Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name SEALED Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name EXTENSION_LIST Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name EXTENSION_NAME Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name EXTENSION_INSTALLATION Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name IMPLEMENTATION_TITLE Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name IMPLEMENTATION_VERSION Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name IMPLEMENTATION_VENDOR Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name IMPLEMENTATION_VENDOR_ID Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name IMPLEMENTATION_URL Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name SPECIFICATION_TITLE Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name SPECIFICATION_VERSION Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +staticfield java/util/jar/Attributes$Name SPECIFICATION_VENDOR Ljava/util/jar/Attributes$Name; java/util/jar/Attributes$Name +instanceKlass java/io/CharConversionException +instanceKlass java/io/ObjectStreamException +instanceKlass java/util/zip/ZipException +instanceKlass com/fasterxml/jackson/core/JsonProcessingException +instanceKlass java/io/UnsupportedEncodingException +instanceKlass java/net/UnknownHostException +instanceKlass java/nio/file/FileSystemException +instanceKlass org/springframework/core/NestedIOException +instanceKlass java/net/MalformedURLException +instanceKlass java/io/FileNotFoundException +ciInstanceKlass java/io/IOException 1 1 27 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 7 1 12 12 12 12 10 10 10 10 1 +instanceKlass sun/misc/URLClassPath$FileLoader$1 +instanceKlass sun/misc/URLClassPath$JarLoader$2 +ciInstanceKlass sun/misc/Resource 1 1 99 3 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 100 100 100 7 100 7 7 7 100 7 7 7 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 10 10 10 10 10 10 10 10 10 10 10 10 11 1 +ciInstanceKlass sun/misc/URLClassPath$JarLoader$2 1 1 95 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 7 7 7 100 7 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 10 10 10 10 10 11 1 1 +ciInstanceKlass java/lang/Package 1 1 380 8 8 8 8 8 8 8 8 8 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 100 100 100 7 100 7 7 100 100 100 100 7 7 7 7 100 100 100 100 7 100 7 7 7 7 7 7 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 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 1 +ciInstanceKlass sun/nio/ByteBuffered 0 0 12 1 1 1 1 1 1 100 100 100 1 1 +instanceKlass java/security/AllPermissionCollection +instanceKlass java/util/PropertyPermissionCollection +instanceKlass java/net/SocketPermissionCollection +instanceKlass java/security/Policy$UnsupportedEmptyCollection +instanceKlass java/security/BasicPermissionCollection +instanceKlass java/io/FilePermissionCollection +instanceKlass java/security/Permissions +ciInstanceKlass java/security/PermissionCollection 1 1 72 8 8 8 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 5 0 100 7 100 100 7 100 100 1 1 1 1 1 12 12 12 12 12 12 12 9 10 10 10 10 10 10 10 11 11 1 +ciInstanceKlass sun/misc/URLClassPath$FileLoader$1 1 1 66 1 1 1 1 1 1 1 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 7 100 7 100 7 7 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 9 9 9 9 10 10 10 10 1 1 +instanceKlass java/security/AccessControlException +ciInstanceKlass java/lang/SecurityException 1 1 27 1 1 1 1 1 1 1 1 1 1 1 1 5 0 7 100 1 12 12 12 12 10 10 10 10 1 +ciInstanceKlass sun/misc/ProxyGenerator$ConstantPool$IndirectEntry 1 1 55 1 1 1 1 1 1 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 100 100 100 100 7 7 1 1 12 12 12 12 12 12 9 9 9 10 10 10 1 1 1 +ciInstanceKlass java/lang/ProcessEnvironment 1 1 270 8 8 8 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 1 1 1 3 5 0 100 100 7 100 100 7 7 100 7 7 7 100 100 7 7 100 100 7 100 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 1 1 1 1 1 1 1 +staticfield java/lang/ProcessEnvironment nameComparator Ljava/lang/ProcessEnvironment$NameComparator; java/lang/ProcessEnvironment$NameComparator +staticfield java/lang/ProcessEnvironment entryComparator Ljava/lang/ProcessEnvironment$EntryComparator; java/lang/ProcessEnvironment$EntryComparator +staticfield java/lang/ProcessEnvironment theEnvironment Ljava/lang/ProcessEnvironment; java/lang/ProcessEnvironment +staticfield java/lang/ProcessEnvironment theUnmodifiableEnvironment Ljava/util/Map; java/util/Collections$UnmodifiableMap +staticfield java/lang/ProcessEnvironment theCaseInsensitiveEnvironment Ljava/util/Map; java/util/TreeMap +ciInstanceKlass java/util/zip/ZipException 0 0 21 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 12 12 10 10 1 +ciInstanceKlass java/lang/Package$1 1 1 103 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 7 7 7 7 100 100 100 7 7 7 1 1 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 1 +ciInstanceKlass java/lang/AssertionError 0 0 65 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 0 100 100 100 100 100 1 1 1 1 1 1 1 1 12 12 12 12 12 12 12 12 12 12 12 10 10 10 10 10 10 10 10 10 10 10 10 1 +compile java/net/URLClassLoader$1 run ()Ljava/lang/Object; -1 4 inline 212 0 -1 java/net/URLClassLoader$1 run ()Ljava/lang/Object; 1 1 java/net/URLClassLoader$1 run ()Ljava/lang/Class; 2 8 java/lang/String replace (CC)Ljava/lang/String; 3 121 java/lang/String ([CZ)V 4 1 java/lang/Object ()V 2 13 java/lang/String concat (Ljava/lang/String;)Ljava/lang/String; 3 1 java/lang/String length ()I 3 24 java/util/Arrays copyOf ([CI)[C 3 33 java/lang/String getChars ([CI)V 3 43 java/lang/String ([CZ)V 4 1 java/lang/Object ()V 2 21 java/net/URLClassLoader access$000 (Ljava/net/URLClassLoader;)Lsun/misc/URLClassPath; 2 43 java/net/URLClassLoader access$100 (Ljava/net/URLClassLoader;Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class; 3 3 java/net/URLClassLoader defineClass (Ljava/lang/String;Lsun/misc/Resource;)Ljava/lang/Class; 4 7 java/lang/String lastIndexOf (I)I 5 9 java/lang/String lastIndexOf (II)I 4 13 sun/misc/URLClassPath$JarLoader$2 getCodeSourceURL ()Ljava/net/URL; 5 4 sun/misc/URLClassPath$JarLoader access$600 (Lsun/misc/URLClassPath$JarLoader;)Ljava/net/URL; 4 28 java/lang/String substring (II)Ljava/lang/String; 5 75 java/lang/String ([CII)V 6 1 java/lang/Object ()V 6 75 java/util/Arrays copyOfRange ([CII)[C 4 34 sun/misc/URLClassPath$JarLoader$2 getManifest ()Ljava/util/jar/Manifest; 5 0 sun/misc/SharedSecrets javaUtilJarAccess ()Lsun/misc/JavaUtilJarAccess; 5 7 sun/misc/URLClassPath$JarLoader access$700 (Lsun/misc/URLClassPath$JarLoader;)Ljava/util/jar/JarFile; 5 10 java/util/jar/JavaUtilJarAccessImpl ensureInitialization (Ljava/util/jar/JarFile;)V 6 1 java/util/jar/JarFile ensureInitialization ()V 7 1 java/util/jar/JarFile maybeInstantiateVerifier ()V 8 45 java/lang/String endsWith (Ljava/lang/String;)Z 9 13 java/lang/String startsWith (Ljava/lang/String;I)Z 8 54 java/lang/String endsWith (Ljava/lang/String;)Z 9 13 java/lang/String startsWith (Ljava/lang/String;I)Z 8 63 java/lang/String endsWith (Ljava/lang/String;)Z 9 13 java/lang/String startsWith (Ljava/lang/String;I)Z 8 72 java/lang/String endsWith (Ljava/lang/String;)Z 9 13 java/lang/String startsWith (Ljava/lang/String;I)Z 5 19 sun/misc/URLClassPath$JarLoader access$700 (Lsun/misc/URLClassPath$JarLoader;)Ljava/util/jar/JarFile; 5 22 java/util/jar/JarFile getManifest ()Ljava/util/jar/Manifest; 6 1 java/util/jar/JarFile getManifestFromReference ()Ljava/util/jar/Manifest; 7 11 java/lang/ref/SoftReference get ()Ljava/lang/Object; 7 99 java/util/jar/Manifest (Ljava/io/InputStream;)V 8 3 java/util/jar/Manifest (Ljava/util/jar/JarVerifier;Ljava/io/InputStream;)V 9 1 java/lang/Object ()V 9 9 java/util/jar/Attributes ()V 10 3 java/util/jar/Attributes (I)V 9 20 java/util/HashMap ()V 10 1 java/util/AbstractMap ()V 7 109 java/lang/ref/SoftReference (Ljava/lang/Object;)V 8 2 java/lang/ref/Reference (Ljava/lang/Object;)V 9 3 java/lang/ref/Reference (Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V 10 1 java/lang/Object ()V 4 34 sun/misc/Resource getManifest ()Ljava/util/jar/Manifest; 4 46 java/net/URLClassLoader definePackageInternal (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)V 5 4 java/net/URLClassLoader getAndVerifyPackage (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package; 6 2 java/lang/ClassLoader getPackage (Ljava/lang/String;)Ljava/lang/Package; 7 12 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 8 2 java/util/HashMap hash (Ljava/lang/Object;)I 9 9 java/lang/String hashCode ()I 8 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 7 47 java/lang/ClassLoader getPackage (Ljava/lang/String;)Ljava/lang/Package; 8 12 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/lang/String hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 8 55 java/lang/Package getSystemPackage (Ljava/lang/String;)Ljava/lang/Package; 7 55 java/lang/Package getSystemPackage (Ljava/lang/String;)Ljava/lang/Package; 6 14 java/lang/Package isSealed ()Z 6 68 java/net/URLClassLoader isSealed (Ljava/lang/String;Ljava/util/jar/Manifest;)Z 7 0 sun/misc/SharedSecrets javaUtilJarAccess ()Lsun/misc/JavaUtilJarAccess; 7 9 java/lang/String replace (CC)Ljava/lang/String; 8 121 java/lang/String ([CZ)V 9 1 java/lang/Object ()V 7 14 java/lang/String concat (Ljava/lang/String;)Ljava/lang/String; 8 1 java/lang/String length ()I 8 24 java/util/Arrays copyOf ([CI)[C 8 33 java/lang/String getChars ([CI)V 8 43 java/lang/String ([CZ)V 9 1 java/lang/Object ()V 7 17 java/util/jar/JavaUtilJarAccessImpl getTrustedAttributes (Ljava/util/jar/Manifest;Ljava/lang/String;)Ljava/util/jar/Attributes; 8 2 java/util/jar/Manifest getTrustedAttributes (Ljava/lang/String;)Ljava/util/jar/Attributes; 9 2 java/util/jar/Manifest getAttributes (Ljava/lang/String;)Ljava/util/jar/Attributes; 10 1 java/util/jar/Manifest getEntries ()Ljava/util/Map; 10 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 7 34 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 8 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 9 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 10 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 7 45 java/util/jar/Manifest getMainAttributes ()Ljava/util/jar/Attributes; 7 57 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 8 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 9 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 10 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 7 66 java/lang/String equalsIgnoreCase (Ljava/lang/String;)Z 5 18 java/net/URLClassLoader definePackage (Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package; 6 24 sun/misc/SharedSecrets javaUtilJarAccess ()Lsun/misc/JavaUtilJarAccess; 6 58 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 68 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 78 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 88 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 98 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 108 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 118 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 124 java/util/jar/Manifest getMainAttributes ()Ljava/util/jar/Attributes; 6 144 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 159 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 174 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 189 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 204 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 219 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 6 234 java/util/jar/Attributes getValue (Ljava/util/jar/Attributes$Name;)Ljava/lang/String; 7 2 java/util/jar/Attributes get (Ljava/lang/Object;)Ljava/lang/Object; 8 5 java/util/HashMap get (Ljava/lang/Object;)Ljava/lang/Object; 9 2 java/util/HashMap hash (Ljava/lang/Object;)I 10 9 java/util/jar/Attributes$Name hashCode ()I 9 6 java/util/HashMap getNode (ILjava/lang/Object;)Ljava/util/HashMap$Node; 10 59 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 10 126 java/util/jar/Attributes$Name equals (Ljava/lang/Object;)Z 4 103 sun/misc/Resource getCodeSigners ()[Ljava/security/CodeSigner; 4 121 sun/misc/PerfCounter getReadClassBytesTime ()Lsun/misc/PerfCounter; diff --git a/src/main/java/cn/edu/whu/boot/BootApplication.java b/src/main/java/cn/edu/whu/boot/BootApplication.java new file mode 100644 index 0000000..fc7257c --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/BootApplication.java @@ -0,0 +1,79 @@ +package cn.edu.whu.boot; + +import cn.edu.whu.boot.common.domain.CommonConstant; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +@SpringBootApplication +@MapperScan("cn.edu.whu.boot.*.mapper") +@EnableAsync +@EnableCaching +public class BootApplication extends SpringBootServletInitializer implements CommandLineRunner{ + + /** + * 必要的文件夹对应的路径 + */ + @Value("${MediaPath}") + private String mediaPath; + + @Value("${HistoryMediaPath}") + private String historyMediaPath; + @Value("${XmlFilePath}") + private String xmlFilePath; + @Value("${tpk.root}") + private String tpkRoot; + @Value("${tpkx.root}") + private String tpkxRoot; + @Value("${ApkFilePath}") + private String apkFilePath; + @Value("${photozippath}") + private String photozippath; + + + public static void main(String[] args) { + SpringApplication.run(BootApplication.class, args); + } + + /** + * 打成war包需要 + */ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return super.configure(builder); + } + + + /** + * 创建必要的文件夹 + */ + @Override + public void run(String... args) throws Exception{ + + + List paths = new ArrayList<>(); + paths.add(mediaPath); + paths.add(historyMediaPath); + paths.add(xmlFilePath); + paths.add(tpkRoot); + paths.add(tpkxRoot); + paths.add(CommonConstant.TEMP_FILE_PATHNAME); + paths.add(apkFilePath); + paths.add(photozippath); + paths.forEach(path -> { + File file = new File(path); + if(!file.exists()){ + file.mkdirs(); + } + }); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/DraftController.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/DraftController.java new file mode 100644 index 0000000..ee3e8e9 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/DraftController.java @@ -0,0 +1,93 @@ +package cn.edu.whu.boot.allocation.controllers; + +import cn.edu.whu.boot.allocation.controllers.dtos.TableField; +import cn.edu.whu.boot.allocation.entities.Draft; +import cn.edu.whu.boot.allocation.services.DraftService; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.xml.service.ITaskService; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotBlank; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/draft") +public class DraftController { + + @Autowired + private DraftService draftService; + + @Autowired + private ITaskService taskService; + + private static Logger logger = LoggerFactory.getLogger(DraftController.class); + + @RequestMapping("/insert") + @ResponseBody + public ResultMessage insertDraft(@RequestParam("detail") @NotBlank(message = "数据不能为空") String detail) + { + JSONObject jsonObject = JSON.parseObject(detail); + int taskId = jsonObject.getInteger("taskId"); + JSONObject draftJsonObj = jsonObject.getJSONObject("draft"); + Draft draft = JSON.toJavaObject(draftJsonObj, Draft.class); + draft.setDate(OtherUtil.changeTimeString(draft.getDate())); + byte[] shapeByte = Base64.getDecoder().decode(draft.getShape()); + draft.setShape(new String(shapeByte)); + draftService.insert(PostgreSqlUtil.transformString(taskService.getTaskById(taskId).getDatabaseName()), draft); + return ResultMessage.success(null); + } + + @RequestMapping("/fields") + @ResponseBody + public ResultMessage getDraftField() { + + Map map = new HashMap<>(); + TableField tableField; + + tableField = new TableField(); + tableField.setName("upload"); + tableField.setType("int"); + tableField.setChinese("ID"); + map.put("upload", tableField); + + tableField = new TableField(); + tableField.setName("userName"); + tableField.setType("String"); + tableField.setChinese("采集人员"); + map.put("userName", tableField); + + tableField = new TableField(); + tableField.setName("date"); + tableField.setType("Date"); + tableField.setChinese("绘制时间"); + map.put("date", tableField); + + tableField = new TableField(); + tableField.setName("shape"); + tableField.setType("String"); + tableField.setChinese("草图shape"); + map.put("shape", tableField); + + tableField = new TableField(); + tableField.setName("uploadTime"); + tableField.setType("Date"); + tableField.setChinese("上传时间"); + map.put("uploadTime", tableField); + + return new ResultMessage<>(true, "成功获取草图表字段对照名称", map); + } +} + + diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/ImageController.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/ImageController.java new file mode 100644 index 0000000..f0bc355 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/ImageController.java @@ -0,0 +1,329 @@ +package cn.edu.whu.boot.allocation.controllers; + + +import cn.edu.whu.boot.allocation.controllers.dtos.ImageWithUrl; +import cn.edu.whu.boot.allocation.controllers.dtos.MapServerInitialExtent; +import cn.edu.whu.boot.allocation.controllers.dtos.MapServerRoot; +import cn.edu.whu.boot.allocation.entities.Image; +import cn.edu.whu.boot.allocation.services.ImageService; +import cn.edu.whu.boot.allocation.services.TaskCellService; +import cn.edu.whu.boot.allocation.services.TaskInfoService; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.utils.allocation.TpkEncryptHelper; +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.IOUtils; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Polygon; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.Resource; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +@RestController +@Validated +public class ImageController { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + private final GeometryFactory geometryFactory = new GeometryFactory(); + + private final Logger logger = LoggerFactory.getLogger(ImageController.class); + + private final TaskCellService taskCellService; + + private final ImageService imageService; + + private final TaskInfoService taskInfoService; + + @Value("${tpk.root}") + private String tpkRoot; + + @Value("${tpkx.root}") + private String tpkxRoot; + + public ImageController(TaskCellService taskCellService, ImageService imageService, TaskInfoService taskInfoService) { + this.taskCellService = taskCellService; + this.imageService = imageService; + this.taskInfoService = taskInfoService; + } + + /** + * 上传影像文件,加密之后存在服务器上 + * + * @param taskId 任务 ID + * @param file 影像文件 + */ + @RequestMapping("/image/new") + @ResponseBody + public ResultMessage uploadImage(@RequestParam("image") @NotNull(message = "必须上传影像文件") + MultipartFile file, + @RequestParam @Positive + int taskId) throws Exception { + // 检查上传的文件 + if (file.getSize() == 0) { + throw new Exception("上传的文件没有内容"); + } + Optional optionalFilename = Optional.ofNullable(file.getOriginalFilename()); + optionalFilename.orElseThrow(() -> new Exception("非法的文件名")); + String filename = optionalFilename.get(); + if (!filename.endsWith(".tpk")) { + throw new Exception("上传的不是 .tpk 文件"); + } + String tpkFilename = taskId + "_" + filename; + String tpkxFilename = tpkFilename.substring(0, tpkFilename.lastIndexOf(".") + 1) + "tpkx"; + if (imageService.countByFilename(tpkxFilename) != 0) { + throw new Exception("存在同名文件,请更改文件名"); + } + + String tpkUrl = tpkRoot + tpkFilename; + try (InputStream in = file.getInputStream()) { + // 将 .tpk 文件存在本地 + File tpkFile = new File(tpkUrl); + if (tpkFile.exists()) { + Files.delete(Paths.get(tpkUrl)); + } + Files.copy(in, tpkFile.toPath()); + // 加密 + TpkEncryptHelper.encryptTpk(tpkUrl, tpkxRoot); + // 解析 TPK 文件,获取经纬度范围 + MapServerInitialExtent extent = getExtentFromTPK(tpkUrl); + if (extent == null) { + throw new Exception("无法从 TPK 中获取经纬度范围"); + } + // 在 task_image 中插入一条新记录 + int id = imageService.insert(new Image(tpkxFilename, taskId, extent.getXmin(), extent.getYmin(), extent.getXmax(), extent.getYmax())); + ResultMessage message = new ResultMessage<>(true, "成功上传影像"); + message.setData(id); + return message; + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultMessage<>(false, "上传失败"); + } finally { + // 删除原始 TPK 文件,保证服务器上只保存加密后的文件 + try { + Files.delete(Paths.get(tpkUrl)); + } catch (Exception e) { + logger.warn("无法删除 TPK:" + e.getMessage()); + } + } + } + + private MapServerInitialExtent getExtentFromTPK(String tpkUrl) throws IOException { + try (ZipFile zip = new ZipFile(tpkUrl)) { + for (Enumeration e = zip.entries(); e.hasMoreElements(); ) { + ZipEntry entry = e.nextElement(); + if (!entry.isDirectory()) { + if (FilenameUtils.getName(entry.getName()).equals("mapserver.json")) { + try (InputStream in = zip.getInputStream(entry)) { + MapServerRoot root = JSON.parseObject(IOUtils.toString(in, StandardCharsets.UTF_8), MapServerRoot.class); + return root.getContents().getInitialExtent(); + } + } + } + } + } + throw new IOException("TPK 不包含 mapserver.json"); + } + + /** + * 获取指定任务的影像文件 + * + * @param taskId 任务 ID + * @param page 页码 + * @param count 每页的数据量 + */ + @RequestMapping("/images") + @ResponseBody + public ResultMessage getImagesByTaskId(@RequestParam @Positive int taskId, + @RequestParam(defaultValue = "1") @Positive int page, + @RequestParam(defaultValue = "10") @Positive int count) { + // 统计该任务的影像文件 + int total = imageService.countByTaskId(taskId); + int totalPages = (int) Math.ceil((double) total / count); + if (page > totalPages) { + return new ResultMessage<>(false, "请求的页码大于总页数"); + } + + // 获取指定范围内的数据 + List> images = imageService.findByTaskIdPaginated(taskId, page, count); + + Map data = new HashMap<>(); + data.put("total", totalPages); + data.put("data", images); + return new ResultMessage<>(true, "成功获取影像文件列表", data); + } + + /** + * 删除影像文件 + * + * @param str 影像文件 ID 列表字符串,每个 ID 之间用逗号隔开 + */ + @RequestMapping("/image/delete") + @ResponseBody + public ResultMessage deleteImages(@RequestParam("ids") @NotBlank String str) { + List ids = Arrays.stream(str.split(",")).mapToInt(Integer::parseInt).boxed().collect(Collectors.toList()); + List filenames = imageService.findFilenamesInIds(ids); + if (!filenames.isEmpty()) { + for (String filename : filenames) { + try { + // 删除原始 TPK 文件 + File tpkFile = new File(tpkRoot + filename.replace(".tpkx", ".tpk")); + if (tpkFile.exists()) { + if (!tpkFile.delete()) { + logger.warn("无法删除 TPK 文件 " + tpkFile.getPath()); + } + } + // 删除加密文件 + File tpkxFile = new File(tpkxRoot + filename); + if (tpkxFile.exists()) { + if (!tpkxFile.delete()) { + logger.warn("无法删除 TPKX 文件 " + tpkxFile.getPath()); + } + } + } catch (Exception e) { + logger.warn(e.getMessage()); + } + } + } + imageService.deleteInIds(ids); + return new ResultMessage<>(true, "成功删除文件"); + } + + + /** + * 外业人员获取某个任务中与其相关的所有影像 + * + * @param taskId 任务 ID + * @param userId 外业人员 ID + */ + @RequestMapping("/image/all") + @ResponseBody + public ResultMessage getImageList(@RequestParam("taskId") + @NotNull(message = "任务 ID 不能为空") + int taskId, + @RequestParam("userId") + @NotNull(message = "人员 ID 不能为空") + int userId) { + // 获取该任务对应的影像 + List images = imageService.findByTaskId(taskId); + if (taskInfoService.isTaskAllocationOptional(taskId)) { + List result = images + .stream() + .map(image -> new ImageWithUrl(image.getId(), "/tpkx/" + image.getFilename(), image.getMinLon(), image.getMinLat(), image.getMaxLon(), image.getMaxLat())) + .collect(Collectors.toList()); + return new ResultMessage<>(true, "成功获取影像列表", result); + } + + // 获取任务涉及的网格 + List filteredImages = new ArrayList<>(); + List cells = new ArrayList<>(); + for (String geojson : taskCellService.findGeojsonByTaskIdAndUserId(taskId, userId)) { + Polygon cell = fromGeoJsonToPolygon(geojson); + if (cell != null) { + cells.add(cell); + } + } + // 筛选出与任务网格相交的影像 + if (!cells.isEmpty()) { + for (Image image : images) { + double xmin = image.getMinLon(); + double ymin = image.getMinLat(); + double xmax = image.getMaxLon(); + double ymax = image.getMaxLat(); + Coordinate[] shell = {new Coordinate(xmin, ymin), new Coordinate(xmin, ymax), new Coordinate(xmax, ymax), new Coordinate(xmax, ymin), new Coordinate(xmin, ymin)}; + Polygon imageBoundary = geometryFactory.createPolygon(shell); + for (Polygon cell : cells) { + if (cell.intersects(imageBoundary)) { + filteredImages.add(new ImageWithUrl(image.getId(), "/tpkx/" + image.getFilename(), xmin, ymin, xmax, ymax)); + break; + } + } + } + } + return new ResultMessage<>(true, "成功获取影像列表", filteredImages); + } + + /** + * 将 GeoJSON 字符串转换为 org.locationtech.jts.geom.Polygon 对象 + * + * @param geojson 表示一个多边形的 GeoJSON 字符串 + * @return org.locationtech.jts.geom.Polygon 对象 + */ + private Polygon fromGeoJsonToPolygon(String geojson) { + if (geojson == null || geojson.equals("")) { + return null; + } + org.geojson.Feature feature; + try { + feature = objectMapper.readValue(geojson, org.geojson.Feature.class); + } catch (IOException e) { + logger.error("无法解析数据:{},数据应为标准的 GeoJSON 格式", geojson); + return null; + } + Coordinate[] shell = ((org.geojson.Polygon) feature.getGeometry()) + .getCoordinates() + .stream() + .flatMap(lngLatAlts -> lngLatAlts.stream().map(lngLatAlt -> new Coordinate(lngLatAlt.getLongitude(), lngLatAlt.getLatitude()))) + .toArray(Coordinate[]::new); + return geometryFactory.createPolygon(shell); + } + + /** + * 返回加密影像的 URL + * + * @param imageId 影像 ID + */ + @RequestMapping("/image") + @ResponseBody + public ResultMessage getImageUrl(@RequestParam("imageId") + @NotNull(message = "必须上传影像 ID") + int imageId) throws Exception { + Optional optional = imageService.findFilenameById(imageId); + if (!optional.isPresent()) { + throw new Exception("影像不存在"); + } + return new ResultMessage<>(true, "成功获取影像 URL", "/tpkx/" + optional.get()); + } + + /** + * 下载加密 TPKX 影像 + * + * @param filename .tpkx 文件名 + * @throws IOException 读取文件异常 + */ + @RequestMapping("/tpkx/{filename}") + public ResponseEntity downloadImage(@PathVariable("filename") String filename) throws IOException { + File tpkxFile = new File(tpkxRoot + filename); + Path path = Paths.get(tpkxFile.getAbsolutePath()); + ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path)); + return ResponseEntity + .ok() + .contentLength(tpkxFile.length()) + .contentType(MediaType.parseMediaType("application/octet-stream")) + .body(resource); + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/RouteLineController.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/RouteLineController.java new file mode 100644 index 0000000..c95c74b --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/RouteLineController.java @@ -0,0 +1,139 @@ +package cn.edu.whu.boot.allocation.controllers; + + +import cn.edu.whu.boot.allocation.entities.RouteLine; +import cn.edu.whu.boot.allocation.services.RouteLineService; +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import cn.edu.whu.boot.collection.dto.Feature; +import cn.edu.whu.boot.collection.dto.GeometryType; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.NotEmpty; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("route") +public class RouteLineController { + + @Autowired + private RouteLineService routeLineService; + + @Autowired + private ITaskService taskService; + + @Autowired + private UserService userService; + + @Autowired + private TaskUserRoleService taskUserRoleService; + + private static Logger logger = LoggerFactory.getLogger(RouteLineController.class); + + /** + * 上传轨迹数据 + * @param detail 轨迹数据,格式为 JSON 字符串 + */ + @RequestMapping(value="insert",produces="text/html;charset=UTF-8") + public String uploadRoute(@RequestParam("detail") @NotEmpty(message = "数据不能为空") String detail) + { + + JSONObject jsonObject = JSON.parseObject(detail); + int taskId = jsonObject.getInteger("taskId"); + JSONObject routeLineJsonObj = jsonObject.getJSONObject("routeLine"); + RouteLine routeLine = JSON.toJavaObject(routeLineJsonObj, RouteLine.class); + routeLine.setUploadTime(new Date()); + byte[] result = Base64.getDecoder().decode(routeLine.getPolyline()); + + // routeLine的Polyline为标准的GeoJson格式,主要是方便网页端获取,要判断前端传来的是path还是point + Feature feature = new Feature(); + feature.setType(CommonConstant.FEATURE); + GeometryType geometryType = new GeometryType(); + JSONObject shapeJson = JSON.parseObject(new String(result)); + if (shapeJson.containsKey(CommonConstant.PATHS)){ + geometryType.setType(CommonConstant.LINESTRING); + List> pathList = ((List>>)shapeJson.get(CommonConstant.PATHS)).get(0); + geometryType.setCoordinates(pathList); + } + else{ + geometryType.setType(CommonConstant.POINT); + List coordinateList = new ArrayList<>(); + coordinateList.add(shapeJson.getDouble(CommonConstant.X)); + coordinateList.add(shapeJson.getDouble(CommonConstant.Y)); + geometryType.setCoordinates(coordinateList); + } + feature.setGeometry(geometryType); + routeLine.setPolyline(JSON.toJSONString(feature)); + Task task = taskService.getTaskById(taskId); + routeLineService.insertRouteLine(PostgreSqlUtil.transformString(task.getDatabaseName()), routeLine); + return new ResultMessage(true, "轨迹上传成功").toString(); + } + + /** + * 获取某个任务下所有工作人员的名单 + * @param taskId 任务id + */ + @RequestMapping(value="getWorkerForTask",produces="text/html;charset=UTF-8") + public String getWorkerForTask(Integer taskId) + { + List> result = taskService + .getWorkersByTask(taskId) + .stream() + .map(user -> { + Map map = new HashMap<>(); + map.put("userId", String.valueOf(user.getId())); + map.put("userName", user.getUsername()); + return map; + }) + .collect(Collectors.toList()); + return result.isEmpty() ? new ResultMessage<>(false,"该任务下无工作人员", null).toString() : new ResultMessage<>(true,CommonConstant.SUCCEED, result).toString(); + } + + /** + * 获取某用户id在某个时间段内的轨迹数据,并以标准的Feature格式传给前端。数据库中的记录只要与该时间端相交就返回 + * @param taskId 任务Id + * @param userId 用户Id + * @param beginTime 开始时间 + * @param stopTime 结束时间 + */ + @RequestMapping(value="getRouteByUserId",produces="text/html;charset=UTF-8") + public String getRoute(Integer taskId, Integer userId, String beginTime, String stopTime) + { + Task task = taskService.getTaskById(taskId); + User user = userService.findById(userId).get(); + List routeLineStringList; + if (beginTime != null && !beginTime.equals("") && stopTime != null && !stopTime.equals("")) + { + routeLineStringList = routeLineService.findByNameAndTime(PostgreSqlUtil.transformString(task.getDatabaseName()), + user.getUsername(), beginTime, stopTime); + } + else + { + routeLineStringList = routeLineService.findByName(PostgreSqlUtil.transformString(task.getDatabaseName()), + user.getUsername()); + } + if (routeLineStringList == null) + { + return new ResultMessage<>(false, "轨迹为空", null).toString(); + } + else + { + return new ResultMessage<>(true, CommonConstant.SUCCEED, routeLineStringList).toString(); + } + } + +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/TaskController.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/TaskController.java new file mode 100644 index 0000000..21f2487 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/TaskController.java @@ -0,0 +1,1357 @@ +package cn.edu.whu.boot.allocation.controllers; + +import cn.edu.whu.boot.allocation.controllers.dtos.CustomFeatureCollection; +import cn.edu.whu.boot.allocation.controllers.dtos.Pair; +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskCell; +import cn.edu.whu.boot.allocation.entities.TaskCellData; +import cn.edu.whu.boot.allocation.entities.TaskUserCell; +import cn.edu.whu.boot.allocation.entities.TaskUserRole; +import cn.edu.whu.boot.allocation.exceptions.InvalidAssignmentStatus; +import cn.edu.whu.boot.allocation.exceptions.InvalidShapefileException; +import cn.edu.whu.boot.allocation.services.*; +import cn.edu.whu.boot.collection.dto.GeometryType; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.utils.allocation.ArcGisGeoJsonParser; +import cn.edu.whu.boot.common.utils.allocation.GeohashUtil; +import cn.edu.whu.boot.common.utils.allocation.KMeansClustering; +import cn.edu.whu.boot.common.utils.allocation.ShapefileGeometryCursor; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.collection.ShapeTypeUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil; +import cn.edu.whu.boot.xml.domain.RedisKeyType; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.esri.core.geometry.*; +import com.esri.core.geometry.ogc.OGCMultiPolygon; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import org.geojson.Feature; +import org.geojson.FeatureCollection; +import org.geojson.GeoJsonObject; +import org.geojson.LngLatAlt; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.IOException; +import java.io.InputStream; +import java.text.MessageFormat; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@RestController +@RequestMapping("/allocation") +@Validated +public class TaskController { + + private final Logger log = LoggerFactory.getLogger(TaskController.class); + + private final GeometryFactory geometryFactory = new GeometryFactory(); + + private final Gson gson = new Gson(); + + private final ObjectMapper objectMapper = new ObjectMapper(); + + private int precision = 1; + + private boolean precisionDecided = false; + + private final TaskCellDataService taskCellDataService; + + private final TaskUserCellService taskUserCellService; + + private final TaskCellService taskCellService; + + private final TaskUserRoleService taskUserRoleService; + + private final CacheService cacheService; + + @Autowired + private TaskInfoService taskInfoService; + + @Autowired + private ITaskService taskService; + + @Autowired + private IBaseService baseService; + + public TaskController(TaskCellDataService taskCellDataService, TaskUserCellService taskUserCellService, + TaskCellService taskCellService, TaskUserRoleService taskUserRoleService, CacheService cacheService) { + this.taskCellDataService = taskCellDataService; + this.taskUserCellService = taskUserCellService; + this.taskCellService = taskCellService; + this.taskUserRoleService = taskUserRoleService; + this.cacheService = cacheService; + } + + /** + * 判断任务是否已经分配 + * + * @param taskId 任务 ID + */ + @RequestMapping("/is_assigned") + @ResponseBody + public ResultMessage isAssigned(@RequestParam("taskId") int taskId) { + boolean result = _isAssigned(taskId); + return new ResultMessage<>(true, String.format("任务%s分配", result ? "已" : "未"), result); + } + + private boolean _isAssigned(int taskId) { + return !taskCellService.findByTaskId(taskId).isEmpty(); + } + + /** + * 设置任务是否需要分配 + * + * @param taskId 任务 ID + * @param optional true/false + */ + @RequestMapping("/optional") + @ResponseBody + public ResultMessage setTaskAllocationOptional(@RequestParam("taskId") int taskId, @RequestParam("optional") boolean optional) { + taskInfoService.setTaskAllocationOptional(taskId, optional); + return new ResultMessage<>(true, "修改成功"); + } + + + /** + * 自动分配任务区域 如果是审核任务,还要将数据分配给审核人员将分配的结果, + * 即网格-人员和数据-人员的对应关系返回给前端 + * + * @param taskId 任务 ID + * @param jsonString JSON 字符串,包含外业人员信息(id,角色) + * @param shp 区域的 shp 文件或其压缩文件 + * @throws Exception 某某异常 + */ + @RequestMapping("/assignment") + @ResponseBody + public ResultMessage assignCollectingTasks(@RequestParam("taskId") @NotNull(message = "必须上传任务 ID") int taskId, + @RequestParam("workers") @NotBlank(message = "必须上传外业人员") String jsonString, + @RequestParam(name = "precision", defaultValue = "0") int precision, + @RequestParam(name = "shp", required = false) MultipartFile shp) throws Exception { + this.precision = 1; + this.precisionDecided = false; + + // 检查该任务是否已经分配 + if (_isAssigned(taskId)) { + // 如果已经分配,清除原先的分配结果 + taskInfoService.deleteTaskInfo(taskId); + } + + // 解析 shp 文件,读取其中的多边形区域 + boolean isShp = false; + List regions = new LinkedList<>(); + if (shp != null) { + regions = readShp(resolveUploadedFile(shp)); + isShp = !regions.isEmpty(); + } + + List workers = gson.fromJson(jsonString, new TypeToken>() { + }.getType()); + + // 获取任务的数据 + Map> tbToData = getIdAndGeometryData(taskId); // Key: 表名,Value: 数据 ID - JSON 字符串的映射 + + // 有数据,说明这是一个审核任务 + tbToData = tbToData + .entrySet() + .stream() + .filter(it -> { + Map map = it.getValue(); + return map != null && !map.isEmpty(); + }) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + boolean isData = !tbToData.isEmpty(); + // 先检查用户是否指定了审核人员 + if (isData) { + if (workers.stream().noneMatch(Worker::isInspector)) { + throw new InvalidAssignmentStatus("没有指定巡查人员"); + } + } + + if (!isShp && !isData) { + throw new InvalidAssignmentStatus("没有工作区域,数据库中也无数据,无法进行分配"); + } + + // 检查前端是否指定 Geohash 精度 + if (precision != 0) { + this.precision = precision; + this.precisionDecided = true; + } + + // 工作人员-网格的对应关系 + Map> workerToCells = new HashMap<>(); + // 任务-网格-数据的对应关系 + List cellToData = new LinkedList<>(); + Task task = null; + // Key:表名,Value:数据 ID - 审核人员 ID 的映射 + Map> assignedData = new HashMap<>(); + // 标识工作区域的格网 + List cells; + List inspectors = workers.stream().filter(Worker::isInspector).collect(Collectors.toList()); + if (isShp) { + // 上传了 shp,首先将工作区域分配给外业人员 + // 如果这是一个采集任务,把工作区域分给所有人 + List _workers = workers; + if (isData) { + // 否则,先把工作区域分给采集人员 + _workers = _workers.stream().filter(Worker::isCollector).collect(Collectors.toList()); + if (_workers.size() == 0) { + _workers = workers; + } + } + if (this.precisionDecided) { + // 根据指定的 Geohash 精度,将区域的 MBR 划分成矩形格网 + // 1. 获取 MBR + double xmin = Double.MAX_VALUE; + double xmax = Double.MIN_VALUE; + double ymin = Double.MAX_VALUE; + double ymax = Double.MIN_VALUE; + for (com.esri.core.geometry.Polygon region : regions) { + Envelope2D envelope = getEnvelope(region); + if (envelope.xmin < xmin) { + xmin = envelope.xmin; + } + if (envelope.xmax > xmax) { + xmax = envelope.xmax; + } + if (envelope.ymin < ymin) { + ymin = envelope.ymin; + } + if (envelope.ymax > ymax) { + ymax = envelope.ymax; + } + } + // 2. 将 MBR 划分成格网 + Envelope2D MBR = new Envelope2D(xmin, ymin, xmax, ymax); + assignCells(_workers, regions, MBR, workerToCells); + } else { + // 走之前的流程 + assignRegions(_workers, regions, workerToCells); + } + cells = workerToCells + .values() + .stream() + .flatMap(List::stream) + .collect(Collectors.toList()); + } else { + // 没有上传 shp,但是有数据 + // 1. 先计算出能包含所有数据的 MBR + double xmin = Double.MAX_VALUE; + double xmax = Double.MIN_VALUE; + double ymin = Double.MAX_VALUE; + double ymax = Double.MIN_VALUE; + for (Map.Entry> entry : tbToData.entrySet()) { + for (Map.Entry e : entry.getValue().entrySet()) { + // 将 JSON 字符串转换成几何对象 + org.locationtech.jts.geom.Geometry geometry = ArcGisGeoJsonParser + .toGeometryObject(ShapeTypeUtil.changeGeometryToArcGIS(e.getValue())); + if (geometry == null) { + continue; + } + // 更新 MBR 的坐标 + org.locationtech.jts.geom.Geometry envelope = geometry.getEnvelope(); + for (Coordinate coordinate : envelope.getCoordinates()) { + double y = coordinate.y; + if (y < ymin) { + ymin = y; + } else if (y > ymax) { + ymax = y; + } + double x = coordinate.x; + if (x < xmin) { + xmin = x; + } else if (x > xmax) { + xmax = x; + } + } + } + } + com.esri.core.geometry.Polygon mbr = new com.esri.core.geometry.Polygon(); + mbr.startPath(xmin, ymax); + mbr.lineTo(xmax, ymax); + mbr.lineTo(xmax, ymin); + mbr.lineTo(xmin, ymin); + // 2. 如果用户没有指定 Geohash 精度,根据审核人员的数量确定 Geohash 精度, + //假设审核人员有 X 个,那么最好能将 MBR 划分成 X 个矩形 + if (!this.precisionDecided) { + double width = (111.320 * Math.cos(((ymin + ymax) / 2.0) * Math.PI / 180.0)) * (xmax - xmin); + double height = 110.574 * (ymax - ymin); + findGeohashPrecision(inspectors, width, height); + } + // 3. 将 mbr 划分成矩形格网 + List region = Collections.singletonList(mbr); + while (true) { + // 如果划分出的格网数量少于人员数量 + // 增加 Geohash 的精度继续尝试划分 + cells = generateCells(region, xmin, xmax, ymin, ymax); + if (cells.size() >= inspectors.size()) { + break; + } else { + this.precision++; + if (this.precision > 12) { + throw new InvalidAssignmentStatus("无法找到合适的划分等级,请检查工作区域是否过小"); + } + } + } + } + + // 计算每个网格的 Geohash + cells.forEach(c -> { + Point centroid = c.getCentroid(); + // 某些情况下两个相邻网格的 Geohash 会相同,所以加上随机 8 位随机字符串作为后缀 + c.setUserData(GeohashUtil.geohashPoint(centroid.getX(), centroid.getY(), this.precision) + UUID.randomUUID().toString().split("-")[4]); + }); + + // 分配数据 + if (isData) { + if (workers.stream().noneMatch(Worker::isCollector)) { + // 因为在没有指定采集人员的情况下,在前面分配网格时就已经审核人员分配了网格 + // 但是在后面分配数据时,需要把数据对应的网格也分配给审核人员 + // 为了防止重复分配,这里先把前面分配给审核人员的网格清除 + inspectors.forEach(workerToCells::remove); + } + assignData(taskId, inspectors, tbToData, workerToCells, cells, cellToData, assignedData); + task = taskService.getTaskById(taskId); + } + + // 获取外业人员-网格的对应关系 + // 同时将对应关系转换为 TaskUserCell 对象和 TaskCell 对象 + Set taskCells = new HashSet<>(); + List taskUserCells = workerToCells + .entrySet() + .stream() + .map(entry -> entry + .getValue() + .stream() + .map(cell -> { + Worker worker = entry.getKey(); + String geohash = (String) cell.getUserData(); + String geojson = generateCellGeoJsonString(toGeoJsonPolygon(cell), null); + taskCells.add(new TaskCell(taskId, geohash, geojson)); + return new TaskUserCell(taskId, worker.getId(), geohash); + }) + .collect(Collectors.toList()) + ) + .flatMap(List::stream) + .distinct() + .collect(Collectors.toList()); + + // 外业人员-工作角色的对应关系 + List taskUserRole = workers.stream().map(worker -> new TaskUserRole(taskId, worker.getId(), worker.getRole())).collect(Collectors.toList()); + + // 将任务的相关信息都保存到数据库中 + boolean result = taskInfoService.updateTaskInfo(cellToData, new LinkedList<>(taskCells), taskUserCells, taskUserRole, task, assignedData); + if (!result) { + return new ResultMessage<>(false, "任务分配失败"); + } else { + // 返回人员-网格和数据的对应关系 + log.info("成功分配任务 {}", taskId); + return new ResultMessage<>(true, "成功分配任务"); + } + } + + /** + * 根据工作区域面积和工作人员数量,确定合适的 GeoHash 精度 + */ + private void findGeohashPrecision(List workers, double width, double height) { + this.precision = GeohashUtil.findPrecision(width * height / workers.size()); + double[] cellSize = GeohashUtil.getCellSize(this.precision); + if (cellSize == null || cellSize[0] > width || cellSize[1] > height) { + if (width < height) { + this.precision = GeohashUtil.findPrecisionByWidth(width / workers.size()); + } else { + this.precision = GeohashUtil.findPrecisionByHeight(height / workers.size()); + } + } + this.precisionDecided = true; + } + + /** + * 将数据分配给审核人员,同时记录下审核人员-网格、数据-网格的对应关系 + */ + private void assignData(int taskId, + List inspectors, + Map> tbToData, + Map> workerToCells, + List cells, + List cellToData, + Map> assignedData) { + Map> nonNullData = tbToData + .entrySet() + .stream() + .filter(it -> Objects.nonNull(it.getValue())) + .filter(it -> !it.getValue().isEmpty()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + // 建立质心到几何要素之间的对应关系 + Map> centroidToStrId = new HashMap<>(); + for (Map.Entry> entry : nonNullData.entrySet()) { + String tableName = entry.getKey(); + for (Map.Entry jsonData : entry.getValue().entrySet()) { + org.locationtech.jts.geom.Geometry geometry = ArcGisGeoJsonParser + .toGeometryObject(ShapeTypeUtil.changeGeometryToArcGIS(jsonData.getValue())); + Optional.ofNullable(geometry) + .ifPresent(it -> { + geometry.setUserData(tableName + "/" + jsonData.getKey()); + centroidToStrId + .computeIfAbsent(geometry.getCentroid(), k -> new LinkedList<>()) + .add(geometry); + } + ); + } + } + List centroids = new LinkedList<>(centroidToStrId.keySet()); + if (centroids.size() < inspectors.size()) { + // 1. 质心数量少于审核人员数量,均分数据 + List data = centroidToStrId + .values() + .stream() + .flatMap(List::stream) + .collect(Collectors.toList()); + int workload = (int) Math.ceil((data.size() * 1.0) / inspectors.size()); + for (int i = 0; i < inspectors.size(); i++) { + Worker inspector = inspectors.get(i); + for (int j = i * workload; j < data.size(); j++) { + org.locationtech.jts.geom.Geometry geometry = data.get(j); + assignDataAndCell(taskId, workerToCells, cells, cellToData, assignedData, inspector, geometry); + } + } + } else if (inspectors.size() == 1) { + // 2. 只有一个审核人员 + centroidToStrId + .values() + .stream() + .flatMap(List::stream) + .forEach(geometry -> assignDataAndCell(taskId, workerToCells, cells, cellToData, assignedData, inspectors.get(0), geometry)); + } else { + // 3. 否则先聚类,再将类簇随机分配给审核人员 + Map> clusters = KMeansClustering + .clustering(centroids, inspectors.size()); + for (int i = 0; i < inspectors.size(); i++) { + Worker inspector = inspectors.get(i); + for (Point centroid : clusters.get(i)) { + for (org.locationtech.jts.geom.Geometry geometry : centroidToStrId.get(centroid)) { + assignDataAndCell(taskId, workerToCells, cells, cellToData, assignedData, inspector, geometry); + } + } + } + } + } + + // 将数据分配给审核人员 + // 如果在前面分配网格时没有涉及到审核人员, + // 那么在这里还要将数据对应的网格分配给审核人员 + private void assignDataAndCell(int taskId, Map> workerToCells, List cells, List cellToData, Map> assignedData, Worker inspector, org.locationtech.jts.geom.Geometry geometry) { + // strId 的格式为 "tableName/dataId" + String strId = (String) geometry.getUserData(); + String tableName = strId.substring(0, strId.indexOf("/")); + long dataId = Long.parseLong(strId.substring(strId.indexOf("/") + 1)); + // 将数据分配给审核人员 + assignedData.computeIfAbsent(tableName, k -> new HashMap<>()).put(dataId, inspector.getId()); + // 找出与数据相交的网格,分配给该审核人员 + if (!cells.isEmpty()) { + for (Polygon cell : cells) { + if (cell.intersects(geometry)) { + cellToData.add(new TaskCellData( + taskId, + tableName, + dataId, + (String) cell.getUserData()) + ); + workerToCells.computeIfAbsent(inspector, k -> new LinkedList<>()).add(cell); + } + } + } + } + + /** + * 分配任务区域 + * + * @param collectors 采集人员 + * @param regions 区域列表 + * @param workerToCells 外业人员-网格的对应关系 + * @throws Exception Geohash 精度过低 + */ + private void assignRegions(List collectors, + List regions, + Map> workerToCells) throws Exception { + if (regions.size() == collectors.size()) { + // 区域数量等于外业人员数量,直接随机分配区域 + for (int i = 0; i < regions.size(); i++) { + com.esri.core.geometry.Polygon region = regions.get(i); + Worker worker = collectors.get(i); + workerToCells.put(worker, Stream.of(region).map(this::fromEsriPolygon).collect(Collectors.toList())); + } + } else if (regions.size() < collectors.size() && regions.size() > 1) { + // 有多个区域,但区域数量小于外业人员数量 + List polygons = regions.stream().map(this::fromEsriPolygon).collect(Collectors.toList()); + // 首先,每个区域里都分配一个人 + int i = 0; // worker 列表的索引 + for (Polygon polygon : polygons) { + Worker worker = collectors.get(i); + workerToCells.put(worker, Collections.singletonList(polygon)); + i++; + } + // 然后,以区域的面积为权重分配剩下的人,面积大的区域分到的人就相应的多一些 + // 计算每个区域理论上应该能分到多少人 + final int headcount = collectors.size() - i; + double sumArea = polygons.stream().mapToDouble(Polygon::getArea).sum(); // 总面积 + Map polygonToHeadcount = polygons + .stream() + .map(polygon -> new AbstractMap.SimpleEntry<>(polygon, (int) Math.ceil(headcount * (polygon.getArea() / sumArea)))) + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, + (oldValue, newValue) -> oldValue, LinkedHashMap::new)); + // 分配剩下的人,分完了就停止 + for (Map.Entry entry : polygonToHeadcount.entrySet()) { + int count = entry.getValue(); + for (int end = i + count; i < collectors.size() && i < end; i++) { + Worker worker = collectors.get(i); + workerToCells.put(worker, Collections.singletonList(entry.getKey())); + } + if (i == collectors.size()) { + break; + } + } + } else if (regions.size() > collectors.size()) { + // 区域数量大于外业人员数量 + // 对区域聚类,分配给外业人员 + // 建立多边形形心到多边形之间的映射 + // 不同多边形可能具有相同形心 + Map> centroidToCells = regions + .stream() + .map(this::fromEsriPolygon) + .collect(Collectors.groupingBy(org.locationtech.jts.geom.Geometry::getCentroid)); + // 聚类 + Map> clusters = KMeansClustering + .clustering(new LinkedList<>(centroidToCells.keySet()), collectors.size()); + // 分配区域 + for (Map.Entry> entry : clusters.entrySet()) { + Worker worker = collectors.get(entry.getKey()); + workerToCells.put( + worker, + entry.getValue().stream().map(centroidToCells::get).flatMap(List::stream).collect(Collectors.toList()) + ); + } + } else { + // 只有一个区域 + // 将区域划分为网格,然后分配网格 + // 首先要确定 Geohash 精度 + // 原则:划分出的网格数量大于等于外业人员的数量 + Envelope2D MBR = getEnvelope(regions.get(0)); + // 计算区域外接矩形的面积 + // Longitude: 1 deg = 111.320*cos(latitude) km + double width = (111.320 * Math.cos(((MBR.ymin + MBR.ymax) / 2.0) * Math.PI / 180.0)) * (MBR.xmax - MBR.xmin); + // Latitude: 1 deg = 110.574 km + double height = 110.574 * (MBR.ymax - MBR.ymin); + findGeohashPrecision(collectors, width, height); + assignCells(collectors, regions, MBR, workerToCells); + } + } + + /** + * 将 MBR 划分为格网,然后分配格网 + * + * @param collectors 采集人员 + * @param polygons 原始多边形 + * @param MBR 需要划分的 MBR + * @param collectorToCells 采集人员-格网 + * @throws Exception Geohash 精度过低 + */ + private void assignCells(List collectors, + List polygons, + Envelope2D MBR, + Map> collectorToCells) throws Exception { + // 划分网格 + // 如果划分出的格网数量小于外业人员数量, + // 增加 Geohash 精度继续尝试划分 + List cells; + while (true) { + cells = generateCells( + polygons, + MBR.xmin, + MBR.xmax, + MBR.ymin, + MBR.ymax + ); + if (cells.size() >= collectors.size()) { + break; + } else { + this.precision++; + if (this.precision > 12) { + throw new InvalidAssignmentStatus("无法找到合适的划分等级,请检查指定的工作区域是否过小"); + } + } + } + + // 尽可能平均地将网格分配给外业人员 + int workload = (int) Math.ceil((cells.size() * 1.0) / collectors.size()); // 每个外业人员负责的网格数量 + for (int i = 0; i < collectors.size(); i++) { + int count = 0; + List _cells = new LinkedList<>(); + for (int j = i * workload; j < cells.size() && count < workload; j++) { + _cells.add(cells.get(j)); + count++; + } + collectorToCells.put(collectors.get(i), _cells); + } + } + + /** + * 获取多边形的 MBR + * + * @param polygon 多边形 + * @return MBR + */ + private Envelope2D getEnvelope(com.esri.core.geometry.Polygon polygon) { + Envelope2D env = new Envelope2D(); + polygon.queryEnvelope2D(env); + return env; + } + + /** + * 获取任务涉及到的所有网格 + * 如果该任务是不需要分配的,返回包含所有数据的外接矩形 + * + * @param taskId 任务 ID + */ + @RequestMapping("/info/cell/all") + @ResponseBody + public ResultMessage getTaskCell(@RequestParam("taskId") + @NotNull(message = "必须上传任务 ID") + int taskId) throws Exception { + CustomFeatureCollection result = null; + if (taskService.getTaskById(taskId).getIsAllocationOptional() == 1) { + // 该任务无需分配,没有网格,所以直接获取包含所有数据的外接矩形 + Map> tbToData = getIdAndGeometryData(taskId); + if (!tbToData.isEmpty()) { + double[] bbox = getBBoxOfData(tbToData); + if (bbox == null) { + result = new CustomFeatureCollection(Collections.emptyList()); + } else { + double xmin = bbox[0]; + double ymin = bbox[1]; + double xmax = bbox[2]; + double ymax = bbox[3]; + Feature feature = new Feature(); + feature.setGeometry(new org.geojson.Polygon( + new LngLatAlt(xmin, ymin), + new LngLatAlt(xmax, ymin), + new LngLatAlt(xmax, ymax), + new LngLatAlt(xmin, ymax), + new LngLatAlt(xmin, ymin)) + ); + feature.setProperty("count", tbToData.values().stream().filter(Objects::nonNull).mapToInt(Map::size).sum()); + feature.setProperty("geohash", ""); + feature.setProperty("users", Collections.emptyList()); + result = new CustomFeatureCollection(Collections.singletonList(feature)); + } + } + } else { + // 先查缓存 + String cellCacheKey = RedisKeyType.CELL.toString() + taskId; + Object cachedCells = cacheService.get(cellCacheKey); + if (cachedCells != null) { + FeatureCollection collection = (FeatureCollection) objectMapper.readValue((String) cachedCells, GeoJsonObject.class); + return new ResultMessage<>(true, "网格获取成功", new CustomFeatureCollection(collection.getFeatures())); + } + + // 获取所有的网格 (geohash, geojson) + List cells = taskCellService.findByTaskId(taskId); + Map> cell2Workers = new HashMap<>(); + for (TaskCell cell : cells) { + Worker dummy = new Worker(); + dummy.setGeojson(cell.getGeojson()); + List workers = new ArrayList<>(); + workers.add(dummy); + cell2Workers.put(cell.getGeohash(), workers); + } + // 获取工作人员,包含字段(id, username, work_role, cell_geohash) + List workers = taskUserCellService.findWorkerByTaskId(taskId); + // 根据 geohash 字段进行连接 + for (Worker worker : workers) { + for (TaskCell cell : cells) { + String geohash = worker.getGeohash(); + if (geohash.equals(cell.getGeohash())) { + worker.setGeojson(cell.getGeojson()); + cell2Workers.get(geohash).add(worker); + break; + } + } + } + // 将数据转换成 GeoJSON + List features = new LinkedList<>(); + addFeature(features, cell2Workers, true, taskId); + result = new CustomFeatureCollection(features); + + // 更新缓存 + FeatureCollection collection = new FeatureCollection(); + collection.addAll(result.getFeatures()); + // 设置缓存过期时间为一天 + cacheService.set(cellCacheKey, objectMapper.writeValueAsString(collection), 24 * 60 * 60); + } + + return new ResultMessage<>(true, "成功获取所有网格", result); + } + + /** + * 计算包含所有数据的外接矩形 + * + * @param tbToData: 表名和数据间的映射 + * @return (xmin, ymin, xmax, ymax) + */ + private double[] getBBoxOfData(Map> tbToData) { + double xmin = Double.MAX_VALUE; + double ymin = Double.MAX_VALUE; + double xmax = Double.MIN_VALUE; + double ymax = Double.MIN_VALUE; + for (Map.Entry> entry : tbToData.entrySet()) { + Map idToJson = entry.getValue(); + if (idToJson != null && !idToJson.isEmpty()) { + for (String json : idToJson.values()) { + org.locationtech.jts.geom.Geometry geometry = ArcGisGeoJsonParser.toGeometryObject(ShapeTypeUtil.changeGeometryToArcGIS(json)); + if (geometry != null) { + org.locationtech.jts.geom.Geometry envelope = geometry.getEnvelope(); + if (envelope instanceof Point) { + // If geometry is empty, envelope is an empty Point. + // If geometry is a point, envelope is a Point. + Point point = (Point) envelope; + if (!point.isEmpty()) { + xmin = Math.min(xmin, point.getX()); + ymin = Math.min(ymin, point.getY()); + xmax = Math.max(xmax, point.getX()); + ymax = Math.max(ymax, point.getY()); + } + } else if (envelope instanceof org.locationtech.jts.geom.LineString) { + // If geometry is a line parallel to an axis, envelope is a two-vertex LineString + org.locationtech.jts.geom.LineString lineString = (org.locationtech.jts.geom.LineString) envelope; + Point p1 = lineString.getStartPoint(); + Point p2 = lineString.getEndPoint(); + xmin = Math.min(xmin, Math.min(p1.getX(), p2.getX())); + ymin = Math.min(ymin, Math.min(p1.getY(), p2.getY())); + xmax = Math.max(xmax, Math.max(p1.getX(), p2.getX())); + ymax = Math.max(ymax, Math.max(p1.getY(), p2.getY())); + } else { + // otherwise, envelope a Polygon + // whose vertices are (minx miny, maxx miny, maxx maxy, minx maxy, minx miny) + org.locationtech.jts.geom.Polygon polygon = (org.locationtech.jts.geom.Polygon) envelope; + Coordinate[] coords = polygon.getCoordinates(); + xmin = Math.min(xmin, coords[0].x); + ymin = Math.min(ymin, coords[0].y); + xmax = Math.max(xmax, coords[1].x); + ymax = Math.max(ymax, coords[2].y); + } + } + } + } + } + + if (xmin == Double.MAX_VALUE || ymin == Double.MAX_VALUE || xmax == Double.MIN_VALUE || ymax == Double.MIN_VALUE) { + return null; + } + + // 最大坐标和最小坐标之间至少相差 0.0005 + double threshold = 0.0005; + double halfThreshold = threshold / 2.0; + if (xmax - xmin < threshold) { + xmax += halfThreshold; + xmin -= halfThreshold; + } + if (ymax - ymin < threshold) { + ymax += halfThreshold; + ymin -= halfThreshold; + } + return new double[]{xmin, ymin, xmax, ymax}; + } + + /** + * 获取外业人员在任务中分配到的网格 + * + * @param taskId 任务 ID + * @param userId 外业人员 ID + */ + @RequestMapping("/info/cell/user") + @ResponseBody + public ResultMessage getTaskCellByUser(@RequestParam("taskId") + @NotNull(message = "必须上传任务 ID") + int taskId, + @RequestParam("userId") + @NotNull(message = "必须上传外业人员 ID") + int userId) throws Exception { + // 以 Geohash 为 key 进行聚合 + Map> cell2Worker = taskUserCellService + .findWorkerByTaskIdAndUserId(taskId, userId) + .stream() + .collect(Collectors.groupingBy(Worker::getGeohash)); + List features = new LinkedList<>(); + addFeature(features, cell2Worker, false, taskId); + CustomFeatureCollection collection = new CustomFeatureCollection(features); + return new ResultMessage<>(true, "成功获取网格", collection); + } + + /** + * 将网格和人员信息转换为 GeoJSON Feature + * + * @param features Feature 列表 + * @param cell2Users key:Geohash,value:相关的人员列表 + * @throws Exception 无法解析 GeoJSON 字符串 + */ + private void addFeature(List features, Map> cell2Users, + boolean statisticsDataNum, Integer taskId) throws Exception { + Task task = taskService.getTaskById(taskId); + Map tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + for (Map.Entry> entry : cell2Users.entrySet()) { + List cellAndUsers = entry.getValue(); + String geojson = cellAndUsers.get(0).getGeojson(); + Feature feature; + try { + feature = objectMapper.readValue(geojson, Feature.class); + } catch (IOException e) { + log.error("无法解析 {},应为标准的 GeoJSON Feature 格式", geojson); + throw new Exception("解析 GeoJSON 数据时发生异常"); + } + // 如果statisticsDataNum为true,统计每个GeoHash内的数据个数 + if (statisticsDataNum) { + Long dataSum = 0L; + String featureString = taskCellService.findGeojsonByTaskIdAndGeohash(taskId, entry.getKey()).get(); + GeometryType geometryType = JSON.toJavaObject(JSON.parseObject(featureString), cn.edu.whu.boot.collection.dto.Feature.class).getGeometry(); + for (String tableName : tables.keySet()) { + dataSum += baseService.getStatisticDataNumByGeoJson(PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false), + PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(tables.get(tableName))), + JSON.toJSONString(geometryType)); + } + feature.setProperty("count", dataSum); + } + // 设置属性 + feature.setProperty("geohash", entry.getKey()); + List> users = new ArrayList<>(); + for (Worker user : cellAndUsers) { + if (user.getId() == null) { + continue; + } + users.add(new HashMap() {{ + put("userId", user.getId()); + put("username", user.getUsername()); + put("role", user.getRole()); + }}); + } + feature.setProperty("users", users); + features.add(feature); + } + } + + /** + *

修改网格和外业人员的对应关系,上传的 JSON 参数格式为: + *

+     * {
+     *    "geohash1": 1,
+     *    "geohash2": 1,
+     * }
+     * 
+ *

表示将编号为 geohash1 和 geohash2 的网格分别分配给外业人员 1 和 外业人员 2 + * + * @param taskId 任务 ID + * @param jsonString 表示网格-人员对应关系的 JSON 字符串 + */ + @RequestMapping("/change/cell") + @ResponseBody + public ResultMessage modifyCellToWorker(@RequestParam("taskId") @NotNull(message = "必须上传任务 ID") int taskId, @RequestParam("change") @NotBlank(message = "网格和外业人员的对应关系不能为空") String jsonString) throws Exception { + Map cellToWorker = gson.fromJson(jsonString, new TypeToken>() { + }.getType()); + + // 获取网格和数据的对应关系,再以此找到人员和数据的对应关系 + Map> dataToWorker = new HashMap<>(); + taskCellDataService.findByTaskIdAndCellGeohashIn(taskId, new LinkedList<>(cellToWorker.keySet())).forEach(it -> dataToWorker.computeIfAbsent(it.getTableName(), k -> new HashMap<>()).put(it.getDataId(), cellToWorker.get(it.getCellGeohash()))); + + // 在数据库中更新网格-人员的对应关系和数据-人员的对应关系 + taskInfoService.updateCell2WorkerAndData2Worker(taskId, cellToWorker, dataToWorker); + + return new ResultMessage<>(true, "修改成功"); + } + + /** + *

修改网格内的工作人员,上传的 JSON 参数格式为: + *

+     * {
+     *    "1": "1",
+     *    "2": "0",
+     * }
+     * 
+ *

代表 (worker, role) 键值对,role 为 1 为审核人员,0 为 采集人员 + */ + @RequestMapping("/change/cell_worker") + @ResponseBody + public ResultMessage changeWorkersInCell(@RequestParam("taskId") int taskId, + @RequestParam("geohash") @NotBlank String geohash, + @RequestParam("change") @NotBlank String jsonString) throws Exception { + Map worker2role = gson.fromJson(jsonString, new TypeToken>() { + }.getType()); + + // 1. 获取网格内的数据 + Map> table2data = baseService.getIdAndGeojsonByGeohash(taskId, geohash); + + Map> assignedData = null; + if (table2data != null && !table2data.isEmpty()) { + // 2. 获取网格内的审核人员 + List inspectors = new ArrayList<>(); + for (Map.Entry e : worker2role.entrySet()) { + if (e.getValue().equals(1)) { + inspectors.add(e.getKey()); + } + } + + // 将数据重新分配给审核人员 + assignedData = reassignData(table2data, inspectors); + } + + taskInfoService.completeChangingWorkersInCell(taskId, geohash, worker2role.keySet(), assignedData); + return new ResultMessage<>(true, "修改成功"); + } + + private Map> reassignData(Map> table2data, List inspectors) { + if (inspectors.isEmpty()) { + // 3. 没有审核人员,将所有数据的审核人员设为空 + return assignDataToOne(-1, table2data); + } + + // 4. 将数据分配给审核人员 + if (inspectors.size() == 1) { + // 4.1 如果只有一个审核人员,将数据都分配给 TA + return assignDataToOne(inspectors.get(0), table2data); + } + + Map> assignedData = new HashMap<>(); + // 4.2 计算所有数据的质心 + Map>> centroid2data = new HashMap<>(); + for (Map.Entry> e1 : table2data.entrySet()) { + String table = e1.getKey(); + Map data2geojson = e1.getValue(); + if (data2geojson != null && !data2geojson.isEmpty()) { + for (Map.Entry e2 : data2geojson.entrySet()) { + org.locationtech.jts.geom.Geometry geom = ArcGisGeoJsonParser.toGeometryObject(ShapeTypeUtil.changeGeometryToArcGIS(e2.getValue())); + if (geom != null) { + long dataId = e2.getKey(); + centroid2data.computeIfAbsent(geom.getCentroid(), k -> new ArrayList<>()).add(new Pair<>(table, dataId)); + } + } + } + } + List centroids = new ArrayList<>(centroid2data.keySet()); + if (centroids.size() < inspectors.size()) { + // 4.2.1 质心数量少于审核人员数量,将数据随机分给所有审核人员 + int inspIdx = 0; + int inspSize = inspectors.size(); + for (List> value : centroid2data.values()) { + for (Pair p : value) { + String table = p.x; + long dataId = p.y; + assignedData.computeIfAbsent(table, k -> new HashMap<>()).put(dataId, inspectors.get(inspIdx)); + inspIdx = (inspIdx + 1) % inspSize; + } + } + } else { + // 4.2.2 如果有多个质心且质心数量大于等于审核人员数量,先将质心聚类再分配给审核人员 + Map> clusters = KMeansClustering.clustering(centroids, inspectors.size()); + for (int i = 0; i < inspectors.size(); i++) { + int inspId = inspectors.get(i); + for (Point centroid : clusters.get(i)) { + for (Pair p : centroid2data.get(centroid)) { + String table = p.x; + long dataId = p.y; + assignedData.computeIfAbsent(table, k -> new HashMap<>()).put(dataId, inspId); + } + } + } + } + + return assignedData; + } + + // 将所有数据都分配给一个审核人员 + private Map> assignDataToOne(int inspId, Map> table2data) { + Map> assignedData = new HashMap<>(); + for (Map.Entry> e : table2data.entrySet()) { + String table = e.getKey(); + Map data2geojson = e.getValue(); + if (data2geojson != null && !data2geojson.isEmpty()) { + Map data2insp = new HashMap<>(); + for (long dataId : data2geojson.keySet()) { + data2insp.put(dataId, inspId); + } + assignedData.put(table, data2insp); + } + } + return assignedData; + } + + /** + *

修改数据和外业人员的对应关系,上传的 JSON 参数的格式为 + *

+     * {
+     *     "table1": {
+     *         1: 1,
+     *         2: 2
+     *     }
+     * }
+     * 
+ *

表示将数据表 table1 下 ID 为 1 和 2 的数据分别分配给外业人员 1 和外业人员 2 + * + * @param taskId 任务 ID + * @param jsonString 表示数据-人员对应关系的 JSON 字符串 + */ + @RequestMapping("/change/data") + @ResponseBody + public ResultMessage modifyDataToWorker(@RequestParam("taskId") @NotNull(message = "必须上传任务 ID") int taskId, @RequestParam("change") @NotBlank(message = "数据和外业人员的对应关系不能为空") String jsonString) throws Exception { + Map> tbToDataAndWorker = gson.fromJson(jsonString, new TypeToken>>() { + }.getType()); + if (tbToDataAndWorker == null || tbToDataAndWorker.isEmpty()) { + return new ResultMessage<>(false, "参数为空"); + } + + // 在数据库中更新 + try { + taskInfoService.updateCell2WorkerAndData2Worker(taskId, tbToDataAndWorker); + } catch (InvalidAssignmentStatus e) { + return new ResultMessage<>(false, e.getMessage()); + } + return new ResultMessage<>(true, "修改成功"); + } + + /** + * 获取某个任务下的所有外业人员 + * + * @param taskId 任务 ID + */ + @RequestMapping("/info/worker") + @ResponseBody + public ResultMessage getWorkerByTask(@RequestParam("taskId") int taskId) { + List> workers = taskUserRoleService + .findWorkerByTaskId(taskId) + .stream() + .map(item -> (Map) new HashMap() {{ + put("id", item.getId()); + put("username", item.getUsername()); + put("role", item.getRole()); + }}) + .collect(Collectors.toList()); + return new ResultMessage<>(true, "成功获取外业人员列表", workers); + } + + /** + * 检查某个外业人员在某个任务中是否有正在负责的网格 + * 或正在审核的数据 + * + * @param taskId 任务 ID + * @param userId 外业人员 ID + * @param role 工作角色 + */ + @RequestMapping("/worker_status") + @ResponseBody + public ResultMessage checkWorkerStatus(@RequestParam("taskId") + int taskId, + @RequestParam("userId") + int userId, + @RequestParam("role") + int role) { + // 检查该外业人员是否有负责的格网 + if (!taskUserCellService.findByTaskIdAndUserId(taskId, userId).isEmpty()) { + return new ResultMessage<>(true, "该人员有正在负责的格网", true); + } + // 如果是审核人员,还要检查他是否有正在审核的数据 + if (role == 1) { + // TODO: 检查该审核人员是否有正在审核的数据,如果有,则直接返回 + } + return new ResultMessage<>(true, "该外业人员无任务", false); + } + + /** + * 管理任务的外业人员,上传的 append 参数表示新增的工作人员,格式为 + *

+     * {
+     *    "1": "1",
+     *    "2": "0",
+     * }
+     * 
+ *

代表 (worker, role) 键值对,role 为 1 为审核人员,0 为 采集人员 + * delete 参数是需要删除的人员,格式同上 + */ + @RequestMapping("/change/worker") + @ResponseBody + public ResultMessage changeWorkers(@RequestParam("taskId") int taskId, + @RequestParam("append") String jsonString1, + @RequestParam("delete") String jsonString2) throws Exception { + + Map appendWorker2role = (jsonString1 == null || jsonString1.isEmpty()) ? null : gson.fromJson(jsonString1, new TypeToken>() { + }.getType()); + Map deleteWorker2role = (jsonString2 == null || jsonString2.isEmpty()) ? null : gson.fromJson(jsonString2, new TypeToken>() { + }.getType()); + if ((appendWorker2role == null || appendWorker2role.isEmpty()) && (deleteWorker2role == null || deleteWorker2role.isEmpty())) { + return new ResultMessage<>(true, "修改成功"); + } + + taskInfoService.completeChangingWorkers(taskId, appendWorker2role, deleteWorker2role); + return new ResultMessage<>(true, "修改成功"); + } + + /** + * 将包含所有多边形的 MBR 划分为格网 + * + * @param polygons 原始多边形 + * @return 划分得到的格网 + * @throws Exception Geohash 精度不在 1 到 12 位之间 + */ + private List generateCells(List polygons, + double xmin, + double xmax, + double ymin, + double ymax) throws Exception { + double[] cellSize = GeohashUtil.getCellSize(this.precision); // 单位为 km + if (cellSize == null) { + throw new Exception("Geohash 精度不在 1 到 12 位之间"); + } + // 计算每个网格的经纬度跨度 + // Latitude: 1 deg = 110.574 km + double latDelta = cellSize[1] / 110.574; + // Longitude: 1 deg = 111.320*cos(latitude) km + double lonDelta = cellSize[0] / (111.320 * Math.cos(((ymax + ymin) / 2.0) * Math.PI / 180.0)); + // 划分网格 + List cells = new LinkedList<>(); + int lonCount = (int) Math.ceil((xmax - xmin) / lonDelta); // 经度方向上的网格数量 + int latCount = (int) Math.ceil((ymax - ymin) / latDelta); // 纬度方向上的网格数量 + for (int i = 0; i < lonCount; i++) { + double left = xmin + i * lonDelta; + double right = left + lonDelta; + for (int j = 0; j < latCount; j++) { + double bottom = ymin + j * latDelta; + double top = bottom + latDelta; + // 创建一个矩形要素作为网格 + Polygon cell = geometryFactory.createPolygon(new Coordinate[]{new Coordinate(left, top), new Coordinate(right, top), new Coordinate(right, bottom), new Coordinate(left, bottom), new Coordinate(left, top)}); + // 如果该网格不与任何多边形相交,则略去 + if (polygons.stream().map(this::fromEsriPolygon).noneMatch(it -> it.intersects(cell))) { + continue; + } + cells.add(cell); + } + } + return cells; + } + + /** + * 生成表示网格的 GeoJSON 字符串 + * + * @param geometry GeoJSON 对象列表 + * @param properties 需要添加的属性 + * @return GeoJSON 字符串 + */ + private String generateCellGeoJsonString(GeoJsonObject geometry, Map properties) { + if (geometry == null) { + return null; + } + Feature feature = new Feature(); + feature.setGeometry(geometry); + Optional.ofNullable(properties).ifPresent(feature::setProperties); + String jsonString = ""; + try { + jsonString = objectMapper.writeValueAsString(feature); + } catch (JsonProcessingException e) { + log.error(e.getMessage()); + } + return jsonString; + } + + /** + * 检查上传的文件,检查完成后将文件转换为 InputStream,用于进一步解析 + * + * @throws Exception 文件名为空、不是 shp 文件 + */ + private InputStream resolveUploadedFile(MultipartFile shp) throws Exception { + String filename = shp.getOriginalFilename(); + if (filename == null) { + throw new InvalidShapefileException("文件名为空"); + } + if (filename.endsWith(".shp")) { + // 未压缩的 .shp 文件 + return shp.getInputStream(); + } else { + throw new InvalidShapefileException("不支持的文件格式"); + } + } + + /** + * 解析 shp,读取其中的多边形 + * + * @param inputStream shp 文件的输入流 + * @return shp 包含的多边形 + * @throws Exception 不包含多边形、包含多面 + */ + private List readShp(InputStream inputStream) throws Exception { + List polygons = new LinkedList<>(); + ShapefileGeometryCursor cursor = new ShapefileGeometryCursor(inputStream); + while (cursor.hasNext()) { + Geometry next = cursor.next(); + if (!cursor.getGeometryType().equals(Geometry.Type.Polygon)) { + continue; + } + com.esri.core.geometry.Polygon polygon = (com.esri.core.geometry.Polygon) next; + OGCMultiPolygon ogcMultiPolygon = new OGCMultiPolygon(polygon, null); + if (ogcMultiPolygon.numGeometries() > 1) { + throw new InvalidShapefileException("上传的 shp 中包含 MultiPolygon"); + } + polygons.add(polygon); + } + if (polygons.size() == 0) { + throw new InvalidShapefileException("上传的 shp 中没有 Polygon"); + } + return polygons; + } + + /** + * 将 com.esri.core.geometry.Polygon 类型转换为 org.locationtech.jts.geom.Polygon 类型 + */ + private org.locationtech.jts.geom.Polygon fromEsriPolygon(com.esri.core.geometry.Polygon esriPolygon) { + // 获取外环 + List shellCoordinates = Arrays + .stream(getOutermostRings(esriPolygon).get(0).getCoordinates2D()) + .map(it -> new Coordinate(it.x, it.y)) + .collect(Collectors.toList()); + shellCoordinates.add(shellCoordinates.get(0)); + org.locationtech.jts.geom.LinearRing shell = geometryFactory + .createLinearRing(shellCoordinates.toArray(new Coordinate[0])); + // 获取内环 + org.locationtech.jts.geom.LinearRing[] holes = getAllInteriorRings(esriPolygon) + .stream() + .map(polygon -> { + List holeCoordinates = Arrays + .stream(polygon.getCoordinates2D()) + .map(it -> new Coordinate(it.x, it.y)) + .collect(Collectors.toList()); + holeCoordinates.add(holeCoordinates.get(0)); + return geometryFactory.createLinearRing(holeCoordinates.toArray(new Coordinate[0])); + }) + .toArray(org.locationtech.jts.geom.LinearRing[]::new); + return geometryFactory.createPolygon(shell, holes); + } + + private List getOutermostRings(com.esri.core.geometry.Polygon polygon) { + GeometryCursor outerRingsCursor = new SimpleGeometryCursor(new LinkedList<>(getAllOuterRings(polygon))); + GeometryCursor unionCursor = OperatorUnion + .local() + .execute(outerRingsCursor, null, null); + Geometry unionPoly = unionCursor.next(); + // Holes could have been produced during the union, so rerun just in case. + return getAllOuterRings((com.esri.core.geometry.Polygon) unionPoly); + } + + private List getAllOuterRings(com.esri.core.geometry.Polygon polygon) { + com.esri.core.geometry.Polygon simplePolygon = (com.esri.core.geometry.Polygon) OperatorSimplifyOGC + .local() + .execute(polygon, null, true, null); + List rings = new ArrayList<>(); + int n = simplePolygon.getPathCount(); + for (int i = 0; i < n; i++) { + if (simplePolygon.calculateRingArea2D(i) <= 0) { + continue; + } + com.esri.core.geometry.Polygon ring = new com.esri.core.geometry.Polygon(); + ring.addPath(simplePolygon, i, true); + rings.add(ring); + } + return rings; + } + + private List getAllInteriorRings(com.esri.core.geometry.Polygon polygon) { + com.esri.core.geometry.Polygon simplePolygon = (com.esri.core.geometry.Polygon) OperatorSimplifyOGC + .local() + .execute(polygon, null, true, null); + List rings = new ArrayList<>(); + int n = simplePolygon.getPathCount(); + for (int i = 0; i < n; i++) { + if (simplePolygon.calculateRingArea2D(i) > 0) { + continue; + } + com.esri.core.geometry.Polygon ring = new com.esri.core.geometry.Polygon(); + ring.addPath(simplePolygon, i, true); + rings.add(ring); + } + return rings; + } + + /** + * 将 org.locationtech.jts.geom.Polygon 转为 org.geojson.Polygon + */ + private org.geojson.Polygon toGeoJsonPolygon(Polygon polygon) { + // 设置外环 + org.geojson.Polygon geojsonPolygon = new org.geojson.Polygon( + Arrays + .stream(polygon.getExteriorRing().getCoordinates()) + .map(p -> new LngLatAlt(p.getX(), p.getY())) + .toArray(LngLatAlt[]::new) + ); + // 添加内环 + for (int i = 0; i < polygon.getNumInteriorRing(); i++) { + geojsonPolygon.addInteriorRing( + Arrays + .stream(polygon.getInteriorRingN(i).getCoordinates()) + .map(p -> new LngLatAlt(p.getX(), p.getY())) + .toArray(LngLatAlt[]::new) + ); + } + return geojsonPolygon; + } + + /** + * 主要是用于获取 taskId 对应任务数据库下所有数据的 id 和 geometry + */ + private Map> getIdAndGeometryData(Integer id) { + Task task = taskService.getTaskById(id); + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map rootTables = config.getRootTables(); + Map> result = new HashMap<>(); + for (String tableName : rootTables.keySet()) { + Map resultMap = new HashMap<>(); + Map tables = config.getTables(); + Table table = tables.get(tableName); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String primaryKeyInDb = PostgreSqlUtil.buildColumnNameString(task.getDatabaseName(), tableName, primaryKey); + String geometry = TableOperationUtil.getShapeFieldName(table); + String geometryInDb = PostgreSqlUtil.buildColumnNameString(task.getDatabaseName(), tableName, geometry); + String selectIdAndGeometryDataSql = MessageFormat.format("select {0},{1} from {2}", + primaryKeyInDb, geometryInDb, + PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false)); + List> rootTableDataList = baseService.selectData(selectIdAndGeometryDataSql); + if (rootTableDataList == null) { + result.put(tableName, null); + continue; + } + for (Map rootTableData : rootTableDataList) { + resultMap.put(Long.parseLong(rootTableData.get(primaryKey).toString()), + rootTableData.get(geometry).toString()); + } + result.put(tableName, resultMap); + } + return result; + } +} + diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Cell.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Cell.java new file mode 100644 index 0000000..c9ed618 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Cell.java @@ -0,0 +1,50 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class Cell { + private Worker worker; + + private String geohash; + + private String geojson; + + public Cell() + { + } + + public Cell(Worker worker , String geohash , String geojson) + { + this.worker = worker; + this.geohash = geohash; + this.geojson = geojson; + } + + public String getGeohash() + { + return geohash; + } + + public void setGeohash(String geohash) + { + this.geohash = geohash; + } + + public String getGeojson() + { + return geojson; + } + + public void setGeojson(String geojson) + { + this.geojson = geojson; + } + + public Worker getWorker() + { + return worker; + } + + public void setWorker(Worker worker) + { + this.worker = worker; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/CustomFeatureCollection.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/CustomFeatureCollection.java new file mode 100644 index 0000000..a564d2f --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/CustomFeatureCollection.java @@ -0,0 +1,44 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +import org.geojson.Feature; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CustomFeatureCollection { + + private final String type = "FeatureCollection"; + + private final Map crs = new HashMap() {{ + put("type", "EPSG"); + put("properties", new HashMap() {{ + put("code", "4326"); + }}); + }}; + + public CustomFeatureCollection() { + } + + public CustomFeatureCollection(List features) { + this.features = features; + } + + private List features; + + public String getType() { + return type; + } + + public Map getCrs() { + return crs; + } + + public List getFeatures() { + return features; + } + + public void setFeatures(List features) { + this.features = features; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Data.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Data.java new file mode 100644 index 0000000..d1ba1aa --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Data.java @@ -0,0 +1,59 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class Data { + private Worker worker; + + private String table; + + private Long id; + + private String geojson; + + public Data(Worker worker , String table , Long id , String geojson) + { + this.worker = worker; + this.table = table; + this.id = id; + this.geojson = geojson; + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getGeojson() + { + return geojson; + } + + public void setGeojson(String geojson) + { + this.geojson = geojson; + } + + public Worker getWorker() + { + return worker; + } + + public void setWorker(Worker worker) + { + this.worker = worker; + } + + public String getTable() + { + return table; + } + + public void setTable(String table) + { + this.table = table; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/ImageWithUrl.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/ImageWithUrl.java new file mode 100644 index 0000000..33a2cae --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/ImageWithUrl.java @@ -0,0 +1,89 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class ImageWithUrl { + private Integer id; + + private String url; + + private Double minLon; + + private Double minLat; + + private Double maxLon; + + private Double maxLat; + + public ImageWithUrl() + { + } + + public ImageWithUrl(Integer id , String url , Double minLon , Double minLat , Double maxLon , Double maxLat) + { + this.id = id; + this.url = url; + this.minLon = minLon; + this.minLat = minLat; + this.maxLon = maxLon; + this.maxLat = maxLat; + } + + public Integer getId() + { + return id; + } + + public void setId(Integer id) + { + this.id = id; + } + + public String getUrl() + { + return url; + } + + public void setUrl(String url) + { + this.url = url; + } + + public Double getMinLon() + { + return minLon; + } + + public void setMinLon(Double minLon) + { + this.minLon = minLon; + } + + public Double getMinLat() + { + return minLat; + } + + public void setMinLat(Double minLat) + { + this.minLat = minLat; + } + + public Double getMaxLon() + { + return maxLon; + } + + public void setMaxLon(Double maxLon) + { + this.maxLon = maxLon; + } + + public Double getMaxLat() + { + return maxLat; + } + + public void setMaxLat(Double maxLat) + { + this.maxLat = maxLat; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerContents.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerContents.java new file mode 100644 index 0000000..4cf80ec --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerContents.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class MapServerContents { + private MapServerInitialExtent initialExtent; + + public MapServerInitialExtent getInitialExtent() { + return initialExtent; + } + + public void setInitialExtent(MapServerInitialExtent initialExtent) { + this.initialExtent = initialExtent; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerInitialExtent.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerInitialExtent.java new file mode 100644 index 0000000..d7df522 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerInitialExtent.java @@ -0,0 +1,43 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class MapServerInitialExtent { + private Double xmin; + + private Double ymin; + + private Double xmax; + + private Double ymax; + + public Double getXmin() { + return xmin; + } + + public void setXmin(Double xmin) { + this.xmin = xmin; + } + + public Double getYmin() { + return ymin; + } + + public void setYmin(Double ymin) { + this.ymin = ymin; + } + + public Double getXmax() { + return xmax; + } + + public void setXmax(Double xmax) { + this.xmax = xmax; + } + + public Double getYmax() { + return ymax; + } + + public void setYmax(Double ymax) { + this.ymax = ymax; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerRoot.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerRoot.java new file mode 100644 index 0000000..478e2eb --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/MapServerRoot.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class MapServerRoot { + private MapServerContents contents; + + public MapServerContents getContents() { + return contents; + } + + public void setContents(MapServerContents contents) { + this.contents = contents; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Pair.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Pair.java new file mode 100644 index 0000000..67c53fc --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Pair.java @@ -0,0 +1,10 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class Pair { + public final X x; + public final Y y; + public Pair(X x, Y y) { + this.x = x; + this.y = y; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/TableField.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/TableField.java new file mode 100644 index 0000000..a5f6a47 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/TableField.java @@ -0,0 +1,71 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +public class TableField { + + /** + * 字段名 + */ + private String name; + + /** + * 字段类型 + */ + private String type; + + /** + * 是否为空 + */ + private boolean notNull; + + /** + * 备注 + */ + private String comment; + + /** + * 中文名 + */ + private String chinese; + + //region getter and setter + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isNotNull() { + return notNull; + } + + public void setNotNull(boolean notNull) { + this.notNull = notNull; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getChinese() { + return chinese; + } + + public void setChinese(String chinese) { + this.chinese = chinese; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Worker.java b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Worker.java new file mode 100644 index 0000000..3feac62 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/controllers/dtos/Worker.java @@ -0,0 +1,106 @@ +package cn.edu.whu.boot.allocation.controllers.dtos; + +import java.util.Objects; + +/** + * 用于接收外业人员列表 + */ +public class Worker { + private Integer id; + + private String username; + + // 0: 采集人员 + // 1:审核人员 + private Integer role; + + private String geohash; + + private String geojson; + + public Worker() { + } + + public Worker(Integer id, String username, Integer role) { + this.id = id; + this.username = username; + this.role = role; + } + + public Worker(Integer id, Integer role, String geohash) { + this.id = id; + this.role = role; + this.geohash = geohash; + } + + public Integer getId() { + return id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRole() { + return role; + } + + public void setRole(Integer role) { + this.role = role; + } + + /** + * 是否为采集人员 + */ + public boolean isCollector() { + return role.equals(0); + } + + /** + * 是否为审核人员 + */ + public boolean isInspector() { + return role.equals(1); + } + + public String getGeohash() { + return geohash; + } + + public void setGeohash(String geohash) { + this.geohash = geohash; + } + + public String getGeojson() { + return geojson; + } + + public void setGeojson(String geojson) { + this.geojson = geojson; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Worker worker = (Worker) o; + return Objects.equals(id, worker.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/Draft.java b/src/main/java/cn/edu/whu/boot/allocation/entities/Draft.java new file mode 100644 index 0000000..47a6ce3 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/Draft.java @@ -0,0 +1,60 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; + +public class Draft implements Serializable { + + private static final long serialVersionUID = 928802847368958369L; + + private Integer iD; + + private Integer collectorId; + + private String userName; + + private String date; + + private String shape; + + public String getShape() { + return shape; + } + + public void setShape(String shape) { + this.shape = shape; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getiD() + { + return iD; + } + + public void setiD(Integer iD) + { + this.iD = iD; + } + + public Integer getCollectorId() { + return collectorId; + } + + public void setCollectorId(Integer collectorId) { + this.collectorId = collectorId; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/Image.java b/src/main/java/cn/edu/whu/boot/allocation/entities/Image.java new file mode 100644 index 0000000..dcdcc14 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/Image.java @@ -0,0 +1,90 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; + +public class Image implements Serializable{ + + private static final long serialVersionUID = -3667769005593579199L; + + private Integer id; + + private Integer taskId; + + private String filename; + + private Double minLon; + + private Double minLat; + + private Double maxLon; + + private Double maxLat; + + public Image() { + } + + public Image(String filename, Integer taskId, Double minLon, Double minLat, Double maxLon, Double maxLat) { + this.filename = filename; + this.taskId = taskId; + this.minLon = minLon; + this.minLat = minLat; + this.maxLon = maxLon; + this.maxLat = maxLat; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public Double getMinLon() { + return minLon; + } + + public void setMinLon(Double minLon) { + this.minLon = minLon; + } + + public Double getMinLat() { + return minLat; + } + + public void setMinLat(Double minLat) { + this.minLat = minLat; + } + + public Double getMaxLon() { + return maxLon; + } + + public void setMaxLon(Double maxLon) { + this.maxLon = maxLon; + } + + public Double getMaxLat() { + return maxLat; + } + + public void setMaxLat(Double maxLat) { + this.maxLat = maxLat; + } + + public Integer getTaskId() { + return taskId; + } + + public void setTaskId(Integer taskId) { + this.taskId = taskId; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/RouteLine.java b/src/main/java/cn/edu/whu/boot/allocation/entities/RouteLine.java new file mode 100644 index 0000000..b795cc8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/RouteLine.java @@ -0,0 +1,103 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; +import java.util.Date; + +public class RouteLine implements Serializable{ + + private static final long serialVersionUID = -4234791937496046197L; + + private Integer id; + + private Integer collectorId; + + private String name; + + private String polyline; + + private String begindate; + + private String stopdate; + + private Date uploadTime; + + private String primaryKeySeq; + + public Integer getId() + { + return id; + } + + public void setId(Integer id) + { + this.id = id; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getPolyline() + { + return polyline; + } + + public void setPolyline(String polyline) + { + this.polyline = polyline; + } + + public String getBegindate() + { + return begindate; + } + + public void setBegindate(String begindate) + { + this.begindate = begindate; + } + + public String getStopdate() + { + return stopdate; + } + + public void setStopdate(String stopdate) + { + this.stopdate = stopdate; + } + + public Date getUploadTime() + { + return uploadTime; + } + + public void setUploadTime(Date uploadTime) + { + this.uploadTime = uploadTime; + } + + public String getPrimaryKeySeq() + { + return primaryKeySeq; + } + + public void setPrimaryKeySeq(String primaryKeySeq) + { + this.primaryKeySeq = primaryKeySeq; + } + + public Integer getCollectorId() { + return collectorId; + } + + public void setCollectorId(Integer collectorId) { + this.collectorId = collectorId; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/TaskCell.java b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskCell.java new file mode 100644 index 0000000..30f530b --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskCell.java @@ -0,0 +1,79 @@ +package cn.edu.whu.boot.allocation.entities; + +public class TaskCell { + private Integer id; + + private Integer taskId; + + private String geohash; + + private String geojson; + + public TaskCell() { + } + + public TaskCell(Integer taskId, String geohash, String geojson) { + this.taskId = taskId; + this.geohash = geohash; + this.geojson = geojson; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTaskId() { + return taskId; + } + + public void setTaskId(Integer taskId) { + this.taskId = taskId; + } + + public String getGeohash() { + return geohash; + } + + public void setGeohash(String geohash) { + this.geohash = geohash; + } + + public String getGeojson() { + return geojson; + } + + public void setGeojson(String geojson) { + this.geojson = geojson; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + taskId.hashCode(); + result = 31 * result + geohash.hashCode(); + result = 31 * result + geojson.hashCode(); + return result; + + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (obj == this) { + return true; + } + if (!(obj instanceof TaskCell)) { + return false; + } + TaskCell it = (TaskCell) obj; + return this.taskId.equals(it.taskId) + && this.geohash.equals(it.geohash) + && this.geojson.equals(it.geojson); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/TaskCellData.java b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskCellData.java new file mode 100644 index 0000000..782bab5 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskCellData.java @@ -0,0 +1,67 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; + +public class TaskCellData implements Serializable{ + + private static final long serialVersionUID = -5939625198144474917L; + private Integer id; + + private Integer taskId; + + private String tableName; + + private Long dataId; + + private String cellGeohash; + + public TaskCellData() { + } + + public TaskCellData(Integer taskId, String tableName, Long dataId, String cellGeohash) { + this.taskId = taskId; + this.tableName = tableName; + this.dataId = dataId; + this.cellGeohash = cellGeohash; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTaskId() { + return taskId; + } + + public void setTaskId(Integer taskId) { + this.taskId = taskId; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public Long getDataId() { + return dataId; + } + + public void setDataId(Long dataId) { + this.dataId = dataId; + } + + public String getCellGeohash() { + return cellGeohash; + } + + public void setCellGeohash(String cellGeohash) { + this.cellGeohash = cellGeohash; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/TaskToUser.java b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskToUser.java new file mode 100644 index 0000000..7fe4d62 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskToUser.java @@ -0,0 +1,68 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; + +public class TaskToUser implements Serializable{ + + private static final long serialVersionUID = -1638320551511254937L; + + private Integer id; + + private Integer task; + + private Integer user; + + private String cell; + + private Integer captain; + + public TaskToUser() { + } + + public TaskToUser(Integer task, Integer user, String cell, Integer captain) { + this.task = task; + this.user = user; + this.cell = cell; + this.captain = captain; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTask() { + return task; + } + + public void setTask(Integer task) { + this.task = task; + } + + public Integer getUser() { + return user; + } + + public void setUser(Integer user) { + this.user = user; + } + + public String getCell() { + return cell; + } + + public void setCell(String cell) { + this.cell = cell; + } + + public Integer getCaptain() { + return captain; + } + + public void setCaptain(Integer captain) { + this.captain = captain; + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserCell.java b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserCell.java new file mode 100644 index 0000000..c2f6ee0 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserCell.java @@ -0,0 +1,71 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; +import java.util.Objects; + +public class TaskUserCell implements Serializable{ + + private static final long serialVersionUID = -1326635728899511955L; + + private Integer id; + + private Integer taskId; + + private Integer userId; + + private String cellGeohash; + + public TaskUserCell() { + } + + public TaskUserCell(Integer taskId, Integer userId, String cellGeohash) { + this.taskId = taskId; + this.userId = userId; + this.cellGeohash = cellGeohash; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTaskId() { + return taskId; + } + + public void setTaskId(Integer taskId) { + this.taskId = taskId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getCellGeohash() { + return cellGeohash; + } + + public void setCellGeohash(String cellGeohash) { + this.cellGeohash = cellGeohash; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TaskUserCell that = (TaskUserCell) o; + return taskId.equals(that.taskId) && userId.equals(that.userId) && cellGeohash.equals(that.cellGeohash); + } + + @Override + public int hashCode() { + return Objects.hash(taskId, userId, cellGeohash); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserRole.java b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserRole.java new file mode 100644 index 0000000..a3f57b4 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/entities/TaskUserRole.java @@ -0,0 +1,67 @@ +package cn.edu.whu.boot.allocation.entities; + +import java.io.Serializable; + +public class TaskUserRole implements Serializable{ + + private static final long serialVersionUID = 2002012690341409624L; + private Integer id; + + private Integer taskId; + + private Integer userId; + + // 1:审核人员 + // 0:采集人员 + private Integer workRole; + + + public TaskUserRole() { + } + + public TaskUserRole(Integer taskId, Integer userId, Integer workRole) { + this.taskId = taskId; + this.userId = userId; + this.workRole = workRole; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getTaskId() { + return taskId; + } + + public void setTaskId(Integer taskId) { + this.taskId = taskId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getWorkRole() { + return workRole; + } + + public void setWorkRole(Integer workRole) { + this.workRole = workRole; + } + + public boolean isCollector() { + return this.workRole.equals(0); + } + + public boolean isInspector() { + return this.workRole.equals(1); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidAssignmentStatus.java b/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidAssignmentStatus.java new file mode 100644 index 0000000..6ba6f99 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidAssignmentStatus.java @@ -0,0 +1,11 @@ +package cn.edu.whu.boot.allocation.exceptions; + +public class InvalidAssignmentStatus extends Exception { + public InvalidAssignmentStatus() { + super(); + } + + public InvalidAssignmentStatus(String message) { + super(message); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidShapefileException.java b/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidShapefileException.java new file mode 100644 index 0000000..a05a99b --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidShapefileException.java @@ -0,0 +1,10 @@ +package cn.edu.whu.boot.allocation.exceptions; + +public class InvalidShapefileException extends Exception { + public InvalidShapefileException() { + } + + public InvalidShapefileException(String message) { + super(message); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidUserRoleCodeException.java b/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidUserRoleCodeException.java new file mode 100644 index 0000000..0efbc00 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/exceptions/InvalidUserRoleCodeException.java @@ -0,0 +1,11 @@ +package cn.edu.whu.boot.allocation.exceptions; + +public class InvalidUserRoleCodeException extends Exception { + public InvalidUserRoleCodeException() { + super(); + } + + public InvalidUserRoleCodeException(String message) { + super(message); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/DraftMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/DraftMapper.java new file mode 100644 index 0000000..cad09b8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/DraftMapper.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.entities.Draft; +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Repository; + +@Repository +public interface DraftMapper { + + int insert(@Param("databaseName") String databaseName , @Param("draft") Draft draft); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/ImageMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/ImageMapper.java new file mode 100644 index 0000000..c702c45 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/ImageMapper.java @@ -0,0 +1,59 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.entities.Image; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +public interface ImageMapper { + @Select("SELECT file_name FROM task_image WHERE id = #{id}") + String findFilenameById(int id); + + @Select("SELECT count(*) FROM task_image WHERE file_name = #{filename}") + int countByFilename(String filename); + + @Select({ + "" + }) + List findFilenamesByIds(@Param("ids") List ids); + + @Select("SELECT id, file_name, ST_XMin(bbox) as lon_min, ST_YMin(bbox) as lat_min, ST_XMax(bbox) as lon_max, ST_YMax(bbox) as lat_max " + + "FROM task_image WHERE task_id = #{taskId}") + @Results( + { + @Result(property = "filename", column = "file_name"), + @Result(property = "minLon", column = "lon_min"), + @Result(property = "minLat", column = "lat_min"), + @Result(property = "maxLon", column = "lon_max"), + @Result(property = "maxLat", column = "lat_max") + } + ) + List findByTaskId(@Param("taskId") int taskId); + + @Select("SELECT count(*) FROM task_image WHERE task_id = #{taskId}") + int countByTaskId(@Param("taskId") int taskId); + + @Select("SELECT id, substring(file_name, position('_' in file_name) + 1) as filename " + + "FROM task_image WHERE task_id = #{taskId} " + + "ORDER BY id " + + "OFFSET (#{page} - 1) * #{count} LIMIT #{count}") + List> findByTaskIdPaginated(@Param("taskId") int taskId, @Param("page") int page, @Param("count") int count); + + @Select("INSERT INTO task_image(file_name, task_id, bbox) " + + "VALUES (#{filename}, #{taskId}, ST_MakeEnvelope(#{minLon}, #{minLat}, #{maxLon}, #{maxLat})) RETURNING id") + @Options(flushCache = Options.FlushCachePolicy.TRUE) + int insert(Image image); + + @Delete({ + "" + }) + void deleteInIds(@Param("ids") List ids); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/RouteLineMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/RouteLineMapper.java new file mode 100644 index 0000000..f360a7d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/RouteLineMapper.java @@ -0,0 +1,20 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.entities.RouteLine; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface RouteLineMapper { + + void insert(@Param("databaseName") String databaseName, @Param("routeLine")RouteLine routeLine); + + List findByName(@Param("databaseName") String databaseName, @Param("name")String name); + + List findByNameAndTime(@Param("databaseName") String databaseName, @Param("name")String name, + @Param("beginTime") String beginTime, @Param("stopTime") String stopTime); + + +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/SimpleTaskMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/SimpleTaskMapper.java new file mode 100644 index 0000000..80740d8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/SimpleTaskMapper.java @@ -0,0 +1,17 @@ +package cn.edu.whu.boot.allocation.mapper; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.springframework.stereotype.Repository; + +@Repository +public interface SimpleTaskMapper { + @Update("UPDATE task SET is_allocation_optional = #{optional} WHERE id = #{taskId}") + @Options(flushCache = Options.FlushCachePolicy.TRUE) + void updateTaskAllocationOptional(@Param("taskId") int taskId, @Param("optional") int optional); + + @Select("SELECT is_allocation_optional FROM task WHERE id = #{taskId}") + Integer isTaskAllocationOptional(@Param("taskId") int taskId); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellDataMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellDataMapper.java new file mode 100644 index 0000000..3121649 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellDataMapper.java @@ -0,0 +1,179 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.entities.TaskCellData; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TaskCellDataMapper { + @Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE id = #{id}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + TaskCellData findById(@Param("id") int id); + + @Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE task_id = #{taskId}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findByTaskId(@Param("taskId") int taskId); + + @Select("SELECT id, task_id, table_name, data_id, cell_geohash " + + "FROM task_cell_data " + + "WHERE task_id = #{taskId} AND cell_geohash = #{cellGeohash}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findByTaskIdAndCellGeohash(@Param("taskId") int taskId , @Param("cellGeohash") String cellGeohash); + + @Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE task_id = #{taskId} AND cell_geohash = #{cellGeohash} and table_name = #{tableName}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findByTaskIdAndTableNameAndCellGeohash(@Param("taskId") int taskId , @Param("tableName") String tableName , + @Param("cellGeohash") String cellGeohash); + + @Select("SELECT id, task_id, table_name, data_id, cell_geohash FROM task_cell_data WHERE task_id = #{taskId} AND table_name = #{tableName} AND data_id = #{dataId}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + TaskCellData findByTaskIdAndTableNameAndDataId(@Param("taskId") int taskId ,@Param("tableName") String tableName , @Param("dataId") long dataId); + + @Select({""}) + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findByTaskIdAndCellGeohashIn(@Param("taskId") int taskId , @Param("geohashes") List geohashes); + + @Select({""}) + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findByTaskIdAndDataIdIn(@Param("taskId") int taskId , @Param("dataIds") List dataIds); + + @Select("SELECT id, task_id, table_name, data_id, cell_geohash " + + "FROM task_cell_data " + + "WHERE task_id = #{taskId} AND data_id = #{dataId}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + TaskCellData findByTaskIdAndDataId(@Param("taskId") int taskId , @Param("dataId") int dataId); + + @Select("INSERT INTO task_cell_data(task_id, table_name, data_id, cell_geohash)" + + " VALUES(#{taskId}, #{tableName}, #{dataId}, #{cellGeohash}) RETURNING id") + int insert(TaskCellData taskCellData); + + @Insert({ + ""}) + void insertForeach(@Param("list") List list); + + @Select("UPDATE task_cell_data SET task_id = #{taskId}, table_name = #{tableName}, data_id = #{dataId}, cell_geohash = #{cellGeohash} WHERE id = #{id} RETURNING id") + @Options(flushCache = Options.FlushCachePolicy.TRUE) + int update(TaskCellData taskCellData); + + @Delete("DELETE FROM task_cell_data WHERE task_id = #{taskId}") + void deleteByTaskId(@Param("taskId") int taskId); + + @Delete("DELETE FROM task_cell_data WHERE task_id = #{taskId} AND table_name = #{tableName} AND data_id = #{dataId}") + void deleteByTaskIdAndTableNameAndDataId(@Param("taskId") int taskId, @Param("tableName") String tableName, @Param("dataId") long dataId); + + @Select( + "SELECT table_name, data_id, cell_geohash " + + "FROM task_cell_data " + + "WHERE task_id = #{taskId} " + + "AND cell_geohash = (SELECT cell_geohash FROM task_cell_data WHERE data_id = #{dataId})" + ) + @Results( + { + @Result(property = "tableName", column = "table_name"), + @Result(property = "dataId", column = "data_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findInTheSameTaskAndCell(@Param("taskId") int taskId, @Param("dataId") long dataId); + + @Select({ + "" + }) + List findCellGeohashByTaskIdAndTableNameAndDataId(@Param("taskId") int taskId, @Param("tableName") String tableName, @Param("dataIds") List dataIds); + + @Select({ + "" + }) + List findCellsWhereUserIsAbsent(@Param("taskId") int taskId, @Param("tableName") String table, @Param("userId") Integer reviewerId, @Param("dataIds") List dataIds); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellMapper.java new file mode 100644 index 0000000..f931e98 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskCellMapper.java @@ -0,0 +1,52 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.entities.TaskCell; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +@Repository +public interface TaskCellMapper { + @Select("SELECT * FROM task_cell WHERE task_id = #{taskId}") + @Results( + { + @Result(property = "taskId", column = "task_id") + } + ) + List findByTaskId(@Param("taskId") int taskId); + + @Select("SELECT a.geojson FROM task_cell AS a WHERE a.geohash IN " + + "(SELECT DISTINCT b.cell_geohash FROM task_user_cell AS b " + + "WHERE b.task_id = #{taskId} AND b.user_id = #{userId})") + List findGeojsonByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); + + @Select("SELECT geojson FROM task_cell WHERE task_id = #{taskId} AND geohash = #{geohash}") + String findGeojsonByTaskIdAndGeohash(@Param("taskId") int taskId, @Param("geohash") String geohash); + + @Insert({ + ""}) + void insertForeach(@Param("list") List list); + + @Insert("INSERT INTO task_cell(task_id, geohash, geojson) VALUES(#{taskId}, #{geohash}, #{geojson})") + void insert(TaskCell taskCell); + + @Delete("DELETE FROM task_cell WHERE task_id = #{taskId}") + void deleteByTaskId(@Param("taskId") int taskId); + + @Select("SELECT min(st_xmin(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as xmin," + + " max(st_xmax(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as xmax, " + + " min(st_ymin(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as ymin, " + + " max(st_ymax(st_geomfromgeohash(substring(geohash, 1, length(geohash) - 12), 4490))) as ymax " + + " FROM task_cell WHERE task_id = #{taskId}") + Map getCoordinateRange(@Param("taskId") Integer taskId); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserCellMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserCellMapper.java new file mode 100644 index 0000000..ce3c0ca --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserCellMapper.java @@ -0,0 +1,120 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskUserCell; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TaskUserCellMapper { + @Select("SELECT id, task_id, user_id, cell_geohash " + + "FROM task_user_cell " + + "WHERE id = #{id}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "userId", column = "user_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + TaskUserCell findById(@Param("id") int id); + + @Select("SELECT id, task_id, user_id, cell_geohash " + + "FROM task_user_cell " + + "WHERE task_id = #{taskId} AND user_id = #{userId}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "userId", column = "user_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + List findByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); + + @Select("SELECT tmp.id AS user_id, tmp.real_name, tmp.work_role, tuc.cell_geohash\n" + + "FROM task_user_cell tuc\n" + + " INNER JOIN (SELECT tur.work_role, us.id, us.real_name\n" + + " FROM task_user_role tur\n" + + " INNER JOIN user_staff us ON tur.user_id = us.id\n" + + " WHERE tur.task_id = #{taskId}) tmp ON tuc.user_id = tmp.id\n" + + "WHERE tuc.task_id = #{taskId}") + @Results( + { + @Result(property = "id", column = "user_id"), + @Result(property = "username", column = "real_name"), + @Result(property = "geohash", column = "cell_geohash"), + @Result(property = "role", column = "work_role") + } + ) + List findCellAndUserByTaskId(@Param("taskId") int taskId); + + @Select("SELECT a.user_id, a.cell_geohash, b.username, c.geojson, d.work_role " + + "FROM task_user_cell AS a, user_staff AS b, task_cell AS c, task_user_role as d " + + "WHERE a.task_id = #{taskId} AND a.user_id = #{userId} " + + "AND a.user_id = b.id AND a.task_id = c.task_id AND a.cell_geohash = c.geohash " + + "AND d.task_id = a.task_id AND d.user_id = a.user_id") + @Results( + { + @Result(property = "id", column = "user_id"), + @Result(property = "username", column = "username"), + @Result(property = "geohash", column = "cell_geohash"), + @Result(property = "geojson", column = "geojson"), + @Result(property = "role", column = "work_role") + } + ) + List findCellAndUserByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); + + @Select("SELECT id, task_id, user_id, cell_geohash " + + "FROM task_user_cell " + + "WHERE task_id = #{taskId} AND user_id = #{userId} AND cell_geohash = #{geohash}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "userId", column = "user_id"), + @Result(property = "cellGeohash", column = "cell_geohash") + } + ) + TaskUserCell findByTaskIdAndUserIdAndCellGeohash(@Param("taskId") int taskId, @Param("userId") int userId, @Param("geohash") String geohash); + + @Select("SELECT count(id) FROM task_user_cell WHERE task_id = #{taskId} AND user_id = #{userId}") + int countByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); + + @Select("INSERT INTO task_user_cell(task_id, user_id, cell_geohash)" + + " VALUES(#{taskId}, #{userId}, #{cellGeohash}) " + + "RETURNING id") + int insert(TaskUserCell taskUserCell); + + @Insert({ + ""}) + void insertForeach(@Param("list") List list); + + @Select("WITH rows AS (" + + "UPDATE task_user_cell " + + "SET user_id = #{userId}" + + " WHERE task_id = #{taskId} AND cell_geohash = #{cellGeohash} " + + "RETURNING 1" + + ") SELECT count(*) FROM rows") + int updateUserIdByTaskIdAndCellGeohash(@Param("taskId") int taskId, @Param("cellGeohash") String cellGeohash, @Param("userId") int userId); + + @Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId}") + void deleteByTaskId(@Param("taskId") int taskId); + + @Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId} AND user_id = #{userId}") + void deleteByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); + + @Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId} AND cell_geohash = #{geohash} AND user_id = #{userId}") + void deleteByTaskIdAndCellGeohashAndUserId(@Param("taskId") int taskId,@Param("geohash") String geohash, @Param("userId") int userId); + + @Delete("DELETE FROM task_user_cell WHERE task_id = #{taskId} AND cell_geohash = #{geohash}") + void deleteByTaskIdAndCellGeohash(@Param("taskId") int taskId, @Param("geohash") String geohash); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserRoleMapper.java b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserRoleMapper.java new file mode 100644 index 0000000..9e4c8fc --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/mapper/TaskUserRoleMapper.java @@ -0,0 +1,87 @@ +package cn.edu.whu.boot.allocation.mapper; + +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskUserRole; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TaskUserRoleMapper { + @Select("SELECT id, task_id, user_id, work_role FROM task_user_role WHERE id = #{id}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "userId", column = "user_id"), + @Result(property = "workRole", column = "work_role") + } + ) + TaskUserRole findById(int id); + + @Select("SELECT id, task_id, user_id, work_role FROM task_user_role WHERE task_id = #{taskId}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "userId", column = "user_id"), + @Result(property = "workRole", column = "work_role") + } + ) + List findByTaskId(@Param("taskId") int taskId); + + @Select("SELECT id, task_id, user_id, work_role FROM task_user_role WHERE user_id = #{userId}") + @Results( + { + @Result(property = "taskId", column = "task_id"), + @Result(property = "userId", column = "user_id"), + @Result(property = "workRole", column = "work_role") + } + ) + List findByUserId(@Param("userId") int userId); + + @Select("SELECT a.id, a.real_name, b.work_role " + + "FROM user_staff AS a, task_user_role AS b " + + "WHERE b.task_id = #{taskId} AND a.id = b.user_id") + @Results( + { + @Result(property = "id", column = "id"), + @Result(property = "username", column = "real_name"), + @Result(property = "role", column = "work_role") + } + ) + List findWorkerByTaskId(@Param("taskId") int taskId); + + @Select("SELECT work_role FROM task_user_role WHERE task_id = #{taskId} AND user_id = #{userId}") + Integer findWorkRoleByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); + + @Insert("INSERT INTO task_user_role(task_id, user_id, work_role)" + + " VALUES(#{taskId}, #{userId}, #{workRole})" + + " ON CONFLICT (task_id, user_id) DO NOTHING") + void insert(TaskUserRole taskUserRole); + + @Insert({ + ""}) + void insertForeach(@Param("list") List list); + + @Select("UPDATE task_user_role SET task_id = #{taskId}, user_id = #{userId}, work_role = #{workRole} RETURNING id") + @Options(flushCache = Options.FlushCachePolicy.TRUE) + int update(TaskUserRole taskUserRole); + + @Select("SELECT user_id FROM task_user_role WHERE task_id = #{taskId};") + List getUserIdByTaskId(@Param("taskId") int taskId); + + @Delete("DELETE FROM task_user_role WHERE task_id = #{taskId}") + void deleteByTaskId(@Param("taskId") int taskId); + + @Delete("DELETE FROM task_user_role WHERE task_id = #{taskId} AND user_id = #{userId}") + void deleteByTaskIdAndUserId(@Param("taskId") int taskId, @Param("userId") int userId); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/DraftService.java b/src/main/java/cn/edu/whu/boot/allocation/services/DraftService.java new file mode 100644 index 0000000..5415750 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/DraftService.java @@ -0,0 +1,8 @@ +package cn.edu.whu.boot.allocation.services; + +import cn.edu.whu.boot.allocation.entities.Draft; + +public interface DraftService { + + int insert(String databaseName , Draft draft); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/ImageService.java b/src/main/java/cn/edu/whu/boot/allocation/services/ImageService.java new file mode 100644 index 0000000..fd16e1a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/ImageService.java @@ -0,0 +1,26 @@ +package cn.edu.whu.boot.allocation.services; + + +import cn.edu.whu.boot.allocation.entities.Image; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public interface ImageService { + Optional findFilenameById(int id); + + int countByFilename(String filename); + + List findFilenamesInIds(List ids); + + List findByTaskId(int taskId); + + int countByTaskId(int taskId); + + List> findByTaskIdPaginated(int taskId, int page, int count); + + int insert(Image image); + + void deleteInIds(List ids); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/RouteLineService.java b/src/main/java/cn/edu/whu/boot/allocation/services/RouteLineService.java new file mode 100644 index 0000000..4327789 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/RouteLineService.java @@ -0,0 +1,15 @@ +package cn.edu.whu.boot.allocation.services; + + +import cn.edu.whu.boot.allocation.entities.RouteLine; + +import java.util.List; + +public interface RouteLineService { + + void insertRouteLine(String databaseName, RouteLine routeLine); + + List findByName(String databaseName, String name); + + List findByNameAndTime(String databaseName, String name, String beginTime, String stopTime); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/TaskCellDataService.java b/src/main/java/cn/edu/whu/boot/allocation/services/TaskCellDataService.java new file mode 100644 index 0000000..2e6041a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/TaskCellDataService.java @@ -0,0 +1,37 @@ +package cn.edu.whu.boot.allocation.services; + + +import cn.edu.whu.boot.allocation.entities.TaskCellData; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; + +import java.util.List; +import java.util.Optional; + +public interface TaskCellDataService { + Optional findById(int id); + + List findByTaskId(int taskId); + + List findByTaskIdAndGeohash(int taskId , String cellGeohash); + + List findByTaskIdAndTableNameAndGeohash(int taskId , String tableName, String cellGeohash); + + Optional findByTaskIdAndTableNameAndDataId(int taskId , String tableName , long dataId); + + List findByTaskIdAndCellGeohashIn(int taskId , List cellGeohashes); + + int insert(TaskCellData taskCellData); + + void insertList(List taskCellDataList); + + void deleteByTaskId(int taskId); + + List findTaskDataInTheSameCell(int taskId, long dataId); + + List findCellGeohashByData(int taskId, String tableName, List dataIds); + + void updateAfterDataCreatedOrUpdated(Task task, Table table, long dataId); + + List findCellsWhereUserIsAbsent(int taskId, String table, Integer reviewerId, List dataIds); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/TaskCellService.java b/src/main/java/cn/edu/whu/boot/allocation/services/TaskCellService.java new file mode 100644 index 0000000..7138dd6 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/TaskCellService.java @@ -0,0 +1,21 @@ +package cn.edu.whu.boot.allocation.services; + +import cn.edu.whu.boot.allocation.entities.TaskCell; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public interface TaskCellService { + List findByTaskId(int taskId); + + List findGeojsonByTaskIdAndUserId(int taskId, int userId); + + Optional findGeojsonByTaskIdAndGeohash(int taskId, String geohash); + + void insertList(List list); + + void deleteByTaskId(int taskId); + + Map getCoordinateRange(Integer taskId); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/TaskInfoService.java b/src/main/java/cn/edu/whu/boot/allocation/services/TaskInfoService.java new file mode 100644 index 0000000..609fe53 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/TaskInfoService.java @@ -0,0 +1,92 @@ +package cn.edu.whu.boot.allocation.services; + +import cn.edu.whu.boot.allocation.entities.TaskCell; +import cn.edu.whu.boot.allocation.entities.TaskCellData; +import cn.edu.whu.boot.allocation.entities.TaskUserCell; +import cn.edu.whu.boot.allocation.entities.TaskUserRole; +import cn.edu.whu.boot.xml.domain.Task; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public interface TaskInfoService { + /** + * 分配任务时在数据库中更新相关的信息 + * + * @param cellToData 网格-数据的对应关系 + * @param taskCells 网格的信息 + * @param taskUserCell 外业人员-网格的对应关系 + * @param taskUserRole 外业人员-工作角色的对应关系 + * @param task 任务 + * @param assignedData 审核人员-数据的对应关系 + */ + boolean updateTaskInfo(List cellToData, + List taskCells, + List taskUserCell, + List taskUserRole, + Task task, + Map> assignedData); + + /** + * 修改数据对应的巡查人员 + * + * @param taskId 任务 ID + * @param dataToWorker 数据和外业人员的对应关系 + */ + void updateCell2WorkerAndData2Worker(int taskId, + Map> dataToWorker) throws Exception; + + /** + * 交换网格后更新数据库 + */ + void updateCell2WorkerAndData2Worker(int taskId, + Map cellToWorker, + Map> dataToWorker) throws Exception; + + /** + * 从任务中移除外业人员后更新 task_user_cell 和 tasK_user_role + * + * @param taskId 任务 ID + * @param userId 需要移除的外业人员的 ID + * @param isReviewer 是否为审核人员 + */ + void updateUser2RoleAndUser2CellAndUser2Data(int taskId, int userId, boolean isReviewer) throws Exception; + + /** + * 从网格中删除人员后更新 task_user_cell, + * 如果是审核人员,还要更新数据-人员 + * + * @param taskId 任务 ID + * @param geohash 网格 + * @param userId 采集人员 ID + * @param isInspector 是否为审核人员 + */ + boolean updateUser2RoleAndUser2CellAndUser2Data(int taskId, String geohash, int userId, boolean isInspector) throws Exception; + + /** + * 删除任务相关的数据 + * + * @param taskId 任务 ID + */ + void deleteTaskInfo(int taskId); + + /** + * 修改网格内的工作人员后更新数据库 + */ + void completeChangingWorkersInCell(int taskId, String geohash, Collection userIds, Map> assignedData) throws Exception; + + /** + * 修改任务的外业人员队伍后更新数据库 + */ + void completeChangingWorkers(int taskId, + Map appendWorker2role, + Map deleteWorker2role) throws Exception; + + /** + * 设置任务是否需要分配 + */ + void setTaskAllocationOptional(int taskId, boolean optional); + + boolean isTaskAllocationOptional(int taskId); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/TaskUserCellService.java b/src/main/java/cn/edu/whu/boot/allocation/services/TaskUserCellService.java new file mode 100644 index 0000000..81d5e49 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/TaskUserCellService.java @@ -0,0 +1,37 @@ +package cn.edu.whu.boot.allocation.services; + + +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskUserCell; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public interface TaskUserCellService { + Optional findById(int id); + + List findByTaskIdAndUserId(int taskId, int userId); + + List findWorkerByTaskId(int taskId); + + List findWorkerByTaskIdAndUserId(int taskId, int userId); + + Optional findByTaskIdAndUserIdAndCellGeohash(int taskId, int userId, String geohash); + + int countByTaskIdAndUserId(int taskId, int userId); + + int insert(TaskUserCell taskUserCell); + + void insertList(List list); + + void updateUserIdByTaskIdAndCellGeohash(int taskId, Map cellToWorker) throws Exception; + + void deleteByTaskId(int taskId); + + void deleteByTaskIdAndUserId(int taskId, int userId); + + void deleteByTaskIdAndCellGeohashAndUserId(int taskId, String geohash, int userId); + + void deleteByTaskIdAndCellGeohash(int taskId, String geohash); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/TaskUserRoleService.java b/src/main/java/cn/edu/whu/boot/allocation/services/TaskUserRoleService.java new file mode 100644 index 0000000..ef074cc --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/TaskUserRoleService.java @@ -0,0 +1,34 @@ +package cn.edu.whu.boot.allocation.services; + + +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskUserRole; + +import java.util.List; +import java.util.Optional; + +public interface TaskUserRoleService { + + TaskUserRole findById(int id); + + List findByTaskId(int taskId); + + List findByUserId(int userId); + + List findWorkerByTaskId(int taskId); + + Optional findWorkRoleByTaskIdAndUserId(int taskId, int userId); + + void insertList(List list); + + TaskUserRole update(TaskUserRole taskUserRole); + + /** + * 在task_user_role表中获取某任务下的所有工作人员的userId + */ + List getUserIdByTaskId(int taskId); + + void deleteByTaskId(int taskId); + + void deleteByTaskIdAndUserId(int taskId, int userId); +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/DraftServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/DraftServiceImpl.java new file mode 100644 index 0000000..6f230b6 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/DraftServiceImpl.java @@ -0,0 +1,21 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.entities.Draft; +import cn.edu.whu.boot.allocation.mapper.DraftMapper; +import cn.edu.whu.boot.allocation.services.DraftService; +import org.springframework.stereotype.Service; + +@Service +public class DraftServiceImpl implements DraftService { + + private final DraftMapper draftMapper; + + public DraftServiceImpl(DraftMapper draftMapper) { + this.draftMapper = draftMapper; + } + + @Override + public int insert(String databaseName, Draft draft) { + return draftMapper.insert(databaseName, draft); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/ImageServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/ImageServiceImpl.java new file mode 100644 index 0000000..08d73ac --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/ImageServiceImpl.java @@ -0,0 +1,61 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.entities.Image; +import cn.edu.whu.boot.allocation.mapper.ImageMapper; +import cn.edu.whu.boot.allocation.services.ImageService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service +public class ImageServiceImpl implements ImageService { + + private final ImageMapper imageMapper; + + public ImageServiceImpl(ImageMapper imageMapper) { + this.imageMapper = imageMapper; + } + + @Override + public Optional findFilenameById(int id) { + return Optional.ofNullable(imageMapper.findFilenameById(id)); + } + + @Override + public int countByFilename(String filename) + { + return imageMapper.countByFilename(filename); + } + + @Override + public List findFilenamesInIds(List ids) { + return imageMapper.findFilenamesByIds(ids); + } + + @Override + public List findByTaskId(int taskId) { + return imageMapper.findByTaskId(taskId); + } + + @Override + public int countByTaskId(int taskId) { + return imageMapper.countByTaskId(taskId); + } + + @Override + public List> findByTaskIdPaginated(int taskId, int page, int count) { + return imageMapper.findByTaskIdPaginated(taskId, page, count); + } + + @Override + public int insert(Image image) { + return imageMapper.insert(image); + } + + @Override + public void deleteInIds(List ids) { + imageMapper.deleteInIds(ids); + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/RouteLineServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/RouteLineServiceImpl.java new file mode 100644 index 0000000..3e243e7 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/RouteLineServiceImpl.java @@ -0,0 +1,45 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.entities.RouteLine; +import cn.edu.whu.boot.allocation.mapper.RouteLineMapper; +import cn.edu.whu.boot.allocation.services.RouteLineService; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class RouteLineServiceImpl implements RouteLineService { + + private final RouteLineMapper routeLineMapper; + + public RouteLineServiceImpl(RouteLineMapper routeLineMapper) { + this.routeLineMapper = routeLineMapper; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void insertRouteLine(String databaseName, RouteLine routeLine) { + routeLine.setBegindate(OtherUtil.changeTimeString(routeLine.getBegindate())); + routeLine.setStopdate(OtherUtil.changeTimeString(routeLine.getStopdate())); + routeLine.setPrimaryKeySeq("\'" + databaseName + ".route_line_id_seq" + "\'"); + routeLineMapper.insert(databaseName, routeLine); + } + + @Override + public List findByName(String databaseName , String name) + { + return routeLineMapper.findByName(databaseName, name); + } + + @Override + public List findByNameAndTime(String databaseName , String name, String beginTime, String stopTime) + { + return routeLineMapper.findByNameAndTime(databaseName, name, beginTime, stopTime); + } + + +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellDataServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellDataServiceImpl.java new file mode 100644 index 0000000..bfea093 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellDataServiceImpl.java @@ -0,0 +1,165 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.entities.TaskCell; +import cn.edu.whu.boot.allocation.entities.TaskCellData; +import cn.edu.whu.boot.allocation.mapper.TaskCellDataMapper; +import cn.edu.whu.boot.allocation.services.TaskCellDataService; +import cn.edu.whu.boot.allocation.services.TaskCellService; +import cn.edu.whu.boot.common.utils.allocation.ArcGisGeoJsonParser; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Polygon; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class TaskCellDataServiceImpl implements TaskCellDataService { + + @Autowired + private TaskCellService taskCellService; + + @Autowired + private TaskCellDataMapper taskCellDataMapper; + + @Autowired + private SqlSessionFactory sqlSessionFactory; + + @Override + public Optional findById(int id) { + return Optional.ofNullable(taskCellDataMapper.findById(id)); + } + + @Override + public List findByTaskId(int taskId) { + return taskCellDataMapper.findByTaskId(taskId); + } + + @Override + public List findByTaskIdAndGeohash(int taskId, String cellGeohash) { + return taskCellDataMapper.findByTaskIdAndCellGeohash(taskId, cellGeohash); + } + + @Override + public List findByTaskIdAndTableNameAndGeohash(int taskId, String tableName, String cellGeohash) { + return taskCellDataMapper.findByTaskIdAndTableNameAndCellGeohash(taskId, tableName, cellGeohash); + } + + @Override + public Optional findByTaskIdAndTableNameAndDataId(int taskId, String tableName, long dataId) { + return Optional.ofNullable(taskCellDataMapper.findByTaskIdAndTableNameAndDataId(taskId, tableName, dataId)); + } + + @Override + public List findByTaskIdAndCellGeohashIn(int taskId, List cellGeohashes) { + return taskCellDataMapper.findByTaskIdAndCellGeohashIn(taskId, cellGeohashes); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int insert(TaskCellData taskCellData) { + return taskCellDataMapper.insert(taskCellData); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertList(List taskCellDataList) { + if (taskCellDataList == null || taskCellDataList.isEmpty()) { + return; + } + if (taskCellDataList.size() * 4 <= 2000) { + // 参数个数不大于 2000,用 MyBatis foreach 插入 + taskCellDataMapper.insertForeach(taskCellDataList); + } else { + try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { + TaskCellDataMapper mapper = session.getMapper(TaskCellDataMapper.class); + taskCellDataList.forEach(mapper::insert); + session.commit(); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskId(int taskId) { + taskCellDataMapper.deleteByTaskId(taskId); + } + + @Override + public List findTaskDataInTheSameCell(int taskId, long dataId) { + return taskCellDataMapper.findInTheSameTaskAndCell(taskId, dataId); + } + + @Override + public List findCellGeohashByData(int taskId, String tableName, List dataIds) { + return dataIds == null || dataIds.isEmpty() ? Collections.emptyList() : taskCellDataMapper.findCellGeohashByTaskIdAndTableNameAndDataId(taskId, tableName, dataIds); + } + + private static final GeometryFactory geometryFactory = new GeometryFactory(); + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAfterDataCreatedOrUpdated(Task task, Table table, long dataId) { + if (task.getIsAllocationOptional() == 1) { + return; + } + + Optional optional = table + .getFields() + .values() + .stream() + .filter(Field::isGeometry) + .findFirst() + .map(f -> ArcGisGeoJsonParser.toGeometryObject(new String(Base64.getDecoder().decode(f.getValue().toString())))); + if (!optional.isPresent()) { + return; + } + Geometry data = optional.get(); + + // 获取所有和数据相交的网格 + int taskId = task.getId(); + List cells = taskCellService.findByTaskId(taskId); + if (cells.isEmpty()) { + return; + } + String tableName = table.getKey(); + List taskCellData = cells + .stream() + .map(cell -> { + JSONArray jsonArray = JSON.parseObject(cell.getGeojson()).getJSONObject("geometry").getJSONArray("coordinates").getJSONArray(0); + Coordinate[] coordinates = new Coordinate[jsonArray.size()]; + for (int i = 0; i < jsonArray.size(); i++) { + JSONArray coord = jsonArray.getJSONArray(i); + coordinates[i] = new Coordinate(coord.getDouble(0), coord.getDouble(1)); + } + Polygon polygon = geometryFactory.createPolygon(coordinates); + polygon.setUserData(cell.getGeohash()); + return polygon; + }) + .filter(cell -> cell.intersects(data)) + .map(cell -> new TaskCellData(taskId, tableName, dataId, (String) cell.getUserData())) + .collect(Collectors.toList()); + + taskCellDataMapper.deleteByTaskIdAndTableNameAndDataId(taskId, tableName, dataId); + if (!taskCellData.isEmpty()) { + taskCellDataMapper.insertForeach(taskCellData); + } + } + + @Override + public List findCellsWhereUserIsAbsent(int taskId, String table, Integer reviewerId, List dataIds) { + return dataIds == null || dataIds.isEmpty() ? Collections.emptyList() : taskCellDataMapper.findCellsWhereUserIsAbsent(taskId, table, reviewerId, dataIds); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellServiceImpl.java new file mode 100644 index 0000000..b227e6e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskCellServiceImpl.java @@ -0,0 +1,62 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.entities.TaskCell; +import cn.edu.whu.boot.allocation.mapper.TaskCellMapper; +import cn.edu.whu.boot.allocation.services.TaskCellService; +import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service +public class TaskCellServiceImpl implements TaskCellService { + + private final TaskCellMapper taskCellMapper; + + @Autowired + private SqlSessionFactory sqlSessionFactory; + + public TaskCellServiceImpl(TaskCellMapper taskCellMapper) { + this.taskCellMapper = taskCellMapper; + } + + @Override + public List findByTaskId(int taskId) { + return taskCellMapper.findByTaskId(taskId); + } + + @Override + public List findGeojsonByTaskIdAndUserId(int taskId, int userId) { + return taskCellMapper.findGeojsonByTaskIdAndUserId(taskId, userId); + } + + @Override + public Optional findGeojsonByTaskIdAndGeohash(int taskId, String geohash) { + return Optional.ofNullable(taskCellMapper.findGeojsonByTaskIdAndGeohash(taskId, geohash)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertList(List list) { + if (list != null && !list.isEmpty()) { + taskCellMapper.insertForeach(list); + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskId(int taskId) { + taskCellMapper.deleteByTaskId(taskId); + } + + @Override + public Map getCoordinateRange(Integer taskId) + { + return taskCellMapper.getCoordinateRange(taskId); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskInfoServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskInfoServiceImpl.java new file mode 100644 index 0000000..638ea36 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskInfoServiceImpl.java @@ -0,0 +1,300 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.entities.TaskCell; +import cn.edu.whu.boot.allocation.entities.TaskCellData; +import cn.edu.whu.boot.allocation.entities.TaskUserCell; +import cn.edu.whu.boot.allocation.entities.TaskUserRole; +import cn.edu.whu.boot.allocation.exceptions.InvalidAssignmentStatus; +import cn.edu.whu.boot.allocation.mapper.SimpleTaskMapper; +import cn.edu.whu.boot.allocation.services.*; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.xml.domain.RedisKeyType; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.text.MessageFormat; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class TaskInfoServiceImpl implements TaskInfoService { + + private final Logger log = LoggerFactory.getLogger(TaskInfoServiceImpl.class); + + @Autowired + private TaskCellDataService taskCellDataService; + + @Autowired + private TaskCellService taskCellService; + + @Autowired + private TaskUserCellService taskUserCellService; + + @Autowired + private TaskUserRoleService taskUserRoleService; + + @Autowired + private IBaseService baseService; + + @Autowired + private ITaskService taskService; + + @Autowired + private SimpleTaskMapper taskMapper; + + @Autowired + private CacheService cacheService; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateTaskInfo(List cellToData, + List taskCells, + List taskUserCell, + List taskUserRole, + Task task, + Map> assignedData) { + // 将数据-网格的对应关系保存到数据库 + taskCellDataService.insertList(cellToData); + // 将网格的信息保存到数据库 + taskCellService.insertList(taskCells); + // 将人员-网格的对应关系保存到数据库 + taskUserCellService.insertList(taskUserCell); + // 将该任务中给个外业人员的具体角色保存到数据库中 + taskUserRoleService.insertList(taskUserRole); + // 将数据-人员的对应关系保存到数据库 + if (task == null || assignedData == null || assignedData.isEmpty()) { + return true; + } + String updateReviewerResult = baseService.updateRootTableDataForReviewer(task, assignedData); + if (!updateReviewerResult.equals("succeed")) { + log.error("更新任务{}的数据-人员对应关系时发生异常", task.getId()); + return false; + } + + // 更新缓存 + cacheService.delete(RedisKeyType.TASK + String.valueOf(task.getId())); + cacheService.delete(RedisKeyType.TASK + "all"); + + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCell2WorkerAndData2Worker(int taskId, + Map> tbToDataAndWorker) throws Exception { + // 如果巡查人员之前在某个网格中没有任务,那么需要更新 task_user_cell + List taskUserCells = getNewTaskUserCells(taskId, tbToDataAndWorker); + if (!taskUserCells.isEmpty()) { + taskUserCellService.insertList(taskUserCells); + } + + // 更新数据-人员的对应关系 + String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), tbToDataAndWorker); + if (!updateReviewerResult.equals("succeed")) { + throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId)); + } + + if (!taskUserCells.isEmpty()) { + cacheService.delete(RedisKeyType.CELL.toString() + taskId); + } + } + + private List getNewTaskUserCells(int taskId, Map> tbToDataAndWorker) throws InvalidAssignmentStatus { + List newTaskUserCells = new ArrayList<>(); // 需要往 task_user_cell 中插入的记录 + Set validatedNewReviewers = new HashSet<>(); // 已经通过身份检查的新的巡查人员 + for (Map.Entry> e1 : tbToDataAndWorker.entrySet()) { + Map> reviewerToData = new HashMap<>(); // 每个巡查人员对应的数据 + String tableName = e1.getKey(); + for (Map.Entry e2 : e1.getValue().entrySet()) { + long dataId = e2.getKey(); + int reviewerId = e2.getValue(); + if (validatedNewReviewers.add(reviewerId)) { + // 检查该用户的身份是否合法 + Optional optionalRole = taskUserRoleService.findWorkRoleByTaskIdAndUserId(taskId, reviewerId); + if (!optionalRole.isPresent()) { + throw new InvalidAssignmentStatus(String.format("人员 %d 不在 %d 号任务中", reviewerId, taskId)); + } + if (optionalRole.get().equals(0)) { + throw new InvalidAssignmentStatus(String.format("人员 %d 是采集人员,不能审核数据", reviewerId)); + } + } + reviewerToData.computeIfAbsent(reviewerId, k -> new ArrayList<>()).add(dataId); + } + + for (Map.Entry> e : reviewerToData.entrySet()) { + List dataIds = e.getValue(); + Integer reviewerId = e.getKey(); + List geohash = taskCellDataService.findCellsWhereUserIsAbsent(taskId, tableName, reviewerId, dataIds); + if (geohash != null) { + geohash.forEach(h -> newTaskUserCells.add(new TaskUserCell(taskId, reviewerId, h))); + } + } + } + return newTaskUserCells; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCell2WorkerAndData2Worker(int taskId, + Map cellToWorker, + Map> dataToWorker) throws Exception { + // 更新表 task_user_cell + taskUserCellService.updateUserIdByTaskIdAndCellGeohash(taskId, cellToWorker); + // 更新数据-人员的对应关系 + String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), dataToWorker); + if (!updateReviewerResult.equals("succeed")) { + throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId)); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUser2RoleAndUser2CellAndUser2Data(int taskId, int userId, boolean isReviewer) throws Exception { + // 更新 task_user_role + taskUserRoleService.deleteByTaskIdAndUserId(taskId, userId); + // 更新 task_user_cell + taskUserCellService.deleteByTaskIdAndUserId(taskId, userId); + // TODO: 更新人员-数据的对应关系 + if (!isReviewer) { + return; + } + Task task = taskService.getTaskById(taskId); + String databaseName = task.getDatabaseName(); + Map tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + String formatUpdateSql = "UPDATE {0} SET reviewer = -1 where {1} IN (SELECT {1} from {0} WHERE reviewer = {2});"; + for (Map.Entry tableEntry : tables.entrySet()) { + String updateResult = baseService.updateSqlString( + MessageFormat.format(formatUpdateSql, PostgreSqlUtil.buildTableNameString(databaseName, tableEntry.getKey(), false, false), + PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(tableEntry.getValue())), userId)); + if (updateResult.equals(CommonConstant.FAILED)) { + throw new Exception("失败"); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateUser2RoleAndUser2CellAndUser2Data(int taskId, String geohash, int userId, boolean isReviewer) throws Exception { + boolean free = false; + // 从 task_user_cell 中删除 + taskUserCellService.deleteByTaskIdAndCellGeohashAndUserId(taskId, geohash, userId); +// if (taskUserCellService.countByTaskIdAndUserId(taskId, userId) == 0) { +// // 从 task_user_role 中删除 +// taskUserRoleService.deleteByTaskIdAndUserId(taskId, userId); +// free = true; +// } + // TODO: 如果是审核人员,更新人员-数据的对应关系 + if (isReviewer) { + Map> updateData = new HashMap<>(); + taskCellDataService + .findByTaskIdAndGeohash(taskId, geohash) + .stream() + .collect(Collectors.groupingBy(TaskCellData::getTableName)) + .forEach((table, list) -> { + Map dataToWorker = list + .stream() + .map(TaskCellData::getDataId) + .map(dataId -> new AbstractMap.SimpleEntry<>(dataId, -1)) + .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); + updateData.put(table, dataToWorker); + }); + String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), updateData); + if (!updateReviewerResult.equals("succeed")) { + throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId)); + } + } + return free; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteTaskInfo(int taskId) { + taskCellDataService.deleteByTaskId(taskId); + taskCellService.deleteByTaskId(taskId); + taskUserCellService.deleteByTaskId(taskId); + taskUserRoleService.deleteByTaskId(taskId); + cacheService.delete(RedisKeyType.CELL.toString() + taskId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void completeChangingWorkersInCell(int taskId, String geohash, Collection userIds, Map> assignedData) throws Exception { + List taskUserCells = userIds + .stream() + .map(userId -> { + TaskUserCell tuc = new TaskUserCell(); + tuc.setUserId(userId); + tuc.setCellGeohash(geohash); + tuc.setTaskId(taskId); + return tuc; + }) + .collect(Collectors.toList()); + + taskUserCellService.deleteByTaskIdAndCellGeohash(taskId, geohash); + taskUserCellService.insertList(taskUserCells); + if (assignedData != null && !assignedData.isEmpty()) { + String updateReviewerResult = baseService.updateRootTableDataForReviewer(taskService.getTaskById(taskId), assignedData); + if (!updateReviewerResult.equals("succeed")) { + throw new Exception(String.format("更新任务 %d 的数据-人员对应关系时发生异常", taskId)); + } + } + + // 使网格相关的缓存失效 + cacheService.delete(RedisKeyType.CELL.toString() + taskId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void completeChangingWorkers(int taskId, Map appendWorker2role, Map deleteWorker2role) throws Exception { + // 注意要先删后增,这样就可以修改已有工作人员的工作角色 + // 删除工作人员 + if (deleteWorker2role != null && !deleteWorker2role.isEmpty()) { + for (Map.Entry e : deleteWorker2role.entrySet()) { + updateUser2RoleAndUser2CellAndUser2Data(taskId, e.getKey(), e.getValue().equals(1)); + } + cacheService.delete(RedisKeyType.CELL.toString() + taskId); + } + + // 添加工作人员 + if (appendWorker2role != null && !appendWorker2role.isEmpty()) { + List userRoles = appendWorker2role + .entrySet() + .stream() + .map(e -> new TaskUserRole(taskId, e.getKey(), e.getValue())) + .collect(Collectors.toList()); + taskUserRoleService.insertList(userRoles); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void setTaskAllocationOptional(int taskId, boolean optional) { + taskMapper.updateTaskAllocationOptional(taskId, optional ? 1 : 0); + // 如果不需要分配,把原先的分配结果清空 + if (optional) { + deleteTaskInfo(taskId); + } + // 更新缓存 + cacheService.delete(RedisKeyType.TASK + String.valueOf(taskId)); + cacheService.delete(RedisKeyType.TASK + "hasCreate"); + cacheService.delete(RedisKeyType.TASK + "all"); + } + + @Override + public boolean isTaskAllocationOptional(int taskId) { + Integer result = taskMapper.isTaskAllocationOptional(taskId); + return result != null && (result == 1); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserCellServiceImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserCellServiceImpl.java new file mode 100644 index 0000000..7f07125 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserCellServiceImpl.java @@ -0,0 +1,129 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskUserCell; +import cn.edu.whu.boot.allocation.mapper.TaskUserCellMapper; +import cn.edu.whu.boot.allocation.services.TaskUserCellService; +import org.apache.ibatis.session.ExecutorType; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +@Service +public class TaskUserCellServiceImpl implements TaskUserCellService { + + private final TaskUserCellMapper taskUserCellMapper; + + private final SqlSessionFactory sqlSessionFactory; + + public TaskUserCellServiceImpl(TaskUserCellMapper taskUserCellMapper, SqlSessionFactory sqlSessionFactory) { + this.taskUserCellMapper = taskUserCellMapper; + this.sqlSessionFactory = sqlSessionFactory; + } + + @Override + public Optional findById(int id) { + return Optional.ofNullable(taskUserCellMapper.findById(id)); + } + + @Override + public List findByTaskIdAndUserId(int taskId, int userId) { + return taskUserCellMapper.findByTaskIdAndUserId(taskId, userId); + } + + @Override + public List findWorkerByTaskId(int taskId) { + return taskUserCellMapper.findCellAndUserByTaskId(taskId); + } + + @Override + public List findWorkerByTaskIdAndUserId(int taskId, int userId) { + return taskUserCellMapper.findCellAndUserByTaskIdAndUserId(taskId, userId); + } + + @Override + public Optional findByTaskIdAndUserIdAndCellGeohash(int taskId, int userId, String geohash) { + return Optional.ofNullable(taskUserCellMapper.findByTaskIdAndUserIdAndCellGeohash(taskId, userId, geohash)); + } + + @Override + public int countByTaskIdAndUserId(int taskId, int userId) { + return taskUserCellMapper.countByTaskIdAndUserId(taskId, userId); + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public int insert(TaskUserCell taskUserCell) { + return taskUserCellMapper.insert(taskUserCell); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertList(List list) { + if (list == null || list.isEmpty()) { + return; + } + + if (list.size() * 3 <= 2000) { + taskUserCellMapper.insertForeach(list); + } else { + try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) { + TaskUserCellMapper mapper = session.getMapper(TaskUserCellMapper.class); + list.forEach(mapper::insert); + session.commit(); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateUserIdByTaskIdAndCellGeohash(int taskId, Map cellToWorker) throws Exception { + if (cellToWorker == null || cellToWorker.isEmpty()) { + return; + } + for (Map.Entry entry : cellToWorker.entrySet()) { + String geohash = entry.getKey(); + Integer userId = entry.getValue(); + int affectedRow = taskUserCellMapper.updateUserIdByTaskIdAndCellGeohash(taskId, geohash, userId); + if (affectedRow == 0) { + throw new Exception( + String.format( + "修改失败,不存在 %d 号任务或是该任务中不存在编号为 %s 的网格", + taskId, + geohash + ) + ); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskId(int taskId) { + taskUserCellMapper.deleteByTaskId(taskId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskIdAndUserId(int taskId, int userId) { + taskUserCellMapper.deleteByTaskIdAndUserId(taskId, userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskIdAndCellGeohashAndUserId(int taskId, String geohash, int userId) { + taskUserCellMapper.deleteByTaskIdAndCellGeohashAndUserId(taskId, geohash, userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskIdAndCellGeohash(int taskId, String geohash) { + taskUserCellMapper.deleteByTaskIdAndCellGeohash(taskId, geohash); + } +} diff --git a/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserRoleImpl.java b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserRoleImpl.java new file mode 100644 index 0000000..5896439 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/allocation/services/impl/TaskUserRoleImpl.java @@ -0,0 +1,84 @@ +package cn.edu.whu.boot.allocation.services.impl; + +import cn.edu.whu.boot.allocation.controllers.dtos.Worker; +import cn.edu.whu.boot.allocation.entities.TaskUserRole; +import cn.edu.whu.boot.allocation.mapper.TaskUserRoleMapper; +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import org.apache.ibatis.session.SqlSessionFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Service +public class TaskUserRoleImpl implements TaskUserRoleService { + + private final TaskUserRoleMapper taskUserRoleMapper; + + private final SqlSessionFactory sqlSessionFactory; + + @Autowired + public TaskUserRoleImpl(TaskUserRoleMapper taskUserRoleMapper, SqlSessionFactory sqlSessionFactory) { + this.taskUserRoleMapper = taskUserRoleMapper; + this.sqlSessionFactory = sqlSessionFactory; + } + + @Override + public TaskUserRole findById(int id) { + return taskUserRoleMapper.findById(id); + } + + @Override + public List findByTaskId(int taskId) { + return taskUserRoleMapper.findByTaskId(taskId); + } + + @Override + public List findByUserId(int userId) { + return taskUserRoleMapper.findByUserId(userId); + } + + @Override + public List findWorkerByTaskId(int taskId) { + return taskUserRoleMapper.findWorkerByTaskId(taskId); + } + + @Override + public Optional findWorkRoleByTaskIdAndUserId(int taskId, int userId) { + return Optional.ofNullable(taskUserRoleMapper.findWorkRoleByTaskIdAndUserId(taskId, userId)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertList(List list) { + if (list != null && !list.isEmpty()) { + taskUserRoleMapper.insertForeach(list); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public TaskUserRole update(TaskUserRole taskUserRole) { + int id = taskUserRoleMapper.update(taskUserRole); + return taskUserRoleMapper.findById(id); + } + + @Override + public List getUserIdByTaskId(int taskId) { + return taskUserRoleMapper.getUserIdByTaskId(taskId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskId(int taskId) { + taskUserRoleMapper.deleteByTaskId(taskId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteByTaskIdAndUserId(int taskId, int userId) { + taskUserRoleMapper.deleteByTaskIdAndUserId(taskId, userId); + } +} diff --git a/src/main/java/cn/edu/whu/boot/apkversion/controller/ApkVersionController.java b/src/main/java/cn/edu/whu/boot/apkversion/controller/ApkVersionController.java new file mode 100644 index 0000000..c598991 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/apkversion/controller/ApkVersionController.java @@ -0,0 +1,32 @@ +package cn.edu.whu.boot.apkversion.controller; + +import cn.edu.whu.boot.apkversion.service.ApkVersionService; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +@RequestMapping("apkversion") +public class ApkVersionController { + + @Autowired + ApkVersionService versionService; + + @RequestMapping(value="latest",produces="text/html;charset=UTF-8") + @ResponseBody + public String getLatestVersionInfo(){ + + String latestVersion=versionService.getLatestVersion(); + String downUrl=versionService.getApkPath(latestVersion); + String description=versionService.getDescriptionByVersion(latestVersion); + JSONObject jsonVersion=new JSONObject(); + jsonVersion.put("version",latestVersion); + jsonVersion.put("downUrl",downUrl); + jsonVersion.put("description",description); + return JSON.toJSONString(jsonVersion); + } +} + diff --git a/src/main/java/cn/edu/whu/boot/apkversion/mapper/ApkVersionMapper.java b/src/main/java/cn/edu/whu/boot/apkversion/mapper/ApkVersionMapper.java new file mode 100644 index 0000000..11f6972 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/apkversion/mapper/ApkVersionMapper.java @@ -0,0 +1,12 @@ +package cn.edu.whu.boot.apkversion.mapper; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface ApkVersionMapper { + + String getLatestVersion(); + String getApkPathByVersion(@Param("versionCode") String versionCode); + String getDescriptionByVersion(@Param("versionCode") String versionCode); +} diff --git a/src/main/java/cn/edu/whu/boot/apkversion/service/ApkVersionService.java b/src/main/java/cn/edu/whu/boot/apkversion/service/ApkVersionService.java new file mode 100644 index 0000000..c0f7f09 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/apkversion/service/ApkVersionService.java @@ -0,0 +1,38 @@ +package cn.edu.whu.boot.apkversion.service; + +import cn.edu.whu.boot.apkversion.mapper.ApkVersionMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ApkVersionService { + + @Autowired + public ApkVersionMapper apkVersionMapper; + + public String getLatestVersion() { + String lastversion=apkVersionMapper.getLatestVersion(); + if(lastversion!=null && !lastversion.equals("")){ + return lastversion; + } + return "0.1"; + } + + public String getDescriptionByVersion(String version) { + String lastversion="无说明信息!"; + String res=apkVersionMapper.getDescriptionByVersion(version); + if(res!=null&&!res.equals("")){ + lastversion=res; + } + return lastversion; + } + + public String getApkPath(String version) { + String apkPath=apkVersionMapper.getApkPathByVersion(version); + if (apkPath!=null&& !apkPath.equals("")){ + return apkPath; + }else { + return "该版本不存在"; + } + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/controller/BaseController.java b/src/main/java/cn/edu/whu/boot/collection/controller/BaseController.java new file mode 100644 index 0000000..8b2847d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/controller/BaseController.java @@ -0,0 +1,438 @@ +package cn.edu.whu.boot.collection.controller; + +import cn.edu.whu.boot.allocation.services.TaskCellService; +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import cn.edu.whu.boot.collection.dto.CompositeKey; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.domain.SqlStringConstant; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil; +import cn.edu.whu.boot.common.utils.xml.GenerateSqlUtil; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.text.MessageFormat; +import java.util.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 这个类里面放的东西很杂,写的不规范!!! 具体每个方法的作用看方法的注释 + */ +@RestController +@RequestMapping("base") +public class BaseController{ + + private static final Logger logger = (Logger) LoggerFactory.getLogger(BaseController.class); + private final ITaskService taskService; + private final IBaseService baseService; + private final UserService userService; + private final TaskUserRoleService taskUserRoleService; + private final TaskCellService taskCellService; + + @Autowired + public BaseController(ITaskService taskService, IBaseService baseService, UserService userService, + TaskUserRoleService taskUserRoleService, TaskCellService taskCellService){ + this.taskService = taskService; + this.baseService = baseService; + this.userService = userService; + this.taskUserRoleService = taskUserRoleService; + this.taskCellService = taskCellService; + } + /** + * 接受移动端传来的数据和多媒体文件,并将数据保存在数据库中,多媒体文件保存在本地! + * + * @param detail 按指定格式封装的 JsonString + * @param file 多媒体压缩包,注意多媒体文件也可以上传 + */ + @RequestMapping(value = "insertAndRecheckData", produces = "text/html;charset=UTF-8") + public String insertAndRecheckData(String detail, MultipartFile file) throws Exception { + try { + JSONObject jsonObject = JSON.parseObject(detail); + JSONObject tableJsonObject = jsonObject.getJSONObject("table"); + + // 预处理JSON中的boolean值 + preprocessBooleanValues(tableJsonObject); + + Table table = JSON.parseObject(tableJsonObject.toJSONString(), Table.class); + +// Table table = JSON.toJavaObject(tableJsonObject, Table.class); + Integer taskId = jsonObject.getInteger("taskId"); + // 判断当前任务是否存在 + Task task = taskService.getTaskById(taskId); + if (task == null) { + return ResultMessage.failed("当前任务已删除!").toString(); + } + + // 判断该用户是否在对应的任务中 + int userId = jsonObject.getIntValue("userId"); + if(!OtherUtil.isUserInTask(task, userId, taskUserRoleService)){ + return ResultMessage.failed("您不在该任务中!").toString(); + } + + table = TableOperationUtil.changeJsonObjectToField(table); + JSONArray multimediaItemJsonArray = + (JSONArray) TableOperationUtil.getFieldValue(table, TableOperationUtil.getCameraFieldName(table)); + // polygonIdFromAndroid 为移动端传入的数据主键,polygonId 是返回给移动端的数据主键 + String primaryKey = TableOperationUtil.getPrimaryKey(table); + Object polygonIdStringFromAndroid = TableOperationUtil.getFieldValue(table, primaryKey); + Long polygonIdFromAndroid = null; + if(polygonIdStringFromAndroid != null){ + polygonIdFromAndroid = Long.parseLong(polygonIdStringFromAndroid.toString()); + } + Long polygonId; + + + CompositeKey compositeKey = new CompositeKey(); + String trueTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), + false, false); + + // 情况1 : polygonIdFromAndroid == null,新采集的数据 + if(polygonIdFromAndroid == null){ + polygonId = baseService.insertData(task, table, userId, multimediaItemJsonArray, file); + compositeKey.setPolygonId(polygonId); + compositeKey.setVersion(baseService.getVersionByLongId(trueTableName, + PostgreSqlUtil.transformString(primaryKey), + polygonId)); + } + // 情况2 : polygonIdFromAndroid != null ,说明不是新采集的数据,之前采集过一次! + // 说明这条数据为复核数据(数据上传错了,重新上传也归为复核) + else{ + Integer versionCodeInTable = baseService.getVersionByLongId(trueTableName, + PostgreSqlUtil.transformString(primaryKey), + polygonIdFromAndroid); + if(versionCodeInTable == null){ + return ResultMessage.failed("数据库中无对应数据!").toString(); + } + // versionCode 为复核上传的记录版本,versionCodeInTable 为根表中记录版本 + int version = (int) TableOperationUtil.getFieldValue(table, CommonConstant.FIX_FIELD_VERSION); + if(versionCodeInTable > version){ + return ResultMessage.failed(8888, "版本号过低").toString(); + } + // 上传版本号 >= 根表中记录版本,进行更新根表中数据版本(根表中数据更新,像多媒体表和关联表的数据先删除再插入) + // 在上述操作之前必须将旧版本数据放在历史数据库中 + polygonIdFromAndroid = baseService.updateRecheckData(task, table, userId, + multimediaItemJsonArray, polygonIdFromAndroid, file); + compositeKey.setPolygonId(polygonIdFromAndroid); + compositeKey.setVersion(baseService.getVersionByLongId(trueTableName, + PostgreSqlUtil.transformString(primaryKey), + polygonIdFromAndroid)); + } + return ResultMessage.success(compositeKey).toString(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("数据处理失败: {}", e.getMessage()); + return ResultMessage.failed("数据格式错误: " + e.getMessage()).toString(); + } + } + /** + * 预处理JSON中的boolean值,将表达式转换为实际的boolean值 + */ + public void preprocessBooleanValues(Map data) { + if (data == null) { + return; + } + + for (Map.Entry entry : data.entrySet()) { + Object value = entry.getValue(); + if (value instanceof Map) { + preprocessBooleanValues((Map) value); + } else if (value instanceof String) { + String strValue = (String) value; + try { + // 处理特殊表达式情况 + if (strValue.contains("length==")) { + // 简单处理长度检查表达式 + boolean isEmpty = strValue.contains("length==0"); + entry.setValue(isEmpty); + logger.info("Converted expression '{}' to {}", strValue, isEmpty); + } + // 处理标准布尔值 + else if ("true".equalsIgnoreCase(strValue)) { + entry.setValue(true); + } else if ("false".equalsIgnoreCase(strValue)) { + entry.setValue(false); + } + } catch (Exception e) { + logger.warn("Failed to parse value '{}': {}", strValue, e.getMessage()); + // 保持原始值不变 + } + } + } + } + + /** + * 将某个根表下某数据回退到某个历史版本 + * + * @param taskId 任务id + * @param tableName 表名 + * @param polygonId 数据主键id + * @param version 版本号 + */ + @RequestMapping(value = "rollBackDataForVersion", produces = "text/html;charset=UTF-8") + public String rollBackDataForVersion(Integer taskId, String tableName, Long polygonId, + Integer version) throws Exception{ + Task task = taskService.getTaskById(taskId); + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tablesMap = config.getTables(); + Table table = tablesMap.get(tableName); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String selectSql = + GenerateSqlUtil.genSqlByPolygonIdAndVersionId(task.getDatabaseName(), + tableName + CommonConstant.HISTORY_SUFFIX, + primaryKey, polygonId, version); + + // 获取根表数据中主键字段值为polygonId,version 字段为 versionId 的记录,然后进行回滚更新 + List> rootTableDataList = baseService.selectData(selectSql); + ResultMessage resultMessage = OtherUtil.checkDataListGetByPolygonId(rootTableDataList); + if(!resultMessage.isSuccess()){ + return resultMessage.toString(); + } + String updateSqlForRootTable = GenerateSqlUtil.generateUpdateSqlByData(rootTableDataList.get(0), + task.getDatabaseName(), tableName, + primaryKey, polygonId, task.getConfig()); + String result = baseService.rollBackDataForVersion(task, table, updateSqlForRootTable, polygonId, version); + if(result.equals(CommonConstant.SUCCEED)){ + return ResultMessage.success(null).toString(); + } + else{ + return ResultMessage.failed(null).toString(); + } + } + + + /** + * 指定某个数据审核通过,或者审核未通过! 如果审核未通过需要提供原因 + * @param taskId 任务 id + * @param tableName 表名 + * @param polygonId 数据主键 + * @param pass 审核是否通过 + * @param reason 审核未通过原因 + */ + @RequestMapping(value = "setDataStatus", produces = "text/html;charset=UTF-8") + public String setDataStatus(Integer taskId, String tableName, Long polygonId, boolean pass, String reason){ + Task task = taskService.getTaskById(taskId); + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tablesMap = config.getTables(); + Table table = tablesMap.get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + int status; + if(pass){ + status = 2; + reason = null; + } + else{ + status = -1; + } + baseService.updateTableStatus(tableNameInDb, PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)), + polygonId, status, reason); + return ResultMessage.success(null).toString(); + } + + /** + * 根据某任务的统计时间,进行每天的数据统计,并返回给前端! 该接口也就是网页端的“异常监管”! + * 需要将异常范围的上下边界两个参数值提供出来 + * @param taskId 任务 id + * @param tableName 表名, 注意如果 tableName 是 "" ,表明需要统计所有的根表 + * @param lowLimit 下边界 + * @param highLimit 上边界 + */ + @RequestMapping(value = "getWarningForUser", produces = "text/html;charset=UTF-8") + public String getCountForUserEveryday(Integer taskId, String tableName, double lowLimit, double highLimit){ + List workers = taskService.getWorkersByTask(taskId); + if (workers.isEmpty()) { + return new ResultMessage<>(true, "任务下无外业人员").toString(); + } + + Set tableNameSet; + List> unusualData = new ArrayList<>(); + // yearMonthDayList 表示采集数据的年月日,对任务中每个根表进行统计 + List yearMonthDayList = new ArrayList<>(); + // 不区分巡查员和采集员,放在一起计算工作量! + Task task = taskService.getTaskById(taskId); + Long allDataCount = 0L; + if("mmoo".equals(tableName)){ + tableNameSet = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables().keySet(); + } + else{ + tableNameSet = new HashSet<>(); + tableNameSet.add(tableName); + } + for(String rootTableName : tableNameSet){ + String rootTableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), rootTableName, false, false); + allDataCount += baseService.getHasCollectAndPatrolDataCount(rootTableNameInDb); + String selectYearMonthDaySql = MessageFormat.format("select DISTINCT(to_char(update_time,{1})) as collect_date from {0}" + + "where status = 1 or status = 2 " + + "ORDER BY collect_date", + rootTableNameInDb, "\'yyyy-MM-dd\'"); + List> yearMonthDayResult = baseService.selectData(selectYearMonthDaySql); + if(yearMonthDayResult != null && yearMonthDayResult.size() != 0){ + for(Map yearMonthDay : yearMonthDayResult){ + if(!yearMonthDayList.contains(yearMonthDay.get("collect_date").toString())){ + yearMonthDayList.add(yearMonthDay.get("collect_date").toString()); + } + } + } + } + + yearMonthDayList.sort(Comparator.naturalOrder()); + // 判断 yearMonthDayList 是否有当天的日期,若有将它排除,以及 yearMonthDayList 为空就返回 + if(yearMonthDayList.size() == 0){ + return new ResultMessage<>(true, "任务下无数据").toString(); + } + // 从数据中获取的平均工作量 + int avgCollectionNum = (int)(allDataCount / workers.size() / yearMonthDayList.size()), + lowLimitNum = (int)(avgCollectionNum * lowLimit), + highLimitNum = (int)(avgCollectionNum * highLimit); + + // 获取任务中的数据 + for(User worker : workers){ + Map tempMap = new HashMap<>(); + Optional userOptional = userService.findById(worker.getId()); + // 获取该外业人员异常日期及该日期下对应的工作量 + Map dataCountForDayMap = new HashMap<>(); + for(String rootTableName : tableNameSet){ + String rootTableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), rootTableName, false, false); + List> dataCountAndTimeList = baseService.getDataCountAndTimeByUser(rootTableNameInDb, worker.getId()); + for(Map dataCountAndTimeMap : dataCountAndTimeList){ + String time = dataCountAndTimeMap.get("updateTime").toString(); + Long countValue = Long.valueOf(dataCountAndTimeMap.get("dataCount").toString()); + if(!dataCountForDayMap.containsKey(time)){ + dataCountForDayMap.put(time, countValue); + } + else{ + Long dataCountAdd = dataCountForDayMap.get(time) + countValue; + dataCountForDayMap.remove(time); + dataCountForDayMap.put(time, dataCountAdd); + } + } + } + List> unusualDayList = new ArrayList<>(); + for(String yearMonthDay : yearMonthDayList){ + if(!dataCountForDayMap.containsKey(yearMonthDay)){ + Map unusualDayMap = new HashMap<>(); + unusualDayMap.put("day", yearMonthDay); + unusualDayMap.put("num", 0); + unusualDayList.add(unusualDayMap); + } + else if(dataCountForDayMap.get(yearMonthDay) < lowLimitNum + || dataCountForDayMap.get(yearMonthDay) > highLimitNum){ + Map unusualDayMap = new HashMap<>(); + unusualDayMap.put("day", yearMonthDay); + unusualDayMap.put("num", dataCountForDayMap.get(yearMonthDay)); + unusualDayList.add(unusualDayMap); + } + } + if(unusualDayList.size() != 0){ + tempMap.put("unusualDay", unusualDayList); + tempMap.put("userName", userOptional.get().getUsername()); + unusualData.add(tempMap); + } + } + Map result = new HashMap<>(); + result.put("unusualData", unusualData); + result.put("averageNum", avgCollectionNum); + result.put("lowLimitNum", lowLimitNum); + result.put("highLimitNum", highLimitNum); + return ResultMessage.success(result).toString(); + } + + /** + * 根据前端传入的任务 taskId 及经纬度范围进行数据抽稀,只返回某范围的数据个数 + * accuracy、longitudeMin、latitudeMin、longitudeMax、latitudeMax + * 缩放精度、 最小经度 、 最小纬度 、 最大经度 、 最大纬度 + */ + @RequestMapping(value = "getCountByGeoHash", produces = "text/html;charset=UTF-8") + public String getCountByGeoHash(Integer taskId, String tableName, Integer accuracy, Double longitudeMin, + Double latitudeMin, Double longitudeMax, Double latitudeMax){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + // 获取几何字段名 + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table); + + // 如果没有几何字段,直接返回空 + if (geometryFieldName == null) { + return ResultMessage.success(null).toString(); + } + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + + String selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_GEOHASH, + tableNameInDb, + PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), + accuracy, longitudeMin, latitudeMin, longitudeMax, latitudeMax, ""); + List> dataList = baseService.selectData(selectSql); + if(dataList != null && dataList.size() != 0){ + List> result = OtherUtil.genFeatureCountList(dataList); + return ResultMessage.success(result).toString(); + } + else{ + return ResultMessage.success(null).toString(); + } + } + + /** + * 获取热力图相关的数据 + * @param taskId 任务 id + * @param tableName 表名 + */ + @RequestMapping(value = "getHeatData", produces = "text/html;charset=UTF-8") + public String getHeatData(Integer taskId, String tableName){ + Map coordinateRangeMap = taskCellService.getCoordinateRange(taskId); + if(coordinateRangeMap != null && coordinateRangeMap.size() != 0){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + String selectSql = MessageFormat.format(SqlStringConstant.SELECT_CENTROID_SQL_BY_GEOHASH, + tableNameInDb, + PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), 7, + Double.valueOf(coordinateRangeMap.get("xmin").toString()), + Double.valueOf(coordinateRangeMap.get("ymin").toString()), + Double.valueOf(coordinateRangeMap.get("xmax").toString()), + Double.valueOf(coordinateRangeMap.get("ymax").toString())); + List> dataList = baseService.selectData(selectSql); + if(dataList != null && dataList.size() != 0){ + List> result = OtherUtil.genFeatureCountList(dataList); + return ResultMessage.success(result).toString(); + } + } + return ResultMessage.success("null").toString(); + } + + /** + * 根据前端传入的任务 taskId,tableName 及中心点,获取据该中心点小于 100m 的数据 + */ + @RequestMapping(value = "getDataByDistance", produces = "text/html;charset=UTF-8") + public String getDataByDistance(Integer taskId, String tableName, Double longitude, Double latitude){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + String pointGeoJson = "\'{" + MessageFormat.format(SqlStringConstant.POINT_GEOGSON, longitude, latitude) + "}\'"; + String selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_DISTANCE, tableNameInDb, + PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), pointGeoJson); + List> dataList = baseService.selectData(selectSql); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + if(dataList != null && dataList.size() != 0){ + List result = new ArrayList<>(); + dataList.forEach(data -> result.add(Long.valueOf(data.get(primaryKey).toString()))); + return ResultMessage.success(result).toString(); + } + else{ + return ResultMessage.success(null).toString(); + } + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/controller/DefaultController.java b/src/main/java/cn/edu/whu/boot/collection/controller/DefaultController.java new file mode 100644 index 0000000..d4bfd49 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/controller/DefaultController.java @@ -0,0 +1,18 @@ +package cn.edu.whu.boot.collection.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * Created by AJQK on 2018/5/31. + */ +@RequestMapping("/") +@Controller +public class DefaultController { + + @RequestMapping + public ModelAndView homepage(){ + return new ModelAndView("redirect:index.html"); + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/controller/ExportController.java b/src/main/java/cn/edu/whu/boot/collection/controller/ExportController.java new file mode 100644 index 0000000..43743de --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/controller/ExportController.java @@ -0,0 +1,1170 @@ +package cn.edu.whu.boot.collection.controller; + +import cn.edu.whu.boot.collection.service.ExportService; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.domain.SqlStringConstant; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.collection.StoreMediaFileUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +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.usermodel.XSSFWorkbook; +import org.gdal.ogr.Geometry; +import org.geotools.data.DataUtilities; +import org.geotools.data.DefaultTransaction; +import org.geotools.data.Transaction; +import org.geotools.data.collection.ListFeatureCollection; +import org.geotools.data.shapefile.ShapefileDataStore; +import org.geotools.data.shapefile.ShapefileDataStoreFactory; +import org.geotools.data.simple.SimpleFeatureCollection; +import org.geotools.data.simple.SimpleFeatureSource; +import org.geotools.data.simple.SimpleFeatureStore; +import org.geotools.feature.simple.SimpleFeatureBuilder; +import org.geotools.geometry.jts.JTSFactoryFinder; +import org.locationtech.jts.geom.*; +import org.opengis.feature.simple.SimpleFeature; +import org.opengis.feature.simple.SimpleFeatureType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.math.BigDecimal; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import org.gdal.ogr.*; +import org.gdal.osr.SpatialReference; + +import org.gdal.gdal.gdal; +import org.gdal.ogr.ogr; +/** + * 导出数据的接口,对应“下载数据按钮” + */ +@RestController +@RequestMapping("export") +public class ExportController{ + private static final Logger logger = LoggerFactory.getLogger(ExportController.class); + + private final ITaskService taskService; + private final IBaseService baseService; + private final UserService userService; + private final ExportService exportService; + + @Autowired + public ExportController(ITaskService taskService, IBaseService baseService, UserService userService, ExportService exportService){ + this.taskService = taskService; + this.baseService = baseService; + this.userService = userService; + this.exportService = exportService; + } +@RequestMapping(value = "taskTableDataExport", produces = "text/html;charset=UTF-8") +public String taskTableDataExport(Integer taskId, String tableName, + boolean isHighVersion, HttpServletResponse response) throws IOException { + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + + // 获取数据表 + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + String selectSql = MessageFormat.format(SqlStringConstant.SELECT_ALLDATA_SQL, tableNameInDb); + List> tableDataList = baseService.selectData(selectSql); + // ✅ 空数据判断,避免后续导出报错 + if (CollectionUtils.isEmpty(tableDataList)) { + return ResultMessage.failed("数据为空,无法导出").toString(); + } + + // 导出文件夹准备 + Map idToRealName = new HashMap<>(); + String exportDir = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis(); + File exportDirFile = new File(exportDir); + if (!exportDirFile.exists()) { + exportDirFile.mkdirs(); + } + + /// ✅ 判断是否有合法几何数据(Java 8 写法,字段名写死为 "shape") + boolean hasGeometryData = false; + for (Map row : tableDataList) { + Object geom = row.get("shape"); // 写死字段名为 "shape" + if (geom != null && !geom.toString().trim().isEmpty()) { + hasGeometryData = true; + break; + } + } + if (CollectionUtils.isNotEmpty(tableDataList)) { + String shpFileNamePrefix = String.valueOf(System.currentTimeMillis()); + File shpFileNamePrefixDir = new File(CommonConstant.TEMP_FILE_PATHNAME + "/" + shpFileNamePrefix); + if (!shpFileNamePrefixDir.exists()) { + shpFileNamePrefixDir.mkdirs(); + } + + if (hasGeometryData) { + createShpByGeometryType(table, tableDataList, CommonConstant.POINT, shpFileNamePrefix, isHighVersion, idToRealName); + createShpByGeometryType(table, tableDataList, CommonConstant.LINESTRING, shpFileNamePrefix, isHighVersion, idToRealName); + createShpByGeometryType(table, tableDataList, CommonConstant.POLYGON, shpFileNamePrefix, isHighVersion, idToRealName); + createShpByGeometryType(table, tableDataList, CommonConstant.MULTIPOLYGON, shpFileNamePrefix, isHighVersion, idToRealName); + } else { + // ✅ 改为导出 Excel + exportExcelFile(table, tableDataList, exportDir, idToRealName); + } + } + + // 导出 table_media 表(如果存在) + String tableNameMedia = tableName + "_media"; + exportTableMedia(task.getDatabaseName(), tableNameMedia, exportDir); + + // 压缩所有文件 + String zipFilePath = StoreMediaFileUtil.zip(CommonConstant.TEMP_FILE_PATHNAME, Collections.singletonList(exportDir), null); + File zipFile = new File(zipFilePath); + + // 设置响应头并下载 zip 文件 + response.setContentType("application/x-zip-compressed"); + response.addHeader("Content-Disposition", + "attachment;fileName=" + new String(task.getTaskName().getBytes(), "iso-8859-1") + ".zip"); + String result = OtherUtil.uploadFileByResponse(zipFile, response); + + // 清理临时文件 + FileUtils.deleteDirectory(exportDirFile); + zipFile.delete(); + + if (CommonConstant.FAILED.equals(result)) { + return ResultMessage.failed(null).toString(); + } + return ResultMessage.success(null).toString(); +} + + + // 直接从数据库查询字段和数据,导出 Excel + private void exportTableMedia(String databaseName, String tableNameMedia, String exportDir) throws IOException { + List fieldNames = baseService.getTableColumns(databaseName,tableNameMedia); + if (fieldNames.isEmpty()) { + System.out.println("表 " + tableNameMedia + " 不存在或无字段!"); + return; + } + + String selectSql = "SELECT * FROM \"" + databaseName + "\".\"" + tableNameMedia + "\""; + List> dataList = baseService.selectData(selectSql); + + if (dataList == null || dataList.isEmpty()) { + System.out.println("表 " + tableNameMedia + " 查询结果为空!"); + return; + } + + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("Sheet1"); + Row firstRow = sheet.createRow(0); + for (int i = 0; i < fieldNames.size(); i++) { + firstRow.createCell(i).setCellValue(fieldNames.get(i)); + } + + int rowNum = 1; + for (Map rowData : dataList) { + Row row = sheet.createRow(rowNum++); + for (int i = 0; i < fieldNames.size(); i++) { + String fieldName = fieldNames.get(i); + row.createCell(i).setCellValue(rowData.getOrDefault(fieldName, "").toString()); + } + } + + File excelFile = new File(exportDir, tableNameMedia + ".xlsx"); + try (FileOutputStream fos = new FileOutputStream(excelFile)) { + workbook.write(fos); + } + } +//@RequestMapping(value = "taskGdbExport", produces = "text/html;charset=UTF-8") +//public String taskGdbExport(Integer taskId, HttpServletResponse response) throws IOException { +// // ✅ 初始化 GDAL +// ogr.RegisterAll(); +// gdal.AllRegister(); +// // 支持中文路径和中文字段名 +// gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); +// gdal.SetConfigOption("SHAPE_ENCODING", ""); +// +// Task task = taskService.getTaskById(taskId); +// Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); +// Map tableMap = config.getTables(); +// +// // ✅ 表名 → 中文图层名映射 +// Map tableNameAliasMap = new HashMap<>(); +// tableNameAliasMap.put("roottable1", "小班表"); +// tableNameAliasMap.put("t1sub1", "样地表"); +// tableNameAliasMap.put("t1sub2", "样木表"); +// tableNameAliasMap.put("t1sub3", "没有"); +// tableNameAliasMap.put("t1sub4", "幼树样方"); +// tableNameAliasMap.put("t1sub5", "幼树表"); +// tableNameAliasMap.put("t1sub6", "下木样方"); +// tableNameAliasMap.put("t1sub7", "下木表"); +// tableNameAliasMap.put("t1sub8", "未成林样方"); +// tableNameAliasMap.put("t1sub9", "未成林表"); +// tableNameAliasMap.put("t1sub10", "生物多样性"); +// tableNameAliasMap.put("t1sub12", "经济林样方"); +// tableNameAliasMap.put("t1sub13", "经济树种表"); +// tableNameAliasMap.put("t1sub201", "灌木样方"); +// tableNameAliasMap.put("t1sub21", "灌木调查表"); +// tableNameAliasMap.put("t1sub202", "藤本样方"); +// tableNameAliasMap.put("t1sub22", "藤本调查表"); +// tableNameAliasMap.put("t1sub203", "草本样方"); +// tableNameAliasMap.put("t1sub23", "草本调查表"); +// tableNameAliasMap.put("t1sub204", "地被样方"); +// tableNameAliasMap.put("t1sub24", "地被调查表"); +// tableNameAliasMap.put("t1sub25", "目测项目表"); +// tableNameAliasMap.put("t1sub251", "目测单项表"); +// tableNameAliasMap.put("roottable3", "散生木表"); +// tableNameAliasMap.put("t3sub", "散生单木表"); +// tableNameAliasMap.put("roottable4", "四旁树表"); +// tableNameAliasMap.put("t4sub", "四旁树单木表"); +// +// // ✅ 临时导出路径 +// String exportDir = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis(); +// File exportDirFile = new File(exportDir); +// exportDirFile.mkdirs(); +// +// String gdbName = task.getTaskName() + ".gdb"; +// File gdbDir = new File(exportDirFile, gdbName); +// if (gdbDir.exists()) FileUtils.deleteDirectory(gdbDir); +// +// // ✅ 创建 FileGDB 数据源 +// Driver driver = ogr.GetDriverByName("FileGDB"); +// if (driver == null) { +// throw new RuntimeException("未找到 FileGDB 驱动,请确认 GDAL 已正确安装并支持 FileGDB。"); +// } +// DataSource dataSource = driver.CreateDataSource(gdbDir.getAbsolutePath()); +// if (dataSource == null) { +// throw new RuntimeException("创建 FileGDB 数据源失败:" + gdbDir.getAbsolutePath()); +// } +// // ✅ 遍历每个表 +// for (Map.Entry entry : tableMap.entrySet()) { +// String tableName = entry.getKey(); +// Table table = entry.getValue(); +// String layerName = tableNameAliasMap.getOrDefault(tableName, tableName); +// String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); +// String selectSql = MessageFormat.format(SqlStringConstant.SELECT_ALLDATA_SQL, tableNameInDb); +// List> tableDataList = baseService.selectData(selectSql); +// +// if (tableDataList == null || tableDataList.isEmpty()) { +// System.out.println("⚠️ 表数据为空:" + tableName); +// continue; // 跳过空表 +// } +// +// boolean hasGeometry = tableDataList.stream().anyMatch(row -> { +// Object geom = row.get("shape"); +// return geom != null && !geom.toString().trim().isEmpty(); +// }); +// +// if (hasGeometry) { +// addGeometryLayerToGdb(dataSource, table, layerName, tableDataList); +// } else { +// addTableToGdb(dataSource, table, layerName, tableDataList); +// } +// } +// dataSource.delete(); // ✅ 保存并关闭 +// // ✅ 压缩 GDB 文件夹为 ZIP +// String zipFilePath = StoreMediaFileUtil.zip(exportDir, Collections.singletonList(gdbDir.getAbsolutePath()), null); +// File zipFile = new File(zipFilePath); +// +// // ✅ 下载响应 +// response.setContentType("application/x-zip-compressed"); +// response.addHeader("Content-Disposition", +// "attachment;fileName=" + new String(task.getTaskName().getBytes(StandardCharsets.UTF_8), "iso-8859-1") + ".zip"); +// String result = OtherUtil.uploadFileByResponse(zipFile, response); +// +// // ✅ 清理临时文件 +// FileUtils.deleteDirectory(exportDirFile); +// zipFile.delete(); +// +// if (CommonConstant.FAILED.equals(result)) { +// return ResultMessage.failed(null).toString(); +// } +// return ResultMessage.success(null).toString(); +//} + /** + * 下载数据接口,导出单个任务为gdb + */ +@RequestMapping(value = "taskGdbExport", produces = "text/html;charset=UTF-8") +public String taskGdbExport(Integer taskId, HttpServletResponse response) throws IOException { + ogr.RegisterAll(); + gdal.AllRegister(); + // 支持中文路径和中文字段名 + gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); + gdal.SetConfigOption("SHAPE_ENCODING", ""); + + Task task = taskService.getTaskById(taskId); + if (task == null) return ResultMessage.failed("任务不存在").toString(); + + String exportDir = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis(); + File exportDirFile = new File(exportDir); + exportDirFile.mkdirs(); + + String gdbPath = exportTaskToGdb(task, exportDir); + if (gdbPath == null) return ResultMessage.failed("导出失败").toString(); + + String zipFilePath = StoreMediaFileUtil.zip(exportDir, Collections.singletonList(gdbPath), null); + File zipFile = new File(zipFilePath); + + response.setContentType("application/x-zip-compressed"); + response.addHeader("Content-Disposition", + "attachment;fileName=" + new String(task.getTaskName().getBytes(StandardCharsets.UTF_8), "iso-8859-1") + ".zip"); + String result = OtherUtil.uploadFileByResponse(zipFile, response); + + FileUtils.deleteDirectory(exportDirFile); + zipFile.delete(); + + return CommonConstant.FAILED.equals(result) ? ResultMessage.failed(null).toString() : ResultMessage.success(null).toString(); +} + /** + * 批量下载数据接口 + */ + @RequestMapping(value = "batchGdbExport", produces = "text/html;charset=UTF-8") + public String batchGdbExport(@RequestParam List taskIds, HttpServletResponse response) throws IOException { + if (taskIds == null || taskIds.isEmpty()) return ResultMessage.failed("任务ID列表为空").toString(); + + ogr.RegisterAll(); + gdal.AllRegister(); + // 支持中文路径和中文字段名 + gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); + gdal.SetConfigOption("SHAPE_ENCODING", ""); + + String exportDir = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis(); + File exportDirFile = new File(exportDir); + exportDirFile.mkdirs(); + + List gdbPaths = new ArrayList<>(); + for (Integer taskId : taskIds) { + Task task = taskService.getTaskById(taskId); + if (task == null) continue; + String gdbPath = exportTaskToGdb(task, exportDir); + if (gdbPath != null) gdbPaths.add(gdbPath); + } + + if (gdbPaths.isEmpty()) return ResultMessage.failed("没有有效任务可导出").toString(); + + String zipFilePath = StoreMediaFileUtil.zip(exportDir, gdbPaths, null); + File zipFile = new File(zipFilePath); + + // ✅ 使用日期+“批量数据下载”作为压缩包名称 + String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String zipFileName = dateStr + "批量数据下载.zip"; + + response.setContentType("application/x-zip-compressed"); + response.addHeader("Content-Disposition", + "attachment;fileName=" + new String(zipFileName.getBytes(StandardCharsets.UTF_8), "iso-8859-1")); + String result = OtherUtil.uploadFileByResponse(zipFile, response); + + FileUtils.deleteDirectory(exportDirFile); + zipFile.delete(); + + return CommonConstant.FAILED.equals(result) ? ResultMessage.failed(null).toString() : ResultMessage.success(null).toString(); + } + + + /** + * 为一个任务创建 GDB 并写入所有表 + * + * @param task 任务对象 + * @param exportBaseDir 临时导出根目录 + * @return 返回生成的 GDB 绝对路径 + */ + public String exportTaskToGdb(Task task, String exportBaseDir) throws IOException { + if (task == null) return null; + + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tableMap = config.getTables(); + if (tableMap == null || tableMap.isEmpty()) { + System.err.println("⚠️ 任务没有表:" + task.getTaskName()); + return null; + } + + // 临时 GDB 路径 + String gdbName = task.getTaskName() + ".gdb"; + File gdbDir = new File(exportBaseDir, gdbName); + if (gdbDir.exists()) { + try { + FileUtils.deleteDirectory(gdbDir); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + // 创建 FileGDB 数据源 + Driver driver = ogr.GetDriverByName("FileGDB"); + if (driver == null) throw new RuntimeException("未找到 FileGDB 驱动"); + DataSource dataSource = driver.CreateDataSource(gdbDir.getAbsolutePath()); + if (dataSource == null) { + System.err.println("⚠️ 创建 GDB 失败:" + gdbDir.getAbsolutePath()); + return null; + } + + // 遍历表 + for (Map.Entry entry : tableMap.entrySet()) { + String tableName = entry.getKey(); + Table table = entry.getValue(); + String layerName = table.getName(); // 使用中文名作为图层名 + + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + String selectSql = MessageFormat.format(SqlStringConstant.SELECT_ALLDATA_SQL, tableNameInDb); + List> tableDataList = baseService.selectData(selectSql); + + if (tableDataList == null || tableDataList.isEmpty()) { + continue; + } + + boolean hasGeometry = tableDataList.stream().anyMatch(row -> { + Object geom = row.get("shape"); + return geom != null && !geom.toString().trim().isEmpty(); + }); + + if (hasGeometry) { + addGeometryLayerToGdb(dataSource, table, layerName, tableDataList); + } else { + addTableToGdb(dataSource, table, layerName, tableDataList); + } + } + + dataSource.delete(); // 保存并关闭 GDB + return gdbDir.getAbsolutePath(); + } + + /** + * 添加带几何的图层到 GDB(支持 Polygon 和 MultiPolygon) + */ + private void addGeometryLayerToGdb(DataSource dataSource, Table table, String layerName, List> dataList) { + SpatialReference srs = new SpatialReference(); + srs.ImportFromEPSG(4490); // CGCS2000 + + // ✅ 直接从 JSON 中解析几何类型 + int geomType = ogr.wkbPolygon; // 默认 Polygon + for (Map row : dataList) { + Object geomObj = row.get("shape"); + if (geomObj == null || geomObj.toString().trim().isEmpty()) continue; + + try { + JSONObject json = JSONObject.parseObject(geomObj.toString()); + String type = json.getString("type"); + + if ("MultiPolygon".equalsIgnoreCase(type)) { + geomType = ogr.wkbMultiPolygon; + } else if ("Polygon".equalsIgnoreCase(type)) { + geomType = ogr.wkbPolygon; + } else if ("Point".equalsIgnoreCase(type)) { + geomType = ogr.wkbPoint; + } + break; + } catch (Exception ignore) {} + } + + // ✅ 创建图层 + Layer layer = dataSource.CreateLayer(layerName, srs, geomType); + if (layer == null) { + System.err.println("❌ 创建几何图层失败:" + layerName); + return; + } + + // ✅ 字段顺序 + List fieldNameOrder = genFieldNameOrderStringArr(table, ""); + if (fieldNameOrder == null || fieldNameOrder.isEmpty()) return; + + // ✅ 字段创建(英文名 + 中文别名) + for (String fieldName : fieldNameOrder) { + Field field = table.getFields().get(fieldName); + String alias = (field != null && field.getName() != null) ? field.getName() : fieldName; + + FieldDefn fieldDefn = new FieldDefn(fieldName, ogr.OFTString); + try { + fieldDefn.SetAlternativeName(alias); + } catch (Exception ignore) {} + layer.CreateField(fieldDefn); + } + + // ✅ 写入要素(严格匹配几何类型) + for (Map row : dataList) { + Feature feature = new Feature(layer.GetLayerDefn()); + + // 属性写入 + for (String fieldName : fieldNameOrder) { + Object val = row.get(fieldName); + feature.SetField(fieldName, val == null ? "" : val.toString()); + } + + // 几何写入 + Object geomObj = row.get("shape"); + if (geomObj != null && !geomObj.toString().trim().isEmpty()) { + try { + Geometry geometry = Geometry.CreateFromJson(geomObj.toString()); + // ✅ 只有类型一致时写入,否则跳过(不报错) + if (geometry != null && geometry.GetGeometryType() == geomType) { + feature.SetGeometry(geometry); + } + } catch (Exception e) { + System.err.println("⚠️ 几何解析失败:" + e.getMessage()); + } + } + + layer.CreateFeature(feature); + feature.delete(); + } + + layer.SyncToDisk(); + } + + + /** + * 添加普通表到 GDB(无几何) + */ + private void addTableToGdb(DataSource dataSource, Table table, String layerName, List> dataList) { + // ✅ 创建普通表图层 + Layer layer = dataSource.CreateLayer(layerName, null, ogr.wkbNone); + if (layer == null) { + System.err.println("❌ 创建普通表失败:" + layerName); + return; + } + + // ✅ 获取字段顺序 + String primaryKey = TableOperationUtil.getPrimaryKey(table); + List fieldNameOrder = genFieldNameOrderStringArr(table, ""); + if (fieldNameOrder == null || fieldNameOrder.isEmpty()) { + return; + } + + // ✅ 创建字段(英文名 + 中文别名) + for (String fieldName : fieldNameOrder) { + if (fieldName == null || fieldName.trim().isEmpty()) continue; + + Field field = table.getFields().get(fieldName); + String aliasName = (field != null && field.getName() != null) ? field.getName() : fieldName; + + FieldDefn fieldDefn = new FieldDefn(fieldName, ogr.OFTString); + try { + fieldDefn.SetAlternativeName(aliasName); + } catch (Exception e) { + System.err.println("⚠️ 设置别名失败:" + fieldName + " → " + aliasName); + } + layer.CreateField(fieldDefn); + } + + // ✅ 写入行 + for (Map row : dataList) { + FeatureDefn featureDefn = layer.GetLayerDefn(); + Feature feature = new Feature(featureDefn); + + for (String fieldName : fieldNameOrder) { + Object val = row.get(fieldName); + feature.SetField(fieldName, val == null ? "" : val.toString()); + } + + layer.CreateFeature(feature); + feature.delete(); + } + + layer.SyncToDisk(); + } + + + // 导出 Excel 文件 +// private void exportExcelFile(Table table, List> dataList, String exportDir, Map idToRealName) throws IOException { +// String primaryKey = TableOperationUtil.getPrimaryKey(table); +// List fieldNameOrder = genFieldNameOrderStringArr(table, ""); +// +// Workbook workbook = new XSSFWorkbook(); +// Sheet sheet = workbook.createSheet("Sheet1"); +// Row firstRow = sheet.createRow(0); +// firstRow.createCell(0).setCellValue(primaryKey); +// for (int i = 0; i < fieldNameOrder.size(); i++) { +// firstRow.createCell(i + 1).setCellValue(fieldNameOrder.get(i)); +// } +// int rowNum = 1; +// for (Map rowData : dataList) { +// Row row = sheet.createRow(rowNum++); +// row.createCell(0).setCellValue(rowData.get(primaryKey).toString()); +// for (int i = 0; i < fieldNameOrder.size(); i++) { +// String fieldName = fieldNameOrder.get(i); +// row.createCell(i + 1).setCellValue(rowData.getOrDefault(fieldName, "").toString()); +// } +// } +// try (FileOutputStream fos = new FileOutputStream(new File(exportDir, table.getName() + ".xlsx"))) { +// workbook.write(fos); +// } +// } + //导出Excel文件,根据字段类型对应导出 + private void exportExcelFile(Table table, List> dataList, String exportDir, Map idToRealName) throws IOException { + String primaryKey = TableOperationUtil.getPrimaryKey(table); + List fieldNameOrder = genFieldNameOrderStringArr(table, ""); + + Workbook workbook = new XSSFWorkbook(); + Sheet sheet = workbook.createSheet("Sheet1"); + + // 写表头 + Row firstRow = sheet.createRow(0); + firstRow.createCell(0).setCellValue(primaryKey); + for (int i = 0; i < fieldNameOrder.size(); i++) { + firstRow.createCell(i + 1).setCellValue(fieldNameOrder.get(i)); + } + + // 写数据 + int rowNum = 1; + for (Map rowData : dataList) { + Row row = sheet.createRow(rowNum++); + + // 主键列 + Object primaryKeyVal = rowData.get(primaryKey); + Cell pkCell = row.createCell(0); + if (primaryKeyVal == null) { + pkCell.setBlank(); + } else if (primaryKeyVal instanceof Number) { + pkCell.setCellValue(((Number) primaryKeyVal).doubleValue()); + } else if (primaryKeyVal instanceof Boolean) { + pkCell.setCellValue((Boolean) primaryKeyVal); + } else { + pkCell.setCellValue(primaryKeyVal.toString()); + } + + // 其他字段列 + for (int i = 0; i < fieldNameOrder.size(); i++) { + String fieldName = fieldNameOrder.get(i); + Object value = rowData.getOrDefault(fieldName, null); + Cell cell = row.createCell(i + 1); + + if (value == null) { + cell.setBlank(); + } else if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else if (value instanceof Boolean) { + cell.setCellValue((Boolean) value); + } else { + cell.setCellValue(value.toString()); + } + } + } + + // 写入文件 + try (FileOutputStream fos = new FileOutputStream(new File(exportDir, table.getName() + ".xlsx"))) { + workbook.write(fos); + } + } + + + /** + * 因为数据库中没有将点线面数据分开,所以需要创建点线面三个shp, + * 这里为了方便,三个 shp 的名字分别是 Point 、LineString、Polygon + */ +// private void createShpByGeometryType(Table table, List> tableDataList, +// String geometryType, String shpNamePrefix, boolean isHighVersion, +// Map idToRealName) throws IOException{ +// // 创建shp文件并写入数据 +// String shpFilePath = CommonConstant.TEMP_FILE_PATHNAME + "/" + shpNamePrefix + "/" + geometryType + ".shp"; +// File shpFile = new File(shpFilePath); +// ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory(); +// Map params = new HashMap<>(); +// params.put("url", shpFile.toURI().toURL()); +// params.put("create spatial index", Boolean.TRUE); +// ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params); +// try{ +// SimpleFeatureType type = DataUtilities.createType("Location", genTypeSpec(table, geometryType,tableDataList)); +// GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); +// SimpleFeatureBuilder simpleFeatureBuilder = new SimpleFeatureBuilder(type); +// String shapeFieldName = CheckTableDataUtil.getGeometryFieldName(table); +// String primaryKey = TableOperationUtil.getPrimaryKey(table); +// // 将数据转换为简单要素 +// List features = new ArrayList<>(); +// List fieldNameOrderList = genFieldNameOrderStringArr(table, TableOperationUtil.getCameraFieldName(table)); +// for(Map tableData : tableDataList){ +// JSONObject jsonObject = (JSONObject) JSONObject.parse(tableData.get(shapeFieldName).toString()); +// // 针对不同类型进行不同处理 +// if(geometryType.equals(CommonConstant.POLYGON) && jsonObject.getString("type").equals(CommonConstant.POLYGON)){ +// Polygon polygon = geometryFactory.createPolygon(genCoordinateArrByPolygon((List>>)jsonObject.get("coordinates"))); +// features.add(createFeature(simpleFeatureBuilder, polygon, tableData, primaryKey, fieldNameOrderList, idToRealName)); +// } +// if(geometryType.equals(CommonConstant.LINESTRING) && jsonObject.getString("type").equals(CommonConstant.LINESTRING)){ +// LineString lineString = geometryFactory.createLineString(genCoordinateArrByLineString((List>) jsonObject.get("coordinates"))); +// features.add(createFeature(simpleFeatureBuilder, lineString, tableData, primaryKey, fieldNameOrderList, idToRealName)); +// } +// if(geometryType.equals(CommonConstant.POINT) && jsonObject.getString("type").equals(CommonConstant.POINT)){ +// Point point = geometryFactory.createPoint(genCoordinateArrByPoint((List) jsonObject.get("coordinates"))); +// features.add(createFeature(simpleFeatureBuilder, point, tableData, primaryKey, fieldNameOrderList, idToRealName)); +// } +// } +// // 针对不同的版本使用不同的编码 +// if(isHighVersion){ +// newDataStore.setCharset(StandardCharsets.UTF_8); +// } +// else{ +// newDataStore.setCharset(Charset.forName("GBK")); +// } +// newDataStore.createSchema(type); +// Transaction transaction = new DefaultTransaction("create"); +// String typeName = newDataStore.getTypeNames()[0]; +// SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName); +// if(featureSource instanceof SimpleFeatureStore){ +// SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; +// SimpleFeatureCollection collection = new ListFeatureCollection(type, features); +// featureStore.setTransaction(transaction); +// try{ +// featureStore.addFeatures(collection); +// transaction.commit(); +// } catch(Exception problem){ +// problem.printStackTrace(); +// transaction.rollback(); +// } finally{ +// transaction.close(); +// } +// } +// } catch(Exception e){ +// e.printStackTrace(); +// } finally{ +// newDataStore.dispose(); +// } +// } + private void createShpByGeometryType(Table table, List> tableDataList, + String geometryType, String shpNamePrefix, boolean isHighVersion, + Map idToRealName) throws IOException { + // 创建shp文件并写入数据 + String shpFilePath = CommonConstant.TEMP_FILE_PATHNAME + "/" + shpNamePrefix + "/" + geometryType + ".shp"; + File shpFile = new File(shpFilePath); + ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory(); + Map params = new HashMap<>(); + params.put("url", shpFile.toURI().toURL()); + params.put("create spatial index", Boolean.TRUE); + ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params); + try { + SimpleFeatureType type = DataUtilities.createType("Location", genTypeSpec(table, geometryType, tableDataList)); + GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); + SimpleFeatureBuilder simpleFeatureBuilder = new SimpleFeatureBuilder(type); + String shapeFieldName = CheckTableDataUtil.getGeometryFieldName(table); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + // 将数据转换为简单要素 + List features = new ArrayList<>(); + List fieldNameOrderList = genFieldNameOrderStringArr(table, TableOperationUtil.getCameraFieldName(table)); + for (Map tableData : tableDataList) { + JSONObject jsonObject = (JSONObject) JSONObject.parse(tableData.get(shapeFieldName).toString()); + String geomType = jsonObject.getString("type"); + if ("Polygon".equalsIgnoreCase(geometryType) && "Polygon".equalsIgnoreCase(geomType)) { +// // 传入的坐标是 List> 类型,直接调用 +// Polygon polygon = geometryFactory.createPolygon(genCoordinateArrByPolygon((List>>)jsonObject.get("coordinates"))); +// features.add(createFeature(simpleFeatureBuilder, polygon, tableData, primaryKey, fieldNameOrderList, idToRealName)); + // 坐标是 List>>:外环 + 内环 + List>> coords = (List>>) jsonObject.get("coordinates"); + + // 外环 + Coordinate[] shell = genCoordinateArrByLinearRing(coords.get(0)); + LinearRing shellRing = geometryFactory.createLinearRing(shell); + + // 内环(可能没有) + LinearRing[] holes = new LinearRing[coords.size() - 1]; + for (int i = 1; i < coords.size(); i++) { + Coordinate[] holeCoords = genCoordinateArrByLinearRing(coords.get(i)); + holes[i - 1] = geometryFactory.createLinearRing(holeCoords); + } + + Polygon polygon = geometryFactory.createPolygon(shellRing, holes); + features.add(createFeature(simpleFeatureBuilder, polygon, tableData, primaryKey, fieldNameOrderList, idToRealName)); + } + else if ("MultiPolygon".equalsIgnoreCase(geometryType) && "MultiPolygon".equalsIgnoreCase(geomType)) { + // 坐标是 List>>> + List>>> coords = (List>>>) jsonObject.get("coordinates"); + Polygon[] polygons = new Polygon[coords.size()]; + for (int i = 0; i < coords.size(); i++) { + List>> polygonCoords = coords.get(i); + // 外环 + Coordinate[] shell = genCoordinateArrByLinearRing(polygonCoords.get(0)); + LinearRing shellRing = geometryFactory.createLinearRing(shell); + + // 内环 + LinearRing[] holes = new LinearRing[polygonCoords.size() - 1]; + for (int j = 1; j < polygonCoords.size(); j++) { + Coordinate[] holeCoords = genCoordinateArrByLinearRing(polygonCoords.get(j)); + holes[j - 1] = geometryFactory.createLinearRing(holeCoords); + } + + polygons[i] = geometryFactory.createPolygon(shellRing, holes); + } + + MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(polygons); + features.add(createFeature(simpleFeatureBuilder, multiPolygon, tableData, primaryKey, fieldNameOrderList, idToRealName)); + } + + else if ("LineString".equalsIgnoreCase(geometryType) && "LineString".equalsIgnoreCase(geomType)) { + LineString lineString = geometryFactory.createLineString(genCoordinateArrByLineString((List>) jsonObject.get("coordinates"))); + features.add(createFeature(simpleFeatureBuilder, lineString, tableData, primaryKey, fieldNameOrderList, idToRealName)); + } + else if ("Point".equalsIgnoreCase(geometryType) && "Point".equalsIgnoreCase(geomType)) { + Point point = geometryFactory.createPoint(genCoordinateArrByPoint((List) jsonObject.get("coordinates"))); + features.add(createFeature(simpleFeatureBuilder, point, tableData, primaryKey, fieldNameOrderList, idToRealName)); + } + } + + // 编码设置 + if (isHighVersion) { + newDataStore.setCharset(StandardCharsets.UTF_8); + } else { + newDataStore.setCharset(Charset.forName("GBK")); + } + newDataStore.createSchema(type); + Transaction transaction = new DefaultTransaction("create"); + String typeName = newDataStore.getTypeNames()[0]; + SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName); + if (featureSource instanceof SimpleFeatureStore) { + SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; + SimpleFeatureCollection collection = new ListFeatureCollection(type, features); + featureStore.setTransaction(transaction); + try { + featureStore.addFeatures(collection); + transaction.commit(); + } catch (Exception problem) { + problem.printStackTrace(); + transaction.rollback(); + } finally { + transaction.close(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + newDataStore.dispose(); + } + } + +// private SimpleFeature createFeature(SimpleFeatureBuilder builder, +// Object geometry, +// Map tableData, +// String primaryKey, +// List fieldNameOrderList, +// Map idToRealName) { +// // 添加几何要素 +// builder.add(geometry); +// // 添加属性字段 +// builder.add(tableData.get(primaryKey)); +// fieldNameOrderList.forEach(fieldName -> { +// if(CommonConstant.FIX_FIELD_STATUS.equals(fieldName)){ +// Object statusValue = tableData.get(fieldName); +// int status = 0; // 默认值 +// if (statusValue != null && !"null".equalsIgnoreCase(String.valueOf(statusValue))) { +// try { +// status = Integer.parseInt(String.valueOf(statusValue)); +// } catch (NumberFormatException e) { +// logger.warn("Invalid status value: {}", statusValue); +// } +// } +// builder.add(OtherUtil.getStatusMeaning(status)); +// } else if (CommonConstant.FIX_FIELD_COLLECTOR.equals(fieldName) || CommonConstant.FIX_FIELD_REVIEWER.equals(fieldName)) { +// int userId = (int) tableData.getOrDefault(fieldName, -1); +// builder.add(idToRealName.computeIfAbsent(userId, userService::findRealNameById)); +// } else { +// builder.add(tableData.getOrDefault(fieldName, "")); +// } +// }); +// return builder.buildFeature(null); +// } +private SimpleFeature createFeature(SimpleFeatureBuilder builder, + Object geometry, + Map tableData, + String primaryKey, + List fieldNameOrderList, + Map idToRealName) { + // 添加几何要素 + builder.add(geometry); + + // 添加主键(默认是 Integer) + Object pkVal = tableData.get(primaryKey); + builder.add((pkVal instanceof Number) ? pkVal : null); // 避免写入 "" 导致类型不匹配 + + // 添加字段属性 + for (String fieldName : fieldNameOrderList) { + Object value = tableData.get(fieldName); + // 特殊字段:状态值翻译 + if (CommonConstant.FIX_FIELD_STATUS.equals(fieldName)) { + int status = 0; + if (value != null && !"null".equalsIgnoreCase(String.valueOf(value))) { + try { + status = Integer.parseInt(String.valueOf(value)); + } catch (NumberFormatException e) { + logger.warn("Invalid status value: {}", value); + } + } + builder.add(OtherUtil.getStatusMeaning(status)); + } + + // 特殊字段:采集人/审核人ID转真实姓名 + else if (CommonConstant.FIX_FIELD_COLLECTOR.equals(fieldName) || CommonConstant.FIX_FIELD_REVIEWER.equals(fieldName)) { + int userId = -1; + + if (value instanceof Integer) { + userId = (int) value; + } else if (value != null) { + try { + userId = Integer.parseInt(String.valueOf(value)); + } catch (NumberFormatException e) { + logger.warn("Invalid user ID value: {}", value); + } + } + builder.add(idToRealName.computeIfAbsent(userId, userService::findRealNameById)); + } + + // 普通字段:保持类型一致 + else { + if (value == null || "null".equalsIgnoreCase(String.valueOf(value))) { + builder.add(null); // null 是 GeoTools 允许的缺失值 + } else if (value instanceof Integer || value instanceof Long || + value instanceof Double || value instanceof Float || + value instanceof Boolean || value instanceof Date) { + builder.add(value); // 保留原始类型 + } else { + builder.add(value.toString()); // 其他转为 String(如 BigDecimal、Map 等) + } + } + } + + return builder.buildFeature(null); +} + + + /** + * 根据 Table 的字段的 index 大小,生成字段名的 List, + * 注意该 List 中排除了主键和空间字段(如果存在) + */ + private List genFieldNameOrderStringArr(Table table, String cameraFieldName){ + Map fields = table.getFields(); + List result = new ArrayList<>(); + fields.forEach((fieldKey, field) -> { + if(!field.isIdentity() && !field.isGeometry() && !CommonConstant.FIX_FIELD_SET.contains(fieldKey) + && StringUtils.isBlank(field.getAssociate()) && StringUtils.isBlank(field.getCollection()) + && (!fieldKey.equals(cameraFieldName))){ + result.add(fieldKey); + } + }); + result.sort(Comparator.comparingInt(o -> fields.get(o).getIndex())); + // 需要把 "审核状态" 和 "未通过原因" 添加进去 + result.add(CommonConstant.FIX_FIELD_STATUS); + result.add(CommonConstant.FIX_FIELD_REASON); + result.add(CommonConstant.FIX_FIELD_CREATE_TIME); + result.add(CommonConstant.FIX_FIELD_UPDATE_TIME); + result.add(CommonConstant.FIX_FIELD_COLLECTOR); + result.add(CommonConstant.FIX_FIELD_REVIEWER); + return result; + } + + /** + * 根据根表创建 DataUtilities.createType() 的 typeSpec 参数 + * 原始代码:把除了主键以外的所有字段都强行定义为了:String,2025.7.9修改,根据字段值类型动态定义字段类型 + */ +// private String genTypeSpec(Table table, String geometryType){ +// List fieldNameOrderList = genFieldNameOrderStringArr(table, TableOperationUtil.getCameraFieldName(table)); +// String primaryKey = TableOperationUtil.getPrimaryKey(table); +// StringBuilder result = new StringBuilder("the_geom:").append(geometryType) +// .append(":srid=4490,").append(primaryKey).append(":Integer,"); +// // 注意 ShapeFile 规定字段名不能超过10characters +// fieldNameOrderList.forEach(fieldName -> result.append(fieldName.length() > 10 ? fieldName.substring(0, 10) : fieldName).append(":String,")); +// return result.substring(0, result.length() - 1); +// } + /** + * 根据根表数据动态创建 Shapefile 的字段类型定义(typeSpec) + */ +// private String genTypeSpec(Table table, String geometryType, List> tableDataList) { +// List fieldNameOrderList = genFieldNameOrderStringArr(table, TableOperationUtil.getCameraFieldName(table)); +// String primaryKey = TableOperationUtil.getPrimaryKey(table); +// +// // 提取第一条非空数据用于字段类型推断(可以换成更鲁棒的推断方法) +// Map firstData = null; +// for (Map row : tableDataList) { +// if (row != null && !row.isEmpty()) { +// firstData = row; +// break; +// } +// } +// +// if (firstData == null) { +// throw new IllegalArgumentException("数据为空,无法推断字段类型"); +// } +// +// StringBuilder result = new StringBuilder("the_geom:") +// .append(geometryType) +// .append(":srid=4490,") +// .append(primaryKey) +// .append(":Integer,"); +// +// for (String fieldName : fieldNameOrderList) { +// String truncatedField = fieldName.length() > 10 ? fieldName.substring(0, 10) : fieldName; +// Object value = firstData.get(fieldName); +// +// String type; +// if (value instanceof Integer || value instanceof Long) { +// type = "Integer"; +// } else if (value instanceof Double || value instanceof Float || value instanceof BigDecimal) { +// type = "Double"; +// } else if (value instanceof Boolean) { +// type = "Boolean"; +// } else if (value instanceof Date) { +// type = "Date"; +// } else { +// type = "String"; +// } +// +// result.append(truncatedField).append(":").append(type).append(","); +// } +// +// return result.substring(0, result.length() - 1); +// } + private String genTypeSpec(Table table, String geometryType, List> tableDataList) { + List fieldNameOrderList = genFieldNameOrderStringArr(table, TableOperationUtil.getCameraFieldName(table)); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + + // 提取第一条非空数据用于字段类型推断 + Map firstData = null; + for (Map row : tableDataList) { + if (row != null && !row.isEmpty()) { + firstData = row; + break; + } + } + + if (firstData == null) { + throw new IllegalArgumentException("数据为空,无法推断字段类型"); + } + + StringBuilder result = new StringBuilder("the_geom:") + .append(geometryType) + .append(":srid=4490,") + .append(primaryKey) + .append(":Integer,"); + + for (String fieldName : fieldNameOrderList) { + String truncatedField = fieldName.length() > 10 ? fieldName.substring(0, 10) : fieldName; + + // 👇 强制定义为 String 的字段(避免类型不匹配) + if (CommonConstant.FIX_FIELD_COLLECTOR.equals(fieldName) + || CommonConstant.FIX_FIELD_REVIEWER.equals(fieldName) + || CommonConstant.FIX_FIELD_STATUS.equals(fieldName)) { + result.append(truncatedField).append(":String,"); + continue; + } + + Object value = firstData.get(fieldName); + String type; + + if (value instanceof Integer || value instanceof Long) { + type = "Integer"; + } else if (value instanceof Double || value instanceof Float || value instanceof BigDecimal) { + type = "Double"; + } else if (value instanceof Boolean) { + type = "Boolean"; + } else if (value instanceof Date) { + type = "Date"; + } else { + type = "String"; + } + + result.append(truncatedField).append(":").append(type).append(","); + } + + // 去掉最后一个逗号 + return result.substring(0, result.length() - 1); + } + + + /** + * 根据 shape 的 coordinate 属性构建 Coordinate,针对于 type 为 Point + */ + private Coordinate genCoordinateArrByPoint(List coord){ + double x = Double.parseDouble(String.valueOf(coord.get(0))); + double y = Double.parseDouble(String.valueOf(coord.get(1))); + return new Coordinate(x, y); + } + + + /** + * 根据 shape 的 coordinate 属性构建Coordinate[],针对于 type 为 LineString + */ + private Coordinate[] genCoordinateArrByLineString(List> coord){ + List coordinates = new ArrayList<>(); + Coordinate[] coordinateArr = new Coordinate[]{}; + if(CollectionUtils.isNotEmpty(coord)){ + for(List list : coord){ + coordinates.add(genCoordinateArrByPoint(list)); + } + } + return coordinates.toArray(coordinateArr); + } + + /** + * 根据 shape 的 coordinate 属性构建 Coordinate[],针对于 type 为 Polygon + */ + private Coordinate[] genCoordinateArrByPolygon(List>> coord){ + List coordinates = new ArrayList<>(); + Coordinate[] coordinateArr = new Coordinate[]{}; + if(CollectionUtils.isNotEmpty(coord)){ + List> tempList = coord.get(0); + for(List list : tempList){ + coordinates.add(genCoordinateArrByPoint(list)); + } + } + return coordinates.toArray(coordinateArr); + } + /** + * 处理一个 ring(外环或内环):List> → Coordinate[] + */ + private Coordinate[] genCoordinateArrByLinearRing(List> ringCoords) { + List coordinates = new ArrayList<>(); + for (List point : ringCoords) { + coordinates.add(genCoordinateArrByPoint(point)); + } + return coordinates.toArray(new Coordinate[0]); + } + + + + /** + * 将多媒体表导出为 CSV (该接口为导出工具专用) + */ + @RequestMapping("mediaTable") + public String exportMediaTable(int taskId, String tableName, HttpServletResponse response) { + Optional optional = exportService.exportMediaTable(taskId, tableName); + return optional.isPresent() ? transferFile(response, optional.get()) : new ResultMessage<>(false, "无法导出多媒体表").toString() ; + } + + /** + * 将采集人员和巡查人员信息导出为 CSV (该接口为导出工具专用) + */ + @RequestMapping("users") + public String exportUsers(int taskId, HttpServletResponse response) { + Optional optional = exportService.exportUsers(taskId); + return optional.isPresent() ? transferFile(response, optional.get()) : new ResultMessage<>(false, "无法导出用户表").toString(); + } + + private String transferFile(HttpServletResponse response, File file) { + response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString()); + response.setHeader("Content-Disposition", "attachment;filename=" + file.getName()); + try (OutputStream out = response.getOutputStream()) { + Files.copy(file.toPath(), out); + return new ResultMessage<>(true, "").toString(); + } catch (IOException e) { + logger.error(e.getMessage()); + return new ResultMessage<>(false, "").toString(); + } finally { + if (!file.delete()) { + logger.warn("无法删除文件 " + file.getAbsolutePath()); + } + } + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/controller/GetController.java b/src/main/java/cn/edu/whu/boot/collection/controller/GetController.java new file mode 100644 index 0000000..dd6e1cc --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/controller/GetController.java @@ -0,0 +1,1983 @@ +package cn.edu.whu.boot.collection.controller; + +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import cn.edu.whu.boot.collection.domain.MultimediaItem; +import cn.edu.whu.boot.collection.domain.TaskSelectId; +import cn.edu.whu.boot.collection.dto.Feature; +import cn.edu.whu.boot.collection.dto.GeometryType; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.collection.service.IMultimediaService; +import cn.edu.whu.boot.collection.service.ISearchPageService; +import cn.edu.whu.boot.collection.service.ITaskSelectIdService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.domain.SqlStringConstant; +import cn.edu.whu.boot.common.utils.collection.*; +import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil; +import cn.edu.whu.boot.common.utils.xml.GenerateSqlUtil; +import cn.edu.whu.boot.user.entities.Role; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.RoleService; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.service.IXmlEnityService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.*; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 这个类也比较混乱,按道理这个类是想放一些获取相关的接口,奈何后面获取内容太多,导致方法太多。 + * 具体接口的含义参考注释 + */ +@RestController +@RequestMapping("get") +public class GetController { + + private static final Logger log = LoggerFactory.getLogger(GetController.class); + private final ITaskService taskService; + private final IBaseService baseService; + private final IMultimediaService multimediaService; + private final UserService userService; + private final IXmlEnityService xmlEnityService; + private final ISearchPageService searchPageService; + private final ITaskSelectIdService taskSelectIdService; + private final TaskUserRoleService taskUserRoleService; + /** + * 多媒体存放路径 + */ + @Value("${MediaPath}") + private String mediaPath; + + /** + * 历史多媒体存放路径 + */ + @Value("${HistoryMediaPath}") + private String historyMediaPath; + + @Autowired + public GetController(ITaskService taskService, IBaseService baseService, IMultimediaService multimediaService, + UserService userService, IXmlEnityService xmlEnityService, ISearchPageService searchPageService, + ITaskSelectIdService taskSelectIdService, TaskUserRoleService taskUserRoleService, RoleService roleservice){ + this.taskService = taskService; + this.baseService = baseService; + this.multimediaService = multimediaService; + this.userService = userService; + this.xmlEnityService = xmlEnityService; + this.searchPageService = searchPageService; + this.taskSelectIdService = taskSelectIdService; + this.taskUserRoleService = taskUserRoleService; + } + + /** + * 获取图片,图片直接在浏览器端显示,而不是显示下载框 + * 采用 @PathVariable 注解将参数设置在 URL 中 + * @param taskId 任务id + * @param userId 用户id + * @param pictureName 图片名 + * + */ + @RequestMapping(value = "getPicture/{taskId}/{userId}/{pictureName}", produces = "text/html;charset=UTF-8") + public String getPicture(@PathVariable("taskId") Integer taskId, @PathVariable("userId") Integer userId, + @PathVariable("pictureName") String pictureName, HttpServletResponse response){ + String format = pictureName.substring(pictureName.lastIndexOf(".") + 1, pictureName.length()); + response.setContentType("image/" + format); + String fileName = MessageFormat.format(CommonConstant.MEDIA_FILE_PATHNAME, taskId, userId, pictureName); + File file = new File(fileName); + if(!file.exists()){ + fileName = MessageFormat.format(CommonConstant.HISTORY_MEDIA_FILE_PATHNAME, taskId, userId, pictureName); + file = new File(fileName); + if (!file.exists()){ + return ResultMessage.failed( "图片不存在").toString(); + } + } + String result = OtherUtil.uploadFileByResponse(file, response); + if(result.equals(CommonConstant.SUCCEED)){ + return ResultMessage.success(CommonConstant.SUCCEED).toString(); + } + else{ + return ResultMessage.failed(CommonConstant.FAILED).toString(); + } + } +// @RequestMapping(value = "getPicture/{taskId}/{userId}/{pictureName}", produces = "text/html;charset=UTF-8") +// public String getPicture(@PathVariable("taskId") Integer taskId, +// @PathVariable("userId") String userId, +// @PathVariable("pictureName") String pictureName, +// HttpServletResponse response) { +// String format = pictureName.substring(pictureName.lastIndexOf(".") + 1); +// response.setContentType("image/" + format); +// File file; +// +// if ("unknown".equals(userId)) { +// // 在 mediafile/task_{taskId}/user_* 中遍历查找图片 +// String taskFolderPath = MessageFormat.format(CommonConstant.MEDIA_TASK_FOLDER_PATH , taskId); // eg: "mediafile/task_{0}" +// File taskFolder = new File(taskFolderPath); +// file = null; +// if (taskFolder.exists() && taskFolder.isDirectory()) { +// File[] userFolders = taskFolder.listFiles(File::isDirectory); +// if (userFolders != null) { +// for (File userFolder : userFolders) { +// File potentialFile = new File(userFolder, pictureName); +// if (potentialFile.exists()) { +// file = potentialFile; +// break; +// } +// } +// } +// } +// } else { +// // 构造标准路径 +// String filePath = MessageFormat.format(CommonConstant.MEDIA_FILE_PATHNAME, taskId, userId, pictureName); +// file = new File(filePath); +// +// // 查找历史路径 +// if (!file.exists()) { +// filePath = MessageFormat.format(CommonConstant.HISTORY_MEDIA_FILE_PATHNAME, taskId, userId, pictureName); +// file = new File(filePath); +// } +// } +// +// if (file == null || !file.exists()) { +// return ResultMessage.failed("图片不存在").toString(); +// } +// +// String result = OtherUtil.uploadFileByResponse(file, response); +// if (CommonConstant.SUCCEED.equals(result)) { +// return ResultMessage.success(CommonConstant.SUCCEED).toString(); +// } else { +// return ResultMessage.failed(CommonConstant.FAILED).toString(); +// } +// } + + /** + * 获取视频,固定视频格式 .avi,该获取是浏览器获取视频二进制流,且直接播放而不是提示下载 + * 如若下载添加 response.addHeader("Content-Disposition", "attachment;fileName=自设置文件名"); + * @param taskId 任务id + * @param userId 用户id + * @param videoName 视频名 + */ + @RequestMapping(value = "getVideo/{taskId}/{userId}/{videoName}", produces = "text/html;charset=UTF-8") + public String getVideo(@PathVariable("taskId") Integer taskId, @PathVariable("userId") Integer userId, + @PathVariable("videoName") String videoName, HttpServletResponse response){ + response.setContentType("video/mp4"); + String fileName = MessageFormat.format(CommonConstant.MEDIA_FILE_PATHNAME, taskId, userId, videoName); + File file = new File(fileName); + if(!file.exists()){ + fileName = MessageFormat.format(CommonConstant.HISTORY_MEDIA_FILE_PATHNAME, taskId, userId, videoName); + file = new File(fileName); + if (!file.exists()){ + return ResultMessage.failed("视频文件不存在").toString(); + } + } + String result = OtherUtil.uploadFileByResponse(file, response); + if(result.equals(CommonConstant.SUCCEED)){ + return ResultMessage.success(CommonConstant.SUCCEED).toString(); + } + else{ + return ResultMessage.failed(CommonConstant.FAILED).toString(); + } + } + + /** + * 根据根表中的主键字段查询多媒体文件,并通过 HttpServletResponse 提供下载 + * @param taskId 任务id + * @param tableName 表名 + * @param polygonId 数据主键id + */ + @RequestMapping(value="getMediaFile",produces="text/html;charset=UTF-8") + public String selectMediaFileById(Integer taskId, String tableName, Long polygonId, HttpServletResponse response){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); +// String mediaTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, true, false); +// List multimediaItemList = multimediaService.selectMultiMedia(mediaTableName, polygonId); +// String selectByPolygonIdSql = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), tableName, +// TableOperationUtil.getPrimaryKey(table), +// polygonId); +// List> rootTableDataList = baseService.selectData(selectByPolygonIdSql); +// if (rootTableDataList == null || rootTableDataList.isEmpty()){ +// return ResultMessage.failed( "无该主键对应记录").toString(); +// } +// Map rootTableData = rootTableDataList.get(0); +// // 检查下表中是否有表字段的 type 是 photo,若有,将该字段值对应的路径存放在 mediaFileNameList 中 +// List mediaFileNameList = new ArrayList<>(); +// for (Map.Entry fieldEntry : table.getFields().entrySet()){ +// if (fieldEntry.getValue().getType() != null && fieldEntry.getValue().getType().equals(CommonConstant.PHOTO) +// && rootTableData.get(fieldEntry.getKey()) != null && !rootTableData.get(fieldEntry.getKey()).toString().equals("")){ +// mediaFileNameList.add(rootTableDataList.get(0).get(fieldEntry.getKey()).toString()); +// } +// } +// +// +// if (multimediaItemList != null && !multimediaItemList.isEmpty()){ +// for(MultimediaItem multimediaItem:multimediaItemList){ +// mediaFileNameList.add(multimediaItem.getMediaPath()); +// } +// } + // 20250724 下载无法获取子表中的照片--------------------------------- + List mediaFileNameList = new ArrayList<>(); + String selectByPolygonIdSql = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), tableName, + TableOperationUtil.getPrimaryKey(table), + polygonId); + findMediaFiles(task, table, selectByPolygonIdSql, mediaFileNameList); + // -------------------------------------------------------------- + if (mediaFileNameList.isEmpty()){ + return ResultMessage.failed("无多媒体文件").toString(); + } + String tempMediaZipFilePath = StoreMediaFileUtil.zip(mediaPath, mediaFileNameList, null); + + // 利用response上传压缩包 + File tempMediaFile = new File(tempMediaZipFilePath); + response.setContentType("application/x-zip-compressed"); + response.addHeader("Content-Disposition", "attachment;fileName=photos.zip"); + response.addHeader("Content-Length", String.valueOf(tempMediaFile.length())); + String result = OtherUtil.uploadFileByResponse(tempMediaFile, response); + if(result.equals(CommonConstant.FAILED)){ + return ResultMessage.failed(CommonConstant.FAILED).toString(); + } + + // 上传压缩包之后删除产生的中间文件压缩包 + tempMediaFile.delete(); + return ResultMessage.success(null).toString(); + } + private void findMediaFiles(Task task, Table table, String sql, List mediaFileNameList){ + + List> rootTableDataList = baseService.selectData(sql); + if (rootTableDataList == null || rootTableDataList.isEmpty()){ + return; + } + for (Map rootTableData: rootTableDataList){ + Long polygonId = Long.parseLong(rootTableData.get(TableOperationUtil.getPrimaryKey(table)).toString()); + + String mediaTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, false); + List tmp = multimediaService.selectMultiMedia(mediaTableName, polygonId); + if(tmp!=null) { + for(MultimediaItem multimediaItem:tmp){ + mediaFileNameList.add(multimediaItem.getMediaPath()); + } + } + + // 检查下表中是否有表字段的 type 是 photo,若有,将该字段值对应的路径存放在 mediaFileNameList 中 + for (Map.Entry fieldEntry : table.getFields().entrySet()){ + if (fieldEntry.getValue().getType() != null && fieldEntry.getValue().getType().equals(CommonConstant.PHOTO) + && rootTableData.get(fieldEntry.getKey()) != null && !rootTableData.get(fieldEntry.getKey()).toString().isEmpty()){ + // 这里得拼接用户名和任务id + mediaFileNameList.add(rootTableData.get(fieldEntry.getKey()).toString()); + } + else if (fieldEntry.getValue().getAssociate()!=null && !fieldEntry.getValue().getAssociate().isEmpty()){ + Table table1 = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(fieldEntry.getValue().getAssociate()); + String sql1 = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), fieldEntry.getValue().getAssociate(), TableOperationUtil.getParentID(table1), polygonId); + findMediaFiles(task, table1, sql1, mediaFileNameList); + }else if (fieldEntry.getValue().getCollection()!=null && !fieldEntry.getValue().getCollection().isEmpty()){ + Table table2 = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(fieldEntry.getValue().getCollection()); + String sql2 = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), fieldEntry.getValue().getCollection(), TableOperationUtil.getParentID(table2), polygonId); + findMediaFiles(task, table2, sql2, mediaFileNameList); + } + } + } + + } + + /** + * 获取某任务的根表下主键为 polygonId 的数据的属性信息返回给网页端或移动端, + * 其中属性信息的多媒体文件以文件名形式传递 + * @param taskId 任务id + * @param tableName 表名 + * @param polygonId 数据主键id + * @param requestor 标记是移动端访问还是网页端访问,返回的结果不一样 + */ + @RequestMapping(value = "getDataById", produces = "text/html;charset=UTF-8") + public String getDataById(Integer taskId, String tableName, Long polygonId, String requestor) throws Exception{ + Task task = taskService.getTaskById(taskId); + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tablesMap = config.getTables(); + Table table = tablesMap.get(tableName); + //判断是否是根表 + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String selectByPolygonIdSql = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), table.getKey(), + primaryKey, polygonId); + List> rootTableDataList = baseService.selectData(selectByPolygonIdSql); + // 根据 requestor 将查询到的根表数据整理成不同类型返回 + switch (requestor.toLowerCase()){ + case CommonConstant.BROWSER: + ResultMessage resultMessage = OtherUtil.checkDataListGetByPolygonId(rootTableDataList); + if (!resultMessage.isSuccess()){ + return resultMessage.toString(); + } + Map result = genResultMapByRootTableData(table , rootTableDataList.get(0) , task, false); + return ResultMessage.success(result).toString(); + case CommonConstant.ANDROID: + Table resultTable = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(table , SerializerFeature.DisableCircularReferenceDetect)) , Table.class); + Integer version = baseService.getVersionByLongId(PostgreSqlUtil.buildTableNameString(task.getDatabaseName() , tableName , false , false) , + PostgreSqlUtil.transformString(primaryKey) , polygonId); + if (version == null){ + return ResultMessage.failed("数据库中无该id数据").toString(); + } + resultTable = changeDataToTable(resultTable , task , rootTableDataList.get(0) , polygonId , version , version); + // 20250724------------------------------------------ + baseService.decapPhotoInTable(resultTable.getFields()); + // -------------------------------------------------- + return ResultMessage.success(resultTable).toString(); + default: + return ResultMessage.failed("传入参数出错").toString(); + } + } + + /** + * 获取某任务下某个根表中某数据的所有历史版本, + * 不包括主表中版本,因为该版本已经显示在地图上 + * @param taskId 任务id + * @param tableName 表名 + * @param polygonId 数据主键id + */ + @RequestMapping(value="getDataVersion",produces="text/html;charset=UTF-8") + public String getDataVersionByPolygonId(Integer taskId, String tableName, Long polygonId){ + Task task = taskService.getTaskById(taskId); + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Table table = config.getTables().get(tableName); + String selectVersionSql = MessageFormat.format("select version from {0} where {1}={2}", + PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), false, true), + PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)), + polygonId); + List> dataList = baseService.selectData(selectVersionSql); + if (dataList == null || dataList.size() == 0){ + return ResultMessage.failed("无历史版本数据").toString(); + } + List resultList = new ArrayList<>(); + for(Map data : dataList){ + resultList.add(Integer.valueOf(data.get(CommonConstant.FIX_FIELD_VERSION).toString())); + } + return ResultMessage.success(resultList).toString(); + } + + /** + * 获取某任务的根表下 polygonId 和 version 对应的数据 + * @param taskId 任务id + * @param tableName 表名 + * @param polygonId 数据主键id + * @param version 版本号 + */ + @RequestMapping(value = "getDataByIdAndVersion", produces = "text/html;charset=UTF-8") + public String getDataByIdAndVersion(Integer taskId, String tableName, Long polygonId, Integer version) throws Exception{ + Task task = taskService.getTaskById(taskId); + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tablesMap = config.getTables(); + Table table = tablesMap.get(tableName); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String selectByPolygonIdSql = GenerateSqlUtil.genSqlByPolygonIdAndVersionId(task.getDatabaseName(), tableName + CommonConstant.HISTORY_SUFFIX, + primaryKey, polygonId, version); + + List> rootTableDataList = baseService.selectData(selectByPolygonIdSql); + ResultMessage resultMessage = OtherUtil.checkDataListGetByPolygonId(rootTableDataList); + if(!resultMessage.isSuccess()){ + return resultMessage.toString(); + } + Map result = genResultMapByRootTableData(table, rootTableDataList.get(0), task, true); + return ResultMessage.success(result).toString(); + } + /** + * 原始移动端下载数据 + * @param taskId 任务id + * @param tableName 表名 + * @param userId 用户id + */ + @RequestMapping(value = "getDataByUserId", produces = "text/html;charset=UTF-8") + public String getDataByUserId(Integer taskId, String tableName, Integer userId){ + Task task = taskService.getTaskById(taskId); + if(task == null){ + return ResultMessage.failed("当前任务已删除!").toString(); + } + // 判断该用户是否在对应的任务中 + if(!OtherUtil.isUserInTask(task, userId, taskUserRoleService)){ + return ResultMessage.failed("您不在该任务中!").toString(); + } + String selectByUserIdSql; + String dbTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + // 调用接口判断该任务下的该 userId 的身份权限,采集员还是审核员 + Integer userWorkRoleNumber = baseService.getUserWorkRole(taskId, userId) ; + //查询当前用户角色 + User user = userService.findById(userId).get(); + Integer userrolecode = user.getRole(); +// System.out.println(userrolecode); + + if (userWorkRoleNumber == null) { + //任务不分配的情况 + if (userrolecode<= 3) { + // 管理员查询所有记录 + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} ORDER BY {1} DESC", + dbTableName, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } else { + // 其他角色,按用户过滤 + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} where {1}={3} OR {2}={3} OR {2}=-1 ORDER BY {4} DESC", + dbTableName, + CommonConstant.FIX_FIELD_COLLECTOR, + CommonConstant.FIX_FIELD_REVIEWER, + userId, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } + } + else if (userWorkRoleNumber == 0){ + selectByUserIdSql = MessageFormat.format("select * FROM {0} where {1}={2} ORDER BY {3} DESC", dbTableName, + CommonConstant.FIX_FIELD_COLLECTOR, userId, + CommonConstant.FIX_FIELD_CREATE_TIME); + } + else if(userWorkRoleNumber == 1){ + if (task.getIsReviewerRestricted() == 1) { + // 及时审核:获取自己审核的、还没有分配的和自己采集的数据 +// selectByUserIdSql = MessageFormat.format("select * FROM {0} where status != 2 and ({1} = {2} or {1} = -1 or {3} = {2}) ORDER BY {4} DESC", +// dbTableName, +// CommonConstant.FIX_FIELD_REVIEWER, userId, +// CommonConstant.FIX_FIELD_COLLECTOR, +// CommonConstant.FIX_FIELD_CREATE_TIME); + selectByUserIdSql = MessageFormat.format("select * FROM {0} where ({1} = {2} or {1} = -1 or {3} = {2}) ORDER BY {4} DESC", + dbTableName, + CommonConstant.FIX_FIELD_REVIEWER, userId, + CommonConstant.FIX_FIELD_COLLECTOR, + CommonConstant.FIX_FIELD_CREATE_TIME); + } else { + // 非及时审核:获取自己审核的或自己采集的数据 + selectByUserIdSql = MessageFormat.format("select * FROM {0} where ({1} = {2} or {3} = {2}) ORDER BY {4} DESC", + dbTableName, + CommonConstant.FIX_FIELD_REVIEWER, userId, + CommonConstant.FIX_FIELD_COLLECTOR, + CommonConstant.FIX_FIELD_CREATE_TIME); + } + } + else{ + return ResultMessage.failed("身份权限出错").toString(); + } + + // 获取根表数据中 reviewer 字段值为 userId 的所有记录 + List> rootTableDataList = baseService.selectData(selectByUserIdSql); + if(rootTableDataList == null || rootTableDataList.size() == 0){ + return ResultMessage.failed("获取记录为空").toString(); + } + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tablesMap = config.getTables(); + Table table = tablesMap.get(tableName); + // 封装记录成 Table 类, 并添加在 List中返回给安卓端 + List tablesResultList = new ArrayList<>(); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + for(Map rootTableData : rootTableDataList){ + Long polygonId = Long.valueOf(rootTableData.get(TableOperationUtil.getPrimaryKey(table)).toString()); +// Table resultTable = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(table, SerializerFeature.DisableCircularReferenceDetect)), +// Table.class); + Table resultTable = JSON.parseObject(JSON.toJSONString(table, SerializerFeature.DisableCircularReferenceDetect), Table.class); +// resultTable = cleanTableForAndroid(resultTable); + + Integer versionCode = baseService.getVersionByLongId(dbTableName, PostgreSqlUtil.transformString(primaryKey), polygonId); + if (versionCode == null){ + return ResultMessage.failed("数据库中无该id数据").toString(); + } + resultTable = changeDataToTable(resultTable, task, rootTableData, polygonId,versionCode,versionCode); + // 20250724------------------------------------------ + baseService.decapPhotoInTable(resultTable.getFields()); + // -------------------------------------------------- + tablesResultList.add(resultTable); + } + return ResultMessage.success(tablesResultList).toStringByDisableCircularReference(); + } + /** + * 移动端下载数据 + * @param taskId 任务id + * @param tableName 表名 + * @param userId 用户id + * @param idList ID列表,用于筛选特定数据 + */ + @RequestMapping(value = "getDatatoAndroid", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") + @ResponseBody + public String getDatatoAndroid(@RequestParam Integer taskId, + @RequestParam String tableName, + @RequestParam Integer userId, + @RequestParam(required = false) String idList) { + Task task = taskService.getTaskById(taskId); + if (task == null) { + return ResultMessage.failed("当前任务已删除!").toString(); + } + + if (!OtherUtil.isUserInTask(task, userId, taskUserRoleService)) { + return ResultMessage.failed("您不在该任务中!").toString(); + } + + // 构造SQL + String selectByUserIdSql; + String dbTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + Integer userWorkRoleNumber = baseService.getUserWorkRole(taskId, userId); + User user = userService.findById(userId).get(); + Integer userrolecode = user.getRole(); + + if (userWorkRoleNumber == null) { + if (userrolecode <= 3) { + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} ORDER BY {1} DESC", + dbTableName, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } else { + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} where {1}={3} OR {2}={3} OR {2}=-1 ORDER BY {4} DESC", + dbTableName, + CommonConstant.FIX_FIELD_COLLECTOR, + CommonConstant.FIX_FIELD_REVIEWER, + userId, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } + } else if (userWorkRoleNumber == 0) { + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} where {1}={2} ORDER BY {3} DESC", + dbTableName, + CommonConstant.FIX_FIELD_COLLECTOR, userId, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } else if (userWorkRoleNumber == 1) { + if (task.getIsReviewerRestricted() == 1) { + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} where ({1} = {2} or {1} = -1 or {3} = {2}) ORDER BY {4} DESC", + dbTableName, + CommonConstant.FIX_FIELD_REVIEWER, userId, + CommonConstant.FIX_FIELD_COLLECTOR, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } else { + selectByUserIdSql = MessageFormat.format( + "select * FROM {0} where ({1} = {2} or {3} = {2}) ORDER BY {4} DESC", + dbTableName, + CommonConstant.FIX_FIELD_REVIEWER, userId, + CommonConstant.FIX_FIELD_COLLECTOR, + CommonConstant.FIX_FIELD_CREATE_TIME + ); + } + } else { + return ResultMessage.failed("身份权限出错").toString(); + } + + // 处理 idList 字符串 + if (idList != null && !idList.trim().isEmpty()) { + String[] ids = idList.split(","); + List idListParsed = Arrays.stream(ids) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .map(Long::valueOf) + .collect(Collectors.toList()); + + if (!idListParsed.isEmpty()) { + String primaryKey = TableOperationUtil.getPrimaryKey( + JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName) + ); + + StringBuilder inCondition = new StringBuilder(); + inCondition.append(" AND ").append(PostgreSqlUtil.transformString(primaryKey)).append(" IN ("); + for (int i = 0; i < idListParsed.size(); i++) { + inCondition.append(idListParsed.get(i)); + if (i < idListParsed.size() - 1) { + inCondition.append(","); + } + } + inCondition.append(")"); + + int whereIndex = selectByUserIdSql.toUpperCase().indexOf(" WHERE "); + int orderByIndex = selectByUserIdSql.lastIndexOf(" ORDER BY"); + + if (orderByIndex != -1) { + if (whereIndex != -1) { + selectByUserIdSql = selectByUserIdSql.substring(0, orderByIndex) + + inCondition.toString() + + selectByUserIdSql.substring(orderByIndex); + } else { + String inConditionWithWhere = inCondition.toString().replaceFirst(" AND ", " WHERE "); + selectByUserIdSql = selectByUserIdSql.substring(0, orderByIndex) + + inConditionWithWhere + + selectByUserIdSql.substring(orderByIndex); + } + } else { + if (whereIndex != -1) { + selectByUserIdSql += inCondition.toString(); + } else { + String inConditionWithWhere = inCondition.toString().replaceFirst(" AND ", " WHERE "); + selectByUserIdSql += inConditionWithWhere; + } + } + } + } + + List> rootTableDataList = baseService.selectData(selectByUserIdSql); + if (rootTableDataList == null || rootTableDataList.isEmpty()) { + return ResultMessage.failed("获取记录为空").toString(); + } + + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Table table = config.getTables().get(tableName); + List
tablesResultList = new ArrayList<>(); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + + for (Map rootTableData : rootTableDataList) { + Long polygonId = Long.valueOf(rootTableData.get(primaryKey).toString()); + Table resultTable = JSON.parseObject(JSON.toJSONString(table, SerializerFeature.DisableCircularReferenceDetect), Table.class); + Integer versionCode = baseService.getVersionByLongId(dbTableName, PostgreSqlUtil.transformString(primaryKey), polygonId); + + if (versionCode == null) { + return ResultMessage.failed("数据库中无该id数据").toString(); + } + + resultTable = changeDataToTable(resultTable, task, rootTableData, polygonId, versionCode, versionCode); + baseService.decapPhotoInTable(resultTable.getFields()); + tablesResultList.add(resultTable); + } + + return ResultMessage.success(tablesResultList).toStringByDisableCircularReference(); + } + + + + + + /** + * 清理 Table和其具体字段中 Android 不需要的字段 + */ + private void cleanTableForAndroid(Map fieldMap) { + if (fieldMap != null) { + for (Field field : fieldMap.values()) { + field.setSelects(null); + field.setShowSelects(null); + field.setScript(null); + field.setShow(null); +// field.setResultType(null); + field.setMode(null); + field.setSelect(null); + field.setGroups(null); + field.setCollectionValue(null); + // 清空基础字段 + field.setViewKey(null); +// field.setDbType(null); +// field.setName(null); +// field.setType(null); +// field.setAutoDate(null); + field.setTooltips(null); + field.setCheck(null); + field.setLastSelectValue(null); + } + } + } + + /** + * 移动端用于同步审核后的状态,需要同时获取审核通过和未通过的数据 + * + * @param taskId 任务id + * @param userId 用户id + */ + @RequestMapping(value = "syncReviewStatus", produces = "text/html;charset=UTF-8") + public String syncReviewStatus(Integer taskId, Integer userId){ + Task task = taskService.getTaskById(taskId); + if(task == null){ + return ResultMessage.failed("当前任务已删除!").toString(); + } + // 判断该用户是否在对应的任务中 + if(!OtherUtil.isUserInTask(task, userId, taskUserRoleService)){ + return ResultMessage.failed("您不在该任务中!").toString(); + } + Map rootTables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + List> result = new ArrayList<>(); + rootTables.forEach((key,value) -> { + String primaryKey = TableOperationUtil.getPrimaryKey(rootTables.get(key)); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), key, false, false); + List> notPassDataIdList = baseService.getNotPassDataId(tableNameInDb, PostgreSqlUtil.transformString(primaryKey), userId); + Map map = new HashMap<>(); + map.put("tableName",key); + if (notPassDataIdList == null || notPassDataIdList.size() == 0){ + map.put("data",null); + } + else{ + List> resultValueList = new ArrayList<>(); + for (Map notPassDataMap : notPassDataIdList){ + Map idReasonMap = new HashMap<>(); + idReasonMap.put("id",notPassDataMap.get(primaryKey)); + idReasonMap.put("status", notPassDataMap.get(CommonConstant.FIX_FIELD_STATUS)); + idReasonMap.put("reason", notPassDataMap.get(CommonConstant.FIX_FIELD_REASON)); + resultValueList.add(idReasonMap); + } + map.put("data",resultValueList); + } + result.add(map); + + }); + return ResultMessage.success(result).toString(); + } + + + /** + * 获取某任务的根表下所有数据的 id 和 shape,以 Feature 类形式组织返回给前端 + * @param taskId 任务id + * @param tableName 表名 + */ + @RequestMapping(value = "getAllData", produces = "text/html;charset=UTF-8") + public String getAllDataForTaskIdAndTableName(Integer taskId, String tableName){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + String geometryFiledName = CheckTableDataUtil.getGeometryFieldName(table); + String selectAllDataSql = MessageFormat.format(SqlStringConstant.SELECT_ALLDATA_SQL, tableNameInDb); + List> rootTableDataList = baseService.selectData(selectAllDataSql); + if (rootTableDataList == null || rootTableDataList.size() == 0){ + return ResultMessage.success(null).toString(); + } + else + { + List featureList = changeRootTableDataToFeatureList(task, tableName, geometryFiledName, + rootTableDataList, false,null,null); + return ResultMessage.success(featureList).toStringByDisableCircularReference(); + } + } + + /** + * 获取某任务的某根表下所有数据库类型为 text 的字段名,包括数据库中的字段名和中文名(如果有的话) + * 注意这里数据库类型为 text 是网页端选择的类型,并非存在数据库中的类型 + */ + @RequestMapping(value = "getFieldNames", produces = "text/html;charset=UTF-8") + public String getFieldNames(Integer taskId, String tableName){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + List fieldNameList = CheckTableDataUtil.getTextFieldName(table); + Map fields = table.getFields(); + if (fieldNameList.isEmpty()){ + return ResultMessage.success(null).toString(); + } + + List> result = new ArrayList<>(); + for (String fieldName : fieldNameList){ + Map tempMap = new HashMap<>(); + tempMap.put("key",fieldName); + String name = fields.get(fieldName).getName(); + if (name != null && !"".equals(name)){ + tempMap.put("name",name); + } + else{ + tempMap.put("name",""); + } + result.add(tempMap); + } + return ResultMessage.success(result).toString(); + } + + /** + * 根据任务id,表名,字段名和模糊搜索的关键字 searchKey 获取数据。 + * 这个地方是搜索任务位置,因此返回的是数据的中心点模糊搜索采用 + * field like '%searchKey%'的SelectSql样式。全局搜索 + * @param taskId 任务id + * @param tableName 表名 + * @param fieldName 字段 + * @param searchKey 模糊搜索的关键字 + */ + @RequestMapping(value = "getAllFuzzySearchDataCenterPoint", produces = "text/html;charset=UTF-8") + public String getAllFuzzySearchDataCenterPoint(Integer taskId, String tableName, String fieldName, + String searchKey, int pageNum){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName,false,false); + String fieldNameInDb = PostgreSqlUtil.transformString(fieldName); + String geometryFieldName = PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)); + String orderBy = "update_time ASC"; + PageHelper.startPage(pageNum, CommonConstant.PAGE_SIZE, orderBy); + Page> pageData = baseService.getAllFuzzySearchDataCenterPoint(tableNameInDb, fieldNameInDb, + geometryFieldName, + "\'%" + searchKey + "%\'"); + return ResultMessage.success(getDataTable(pageData, table, task, true)).toString(); + } + + /** + * 根据任务id,表名,字段名和模糊搜索的关键字searchKey获取数据, + * 模糊搜索采用 field like '%searchKey%'的SelectSql样式。 + * + * 模糊搜索分成两个,一个是缩放等级小返回通过geohash聚类的结果, + * 另一个是缩放等级大,返回屏幕范围内且与关键字匹配的具体数据。 + * 与上面的获取全部数据那里相同,缩放精度及经纬度范围见 getCountByGeoHash() 方法介绍 + * @param taskId 任务id + * @param tableName 表名 + * @param fieldName 字段 + * @param searchKey 模糊搜索的关键字 + */ + @RequestMapping(value = "getCountByFuzzySearchAndGeohash", produces = "text/html;charset=UTF-8") + public String getCountByFuzzySearchAndGeohash(Integer taskId, String tableName, String fieldName,String searchKey, + Integer accuracy, Double longitudeMin, Double latitudeMin, + Double longitudeMax, Double latitudeMax){ + Task task = taskService.getTaskById(taskId); + if (tableName == null || "".equals(tableName) || fieldName == null || "".equals(fieldName)){ + return ResultMessage.failed("未选择表或字段").toString(); + } + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table); + String selectSqlPosteriorPart = " where " + PostgreSqlUtil.transformString(fieldName) + " like \'%" + searchKey + "%\'"; + String selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_GEOHASH, + PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false), + PostgreSqlUtil.transformString(geometryFieldName), accuracy, + longitudeMin, latitudeMin, longitudeMax, latitudeMax, + selectSqlPosteriorPart); + List> dataList = baseService.selectData(selectSql); + if (dataList == null || dataList.size() == 0){ + return ResultMessage.success(null).toString(); + } + else{ + List> result = OtherUtil.genFeatureCountList(dataList); + return ResultMessage.success(result).toStringByDisableCircularReference(); + } + } + + /** + * 前端地图缩放到一定等级后,返回该范围内且与关键字匹配的所有数据 + * 该方法与getDataByRangeIntersection()方法区别在于该方法多出关键字, + * 查询的 sql 也较复杂 + */ + @RequestMapping(value = "getDataByFuzzySearchAndRangeIntersection", produces = "text/html;charset=UTF-8") + public String getDataByFuzzySearchAndRangeIntersection(Integer taskId, String tableName, String fieldName, String searchKey, + Double longitudeMin, Double latitudeMin, Double longitudeMax, + Double latitudeMax){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + + String selectSqlPrecedingPart = MessageFormat.format(SqlStringConstant.SELECTCENTER_SQL_BY_RANGE_INTERSECTION, tableNameInDb, + PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)), + PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), + longitudeMin, latitudeMin, longitudeMax, latitudeMax); + String selectSqlPosteriorPart = "and " + PostgreSqlUtil.transformString(fieldName) + " like \'%" + searchKey + "%\'"; + List> rootTableDataList = baseService.selectData(selectSqlPrecedingPart + selectSqlPosteriorPart); + if (rootTableDataList == null || rootTableDataList.size() == 0){ + return ResultMessage.success(null).toString(); + } + else{ + List featureList = changeRootTableDataToFeatureList(task, tableName, CommonConstant.GEOMETRY, + rootTableDataList, false, null,null); + return ResultMessage.success(featureList).toStringByDisableCircularReference(); + } + } + + /** + * 前端地图缩放到一定等级后,返回该范围内的所有数据 + */ +// @RequestMapping(value = "getDataByRangeIntersection", produces = "text/html;charset=UTF-8") +// public String getDataByRangeIntersection(Integer taskId, String tableName, Double longitudeMin, Double latitudeMin, +// Double longitudeMax, Double latitudeMax){ +// Task task = taskService.getTaskById(taskId); +// Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); +// String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); +// String selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_RANGE_INTERSECTION, tableNameInDb, +// PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)), +// PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), +// PostgreSqlUtil.transformString(TableOperationUtil.getUploadNameFieldName(table)), +// longitudeMin, latitudeMin, longitudeMax, latitudeMax); +// List> rootTableDataList = baseService.selectData(selectSql); +// if (rootTableDataList == null || rootTableDataList.size() == 0) +// { +// return ResultMessage.success(null).toString(); +// } +// else{ +// List featureList = changeRootTableDataToFeatureList(task, tableName, CheckTableDataUtil.getGeometryFieldName(table), +// rootTableDataList, false,null,null); +// return ResultMessage.success(featureList).toStringByDisableCircularReference(); +// } +// } + + /** + * 前端地图缩放到一定等级后,返回该范围内的所有数据,以及该数据的是否被抽取,以及抽取的顺序 + */ + @RequestMapping(value = "getDataByRangeIntersection", produces = "text/html;charset=UTF-8") + public String getDataByRangeIntersection(Integer taskId, String tableName, Double longitudeMin, + Double latitudeMin, Double longitudeMax, Double latitudeMax + ) { + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + + String primaryKeyField = TableOperationUtil.getPrimaryKey(table); + String geomField = CheckTableDataUtil.getGeometryFieldName(table); + String uploadNameField = TableOperationUtil.getUploadNameFieldName(table); + // ⚠️ 几何字段为空,直接返回空结果,避免 SQL 报错 + if (geomField == null || geomField.trim().isEmpty()) { + return ResultMessage.success(Collections.emptyList()).toString(); + } + String selectSql; + if (table.isRoot()) { + // 根表查询包含 collector 和 reviewer + selectSql = MessageFormat.format(SqlStringConstant.SELECT_SQL_BY_RANGE_INTERSECTION, + tableNameInDb, + PostgreSqlUtil.transformString(primaryKeyField), + PostgreSqlUtil.transformString(geomField), + PostgreSqlUtil.transformString(uploadNameField), + longitudeMin, latitudeMin, longitudeMax, latitudeMax + ); + } else { + // 非根表不包含 collector 和 reviewer,构造自定义 SQL + selectSql = String.format( + "SELECT %s, %s FROM %s WHERE ST_Intersects(ST_MakeEnvelope(%f, %f, %f, %f, 4490), st_setsrid(ST_GeomFromGeoJSON(%s), 4490))", + PostgreSqlUtil.transformString(primaryKeyField), + PostgreSqlUtil.transformString(geomField), + tableNameInDb, + longitudeMin, latitudeMin, longitudeMax, latitudeMax, + PostgreSqlUtil.transformString(geomField) + ); + } + + List> rootTableDataList = baseService.selectData(selectSql); + if (rootTableDataList == null || rootTableDataList.isEmpty()) { + return ResultMessage.success(null).toString(); + } else { + List featureList = changeRootTableDataToFeatureList(task, tableName, CheckTableDataUtil.getGeometryFieldName(table), + rootTableDataList, false,null,null); + return ResultMessage.success(featureList).toStringByDisableCircularReference(); + } + } + + // TODO 统一前后端状态码的含义 + /** + * 获取某页的数据详情,其中也包括数据共多少页(获取全部数据的过程) + * @param status 数据状态有 -1、0、1、2,分别代表审核未通过、未采集、已采集、审核通过 + */ +// @RequestMapping(value="getDataByPageNum",produces="text/html;charset=UTF-8") +// public String getDataByPageNum(Integer taskId, String tableName, Integer workerId, int status, +// int pageNum, @RequestParam(defaultValue = "10") int pageSize){ +// Task task = taskService.getTaskById(taskId); +// String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName,false,false); +// Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); +// String orderBy = "update_time ASC"; +// PageHelper.startPage(pageNum, pageSize, orderBy); +// Page> pageData = searchPageService.getPageDataByWorkerAndStatus(tableNameInDb, workerId, status); +// return ResultMessage.success(getDataTable(pageData, table, task, false)).toString(); +// } + @RequestMapping(value = "getDataByPageNum", produces = "text/html;charset=UTF-8") + public String getDataByPageNum(Integer taskId, String tableName, Integer workerId, int status, + int pageNum, @RequestParam(defaultValue = "10") int pageSize) { + Task task = taskService.getTaskById(taskId); + + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class) + .getTables().get(tableName); + + Page> pageData; + + if (table.isRoot()) { + String orderBy = "update_time ASC"; + PageHelper.startPage(pageNum, pageSize, orderBy); + pageData = searchPageService.getPageDataByWorkerAndStatus(tableNameInDb, workerId, status); + } else { + String orderBy = "\"ID\" ASC"; + PageHelper.startPage(pageNum, pageSize, orderBy); + List> list = searchPageService.getPageDataByWorkerNoStatus(tableNameInDb); + // 为了统一格式,包装为 Page 对象(可以手动构造) + pageData = new Page<>(); + pageData.addAll(list); + pageData.setPageNum(1); + pageData.setPageSize(list.size()); + pageData.setTotal(list.size()); + } + + return ResultMessage.success(getDataTable(pageData, table, task, false)).toString(); + } + + + + /** + * 获取某页的数据详情,其中也包括数据共多少页(获取模糊匹配数据的过程) + */ + @RequestMapping(value="getFuzzySearchDataByPageNum",produces="text/html;charset=UTF-8") + public String getFuzzySearchDataByPageNum(Integer taskId, String tableName, String fieldName, String searchKey, + int pageNum){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName,false,false); + String fieldNameInDb = PostgreSqlUtil.transformString(fieldName); + String orderBy = "update_time ASC"; + PageHelper.startPage(pageNum, CommonConstant.PAGE_SIZE, orderBy); + Page> pageData = searchPageService.getPageDataByFuzzySearch(tableNameInDb, fieldNameInDb, "\'%" + searchKey + "%\'"); + return ResultMessage.success(getDataTable(pageData, table, task, false)).toString(); + } + + /** + /** + * 将 Page 中数据按照特定格式组织起来,封装成一个方法方便其他接口调用 + */ + private Map getDataTable(Page> pageData, Table table, Task task, + boolean extractCenterPoint){ + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + Map result = new HashMap<>(); + List> dataList = pageData.getResult(); + if (dataList != null && dataList.size() != 0){ + List dataInfoList = new ArrayList<>(); + List dataCoordinatesList = new ArrayList<>(); + dataList.forEach(o ->{ + Feature feature = new Feature(); + feature.setType(CommonConstant.FEATURE); + Map propertiesMap = new HashMap<>(); + if (o.containsKey(primaryKey)){ + propertiesMap.put("id", o.get(primaryKey).toString()); + feature.setProperties(propertiesMap); + } + // 添加 geometry 字段(如果存在) + if (extractCenterPoint){ + if (o.containsKey(CommonConstant.GEOMETRY)){ + feature.setGeometry(JSON.toJavaObject(JSON.parseObject(o.get(CommonConstant.GEOMETRY).toString()), + GeometryType.class)); + dataCoordinatesList.add(feature); + } + } + else{ + if (o.containsKey(geometryFieldName)){ + feature.setGeometry(JSON.toJavaObject(JSON.parseObject(o.get(geometryFieldName).toString()), + GeometryType.class)); + dataCoordinatesList.add(feature); + } + } + // 添加属性信息 + //根表和非根表分开进行处理 + try { + if (table.isRoot()) { + dataInfoList.add(genResultMapByRootTableData(table, o, task, false)); + } else { + dataInfoList.add(genResultMapBySubTableData(table, o, task)); + } + } catch (Exception e) { + e.printStackTrace(); // 可替换为日志 + } + }); + result.put("dataInfo",dataInfoList); + result.put("dataCoordinates",dataCoordinatesList); + result.put("dataPageNum",pageData.getPages()); + return result; + } + else{ + return null; + } + } + + + /** + * 把获取的数据填进Table中部分相同操作封装成一个方法,便于getDataByUserId()和getDataById()使用 + */ + private Table changeDataToTable(Table table, Task task, Map rootTableData, Long polygonId, + int versionCode, int maxVersionCodeInDB){ + table.getFields().remove(CommonConstant.FIX_FIELD_CREATE_TIME); + table.getFields().remove(CommonConstant.FIX_FIELD_UPDATE_TIME); + Map fieldsMap = table.getFields(); + Map associateTableMap = CheckTableDataUtil.getAssociateField(table, task.getConfig()); + Map collectorTableMap = CheckTableDataUtil.getCollectionField(table, task.getConfig()); + for (Map.Entry rootTableDataEntry : rootTableData.entrySet()){ + String fieldName = rootTableDataEntry.getKey(); + Object fieldValue = rootTableDataEntry.getValue(); + + if (fieldName.equals(CheckTableDataUtil.getGeometryFieldName(table))){ + fieldsMap.get(fieldName).setValue(ShapeTypeUtil.changeGeometryToArcGIS(fieldValue.toString())); + } + else if (!fieldName.equals(CommonConstant.FIX_FIELD_CREATE_TIME) + && !fieldName.equals(CommonConstant.FIX_FIELD_UPDATE_TIME)){ + Field field = fieldsMap.get(fieldName); + if (field.getType() != null && field.getType().equals(CommonConstant.PHOTO) + && fieldValue != null && ! fieldValue.toString().equals("")){ + fieldsMap.get(fieldName).setValue(fieldValue.toString().substring(fieldValue.toString().lastIndexOf('/') + 1)); + continue; + } + fieldsMap.get(fieldName).setValue(fieldValue); + } + } + if(associateTableMap.size()!=0 || collectorTableMap.size()!=0){ + table = recursiveChangeDataToTable(table,task.getDatabaseName(),polygonId, task.getConfig(), + associateTableMap,collectorTableMap,versionCode,maxVersionCodeInDB); + } + List multiMediaItemList; + if (versionCode == maxVersionCodeInDB){ + + String mediatableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, false); + multiMediaItemList = multimediaService.selectMultiMedia(mediatableNameInDb, polygonId); + } + else{ + String mediatableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, true); + multiMediaItemList = multimediaService.selectHistoryMultiMedia(mediatableNameInDb, polygonId, versionCode); + } + String cameraFieldName = TableOperationUtil.getCameraFieldName(table); + if (cameraFieldName != null && !cameraFieldName.equals("")){ + fieldsMap.get(cameraFieldName).setValue(multiMediaItemList); + } + table.setFields(fieldsMap); + cleanTableForAndroid(table.getFields()); + return table; + } + + /** + * 递归的获取关联表数据,并将关联表数据放进根表数据对应的Table中 + */ +// private Table recursiveChangeDataToTable(Table table, String databaseName, Long polygonId, String configString, +// Map associateTableMap, Map collectorTableMap, +// int versionCode, int maxVersionCodeInDB){ +// Map tableFields = table.getFields(); +// Config config = JSON.toJavaObject(JSON.parseObject(configString), Config.class); +// Map tables = config.getTables(); +// if(associateTableMap.size()!=0){ +// for(Map.Entry associateEntry:associateTableMap.entrySet()){ +// Table associateTable = tables.get(associateEntry.getKey()); +// String selectSql; +// if(versionCode == maxVersionCodeInDB){ +// selectSql = GenerateSqlUtil.generateSelectSqlByField(databaseName, associateEntry.getKey(), +// associateEntry.getValue(), polygonId); +// } +// else{ +// selectSql = GenerateSqlUtil.genSqlByPolygonIdAndVersionId(databaseName, associateEntry.getKey() + CommonConstant.HISTORY_SUFFIX, +// associateEntry.getValue(), polygonId, versionCode); +// } +// +// List> dataList = baseService.selectData(selectSql); +// if(dataList == null || dataList.size() == 0) +// { +// continue; +// } +// Map associateData = dataList.get(0); +// String primaryKey = TableOperationUtil.getPrimaryKey(associateTable); +// Map associateTableFields = new HashMap<>(associateTable.getFields()); +// associateTableFields.remove(CommonConstant.FIX_FIELD_VERSION); +// associateTableFields = putDataToMap(associateData,associateTableFields); +// associateTable.setFields(associateTableFields); +// Long associatePolygonId = Long.valueOf(associateData.get(primaryKey).toString()); +// Map childAssociateTableMap = CheckTableDataUtil.getAssociateField(associateTable, configString); +// Map childCollectorTableMap = CheckTableDataUtil.getCollectionField(associateTable, configString); +// if(childAssociateTableMap.size()!=0 || childCollectorTableMap.size()!=0) +// { +// associateTable = recursiveChangeDataToTable(associateTable,databaseName,associatePolygonId, configString, +// childAssociateTableMap,childCollectorTableMap,versionCode, maxVersionCodeInDB); +// } +// Field tempField = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(tableFields.get(associateEntry.getKey()), SerializerFeature.DisableCircularReferenceDetect)), +// Field.class); +// tempField.setValue(associateTable.getFields()); +// tableFields.remove(associateEntry.getKey()); +// tableFields.put(associateEntry.getKey(), tempField); +// } +// } +// if(collectorTableMap.size()!=0) +// { +// for(Map.Entry collectorEntry:collectorTableMap.entrySet()) +// { +// Table collectorTable = tables.get(collectorEntry.getKey()); +// String selectSql; +// if(versionCode == maxVersionCodeInDB) +// { +// selectSql = GenerateSqlUtil.generateSelectSqlByField(databaseName, collectorEntry.getKey(), +// collectorEntry.getValue(), polygonId); +// } +// else +// { +// selectSql = GenerateSqlUtil.genSqlByPolygonIdAndVersionId(databaseName, collectorEntry.getKey() + CommonConstant.HISTORY_SUFFIX, +// collectorEntry.getValue(), polygonId, versionCode); +// } +// +// List> dataList = baseService.selectData(selectSql); +// if (dataList == null || dataList.size() == 0) +// { +// continue; +// } +// List> result = new ArrayList<>(); +// for(Map data:dataList) +// { +// Map collectorTableFields = new HashMap<>(collectorTable.getFields()); +// collectorTableFields.remove(CommonConstant.FIX_FIELD_VERSION); +// collectorTableFields = putDataToMap(data, collectorTableFields); +// result.add(collectorTableFields); +// } +// String primaryKey = TableOperationUtil.getPrimaryKey(collectorTable); +// Map childAssociateTableMap = CheckTableDataUtil.getAssociateField(collectorTable, configString); +// Map childCollectorTableMap = CheckTableDataUtil.getCollectionField(collectorTable, configString); +// for(Map data:dataList) +// { +// Long collectorPolygonId = Long.valueOf(data.get(primaryKey).toString()); +// if(childAssociateTableMap.size()!=0 || childCollectorTableMap.size()!=0) +// { +// collectorTable = recursiveChangeDataToTable(collectorTable,databaseName,collectorPolygonId, configString, +// childAssociateTableMap,childCollectorTableMap,versionCode, +// maxVersionCodeInDB); +// } +// } +// tableFields.get(collectorEntry.getKey()).setValue(result); +// Field tempField = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(tableFields.get(collectorEntry.getKey()), SerializerFeature.DisableCircularReferenceDetect)), +// Field.class); +// tempField.setValue(result); +// tableFields.remove(collectorEntry.getKey()); +// tableFields.put(collectorEntry.getKey(), tempField); +// } +// } +// table.setFields(tableFields); +// return table; +// } + private Table recursiveChangeDataToTable(Table table, String databaseName, Long polygonId, String configString, + Map associateTableMap, Map collectorTableMap, + int versionCode, int maxVersionCodeInDB){ + Map tableFields = table.getFields(); + Config config = JSON.toJavaObject(JSON.parseObject(configString), Config.class); + Map tables = config.getTables(); + + if(associateTableMap.size() != 0){ + for(Map.Entry associateEntry : associateTableMap.entrySet()){ + Table associateTable = tables.get(associateEntry.getKey()); + String selectSql; + if(versionCode == maxVersionCodeInDB){ + selectSql = GenerateSqlUtil.generateSelectSqlByField(databaseName, associateEntry.getKey(), + associateEntry.getValue(), polygonId); + } + else{ + selectSql = GenerateSqlUtil.genSqlByPolygonIdAndVersionId(databaseName, associateEntry.getKey() + CommonConstant.HISTORY_SUFFIX, + associateEntry.getValue(), polygonId, versionCode); + } + + List> dataList = baseService.selectData(selectSql); + if(dataList == null || dataList.size() == 0){ + continue; + } + Map associateData = dataList.get(0); + String primaryKey = TableOperationUtil.getPrimaryKey(associateTable); + Map associateTableFields = new HashMap<>(associateTable.getFields()); + associateTableFields.remove(CommonConstant.FIX_FIELD_VERSION); + associateTableFields = putDataToMap(associateData, associateTableFields); + //----------20250730 对非根表加入camera处理逻辑------ + // 处理 camera 字段类型的媒体数据 + String cameraFieldName = TableOperationUtil.getCameraFieldName(associateTable); + if (cameraFieldName != null && !cameraFieldName.equals("") && associateTableFields.containsKey(cameraFieldName)) { + String mediaTableNameInDb; + List multiMediaItemList; + if (versionCode == maxVersionCodeInDB) { + mediaTableNameInDb = PostgreSqlUtil.buildTableNameString(databaseName, associateTable.getKey(), true, false); + multiMediaItemList = multimediaService.selectMultiMedia(mediaTableNameInDb, polygonId); + } else { + mediaTableNameInDb = PostgreSqlUtil.buildTableNameString(databaseName, associateTable.getKey(), true, true); + multiMediaItemList = multimediaService.selectHistoryMultiMedia(mediaTableNameInDb, polygonId, versionCode); + } + associateTableFields.get(cameraFieldName).setValue(multiMediaItemList); + } + //-------- + // 这里应该清理tableFields + cleanTableForAndroid(associateTableFields); + + // ==== 新增几何字段处理逻辑 ==== + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(associateTable); + if (geometryFieldName != null && associateTableFields.containsKey(geometryFieldName)) { + Field geoField = associateTableFields.get(geometryFieldName); + Object geoValue = geoField.getValue(); + if (geoValue != null && geoValue instanceof String && !((String)geoValue).isEmpty()) { + geoField.setValue(ShapeTypeUtil.changeGeometryToArcGIS((String)geoValue)); + } + } + // ==== 结束 ==== + + associateTable.setFields(associateTableFields); + Long associatePolygonId = Long.valueOf(associateData.get(primaryKey).toString()); + Map childAssociateTableMap = CheckTableDataUtil.getAssociateField(associateTable, configString); + Map childCollectorTableMap = CheckTableDataUtil.getCollectionField(associateTable, configString); + if(childAssociateTableMap.size() != 0 || childCollectorTableMap.size() != 0){ + associateTable = recursiveChangeDataToTable(associateTable,databaseName,associatePolygonId, configString, + childAssociateTableMap,childCollectorTableMap,versionCode, maxVersionCodeInDB); + } + Field tempField = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(tableFields.get(associateEntry.getKey()), SerializerFeature.DisableCircularReferenceDetect)), + Field.class); + tempField.setValue(associateTable.getFields()); + tableFields.remove(associateEntry.getKey()); + tableFields.put(associateEntry.getKey(), tempField); + + } + } + + if(collectorTableMap.size() != 0){ + for(Map.Entry collectorEntry : collectorTableMap.entrySet()){ + Table collectorTable = tables.get(collectorEntry.getKey()); + String selectSql; + if(versionCode == maxVersionCodeInDB){ + selectSql = GenerateSqlUtil.generateSelectSqlByField(databaseName, collectorEntry.getKey(), + collectorEntry.getValue(), polygonId); + } + else{ + selectSql = GenerateSqlUtil.genSqlByPolygonIdAndVersionId(databaseName, collectorEntry.getKey() + CommonConstant.HISTORY_SUFFIX, + collectorEntry.getValue(), polygonId, versionCode); + } + + List> dataList = baseService.selectData(selectSql); + if (dataList == null || dataList.size() == 0){ + continue; + } + List> result = new ArrayList<>(); + for(Map data : dataList){ + Map collectorTableFields = new HashMap<>(collectorTable.getFields()); + collectorTableFields.remove(CommonConstant.FIX_FIELD_VERSION); + collectorTableFields = putDataToMap(data, collectorTableFields); + //20250730 对非根表加入camera处理逻辑 + String cameraFieldName = TableOperationUtil.getCameraFieldName(collectorTable); + if (cameraFieldName != null && !cameraFieldName.equals("") && collectorTableFields.containsKey(cameraFieldName)) { + String mediaTableNameInDb; + List multiMediaItemList; + Long collectorPolygonId = Long.valueOf(data.get(TableOperationUtil.getPrimaryKey(collectorTable)).toString()); + if (versionCode == maxVersionCodeInDB) { + mediaTableNameInDb = PostgreSqlUtil.buildTableNameString(databaseName, collectorTable.getKey(), true, false); + multiMediaItemList = multimediaService.selectMultiMedia(mediaTableNameInDb, collectorPolygonId); + } else { + mediaTableNameInDb = PostgreSqlUtil.buildTableNameString(databaseName, collectorTable.getKey(), true, true); + multiMediaItemList = multimediaService.selectHistoryMultiMedia(mediaTableNameInDb, collectorPolygonId, versionCode); + } + collectorTableFields.get(cameraFieldName).setValue(multiMediaItemList); + } + //----------- + // ==== 新增几何字段处理逻辑 ==== + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(collectorTable); + if (geometryFieldName != null && collectorTableFields.containsKey(geometryFieldName)) { + Field geoField = collectorTableFields.get(geometryFieldName); + Object geoValue = geoField.getValue(); + if (geoValue != null && geoValue instanceof String && !((String)geoValue).isEmpty()) { + geoField.setValue(ShapeTypeUtil.changeGeometryToArcGIS((String)geoValue)); + } + } + // ==== 结束 ==== + // 这里应该清理tableFields + cleanTableForAndroid(collectorTableFields); + result.add(collectorTableFields); + } + String primaryKey = TableOperationUtil.getPrimaryKey(collectorTable); + Map childAssociateTableMap = CheckTableDataUtil.getAssociateField(collectorTable, configString); + Map childCollectorTableMap = CheckTableDataUtil.getCollectionField(collectorTable, configString); + for(Map data : dataList){ + Long collectorPolygonId = Long.valueOf(data.get(primaryKey).toString()); + if(childAssociateTableMap.size() != 0 || childCollectorTableMap.size() != 0){ + collectorTable = recursiveChangeDataToTable(collectorTable,databaseName,collectorPolygonId, configString, + childAssociateTableMap,childCollectorTableMap,versionCode, + maxVersionCodeInDB); + } + } + tableFields.get(collectorEntry.getKey()).setValue(result); + Field tempField = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(tableFields.get(collectorEntry.getKey()), SerializerFeature.DisableCircularReferenceDetect)), + Field.class); + tempField.setValue(result); + tableFields.remove(collectorEntry.getKey()); + tableFields.put(collectorEntry.getKey(), tempField); + + } + } + table.setFields(tableFields); + return table; + + } + + /** + * 将从数据库中获取的Map data,分别填入字段名对应的Field的value中 + */ + private Map putDataToMap(Map data, Map associateAndcollectorTableFields) + { + Map resultMap = new HashMap<>(associateAndcollectorTableFields); + for(Map.Entry collectorDataEntry:data.entrySet()) + { + for(Map.Entry entry:associateAndcollectorTableFields.entrySet()) + { + if(collectorDataEntry.getKey().equals(entry.getKey())) + { + Field tempField = JSON.toJavaObject(JSON.parseObject(JSON.toJSONString(entry.getValue(), SerializerFeature.DisableCircularReferenceDetect)), + Field.class); + tempField.setValue(collectorDataEntry.getValue()); + resultMap.remove(entry.getKey()); + resultMap.put(entry.getKey(), tempField); + } + } + } + return resultMap; + } + + // 从多媒体文件路径中匹配采集人 ID 的正则表达式 + // 如 C:/CollectionSystem/MediaFile/task_23/user_1/20210913132531680.jpg 的匹配结果是 user_1 + private static final Pattern userIdPattern = Pattern.compile("user_\\d+"); + + /** + * 将获取的根表记录(既包括主表也包括历史表)数据添加到Map中,方便生成JsonString,将该部分操作 + * 封装成一个genResultMapByRootTableData方法,方便与上面的 getDataById 和 getDataByIdAndVersion 方法调用 + * @param table Table类实例 + * @param rootTableData 根表记录Map + * @param task Task类实例 + */ + private Map genResultMapByRootTableData(Table table, Map rootTableData, Task task, boolean isHistory) throws Exception + { + Map result = new HashMap<>(); + Map fields = table.getFields(); + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + + // 将数据库中查询到的属性信息添加到result中 + for (Map.Entry entry:rootTableData.entrySet()) + { + String entryKey = entry.getKey(); + Object entryValue = entry.getValue(); + if (!entryKey.equals(CommonConstant.FIX_FIELD_VERSION) + && !entryKey.equals(CommonConstant.FIX_FIELD_CREATE_TIME) + && !entryKey.equals(CommonConstant.FIX_FIELD_UPDATE_TIME) + && !entryKey.equals(CommonConstant.FIX_FIELD_REASON) + && !entryKey.equals(geometryFieldName) + && !entryKey.equals(CommonConstant.GEOMETRY)){ + switch (entryKey){ + case CommonConstant.FIX_FIELD_COLLECTOR:{ + Integer collectorId = Integer.valueOf(rootTableData.get(CommonConstant.FIX_FIELD_COLLECTOR).toString()); + if (userService.findById(collectorId).isPresent()){ + result.put("采集员" , userService.findById(collectorId).get().getRealName()); + } + else{ + result.put("采集员", "无"); + } + break; + } + case CommonConstant.FIX_FIELD_REVIEWER:{ + Integer reviewerId = Integer.valueOf(entryValue.toString()); + if (reviewerId == -1){ + result.put("巡查员" , "无"); + } + else{ + User user = userService.findById(reviewerId).get(); + result.put("巡查员" , user.getRealName()); + } + break; + } + default: + Field field = fields.get(entryKey); + Map selectKeyValueMap = OtherUtil.getSelectKeyValueMap(xmlEnityService.getXmlEnityById(task.getXmlId()).getFilePath(), + table.getKey(), field.getKey()); + String key; + if (field.getName() != null && !field.getName().equals("")){ + key = field.getName(); + } + else{ + key = field.getKey(); + } + // 针对字段的type为PHOTO类型需要特殊处理 + if (field.getType() != null && field.getType().equals(CommonConstant.PHOTO) + && entryValue != null && ! entryValue.toString().equals("")) + { + String fileName = entryValue.toString().substring(entryValue.toString().lastIndexOf('/') + 1); + Integer collectorId = Integer.valueOf(rootTableData.get(CommonConstant.FIX_FIELD_COLLECTOR).toString()); + result.put(key, CommonConstant.GET_PICTURE_PREFIX + task.getId() + "/" + collectorId + "/" + fileName); + continue; + } + // 针对status字段,需要特殊处理 + if (field.getKey().equals(CommonConstant.FIX_FIELD_STATUS)){ + int status = Integer.valueOf(entryValue.toString()); + result.put("数据状态",OtherUtil.getStatusMeaning(status)); + if(status == -1){ + result.put("审核未通过原因",rootTableData.get(CommonConstant.FIX_FIELD_REASON)); + } + continue; + } + // 针对primaryKey字段 + if (field.getKey().equals(primaryKey)) + { + result.put("id",entryValue); + continue; + } + if (selectKeyValueMap != null && selectKeyValueMap.size() != 0 && field.getResultType() != null + && field.getResultType().equals("key")) + { + // 因为CheckBox和CheckView存在多选的情况,所以得把每一对情况都生成Map + List> keyValueMapList = new ArrayList<>(); + for (String value : entry.getValue().toString().split(",")) + { + Map keyValueMap = new HashMap<>(); + keyValueMap.put("key",value.trim()); + keyValueMap.put("value",selectKeyValueMap.get(value.trim())); + keyValueMapList.add(keyValueMap); + } + result.put(key,JSON.toJSONString(keyValueMapList)); + } + else if (selectKeyValueMap != null && selectKeyValueMap.size() !=0 && field.getResultType() != null + && field.getResultType().equals("value")) + { + // 因为CheckBox和CheckView存在多选的情况,所以得把每一对情况都生成Map + List> keyValueMapList = new ArrayList<>(); + for (String value : entry.getValue().toString().split(",")) + { + Map keyValueMap = new HashMap<>(); + keyValueMap.put("key", OtherUtil.getKeyByValue(selectKeyValueMap, value.trim())); + keyValueMap.put("value",value.trim()); + keyValueMapList.add(keyValueMap); + } + result.put(key,JSON.toJSONString(keyValueMapList)); + } + else + { + if (field.getAutoDate() != null && !field.getAutoDate().equals("") + && field.getDbType().equals(CommonConstant.DATE)) + { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(field.getAutoDate()); + result.put(key, simpleDateFormat.format(entry.getValue())); + } + else if ((field.getAutoDate() == null || field.getAutoDate().equals("")) + && field.getDbType().equals(CommonConstant.DATE)) + { + result.put(key, new SimpleDateFormat(CommonConstant.DATE_FORMAT_STRING).format(entry.getValue())); + } + else + { + result.put(key,entry.getValue()); + } + } + break; + } + } + } + + // 将多媒体信息添加result中 + String mediatableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, isHistory); + List mediaFileUrlList = new ArrayList<>(); + List multimediaItemList = isHistory ? + multimediaService.selectHistoryMultiMedia(mediatableNameInDb, Long.valueOf(rootTableData.get(primaryKey).toString()), (int) rootTableData.get(CommonConstant.FIX_FIELD_VERSION)) + : multimediaService.selectMultiMedia(mediatableNameInDb, Long.valueOf(rootTableData.get(primaryKey).toString())); + if (multimediaItemList == null) + { + result.put("mediaFileURLs",""); + } + else + { + for (MultimediaItem multimediaItem:multimediaItemList) + { + String fileName = multimediaItem.getFile(); + String mediaPath = multimediaItem.getMediaPath(); + Matcher matcher = userIdPattern.matcher(mediaPath); + if (matcher.find()) { + String userId = mediaPath.substring(matcher.start() + 5, matcher.end()); + if (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) + { + + mediaFileUrlList.add(CommonConstant.GET_PICTURE_PREFIX + task.getId() + "/" + userId + "/" + fileName); + } + else + { + mediaFileUrlList.add(CommonConstant.GET_VIDEO_PREFIX + task.getId() + "/" + userId + "/" + fileName); + } + } + } + result.put("mediaFileURLs",mediaFileUrlList); + } + return result; + } + /** + * 将获取的非根表记录数据添加到 Map 中,方便生成 JsonString。 + * 相比根表,非根表中通常不包含 collector、reviewer、status 等字段。 + * + * @param table Table类实例 + * @param subTableData 非根表记录 Map + * @param task Task类实例 + */ +// private Map genResultMapBySubTableData(Table table, Map subTableData, Task task) throws Exception { +// Map result = new HashMap<>(); +// Map fields = table.getFields(); +// String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table); // ⚠️ 可能为 null +// String primaryKey = TableOperationUtil.getPrimaryKey(table); +// +// for (Map.Entry entry : subTableData.entrySet()) { +// String entryKey = entry.getKey(); +// Object entryValue = entry.getValue(); +// +// // ⚠️ 跳过 geometry 字段(如果存在定义) +// if ((geometryFieldName != null && entryKey.equals(geometryFieldName)) +// || entryKey.equals(CommonConstant.GEOMETRY)) { +// continue; +// } +// +// Field field = fields.get(entryKey); +// if (field == null) continue; // 跳过未定义字段 +// +// String key = (field.getName() != null && !field.getName().isEmpty()) ? field.getName() : field.getKey(); +// +// // PHOTO 类型字段处理 +// if (CommonConstant.PHOTO.equals(field.getType()) +// && entryValue != null && !entryValue.toString().isEmpty()) { +// String fileName = entryValue.toString().substring(entryValue.toString().lastIndexOf('/') + 1); +// result.put(key, CommonConstant.GET_PICTURE_PREFIX + task.getId() + "/unknown/" + fileName); +// continue; +// } +// +// // 字典值映射处理 +// Map selectKeyValueMap = OtherUtil.getSelectKeyValueMap( +// xmlEnityService.getXmlEnityById(task.getXmlId()).getFilePath(), +// table.getKey(), field.getKey()); +// +// if (selectKeyValueMap != null && !selectKeyValueMap.isEmpty() && field.getResultType() != null) { +// List> keyValueMapList = new ArrayList<>(); +// for (String value : entryValue.toString().split(",")) { +// Map map = new HashMap<>(); +// if ("key".equals(field.getResultType())) { +// map.put("key", value.trim()); +// map.put("value", selectKeyValueMap.get(value.trim())); +// } else if ("value".equals(field.getResultType())) { +// map.put("key", OtherUtil.getKeyByValue(selectKeyValueMap, value.trim())); +// map.put("value", value.trim()); +// } +// keyValueMapList.add(map); +// } +// result.put(key, JSON.toJSONString(keyValueMapList)); +// } else { +// // 时间字段处理 +// if (CommonConstant.DATE.equals(field.getDbType())) { +// if (field.getAutoDate() != null && !field.getAutoDate().isEmpty()) { +// result.put(key, new SimpleDateFormat(field.getAutoDate()).format(entryValue)); +// } else { +// result.put(key, new SimpleDateFormat(CommonConstant.DATE_FORMAT_STRING).format(entryValue)); +// } +// } else { +// result.put(key, entryValue); +// } +// } +// +// // 主键字段显式放置 "id" 字段 +// if (primaryKey.equals(field.getKey())) { +// result.put("id", entryValue); +// } +// } +// +// // 添加多媒体资源(如果有) +// String mediaTableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, false); +// List multimediaItemList = multimediaService.selectMultiMedia( +// mediaTableNameInDb, Long.valueOf(subTableData.get(primaryKey).toString())); +// +// List mediaFileUrlList = new ArrayList<>(); +// if (multimediaItemList != null) { +// for (MultimediaItem item : multimediaItemList) { +// String fileName = item.getFile(); +// String mediaPath = item.getMediaPath(); +// Matcher matcher = userIdPattern.matcher(mediaPath); +// String userId = matcher.find() ? mediaPath.substring(matcher.start() + 5, matcher.end()) : "unknown"; +// +// String prefix = (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) +// ? CommonConstant.GET_PICTURE_PREFIX +// : CommonConstant.GET_VIDEO_PREFIX; +// mediaFileUrlList.add(prefix + task.getId() + "/" + userId + "/" + fileName); +// System.out.println("mediaFileUrlList: " + mediaFileUrlList); +// } +// } +// result.put("mediaFileURLs", mediaFileUrlList); +// return result; +// } + private Map genResultMapBySubTableData(Table table, Map subTableData, Task task) throws Exception { + Map result = new HashMap<>(); + Map fields = table.getFields(); + String geometryFieldName = CheckTableDataUtil.getGeometryFieldName(table); // ⚠️ 可能为 null + String primaryKey = TableOperationUtil.getPrimaryKey(table); + + for (Map.Entry entry : subTableData.entrySet()) { + String entryKey = entry.getKey(); + Object entryValue = entry.getValue(); + + // ⚠️ 跳过 geometry 字段(如果存在定义) + if ((geometryFieldName != null && entryKey.equals(geometryFieldName)) + || entryKey.equals(CommonConstant.GEOMETRY)) { + continue; + } + + Field field = fields.get(entryKey); + if (field == null) continue; // 跳过未定义字段 + + String key = (field.getName() != null && !field.getName().isEmpty()) ? field.getName() : field.getKey(); + + // PHOTO 类型字段处理(photo 字段只展示一张图) + if (CommonConstant.PHOTO.equals(field.getType()) + && entryValue != null && !entryValue.toString().isEmpty()) { + String fileName = entryValue.toString().substring(entryValue.toString().lastIndexOf('/') + 1); + result.put(key, CommonConstant.GET_PICTURE_PREFIX + task.getId() + "/unknown/" + fileName); + continue; + } + + // 字典值映射处理 + Map selectKeyValueMap = OtherUtil.getSelectKeyValueMap( + xmlEnityService.getXmlEnityById(task.getXmlId()).getFilePath(), + table.getKey(), field.getKey()); + if (selectKeyValueMap != null && !selectKeyValueMap.isEmpty() && field.getResultType() != null) { + List> keyValueMapList = new ArrayList<>(); + for (String value : entryValue.toString().split(",")) { + Map map = new HashMap<>(); + if ("key".equals(field.getResultType())) { + map.put("key", value.trim()); + map.put("value", selectKeyValueMap.get(value.trim())); + } else if ("value".equals(field.getResultType())) { + map.put("key", OtherUtil.getKeyByValue(selectKeyValueMap, value.trim())); + map.put("value", value.trim()); + } + keyValueMapList.add(map); + } + result.put(key, JSON.toJSONString(keyValueMapList)); + } else { + // 时间字段处理 + if (CommonConstant.DATE.equals(field.getDbType())) { + if (field.getAutoDate() != null && !field.getAutoDate().isEmpty()) { + result.put(key, new SimpleDateFormat(field.getAutoDate()).format(entryValue)); + } else { + result.put(key, new SimpleDateFormat(CommonConstant.DATE_FORMAT_STRING).format(entryValue)); + } + } else { + result.put(key, entryValue); + } + } + + // 主键字段显式放置 "id" 字段 + if (primaryKey.equals(field.getKey())) { + result.put("id", entryValue); + } + } + + List mediaFileUrlList = new ArrayList<>(); + Config config = JSON.parseObject(task.getConfig(), Config.class); + boolean isRootTable = config.getRootTables().containsKey(table.getKey()); + + if (isRootTable) { + String mediaTableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, false); + try { + List multimediaItemList = multimediaService.selectMultiMedia( + mediaTableNameInDb, Long.valueOf(subTableData.get(primaryKey).toString())); + + if (multimediaItemList != null && !multimediaItemList.isEmpty()) { + for (MultimediaItem item : multimediaItemList) { + String fileName = item.getFile(); + String mediaPath = item.getMediaPath(); + Matcher matcher = userIdPattern.matcher(mediaPath); + String userId = matcher.find() ? mediaPath.substring(matcher.start() + 5, matcher.end()) : "unknown"; + + String prefix = (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) + ? CommonConstant.GET_PICTURE_PREFIX + : CommonConstant.GET_VIDEO_PREFIX; + mediaFileUrlList.add(prefix + task.getId() + "/" + userId + "/" + fileName); + } + } + } catch (Exception e) { + log.warn("查询根表多媒体失败:" + e.getMessage()); + } + } else { + // fallback:从 photo 字段构造 media URL(非根表情况) + Object photoObj = subTableData.get("photo"); + if (photoObj != null && !photoObj.toString().trim().isEmpty()) { + String fileName = photoObj.toString().trim(); + String prefix = (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) + ? CommonConstant.GET_PICTURE_PREFIX + : CommonConstant.GET_VIDEO_PREFIX; + mediaFileUrlList.add(prefix + task.getId() + "/unknown/" + fileName); + } + } + + + result.put("mediaFileURLs", mediaFileUrlList); + return result; + } + + /** + * 将获取的根表记录转换成一个FeatureList返回给前端,将这些操作封装成一个方法, + * 供getDataByRangeIntersection() 和 getAllDataForTaskIdAndTableName()方法调用 + * @param task task实例 + * @param tableName 根表名 + * @param rootTableDataList 查询到的根表数据,注意该List != null && List.size != 0 + */ + private List changeRootTableDataToFeatureList(Task task, String tableName, String geometryFieldName, + List> rootTableDataList, boolean addSelectOrderValue, + Integer destTaskId, String destTableName) + { + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Table table = config.getTables().get(tableName); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String uploadNameFieldName = TableOperationUtil.getUploadNameFieldName(table); + List featureList = new ArrayList<>(); + + for (Map rootTableData : rootTableDataList) + { + Feature feature = new Feature(); + feature.setType(CommonConstant.FEATURE); + feature.setGeometry(JSON.toJavaObject(JSON.parseObject(rootTableData.get(geometryFieldName).toString()), + GeometryType.class)); + Map propertiesMap = new HashMap<>(); + propertiesMap.put("id",rootTableData.get(primaryKey).toString()); + if (rootTableData.containsKey(CommonConstant.FIX_FIELD_REVIEWER) && (Integer)rootTableData.get(CommonConstant.FIX_FIELD_REVIEWER) == -1) + { + propertiesMap.put(CommonConstant.FIX_FIELD_REVIEWER, "无审核人员"); + } + else if (rootTableData.containsKey(CommonConstant.FIX_FIELD_REVIEWER) && (Integer)rootTableData.get(CommonConstant.FIX_FIELD_REVIEWER) != -1) + { + propertiesMap.put(CommonConstant.FIX_FIELD_REVIEWER, userService.findById(Integer.valueOf(rootTableData.get(CommonConstant.FIX_FIELD_REVIEWER).toString())).get().getRealName()); + } + // 另外添加selectOrder属性,判断该数据是否被抽查过,若未被抽查过,赋予selectOrder为0,否则赋予对应值 + if (addSelectOrderValue) + { + List taskSelectIdList = taskSelectIdService.getTaskSelectIdByTaskIdAndTableName(task.getId(), tableName,destTaskId,destTableName); + propertiesMap.put("selectOrder", getSelectOrderById(taskSelectIdList, rootTableData.get(primaryKey).toString())); + Integer maxSelectOrder = taskSelectIdService.getMaxSelectOrder(task.getId(), tableName, destTaskId, destTableName); + propertiesMap.put("selectNum", maxSelectOrder == null ? "0" : maxSelectOrder.toString()); + } + // 添加显示字段 + if (rootTableData.containsKey(uploadNameFieldName)) { + if(CommonConstant.FIX_FIELD_COLLECTOR.equals(uploadNameFieldName)){ + // 把id转成名称 + Optional opUser = userService.findById(Integer.parseInt(rootTableData.get(CommonConstant.FIX_FIELD_COLLECTOR).toString())); + propertiesMap.put("_upload_name", opUser.map(User::getUsername).orElse(null)); + }else{ + propertiesMap.put("_upload_name", rootTableData.get(uploadNameFieldName).toString()); + } + } + feature.setProperties(propertiesMap); + featureList.add(feature); + } + return featureList; + } + + /** + * 判断primaryKey值是否存在于TaskSelectId的selectId属性中,若存在返回对应的selectOrder + */ + private String getSelectOrderById(List taskSelectIdList, String primaryKey) + { + for (TaskSelectId taskSelectId : taskSelectIdList) + { + if (taskSelectId.getSelectId().contains(primaryKey)) + { + return taskSelectId.getSelectOrder().toString(); + } + } + return "0"; + } + //20250730 lxy + @RequestMapping(value = "getSubDataByRangeIntersection", produces = "text/html;charset=UTF-8") + public String getSubDataByRangeIntersection(Integer taskId, String tableName, Integer parentId, Double longitudeMin, Double latitudeMin, + Double longitudeMax, Double latitudeMax){ + + + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()),Config.class).getTables().get(tableName); + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + + String primaryKeyField = TableOperationUtil.getPrimaryKey(table); + String geomField = CheckTableDataUtil.getGeometryFieldName(table); + String uploadNameField = TableOperationUtil.getUploadNameFieldName(table); + + // 构建额外的parentID条件 + String parentIdCondition = parentId != null + ? " AND \"parentID\" = '" + parentId + "'" + : ""; + + String selectSql = String.format( + "SELECT %s, %s FROM %s WHERE ST_Intersects(ST_MakeEnvelope(%f, %f, %f, %f, 4490), st_setsrid(ST_GeomFromGeoJSON(%s), 4490))" + parentIdCondition, + PostgreSqlUtil.transformString(primaryKeyField), + PostgreSqlUtil.transformString(geomField), + tableNameInDb, + longitudeMin, latitudeMin, longitudeMax, latitudeMax, + PostgreSqlUtil.transformString(geomField) + ); + +// String selectSql = MessageFormat.format( +// SqlStringConstant.SELECT_SQL_BY_RANGE_INTERSECTION + parentIdCondition, // 追加条件 +// tableNameInDb, +// PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)), +// PostgreSqlUtil.transformString(CheckTableDataUtil.getGeometryFieldName(table)), +// PostgreSqlUtil.transformString(TableOperationUtil.getUploadNameFieldName(table)), +// longitudeMin, +// latitudeMin, +// longitudeMax, +// latitudeMax +// ); + + List> rootTableDataList = baseService.selectData(selectSql); + if (rootTableDataList == null || rootTableDataList.size() == 0) + { + return ResultMessage.success(null).toString(); + } + else{ + List featureList = changeRootTableDataToFeatureList(task, tableName, CheckTableDataUtil.getGeometryFieldName(table), + rootTableDataList, false,null,null); + return ResultMessage.success(featureList).toStringByDisableCircularReference(); + } + } + + /** + * 获取某任务下某个表中所有数据的ID字段唯一值 + * @param taskId 任务ID + * @param tableName 表名 + * @param userId 用户ID + * @return ID字段的所有唯一值列表 + */ + @RequestMapping(value = "getDistinctIds", produces = "text/html;charset=UTF-8") + public String getDistinctIds(Integer taskId, String tableName, Integer userId) { + // 参数校验 + if (taskId == null || tableName == null || userId == null) { + return ResultMessage.failed("参数不能为空").toString(); + } + + try { + // 获取任务信息 + Task task = taskService.getTaskById(taskId); + if (task == null) { + return ResultMessage.failed("当前任务已删除!").toString(); + } + + // 判断该用户是否在对应的任务中 + if (!OtherUtil.isUserInTask(task, userId, taskUserRoleService)) { + return ResultMessage.failed("您不在该任务中!").toString(); + } + + // 构建表名 + String dbTableName = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + + // 获取主键字段名 + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tablesMap = config.getTables(); + Table table = tablesMap.get(tableName); + + if (table == null) { + return ResultMessage.failed("表不存在").toString(); + } + + String primaryKey = TableOperationUtil.getPrimaryKey(table); + if (primaryKey == null || primaryKey.isEmpty()) { + return ResultMessage.failed("无法获取表的主键字段").toString(); + } + + // 构建查询SQL + String selectDistinctIdsSql = MessageFormat.format( + "SELECT DISTINCT {0} FROM {1} ORDER BY {0}", + PostgreSqlUtil.transformString(primaryKey), + dbTableName + ); + + // 执行查询 + List> resultData = baseService.selectData(selectDistinctIdsSql); + + // 提取ID值 + List idList = new ArrayList<>(); + if (resultData != null && !resultData.isEmpty()) { + for (Map row : resultData) { + Object idValue = row.get(primaryKey); + if (idValue != null) { + if (idValue instanceof Number) { + idList.add(((Number) idValue).longValue()); + } else { + try { + idList.add(Long.parseLong(idValue.toString())); + } catch (NumberFormatException e) { + // 忽略无法转换为Long的值 + } + } + } + } + } + + return ResultMessage.success(idList).toString(); + } catch (Exception e) { + log.error("获取ID唯一值列表失败", e); + return ResultMessage.failed("获取ID唯一值列表失败: " + e.getMessage()).toString(); + } + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/controller/ImportController.java b/src/main/java/cn/edu/whu/boot/collection/controller/ImportController.java new file mode 100644 index 0000000..0229ba4 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/controller/ImportController.java @@ -0,0 +1,457 @@ +package cn.edu.whu.boot.collection.controller; + +import cn.edu.whu.boot.collection.service.ImportService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +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.usermodel.XSSFWorkbook; +import org.geotools.data.FileDataStore; +import org.geotools.data.FileDataStoreFinder; +import org.geotools.data.shapefile.ShapefileDataStore; +import org.geotools.data.shapefile.ShapefileDataStoreFactory; +import org.geotools.data.simple.SimpleFeatureCollection; +import org.geotools.data.simple.SimpleFeatureIterator; +import org.geotools.data.simple.SimpleFeatureSource; +import org.opengis.feature.type.AttributeDescriptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.*; + +/** + * 上传数据的相关接口!!! + */ +@RestController +@RequestMapping("import") +public class ImportController{ + + private final ITaskService taskService; + private final ImportService importService; + + @Autowired + public ImportController(ITaskService taskService, ImportService importService){ + this.taskService = taskService; + this.importService = importService; + } + + /** + * 获取任务下的根表信息 + * @param taskId 任务 id + */ + @RequestMapping(value = "getRootTablesName", produces = "text/html;charset=UTF-8") + public String getRootTablesName(Integer taskId){ + Task task = taskService.getTaskById(taskId); + if(task.getHasCreateTables() == 0){ + return ResultMessage.success(null).toString(); + } + Map tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + return ResultMessage.success(genTableNameList(tables)).toString(); + } + + /** + * 获取任务下的所有表信息 + * @param taskId 任务 id + */ + @RequestMapping(value = "getTablesName", produces = "text/html;charset=UTF-8") + public String getAllTablesName(Integer taskId){ + Task task = taskService.getTaskById(taskId); + if(task.getHasCreateTables() == 0){ + return ResultMessage.success(null).toString(); + } + Map tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables(); + return ResultMessage.success(genTableNameList(tables)).toString(); + } + + /** + * 基于传入的 Map tables 将其按照某个规则转换成 List> + */ + private List> genTableNameList(Map tables){ + List> result = new ArrayList<>(); + if(MapUtils.isNotEmpty(tables)){ + tables.forEach((tableName, table) -> { + Map tempMap = new HashMap<>(); + tempMap.put("tableName", tableName); + tempMap.put("tableChineseName", table.getName()); + result.add(tempMap); + }); + return result; + } + else{ + return null; + } + } + + /** + * 获取任务下的表字段信息,得把关联表排除掉!!! + * @param taskId 任务 id + * @param tableName 表名 + */ + @RequestMapping(value = "getTableFieldsName", produces = "text/html;charset=UTF-8") + public String getTableFieldsName(Integer taskId, String tableName){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + List fieldNameList = new ArrayList<>(); + Map fields = table.getFields(); + fields.forEach((fieldName, field) -> { + if((StringUtils.isBlank(field.getType()) || !CommonConstant.CAMERA.equals(field.getType())) + && !CommonConstant.FIX_FIELD_SET.contains(fieldName) + && StringUtils.isBlank(field.getAssociate()) + && StringUtils.isBlank(field.getCollection())){ + fieldNameList.add(fieldName); + } + }); + return ResultMessage.success(fieldNameList).toString(); + } + + /** + * 获取源任务和目标任务间,表的映射关系 + * @param srcTaskId 源任务 id + * @param destTaskId 目标任务 id + */ + @RequestMapping(value = "getTaskTableMapping", produces = "text/html;charset=UTF-8") + public String getTaskTableMapping(Integer srcTaskId, Integer destTaskId){ + Task srcTask = taskService.getTaskById(srcTaskId); + Task destTask = taskService.getTaskById(destTaskId); + Map srcRootTables = JSON.toJavaObject(JSON.parseObject(srcTask.getConfig()), Config.class).getRootTables(); + Map destRootTables = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables(); + Set destRootTablesNameSet = destRootTables.keySet(); + List> result = new ArrayList<>(); + srcRootTables.forEach((rootTableName, rootTable) -> { + if(destRootTablesNameSet.contains(rootTableName)){ + Map tempMap = new HashMap<>(); + tempMap.put("srcTable", rootTableName); + tempMap.put("destTable", rootTableName); + result.add(tempMap); + } + else{ + Map tempMap = new HashMap<>(); + tempMap.put("srcTable", rootTableName); + tempMap.put("destTable", ""); + result.add(tempMap); + } + }); + return ResultMessage.success(result).toString(); + } + + /** + * 获取源任务和目标任务间,源表和目标表的字段映射关系 + * @param srcTaskId 源任务 id + * @param destTaskId 目标任务 id + * @param srcTableName 源表名 + * @param destTableName 目标表名 + */ + @RequestMapping(value = "getTaskTableFieldMapping", produces = "text/html;charset=UTF-8") + public String getTaskTableFieldMapping(Integer srcTaskId, Integer destTaskId, String srcTableName, String destTableName){ + Task srcTask = taskService.getTaskById(srcTaskId); + Task destTask = taskService.getTaskById(destTaskId); + Table srcRootTable = JSON.toJavaObject(JSON.parseObject(srcTask.getConfig()), Config.class).getRootTables().get(srcTableName); + Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName); + Map srcRootTableFields = srcRootTable.getFields(); + Map destRootTableFields = destRootTable.getFields(); + Set destRootTableFieldNameSet = destRootTableFields.keySet(); + List> result = new ArrayList<>(); + String srcCameraField = TableOperationUtil.getCameraFieldName(srcRootTable); + srcRootTableFields.forEach((rootTableFieldName, rootTableField) -> { + if(!CommonConstant.FIX_FIELD_SET.contains(rootTableFieldName) + && !rootTableFieldName.equals(srcCameraField)){ + addFieldNameToList(result, destRootTableFieldNameSet, rootTableFieldName); + } + }); + return ResultMessage.success(result).toString(); + } + + + /** + * 根据网页端制定好的字段映射信息进行数据迁移 + * @param srcTaskId 源任务 id + * @param destTaskId 目标任务 id + * @param srcTableName 源表名 + * @param destTableName 目标表名 + * @param isSelective 是否抽查 + * @param selectDataNum 抽查数目,注意这是个字符串,如果字符串中带有“%”,说明是按照比例进行抽查!!! + * 注意 % 只能在最后 + * @param whereClause 按照 where 语句抽查 + * @param fieldMapping 字段映射关系 + */ + @RequestMapping(value = "taskTableDataMigration", produces = "text/html;charset=UTF-8") + public String taskTableDataMigration(Integer srcTaskId, Integer destTaskId, String srcTableName, + String destTableName, boolean isSelective, + @RequestParam(required = false) String selectDataNum, + @RequestParam(required = false) String whereClause, + String fieldMapping) throws IOException{ + Task srcTask = taskService.getTaskById(srcTaskId); + Task destTask = taskService.getTaskById(destTaskId); + if(isSelective){ + // 检查 selectDataNum 是否符合要求 + if(selectDataNum.contains("%")){ + if(selectDataNum.indexOf("%") != selectDataNum.length() - 1){ + return new ResultMessage<>(true, "抽查数量不符合要求", 400).toString(); + } + else{ + return importService.taskTableDataInsert(srcTask, destTask, srcTableName, destTableName, 2, + Integer.parseInt(selectDataNum.substring(0, selectDataNum.length() - 1)), whereClause, + fieldMapping).toString(); + } + } + else{ + if(Integer.parseInt(selectDataNum) <= 0 || Integer.parseInt(selectDataNum) > 9999){ + return new ResultMessage<>(true, "抽查数量不符合要求", 400).toString(); + } + else{ + return importService.taskTableDataInsert(srcTask, destTask, srcTableName, destTableName, 1, + Integer.parseInt(selectDataNum), whereClause, fieldMapping).toString(); + } + } + } + else{ + return importService.taskTableDataInsert(srcTask, destTask, srcTableName, destTableName, 0, + 0, null, fieldMapping).toString(); + } + } + + /** + * 获取.xlsx 或.xls文件与目标表的字段映射关系 + * @param destTaskId 目标任务 id + * @param destTableName 目标表名 + * @param file .xlsx 或.xls文件 + */ + @RequestMapping(value = "getFileAndFieldMapping", produces = "text/html;charset=UTF-8") + public String getFileAndFieldMapping(Integer destTaskId, String destTableName, + @RequestParam(name = "file") MultipartFile file) throws IOException{ + Task destTask = taskService.getTaskById(destTaskId); + Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName); + Map destRootTableFields = destRootTable.getFields(); + Set destRootTableFieldNameSet = destRootTableFields.keySet(); + String fileName = file.getOriginalFilename(); + List> result = new ArrayList<>(); + if(fileName.endsWith(".xls") || fileName.endsWith(".xlsx")){ + Workbook workbook = new XSSFWorkbook(file.getInputStream()); + Sheet sheet = workbook.getSheetAt(0); + Row firstRow = sheet.getRow(sheet.getFirstRowNum()); + for(int i = 0; i < firstRow.getLastCellNum(); i++){ + String cellValue = firstRow.getCell(i).toString(); + if(!cellValue.toLowerCase().equals(CommonConstant.FILE_PATH)){ + addFieldNameToList(result, destRootTableFieldNameSet, cellValue); + } + } + return ResultMessage.success(result).toString(); + } + else{ + return new ResultMessage<>(true, "文件格式不支持", 400).toString(); + } + + } + + /** + * 将 .xlsx 或 .xls 文件中数据插入数据库中 + * @param destTaskId 目标任务 id + * @param destTableName 目标表名 + * @param file .xlsx 或.xls文件 + * @param fieldMapping 字段映射关系 + */ + @RequestMapping(value = "fileDataMigration", produces = "text/html;charset=UTF-8") + public String fileDataMigration(Integer destTaskId, String destTableName, + @RequestParam(name = "file") MultipartFile file, String fieldMapping) throws IOException{ + Task destTask = taskService.getTaskById(destTaskId); + String fileName = file.getOriginalFilename(); + if(fileName.endsWith(".xls") || fileName.endsWith(".xlsx")){ + Workbook workbook = new XSSFWorkbook(file.getInputStream()); + Sheet sheet = workbook.getSheetAt(0); + importService.fileDataInsert(destTask, destTableName, sheet, fieldMapping); + return ResultMessage.success(null).toString(); + } + else{ + return new ResultMessage<>(true, "文件格式不支持", 400).toString(); + } + } + + + /** + * 获取 Shapefile 文件与目标表的字段映射关系! + * .shp:存储地理数据的坐标信息。 + * .shx:存储地理数据的位置索引,记录每个地理数据在 shp 文件中的位置,能够快速定位数据。 + * .dbf:存储地理数据的属性信息,以 dBase IV 的数据表格式存储。 + * + * @param destTaskId 目标任务 id + * @param destTableName 目标表 + * @param shp shp文件 + * @param shx shx 文件 + * @param dbf dbf 文件 + */ + @RequestMapping(value = "getShpAndFieldMapping", produces = "text/html;charset=UTF-8") + public String getShpAndFieldMapping(Integer destTaskId, String destTableName, + @RequestParam(name = "shp") MultipartFile shp, + @RequestParam(name = "shx") MultipartFile shx, + @RequestParam(name = "dbf") MultipartFile dbf) throws IOException{ + if(shp.getOriginalFilename().endsWith(".shp") + && shx.getOriginalFilename().endsWith(".shx") + && dbf.getOriginalFilename().endsWith(".dbf")){ + String tempDirPath = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis() + "/"; + File tempDir = new File(tempDirPath); + tempDir.mkdirs(); + File shpFile = new File(tempDirPath + "temp.shp"); + shp.transferTo(shpFile); + File shxFile = new File(tempDirPath + "temp.shx"); + shx.transferTo(shxFile); + File dbfFile = new File(tempDirPath + "temp.dbf"); + dbf.transferTo(dbfFile); + + ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory(); + ShapefileDataStore dataStore = (ShapefileDataStore) factory.createDataStore(shpFile.toURI().toURL()); + List> result = new ArrayList<>(); + Task destTask = taskService.getTaskById(destTaskId); + Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName); + Map destRootTableFields = destRootTable.getFields(); + Set destRootTableFieldNameSet = destRootTableFields.keySet(); + try{ + if(dataStore != null){ + // 确定 ShapeFile 编码 + String shapeFileCoding = OtherUtil.getShpFileCodingByDbf(dbfFile); + if(shapeFileCoding == null){ + throw new RuntimeException(".dbf文件出错,请检查该文件!"); + } + dataStore.setCharset(Charset.forName(shapeFileCoding)); + List attrList = dataStore.getFeatureSource().getSchema().getAttributeDescriptors(); + for(AttributeDescriptor attr : attrList){ + if(!attr.getLocalName().toLowerCase().equals(CommonConstant.FILE_PATH)){ + addFieldNameToList(result, destRootTableFieldNameSet, attr.getLocalName()); + } + } + } + } catch(Exception e){ + e.printStackTrace(); + } finally{ + if(dataStore != null){ + dataStore.dispose(); + } + // 将临时文件夹删除 + if(tempDir.exists()){ + FileUtils.deleteDirectory(tempDir); + } + } + return ResultMessage.success(result).toString(); + } + else{ + return new ResultMessage<>(true, "文件格式不支持", 400).toString(); + } + + } + + /** + * 将 Shapefile 文件中数据插入数据库中! + * @param destTaskId 目标任务 id + * @param destTableName 目标表 + * @param fieldMapping 字段映射关系 + * @param shp shp文件 + * @param shx shx 文件 + * @param dbf dbf 文件 + */ + @RequestMapping(value = "shpDataMigration", produces = "text/html;charset=UTF-8") + public String shpDataMigration(Integer destTaskId, String destTableName,String fieldMapping, + @RequestParam(name = "shp") MultipartFile shp, + @RequestParam(name = "shx") MultipartFile shx, + @RequestParam(name = "dbf") MultipartFile dbf) throws IOException{ + if(shp.getOriginalFilename().endsWith(".shp") + && shx.getOriginalFilename().endsWith(".shx") + && dbf.getOriginalFilename().endsWith(".dbf")){ + String tempDirPath = CommonConstant.TEMP_FILE_PATHNAME + "/" + System.currentTimeMillis() + "/"; + File tempDir = new File(tempDirPath); + tempDir.mkdirs(); + File shpFile = new File(tempDirPath + "temp.shp"); + shp.transferTo(shpFile); + File shxFile = new File(tempDirPath + "temp.shx"); + shx.transferTo(shxFile); + File dbfFile = new File(tempDirPath + "temp.dbf"); + dbf.transferTo(dbfFile); + + //通过store获取featureCollection + FileDataStore store = FileDataStoreFinder.getDataStore(shpFile); + // 确定 ShapeFile 编码 + String shapeFileCoding = OtherUtil.getShpFileCodingByDbf(dbfFile); + if(shapeFileCoding == null){ + throw new RuntimeException(".dbf文件出错,请检查该文件!"); + } + ((ShapefileDataStore) store).setCharset(Charset.forName(shapeFileCoding)); + SimpleFeatureSource featureSource = store.getFeatureSource(); + SimpleFeatureCollection simpleFeatureCollection = featureSource.getFeatures(); + SimpleFeatureIterator itertor = simpleFeatureCollection.features(); + Task destTask = taskService.getTaskById(destTaskId); + try{ + importService.shpDataInsert(destTask, destTableName, itertor, fieldMapping, + getMediaFilePathNameFromShp(shpFile)); + } + catch(Exception e){ + e.printStackTrace(); + return ResultMessage.failed(e.getMessage()).toString(); + } + finally{ + // 将 SimpleFeatureIterator 和ShapefileDataStore关闭,否则后面删除文件夹会提示shp被占用 + itertor.close(); + store.dispose(); + + // 将临时文件夹删除 + if(tempDir.exists()){ + FileUtils.deleteDirectory(tempDir); + } + } + return ResultMessage.success(null).toString(); + } + else{ + return new ResultMessage<>(true, "文件格式不支持", 400).toString(); + } + } + + /** + * 根据源字段与目标字段生成 List> + */ + private void addFieldNameToList(List> result, Set nameSet, String name){ + if(nameSet.contains(name)){ + Map tempMap = new HashMap<>(); + tempMap.put("srcTableField", name); + tempMap.put("destTableField", name); + result.add(tempMap); + } + else{ + Map tempMap = new HashMap<>(); + tempMap.put("srcTableField", name); + tempMap.put("destTableField", ""); + result.add(tempMap); + } + } + + /** + * 从 shp 中获取 filePath 字段名(如果存在的话) + */ + private String getMediaFilePathNameFromShp(File shpFile) throws IOException{ + ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory(); + ShapefileDataStore dataStore = (ShapefileDataStore) factory.createDataStore(shpFile.toURI().toURL()); + if(dataStore != null){ + List attrList = dataStore.getFeatureSource().getSchema().getAttributeDescriptors(); + for(AttributeDescriptor attr : attrList){ + if(attr.getLocalName().toLowerCase().equals(CommonConstant.FILE_PATH)){ + return attr.getLocalName(); + } + } + } + return null; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/domain/ExportMediaRecord.java b/src/main/java/cn/edu/whu/boot/collection/domain/ExportMediaRecord.java new file mode 100644 index 0000000..b2757ad --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/domain/ExportMediaRecord.java @@ -0,0 +1,173 @@ +package cn.edu.whu.boot.collection.domain; + +public class ExportMediaRecord { + private long mediaID;//多媒体ID + + private long ID;//多媒体对应的父表ID + + private float azimuth;//方向角 + + private int satellites;//卫星数 + + private double longitude;//经度 + + private double latitude;//纬度 + + private double altitude;//海拔 + + private float accuracy;//精度 + + private float cameraAngle;//摄像头方向角 + + private float cameraPitch;//摄像头俯仰角 + + private float cameraRoll;//摄像头俯仰角 + + private String method;//定位方式 + + private String time;//拍摄时间 + + private float focalLength;//焦距 + + private int type;//多媒体类型 + + private String mediaPath; + + private int version; + + public long getMediaID() { + return mediaID; + } + + public void setMediaID(long mediaID) { + this.mediaID = mediaID; + } + + public long getID() { + return ID; + } + + public void setID(long ID) { + this.ID = ID; + } + + public float getAzimuth() { + return azimuth; + } + + public void setAzimuth(float azimuth) { + this.azimuth = azimuth; + } + + public int getSatellites() { + return satellites; + } + + public void setSatellites(int satellites) { + this.satellites = satellites; + } + + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + + public double getLatitude() { + return latitude; + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public double getAltitude() { + return altitude; + } + + public void setAltitude(double altitude) { + this.altitude = altitude; + } + + public float getAccuracy() { + return accuracy; + } + + public void setAccuracy(float accuracy) { + this.accuracy = accuracy; + } + + public float getCameraAngle() { + return cameraAngle; + } + + public void setCameraAngle(float cameraAngle) { + this.cameraAngle = cameraAngle; + } + + public float getCameraPitch() { + return cameraPitch; + } + + public void setCameraPitch(float cameraPitch) { + this.cameraPitch = cameraPitch; + } + + public float getCameraRoll() { + return cameraRoll; + } + + public void setCameraRoll(float cameraRoll) { + this.cameraRoll = cameraRoll; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public float getFocalLength() { + return focalLength; + } + + public void setFocalLength(float focalLength) { + this.focalLength = focalLength; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getMediaPath() { + return mediaPath; + } + + public void setMediaPath(String mediaPath) { + this.mediaPath = mediaPath; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/domain/ExportUserRecord.java b/src/main/java/cn/edu/whu/boot/collection/domain/ExportUserRecord.java new file mode 100644 index 0000000..41fe41d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/domain/ExportUserRecord.java @@ -0,0 +1,31 @@ +package cn.edu.whu.boot.collection.domain; + +public class ExportUserRecord { + private Integer id; + + private String name; + + public ExportUserRecord() { + } + + public ExportUserRecord(Integer id, String name) { + this.id = id; + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/domain/MultimediaItem.java b/src/main/java/cn/edu/whu/boot/collection/domain/MultimediaItem.java new file mode 100644 index 0000000..0679e49 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/domain/MultimediaItem.java @@ -0,0 +1,225 @@ +package cn.edu.whu.boot.collection.domain; + +import java.io.Serializable; + +/** + * Description: + * Author:CXJ + * Date: 2019-04-27 12:29 + * Remark: + */ +public class MultimediaItem implements Serializable{ + + private static final long serialVersionUID = 6456781405975280523L; + + private long mediaID;//多媒体ID + private long ID;//多媒体对应的父表ID + private String file;//文件名 + private float azimuth;//方向角 + private int satellites;//卫星数 + private double longitude;//经度 + private double latitude;//纬度 + private double altitude;//海拔 + private float accuracy;//精度 + private float cameraAngle;//摄像头方向角 + private float cameraPitch;//摄像头俯仰角 + private float cameraRoll;//摄像头俯仰角 + private String method;//定位方式 + private String time;//拍摄时间 + private float focalLength;//焦距 + private int type;//多媒体类型 + private String mediaPath; + + private String mediaTableName; + private int version; + + public long getMediaID() + { + return mediaID; + } + + public void setMediaID(long mediaID) + { + this.mediaID = mediaID; + } + + public long getID() + { + return ID; + } + + public void setID(long ID) + { + this.ID = ID; + } + + public String getFile() + { + return file; + } + + public void setFile(String file) + { + this.file = file; + } + + public float getAzimuth() + { + return azimuth; + } + + public void setAzimuth(float azimuth) + { + this.azimuth = azimuth; + } + + public int getSatellites() + { + return satellites; + } + + public void setSatellites(int satellites) + { + this.satellites = satellites; + } + + public double getLongitude() + { + return longitude; + } + + public void setLongitude(double longitude) + { + this.longitude = longitude; + } + + public double getLatitude() + { + return latitude; + } + + public void setLatitude(double latitude) + { + this.latitude = latitude; + } + + public double getAltitude() + { + return altitude; + } + + public void setAltitude(double altitude) + { + this.altitude = altitude; + } + + public float getAccuracy() + { + return accuracy; + } + + public void setAccuracy(float accuracy) + { + this.accuracy = accuracy; + } + + public float getCameraAngle() + { + return cameraAngle; + } + + public void setCameraAngle(float cameraAngle) + { + this.cameraAngle = cameraAngle; + } + + public float getCameraPitch() + { + return cameraPitch; + } + + public void setCameraPitch(float cameraPitch) + { + this.cameraPitch = cameraPitch; + } + + public float getCameraRoll() + { + return cameraRoll; + } + + public void setCameraRoll(float cameraRoll) + { + this.cameraRoll = cameraRoll; + } + + public String getMethod() + { + return method; + } + + public void setMethod(String method) + { + this.method = method; + } + + public String getTime() + { + return time; + } + + public void setTime(String time) + { + this.time = time; + } + + public float getFocalLength() + { + return focalLength; + } + + public void setFocalLength(float focalLength) + { + this.focalLength = focalLength; + } + + public int getType() + { + return type; + } + + public void setType(int type) + { + this.type = type; + } + + public String getMediaPath() + { + return mediaPath; + } + + public void setMediaPath(String mediaPath) + { + this.mediaPath = mediaPath; + } + + public String getMediaTableName() + { + return mediaTableName; + } + + public void setMediaTableName(String mediaTableName) + { + this.mediaTableName = mediaTableName; + } + + public int getVersion() + { + return version; + } + + public void setVersion(int version) + { + this.version = version; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/domain/TaskSelectId.java b/src/main/java/cn/edu/whu/boot/collection/domain/TaskSelectId.java new file mode 100644 index 0000000..302084c --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/domain/TaskSelectId.java @@ -0,0 +1,89 @@ +package cn.edu.whu.boot.collection.domain; + +import java.io.Serializable; + +/** + * 对应Postgresql 数据库public模式的task_select_id表,记录已经抽查的数据id + */ +public class TaskSelectId implements Serializable { + + private static final long serialVersionUID = -5478907386502727663L; + + private Long id; + private Integer srcTaskId; + private String srcTableName; + private Integer selectOrder; + private String selectId; + private Integer destTaskId; + private String destTableName; + + public Long getId () + { + return id; + } + + public void setId (Long id) + { + this.id = id; + } + + public Integer getSrcTaskId () + { + return srcTaskId; + } + + public void setSrcTaskId (Integer srcTaskId) + { + this.srcTaskId = srcTaskId; + } + + public String getSrcTableName () + { + return srcTableName; + } + + public void setSrcTableName (String srcTableName) + { + this.srcTableName = srcTableName; + } + + public Integer getDestTaskId () + { + return destTaskId; + } + + public void setDestTaskId (Integer destTaskId) + { + this.destTaskId = destTaskId; + } + + public String getDestTableName () + { + return destTableName; + } + + public void setDestTableName (String destTableName) + { + this.destTableName = destTableName; + } + + public Integer getSelectOrder () + { + return selectOrder; + } + + public void setSelectOrder (Integer selectOrder) + { + this.selectOrder = selectOrder; + } + + public String getSelectId () + { + return selectId; + } + + public void setSelectId (String selectId) + { + this.selectId = selectId; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/dto/CompositeKey.java b/src/main/java/cn/edu/whu/boot/collection/dto/CompositeKey.java new file mode 100644 index 0000000..2d781b3 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/dto/CompositeKey.java @@ -0,0 +1,44 @@ +package cn.edu.whu.boot.collection.dto; + + +import com.alibaba.fastjson.JSON; + +import java.io.Serializable; + +/** + * 联合主键类,主要是方便返回数据给移动端 + */ +public class CompositeKey implements Serializable{ + + private static final long serialVersionUID = 6604820802345592864L; + + /** + * 数据的主键 + */ + private Long polygonId; + /** + * 数据的版本 + */ + private int version; + + public Long getPolygonId(){ + return polygonId; + } + + public void setPolygonId(Long polygonId){ + this.polygonId = polygonId; + } + + public int getVersion(){ + return version; + } + + public void setVersion(int version){ + this.version = version; + } + + @Override + public String toString(){ + return JSON.toJSONString(this); + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/dto/Feature.java b/src/main/java/cn/edu/whu/boot/collection/dto/Feature.java new file mode 100644 index 0000000..a4412ad --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/dto/Feature.java @@ -0,0 +1,47 @@ +package cn.edu.whu.boot.collection.dto; + +import java.io.Serializable; + +/** + * 定义一个 Feature 类,主要是方便返回数据给决策管理前端 + */ +public class Feature implements Serializable{ + + private static final long serialVersionUID = 6787141434245062521L; + + private String type; + + private GeometryType geometry; + + private Object properties; + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + public GeometryType getGeometry() + { + return geometry; + } + + public void setGeometry(GeometryType geometry) + { + this.geometry = geometry; + } + + public Object getProperties() + { + return properties; + } + + public void setProperties(Object properties) + { + this.properties = properties; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/dto/GeometryType.java b/src/main/java/cn/edu/whu/boot/collection/dto/GeometryType.java new file mode 100644 index 0000000..131eeb8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/dto/GeometryType.java @@ -0,0 +1,36 @@ +package cn.edu.whu.boot.collection.dto; + + +import java.io.Serializable; + +/** + * 定义一个 GeometryType 类型,与 Feature 类使用用于标记不同 geometry 类型 + */ +public class GeometryType implements Serializable { + + private static final long serialVersionUID = 6477009511765851104L; + + private String type; + + private Object coordinates; + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + public Object getCoordinates() + { + return coordinates; + } + + public void setCoordinates(Object coordinates) + { + this.coordinates = coordinates; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/dto/SqlEnity.java b/src/main/java/cn/edu/whu/boot/collection/dto/SqlEnity.java new file mode 100644 index 0000000..0da2c90 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/dto/SqlEnity.java @@ -0,0 +1,44 @@ +package cn.edu.whu.boot.collection.dto; + +/** + * 封装sqlString的类,因为不涉及具体的JavaBean,通过该类获取插入记录的自增长id号 + */ +public class SqlEnity { + + private Long id; + private String sql; + private String primaryKeySeq; + + public SqlEnity() + {} + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getSql() + { + return sql; + } + + public void setSql(String sql) + { + this.sql = sql; + } + + public String getPrimaryKeySeq() + { + return primaryKeySeq; + } + + public void setPrimaryKeySeq(String primaryKeySeq) + { + this.primaryKeySeq = primaryKeySeq; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/dto/WebLog.java b/src/main/java/cn/edu/whu/boot/collection/dto/WebLog.java new file mode 100644 index 0000000..7f2c2b1 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/dto/WebLog.java @@ -0,0 +1,149 @@ +package cn.edu.whu.boot.collection.dto; + +/** + * Controller 层的日志封装类 + */ +public class WebLog { + /** + * 操作描述 + */ + private String description; + + /** + * 操作用户 + */ + private String username; + + /** + * 操作时间 + */ + private Long startTime; + + /** + * 消耗时间 + */ + private Integer spendTime; + + /** + * 根路径 + */ + private String basePath; + + /** + * URI + */ + private String uri; + + /** + * URL + */ + private String url; + + /** + * 请求类型 + */ + private String method; + + /** + * IP地址 + */ + private String ip; + + /** + * 请求参数 + */ + private Object parameter; + + /** + * 请求返回的结果 + */ + private Object result; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Long getStartTime() { + return startTime; + } + + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + + public Integer getSpendTime() { + return spendTime; + } + + public void setSpendTime(Integer spendTime) { + this.spendTime = spendTime; + } + + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Object getParameter() { + return parameter; + } + + public void setParameter(Object parameter) { + this.parameter = parameter; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/mapper/BaseMapper.java b/src/main/java/cn/edu/whu/boot/collection/mapper/BaseMapper.java new file mode 100644 index 0000000..d77cba5 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/mapper/BaseMapper.java @@ -0,0 +1,65 @@ +package cn.edu.whu.boot.collection.mapper; + +import cn.edu.whu.boot.collection.dto.SqlEnity; +import com.github.pagehelper.Page; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; + +/** + * 插入数据字段不固定,所以定义一个基础 Mapper 接口 + */ +@Repository +public interface BaseMapper { + + Integer insertSql(@Param("insertSql") String insertSql); + + Integer insertSqlEnity(@Param("sqlEnity") SqlEnity sqlEnity); + + Integer getVersionByPolygonId(@Param("tableName") String tableName , @Param("primaryKeyName") String primaryKeyName , + @Param("primaryKeyValue") Long primaryKeyValue); + + List> selectData(@Param("selectSql") String selectSql); + + Integer getUserWorkRole(@Param("taskId") Integer taskId , @Param("userId") Integer userId); + + List> getNotPassDataId(@Param("tableNameInDb") String tableNameInDb , + @Param("primaryKey") String primaryKey , @Param("userId") Integer userId); + Long getStatisticDataNum(@Param("tableNameInDb") String tableNameInDb, @Param("geometryName")String geometryName, + @Param("geoJson")String geoJson); + + Long getDataCount(@Param("tableNameInDb") String tableNameInDb); + + Long getHasCollectAndPatrolDataCount(@Param("tableNameInDb") String tableNameInDb); + + List> getDataCountAndTimeByUser(@Param("tableNameInDb") String tableNameInDb, + @Param("userId") Integer userId); + List> getAllFuzzySearchData(@Param("tableNameInDb") String tableNameInDb, + @Param("fieldNameInDB") String fieldNameInDB, + @Param("searchKey") String searchKey); + Page> getAllFuzzySearchDataCenterPoint(@Param("tableNameInDb") String tableNameInDb, + @Param("fieldNameInDB") String fieldNameInDB, + @Param("geometryFieldNameInDB") String geometryFieldNameInDB, + @Param("searchKey") String searchKey); + + List> randomSelectDataIdNotInList(@Param("tableNameInDb") String tableNameInDb, + @Param("primaryKey") String primaryKey, + @Param("selectIdList") List selectIdList, + @Param("selectDataNum") Integer selectDataNum, + @Param("whereClause") String whereClause); + + List getIdsByReviewer(@Param("tableNameInDb")String tableNameInDb, @Param("reviewerId")int reviewerId, + @Param("primaryKey") String primaryKey); + + Integer getReviewerByDataId(@Param("tableNameInDb")String tableNameInDb, @Param("primaryKey") String primaryKey, + @Param("dataId")int dataId); + /** + * 查询指定表的所有字段名 + * @param tableName 表名 + * @return 字段名列表 + */ + List selectSingleColumn(@Param("databaseName") String databaseName, + @Param("tableName") String tableName); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/mapper/MultimediaMapper.java b/src/main/java/cn/edu/whu/boot/collection/mapper/MultimediaMapper.java new file mode 100644 index 0000000..99b1960 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/mapper/MultimediaMapper.java @@ -0,0 +1,30 @@ +package cn.edu.whu.boot.collection.mapper; + +import cn.edu.whu.boot.collection.domain.ExportMediaRecord; +import cn.edu.whu.boot.collection.domain.MultimediaItem; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Description: + * Author:CXJ + * Date: 2019-04-27 17:32 + * Remark: + */ +@Repository +public interface MultimediaMapper { + + Integer insertMultiMedia(MultimediaItem media); + + Integer deleteMulitMedia(@Param("mediaTableName") String mediaTableName , @Param("polygonId") Long polygonId); + + Integer deleteMulitMediaGreaterThanVersion(@Param("mediaTableName") String mediaTableName , @Param("polygonId") Long polygonId , @Param("version") int versionCode); + + List selectMultiMedia(@Param("mediaTableName") String mediaTableName , @Param("polygonId") Long polygonId); + + List selectHistoryMultiMedia(@Param("mediaTableName") String mediaTableName, @Param("polygonId") Long polygonId, @Param("version") int versionCode); + + List selectByTableName(@Param("tableName") String tableName); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/mapper/SearchPageMapper.java b/src/main/java/cn/edu/whu/boot/collection/mapper/SearchPageMapper.java new file mode 100644 index 0000000..b64315e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/mapper/SearchPageMapper.java @@ -0,0 +1,26 @@ +package cn.edu.whu.boot.collection.mapper; + +import com.github.pagehelper.Page; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.Map; + +@Repository +public interface SearchPageMapper { + + Page> getPageDataByStatus(@Param("tableNameInDB") String tableNameInDB, + @Param("status") int status); + + Page> getUncheckedPageData(@Param("tableNameInDB") String tableNameInDB); + + + Page> getPageDataByFuzzySearch(@Param("tableNameInDB") String tableNameInDB, + @Param("fieldNameInDB") String fieldNameInDB, + @Param("searchKey") String searchKey); + + Page> getUncheckedPageDataByWorker(@Param("tableNameInDB") String tableNameInDB, @Param("workerId") Integer workerId); + Page> getPageDataByWorkerNoStatus(@Param("tableNameInDB") String tableNameInDb); + + Page> getPageDataByStatusAndWorker(@Param("table") String tableNameInDB, @Param("status") int status, @Param("workerId") Integer workerId); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/mapper/TaskSelectIdMapper.java b/src/main/java/cn/edu/whu/boot/collection/mapper/TaskSelectIdMapper.java new file mode 100644 index 0000000..d0cc66e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/mapper/TaskSelectIdMapper.java @@ -0,0 +1,21 @@ +package cn.edu.whu.boot.collection.mapper; + +import cn.edu.whu.boot.collection.domain.TaskSelectId; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TaskSelectIdMapper { + + Integer insert(TaskSelectId taskSelectId); + + Integer delete (Integer taskId); + + List getTaskSelectIdByTaskIdAndTableName (@Param("srcTaskId") Integer srcTaskId, @Param("srcTableName")String srcTableName, + @Param("destTaskId") Integer destTaskId, @Param("destTableName")String destTableName); + + Integer getMaxSelectOrder(@Param("srcTaskId") Integer srcTaskId, @Param("srcTableName")String srcTableName, + @Param("destTaskId") Integer destTaskId, @Param("destTableName")String destTableName); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/mapper/UpdateMapper.java b/src/main/java/cn/edu/whu/boot/collection/mapper/UpdateMapper.java new file mode 100644 index 0000000..b4badf6 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/mapper/UpdateMapper.java @@ -0,0 +1,27 @@ +package cn.edu.whu.boot.collection.mapper; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface UpdateMapper { + + void updateStatus(@Param("tableName") String tableName , @Param("primaryKey") String primaryKey , + @Param("polygonId") Long polygonId , @Param("status") int status, + @Param("reason") String reason); + + Integer updateDataReviewer(@Param("tableName") String tableName , @Param("primaryKey") String primaryKey , + @Param("polygonId") Long polygonId , @Param("reviewer") Integer reviewer); + + void updateDataReviewerAndStatus(@Param("tableName") String tableName , @Param("primaryKey") String primaryKey , + @Param("polygonId") Long polygonId , @Param("reviewer") Integer reviewer, + @Param("status") int status); + + Integer updateSql(@Param("updateSql") String updateSql); + + Integer delete(@Param("deleteSql") String deleteSql); + + Integer getMaxId(@Param("column") String column,@Param("tableName") String tableName); + + void updatePrimaryKey(@Param("seqName")String seqName, @Param("primaryKey") int primaryKey); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/ExportService.java b/src/main/java/cn/edu/whu/boot/collection/service/ExportService.java new file mode 100644 index 0000000..3564749 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/ExportService.java @@ -0,0 +1,10 @@ +package cn.edu.whu.boot.collection.service; + +import java.io.File; +import java.util.Optional; + +public interface ExportService { + Optional exportMediaTable(int taskId, String tableName); + + Optional exportUsers(int taskId); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/ExportWriterService.java b/src/main/java/cn/edu/whu/boot/collection/service/ExportWriterService.java new file mode 100644 index 0000000..d77838a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/ExportWriterService.java @@ -0,0 +1,9 @@ +package cn.edu.whu.boot.collection.service; + +import java.io.File; +import java.util.Collection; +import java.util.Optional; + +public interface ExportWriterService { + Optional writeToFile(Collection values); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/IBaseService.java b/src/main/java/cn/edu/whu/boot/collection/service/IBaseService.java new file mode 100644 index 0000000..64e7ec8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/IBaseService.java @@ -0,0 +1,170 @@ +package cn.edu.whu.boot.collection.service; + +import cn.edu.whu.boot.collection.dto.SqlEnity; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSONArray; +import com.github.pagehelper.Page; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * 这个接口也没有设计好,里面的方法太多了,后面也没办法优化! + * 方法的作用看具体的方法注释!!! + */ +public interface IBaseService { + + /** + * 插入数据方法,sqlEnity是封装的实体类用于获取主键Id + */ + Long insertSqlEnity(SqlEnity sqlEnity); + + /** + * 插入数据方法,sqlString是插入数据的Sql + */ + String insertSqlString(String sqlString); + + /** + * 根据updateSql进行数据更新 + */ + String updateSqlString(String sqlString); + + /** + * 根据deleteSql进行数据删除 + */ + String delete(String deleteSql); + + /** + * 根据表名获取主键id对应的version + */ + Integer getVersionByLongId(String tableName , String primaryKeyName , Long primaryKeyValue); + + /** + * 根据selectSql进行数据获取,结果将一条记录转换成Map + * key 为字段名, value 为字段值 + */ + List> selectData(String selectSql); + + /** + * 获取某任务下,某个userId对应的用户是采集人员还是审核人员 + */ + Integer getUserWorkRole(Integer taskId , Integer userId); + + /** + * 因为涉及到多个表的操作,为满足数据库ACID特性,将插入数据的方法全部放在service类中封装成一个方法 + * 然后使用@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)注解方法 + */ + Long insertData(Task task , Table table , int userId , JSONArray multimediaItemJsonArray , MultipartFile file); + + /** + * 更新复核数据 + */ + Long updateRecheckData(Task task , Table table , int userId , JSONArray multimediaItemJsonArray, + Long polygonIdFromAndroid , MultipartFile file) throws Exception; + + /** + * 回退数据至某个版本 + */ + String rollBackDataForVersion(Task task , Table table , String updateSqlForRootTable , Long polygonId , int versionId) throws Exception; + + /** + * 根据数据自动分配的结果,更新记录的reviewer字段 + */ + String updateRootTableDataForReviewer(Task task , Map> reviewerInfo); + + /** + * 更新数据的 status 字段值,其中 status 值有: + * -1 审核未通过 + * 0 已分配,未审核(经过韦瀚植的自动分配) + * 1 已采集,未审核 + * 2 已审核 + */ + void updateTableStatus(String tableName , String primaryKey , Long polygonId , int status, + String reason); + + /** + * 更新数据的reviewer字段值 + */ + String updateDataReviewer(String tableName , String primaryKey , Long polygonId , Integer reviewer); + + /** + * 获取未通过数据的id 及未通过原因 + */ + List> getNotPassDataId(String tableNameInDB , String primaryKey , Integer userId); + + /** + * 统计GeoHash范围内的数据个数 + */ + Long getStatisticDataNumByGeoJson(String tableName, String geometryName, String geoJson); + + /** + * 统计表内的所有数据个数:status = -1, 0, 1, 2, 都会被统计 + */ + Long getDataCount(String tableName); + + /** + * 统计表内的已经采集或者巡查的数据个数,status = -1, 1, 2, 会被统计,也就是说 0 不会被统计进去 + */ + Long getHasCollectAndPatrolDataCount(String tableName); + + /** + * 统计表内的某 user 采集或者巡查数据的数量按照日期分组 + */ + List> getDataCountAndTimeByUser(String tableName, Integer userId); + + /** + * 根据searchKey模糊搜索全部匹配数据 + */ + List> getAllFuzzySearchData(String tableNameInDB, String fieldNameInDB, String searchKey); + + /** + * 按页查询:根据searchKey模糊搜索,该接口用于搜索任务位置,所以获取坐标是数据的中心点 + */ + Page> getAllFuzzySearchDataCenterPoint(String tableNameInDB, String fieldNameInDB, String geometryFieldNameInDB, + String searchKey); + + /** + * 从表中抽取主键不在selectIdList中的前selectDataNum(数据按照primaryKey升序排序) + */ + List> randomSelectDataIdNotInList(String tableNameInDB, String primaryKey, List selectIdList, Integer selectDataNum, String whereClause); + + /** + * 获取某个任务的某个表下,审核员为 reviewerId 的所有数据的主键 + * @param taskId 任务 id + * @param tableName 表名 + * @param reviewerId 审核员 id + */ + List getIdsByReviewer(int taskId, String tableName, int reviewerId); + + /** + * 获取某条数据对应的审核人员 id ,如果返回 -1, 说明这条数据没有审核人员 + * @param taskId 任务 id + * @param tableName 表名 + * @param dataId 数据主键 id + */ + Integer getReviewerByDataId(int taskId, String tableName, int dataId); + + List getTableColumns(String databaseName, String tableName); + + /** + * 返回某任务,某个区域下的所有表的数据的主键和空间字段 + * @param taskId 任务 id + * @param geohash geohash 字符串 + */ + Map> getIdAndGeojsonByGeohash(int taskId, String geohash); + +// /** +// * 执行 SQL 查询,返回单列数据 +// * @param sql 查询语句(SQL 语句) +// * @param params SQL 参数(可选) +// * @return List 结果列表(只包含第一列数据) +// */ + + + void encapPhotoInTable(Map data, Integer taskId, int userId); + void decapPhotoInTable(Map data); + +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/IMultimediaService.java b/src/main/java/cn/edu/whu/boot/collection/service/IMultimediaService.java new file mode 100644 index 0000000..0fea935 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/IMultimediaService.java @@ -0,0 +1,36 @@ +package cn.edu.whu.boot.collection.service; + +import cn.edu.whu.boot.collection.domain.ExportMediaRecord; +import cn.edu.whu.boot.collection.domain.MultimediaItem; + +import java.util.List; + +public interface IMultimediaService { + + /** + * 插入多媒体数据 + */ + String insertMultiMedia(MultimediaItem media); + + /** + * 删除多媒体数据 + */ + String deleteMultiMedia(String mediaTableName , Long polygonId); + + /** + * 删除历史多媒体表中大于等于某版本号的数据, + */ + String deleteMulitMediaGreaterThanVersion(String mediaTableName , Long polygonId , int version); + + /** + * 获取多媒体数据,针对于根表 + */ + List selectMultiMedia(String mediaTableName , Long polygonId); + + /** + * 获取多媒体数据,针对于历史表,故多出versionCode参数 + */ + List selectHistoryMultiMedia(String mediaTableName , Long polygonId , int versionCode); + + List selectByTaskIdAndTableName(int taskId, String tableName); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/ISearchPageService.java b/src/main/java/cn/edu/whu/boot/collection/service/ISearchPageService.java new file mode 100644 index 0000000..73e8a89 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/ISearchPageService.java @@ -0,0 +1,16 @@ +package cn.edu.whu.boot.collection.service; + +import com.github.pagehelper.Page; + +import java.util.Map; + +public interface ISearchPageService { + + Page> getPageDataByStatus(String tableNameInDB, int status); + + Page> getPageDataByWorkerAndStatus(String tableNameInDB, Integer workerId, int status); + + Page> getPageDataByFuzzySearch(String tableNameInDB, String fieldNameInDB, String searchKey); + Page> getPageDataByWorkerNoStatus(String tableNameInDb); + +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/ITaskSelectIdService.java b/src/main/java/cn/edu/whu/boot/collection/service/ITaskSelectIdService.java new file mode 100644 index 0000000..fa62bac --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/ITaskSelectIdService.java @@ -0,0 +1,28 @@ +package cn.edu.whu.boot.collection.service; + +import cn.edu.whu.boot.collection.domain.TaskSelectId; + +import java.util.List; + +public interface ITaskSelectIdService { + + /** + * 根据srcTaskId ,srcTableName,destTaskId ,destTableName 获取TaskSelectId + */ + List getTaskSelectIdByTaskIdAndTableName (Integer srcTaskId, String srcTableName, + Integer destTaskId, String destTableName); + + /** + * 根据srcTaskId 和 srcTableName 获取最大的selectOrder + */ + Integer getMaxSelectOrder(Integer srcTaskId, String srcTableName, + Integer destTaskId, String destTableName); + + /** + * 插入TaskSelectId + */ + String insertTaskSelectId(TaskSelectId taskSelectId); + + + void delete (Integer taskId); +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/ImportService.java b/src/main/java/cn/edu/whu/boot/collection/service/ImportService.java new file mode 100644 index 0000000..3ac736d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/ImportService.java @@ -0,0 +1,32 @@ +package cn.edu.whu.boot.collection.service; + +import cn.edu.whu.boot.allocation.exceptions.InvalidShapefileException; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.xml.domain.Task; +import org.locationtech.jts.io.ParseException; +import org.apache.poi.ss.usermodel.Sheet; +import org.geotools.data.simple.SimpleFeatureIterator; + + +import java.io.IOException; + +public interface ImportService { + + /** + * 将表中数据迁入到另一个表中,放在一个方法中保持 ACID 特性 + * @param selectType 0 表示不抽查,1 表示抽查,selectDataNum 是抽查数目,2 表示抽查,selectDataNum 是个抽查比例 + */ + ResultMessage taskTableDataInsert (Task srcTask, Task destTask, String srcTableName, String destTableName, + int selectType, int selectDataNum, String whereClause, String fieldMapping) throws IOException; + + /** + * 将.xlsx或.xls的数据,即Sheet迁入到另一个表中,放在一个方法中保持ACID特性 + */ + void fileDataInsert (Task destTask, String destTableName, Sheet sheet, String fieldMapping) throws IOException; + + /** + * 将shp数据迁入到另一个表中,放在一个方法中保持ACID特性 + */ + void shpDataInsert (Task destTask, String destTableName, SimpleFeatureIterator itertor, String fieldMapping, + String mediaFilePath) throws IOException, ParseException, InvalidShapefileException; +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/BaseServiceImpl.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/BaseServiceImpl.java new file mode 100644 index 0000000..140d2b1 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/BaseServiceImpl.java @@ -0,0 +1,935 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.allocation.services.TaskCellDataService; +import cn.edu.whu.boot.allocation.services.TaskUserCellService; +import cn.edu.whu.boot.collection.domain.MultimediaItem; +import cn.edu.whu.boot.collection.dto.SqlEnity; +import cn.edu.whu.boot.collection.mapper.BaseMapper; +import cn.edu.whu.boot.collection.mapper.UpdateMapper; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.collection.service.IMultimediaService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.collection.StoreMediaFileUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil; +import cn.edu.whu.boot.common.utils.xml.GenerateSqlUtil; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.Page; +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.MessageFormat; +import java.util.*; + +@Service +public class BaseServiceImpl implements IBaseService{ + + private final BaseMapper baseMapper; + private final UpdateMapper updateMapper; + private final IMultimediaService multimediaService; + private final ITaskService taskService; + private final TaskCellDataService taskCellDataService; + private final TaskUserCellService taskUserCellService; + private final CacheService cacheService; + + @Value("${MediaPath}") + private String mediaPath; + + @Value("${HistoryMediaPath}") + private String historyMediaPath; + + private static Logger logger = LoggerFactory.getLogger(IBaseService.class); + + @Autowired + public BaseServiceImpl(BaseMapper baseMapper, UpdateMapper updateMapper, IMultimediaService multimediaService, + ITaskService taskService, TaskCellDataService taskCellDataService, TaskUserCellService taskUserCellService, CacheService cacheService){ + this.baseMapper = baseMapper; + this.updateMapper = updateMapper; + this.multimediaService = multimediaService; + this.taskService = taskService; + this.taskCellDataService = taskCellDataService; + this.taskUserCellService = taskUserCellService; + this.cacheService = cacheService; + } + + // 返回的结果为插入记录的自增ID号 + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Long insertSqlEnity(SqlEnity sqlEnity){ + int result = baseMapper.insertSqlEnity(sqlEnity); + if(result == 1){ + return sqlEnity.getId(); + } + else{ + return null; + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String insertSqlString(String sqlString){ + int result = baseMapper.insertSql(sqlString); + if(result >= 1){ + return CommonConstant.SUCCEED; + } + else{ + return CommonConstant.FAILED; + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String updateSqlString(String sqlString){ + int result = -1; + result = updateMapper.updateSql(sqlString); + if(result != -1){ + return CommonConstant.SUCCEED; + } + else{ + return CommonConstant.FAILED; + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Integer getVersionByLongId(String tableName, String primaryKeyName, Long primaryKeyValue){ + int result = -1; + result = baseMapper.getVersionByPolygonId(tableName, primaryKeyName, primaryKeyValue); + return result; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public List> selectData(String selectSql){ + List> result = baseMapper.selectData(selectSql); + if(!result.isEmpty()){ + return result; + } + else{ + return null; + } + } + +// @Override +// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +// public List> selectData(String selectSql){ +// List> result = baseMapper.selectData(selectSql); +// return result == null || result.isEmpty() ? Collections.emptyList() : result; +// } + @Override + public Integer getUserWorkRole(Integer taskId, Integer userId){ + return baseMapper.getUserWorkRole(taskId, userId); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String delete(String deleteSql){ + int result = -1; + result = updateMapper.delete(deleteSql); + if(result != -1){ + return CommonConstant.SUCCEED; + } + return CommonConstant.FAILED; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Long insertData(Task task, Table table, int userId, JSONArray multimediaItemJsonArray, MultipartFile file){ + // 插入根表数据 + Long polygonId; + // 20250724--------------------------------------- + encapPhotoInTable(table.getFields(), task.getId(), userId); + //------------------------------------------------ + String insertSql = GenerateSqlUtil.generateInsertSql(task.getDatabaseName(), table, task.getId(), userId); + System.out.println(insertSql); + SqlEnity sqlEnity = new SqlEnity(); + sqlEnity.setSql(insertSql); + String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(task.getDatabaseName(), table); + sqlEnity.setPrimaryKeySeq(primaryKeySeq); + polygonId = insertSqlEnity(sqlEnity); + if(polygonId == null){ + throw new RuntimeException("获取" + table.getKey() + "表记录插入的ID号失败"); + } + + // 储存多媒体信息到指定的本地文件夹中,前提是判断 MultipartFile 是否为空 + if(file != null && !file.isEmpty()){ + encapMediaInfoMethod(task.getId(), file, task.getDatabaseName(), table.getKey(), userId, + multimediaItemJsonArray, polygonId, 0); + } + + // 检查该表是否具有关联表 + Map assoAndCollTableMap = TableOperationUtil.hasAssoAndCollField(table); + if(assoAndCollTableMap.size() != 0){ + insertAssoAndCollData(task.getDatabaseName(), table, polygonId, 0, task.getConfig(),task.getId(),userId); + } + + // 更新数据和网格对应关系 + taskCellDataService.updateAfterDataCreatedOrUpdated(task, table, polygonId); + + return polygonId; + } + + /** + * 将多媒体信息包括本地存储和表记录插入封装成一个方法,因为插入数据和复核数据时都用到该方法 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void encapMediaInfoMethod(Integer taskId, MultipartFile file, String databaseName, String tableName, int userId, JSONArray multimediaItemJsonArray, Long polygonId, int versionCode){ + String path = "/task_" + taskId + "/user_" + userId; + String storeMediaFileResult = StoreMediaFileUtil.storeFileAndUnzip(file, mediaPath + path); + if(storeMediaFileResult.equals(CommonConstant.FAILED)){ + logger.info("多媒体信息压缩包储存失败"); + } + String mediaTableName = PostgreSqlUtil.buildTableNameString(databaseName, tableName, true, false); + if(multimediaItemJsonArray != null && multimediaItemJsonArray.size() != 0){ + for(int i = 0; i < multimediaItemJsonArray.size(); i++){ + MultimediaItem media = JSON.toJavaObject(multimediaItemJsonArray.getJSONObject(i), MultimediaItem.class); + media.setID(polygonId); + media.setMediaPath(path + "/" + media.getFile()); + media.setMediaTableName(mediaTableName); + media.setVersion(versionCode); + String result = multimediaService.insertMultiMedia(media); + if(result.equals(CommonConstant.FAILED)){ + throw new RuntimeException("插入多媒体记录失败"); + } + } + } + } + /** + * 将多媒体信息包括表记录插入子表 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void encapSubMediaInfoMethod(Integer taskId, String databaseName, String tableName, int userId, JSONArray multimediaItemJsonArray, Long polygonId, int versionCode){ + String path = "/task_" + taskId + "/user_" + userId; + String mediaTableName = PostgreSqlUtil.buildTableNameString(databaseName, tableName, true, false); + if(multimediaItemJsonArray != null && multimediaItemJsonArray.size() != 0){ + for(int i = 0; i < multimediaItemJsonArray.size(); i++){ + MultimediaItem media = JSON.toJavaObject(multimediaItemJsonArray.getJSONObject(i), MultimediaItem.class); + media.setID(polygonId); + media.setMediaPath(path + "/" + media.getFile()); + media.setMediaTableName(mediaTableName); + media.setVersion(versionCode); + String result = multimediaService.insertMultiMedia(media); + if(result.equals(CommonConstant.FAILED)){ + throw new RuntimeException("插入多媒体记录失败"); + } + } + } + } + // 将Photo组件记录的照片名称拼接上路径地址 + public void encapPhotoInTable(Map data, Integer taskId, int userId){ + if(data==null) + return; + String path = "/task_" + taskId + "/user_" + userId; + for(Field field:data.values()){ + if(field.getType()!=null && field.getType().equalsIgnoreCase("photo")){ + field.setValue(path + "/" + field.getValue()); + }else if((field.getAssociate()!=null && !field.getAssociate().isEmpty()) || (field.getCollection()!=null && !field.getCollection().isEmpty())){ + List> values = (List>)field.getValue(); + if(values!=null){ + for(Map value : values){ + if (value != null && !value.isEmpty()) { + encapPhotoInTable(value, taskId, userId); + } + } + } + } + } + } +// public void encapPhotoInTable(Map data, Integer taskId, int userId) { +// if (data == null) return; +// +// String path = "/task_" + taskId + "/user_" + userId; +// +// for (Field field : data.values()) { +// if ("photo".equalsIgnoreCase(field.getType())) { +// field.setValue(path + "/" + field.getValue()); +// } +// else if (field.getAssociate() != null && !field.getAssociate().isEmpty()) { +// Object val = field.getValue(); +// if (val instanceof List) { +// // 正确处理关联字段转成 List> 的情况 +// List> list = (List>) val; +// for (Map item : list) { +// encapPhotoInTable(item, taskId, userId); +// } +// } +// } +// else if (field.getCollection() != null && !field.getCollection().isEmpty()) { +// Object val = field.getValue(); +// if (val instanceof List) { +// List> values = (List>) val; +// for (Map value : values) { +// encapPhotoInTable(value, taskId, userId); +// } +// } +// } +// } +// } + + public void decapPhotoInTable(Map data){ + if(data==null) + return; + for(Field field:data.values()){ + if(field.getType()!=null && field.getType().equalsIgnoreCase("photo")){ + if(field.getValue()!=null) + field.setValue(new File(field.getValue().toString()).getName()); + }else if(field.getAssociate()!=null && !field.getAssociate().isEmpty()){ + decapPhotoInTable((Map)field.getValue()); + }else if(field.getCollection()!=null && !field.getCollection().isEmpty()){ + List> values = (List>)field.getValue(); + if(values!=null){ + for(Map value : values){ + decapPhotoInTable(value); + } + } + + } + } + } + +// /** +// * 将Table中存在关联表(associate、collector)数据存储到指定的关联表中 +// */ +// @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +// public void insertAssoAndCollData(String databaseName, Table table, Long polygonId, int versionCode, String configString){ +// Map assoAndCollTableMap = TableOperationUtil.hasAssoAndCollField(table); +// JSONObject configJsonObject = JSON.parseObject(configString); +// Config config = JSON.toJavaObject(configJsonObject, Config.class); +// Map tables = config.getTables(); +// for(Map.Entry entry : assoAndCollTableMap.entrySet()){ +// if(entry.getValue() == null || entry.getValue().equals("")){ +// continue; +// } +// List> collectoreFieldValueList = (List>) entry.getValue(); +// for(Map collectoreFieldValue : collectoreFieldValueList){ +// Table assoAndCollTable = tables.get(entry.getKey()); +// assoAndCollTable.setFields(collectoreFieldValue); +// Map map = TableOperationUtil.hasAssoAndCollField(assoAndCollTable); +// if(map.size() != 0){ +// String assoAndCollInsertSql = GenerateSqlUtil.generateInsertSql(databaseName, entry.getKey(), collectoreFieldValue, polygonId, versionCode); +// Long assoAndCollPolygonId; // 子表插入数据的polygonId +// SqlEnity sqlEnity = new SqlEnity(); +// sqlEnity.setSql(assoAndCollInsertSql); +// String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(databaseName, assoAndCollTable); +// sqlEnity.setPrimaryKeySeq(primaryKeySeq); +// assoAndCollPolygonId = insertSqlEnity(sqlEnity); +// if(polygonId == null){ +// logger.info("获取" + assoAndCollTable.getKey() + "表记录插入的ID号失败"); +// throw new RuntimeException("获取" + assoAndCollTable.getKey() + "表记录插入的ID号失败"); +// } +// insertAssoAndCollData(databaseName, assoAndCollTable, assoAndCollPolygonId, versionCode, configString); +// } +// else{ +// String collectorInsertSql = GenerateSqlUtil.generateInsertSql(databaseName, entry.getKey(), collectoreFieldValue, polygonId, versionCode); +// String collectorInsertSqlResult = insertSqlString(collectorInsertSql); +// if(collectorInsertSqlResult.equals(CommonConstant.FAILED)){ +// logger.info(assoAndCollTable.getKey() + "对应的关联表" + entry.getKey() + "记录插入失败"); +// throw new RuntimeException(assoAndCollTable.getKey() + "对应的关联表" + entry.getKey() + "记录插入失败"); +// } +// } +// } +// } +// } + +public void insertAssoAndCollData(String databaseName, Table table, Long polygonId, int versionCode, String configString, int taskId,int UserId) { + Map assoAndCollTableMap = TableOperationUtil.hasAssoAndCollField(table); + JSONObject configJsonObject = JSON.parseObject(configString); + Config config = JSON.toJavaObject(configJsonObject, Config.class); + Map tables = config.getTables(); + + for (Map.Entry entry : assoAndCollTableMap.entrySet()) { + if (entry.getValue() == null || entry.getValue().equals("")) { + continue; + } + // 20250728------------------------------------------------------------ + List> collectoreFieldValueList = (List>) entry.getValue(); + +// List> collectoreFieldValueList = new ArrayList<>(); +// if(entry.getValue() instanceof List){ +// collectoreFieldValueList.addAll((List>) entry.getValue()); +// }else{ +// collectoreFieldValueList.add((Map) entry.getValue()); +// } + // ------------------------------------------------------------------- + for (int i = 0; i < collectoreFieldValueList.size(); i++) { + Map collectoreFieldValue = collectoreFieldValueList.get(i); + Table assoAndCollTable = tables.get(entry.getKey()); + assoAndCollTable = JSON.parseObject(JSON.toJSONString(assoAndCollTable), Table.class); + assoAndCollTable.setFields(collectoreFieldValue); + + //---------------------------------------- + String insertSql = GenerateSqlUtil.generateInsertSql(databaseName, entry.getKey(), collectoreFieldValue, polygonId, versionCode); + SqlEnity sqlEnity = new SqlEnity(); + sqlEnity.setSql(insertSql); + + String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(databaseName, assoAndCollTable); + sqlEnity.setPrimaryKeySeq(primaryKeySeq); + + Long polygonIdInserted = insertSqlEnity(sqlEnity); + if (polygonIdInserted == null) { + logger.info(assoAndCollTable.getKey() + " 对应的关联表 " + entry.getKey() + " 记录插入失败,未获取到ID"); + throw new RuntimeException(assoAndCollTable.getKey() + " 对应的关联表 " + entry.getKey() + " 记录插入失败,未获取到ID"); + } + //20250730------------- 子表多媒体信息查询 + JSONArray submultimediaItemJsonArray = + (JSONArray) TableOperationUtil.getFieldValue(assoAndCollTable , TableOperationUtil.getCameraFieldName(assoAndCollTable)); + // ---------- + handleMediaFields(taskId,databaseName, entry.getKey(), collectoreFieldValue, polygonIdInserted,submultimediaItemJsonArray,UserId); + // 递归插入嵌套的子表 + insertAssoAndCollData(databaseName, assoAndCollTable, polygonIdInserted, versionCode, configString, taskId,UserId); + + +// Map subMap = TableOperationUtil.hasAssoAndCollField(assoAndCollTable); +// Long assoAndCollPolygonId; +// +// if (subMap.size() != 0) { +// String subInsertSql = GenerateSqlUtil.generateInsertSql(databaseName, entry.getKey(), collectoreFieldValue, polygonId, versionCode); +// SqlEnity sqlEnity = new SqlEnity(); +// sqlEnity.setSql(subInsertSql); +// +// String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(databaseName, assoAndCollTable); +// sqlEnity.setPrimaryKeySeq(primaryKeySeq); +// +// assoAndCollPolygonId = insertSqlEnity(sqlEnity); +// if (assoAndCollPolygonId == null) { +// logger.info("获取 " + assoAndCollTable.getKey() + " 表记录插入的 ID 号失败"); +// throw new RuntimeException("获取 " + assoAndCollTable.getKey() + " 表记录插入的 ID 号失败"); +// } +// +// // 插入成功后处理 media 类型字段 +// handleMediaFields(taskId, databaseName, entry.getKey(), collectoreFieldValue, assoAndCollPolygonId); +// +// // 递归插入嵌套的子表 +// insertAssoAndCollData(databaseName, assoAndCollTable, assoAndCollPolygonId, versionCode, configString, taskId); +// } else { +// String insertSql = GenerateSqlUtil.generateInsertSql(databaseName, entry.getKey(), collectoreFieldValue, polygonId, versionCode); +// +// SqlEnity sqlEnity = new SqlEnity(); +// sqlEnity.setSql(insertSql); +// +// String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(databaseName, assoAndCollTable); +// sqlEnity.setPrimaryKeySeq(primaryKeySeq); +// +// Long polygonIdInserted = insertSqlEnity(sqlEnity); +// if (polygonIdInserted == null) { +// logger.info(assoAndCollTable.getKey() + " 对应的关联表 " + entry.getKey() + " 记录插入失败,未获取到ID"); +// throw new RuntimeException(assoAndCollTable.getKey() + " 对应的关联表 " + entry.getKey() + " 记录插入失败,未获取到ID"); +// } +// +// // 插入成功后处理 media 类型字段 +// handleMediaFields(taskId, databaseName, entry.getKey(), collectoreFieldValue, polygonIdInserted); +// } + } + } +} + + /** + * 处理字段中 type 为 "media" 的,调用 encapMediaInfoMethod 插入 _media 表 + */ + + private void handleMediaFields(int taskId, String dbName, String tableName, Map fieldMap, Long polygonId, JSONArray submultimediaItemJsonArray, int userId) { + for (Field field : fieldMap.values()) { +// System.out.println(field.getType()); +// if ("media".equalsIgnoreCase(field.getType()) && field.getValue() != null) { +// JSONArray fakeJsonArray = new JSONArray(); // 如果你有实际结构,可以替换 +// encapMediaInfoMethod(taskId, null, dbName, tableName, -1, fakeJsonArray, polygonId, 0); +// } + if ("camera".equalsIgnoreCase(field.getType()) && field.getValue() != null) { + //JSONArray fakeJsonArray = new JSONArray(); // 如果你有实际结构,可以替换 + encapSubMediaInfoMethod(taskId, dbName, tableName, userId,submultimediaItemJsonArray, polygonId, 0); + } + } + } + + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public Long updateRecheckData(Task task, Table table, int userId, JSONArray multimediaItemJsonArray, + Long polygonIdFromAndroid, MultipartFile file) throws IOException{ + // 20250724--------------------------------------- + encapPhotoInTable(table.getFields(), task.getId(), userId); + //------------------------------------------------ + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String selectRootTableByPolygonIdSql = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), table.getKey(), primaryKey, polygonIdFromAndroid); + + List> rootTableDataList = selectData(selectRootTableByPolygonIdSql); + String insertRootDataToHisResult = insertDataToTable(rootTableDataList, task.getDatabaseName(), table.getKey(), task.getConfig(), 1); + if(!insertRootDataToHisResult.equals(CommonConstant.SUCCEED)){ + logger.info("根表" + table.getKey() + "向历史数据库中插入失败"); + } + + // 关联表及多媒体表插入历史数据库 + recursiveInsertAssoAndCollDataToTable(task, table, polygonIdFromAndroid, 1, -1); + + // 多媒体表信息插入历史表不用上述方法,因为多媒体表有对应的实体类 + String mediaTableNameInDB = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, false); + // 如果从数据库中没查到对应的多媒体数据,hisMultimediaItemList == null + List hisMultimediaItemList = multimediaService.selectMultiMedia(mediaTableNameInDB, polygonIdFromAndroid); + if(hisMultimediaItemList != null){ + for(MultimediaItem multimediaItem : hisMultimediaItemList){ + String mediaHisTableNameInDB = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), true, true); + multimediaItem.setMediaTableName(mediaHisTableNameInDB); + String oldMediaPath = multimediaItem.getMediaPath(); + String newMediaPath = oldMediaPath.replaceFirst(mediaPath, historyMediaPath); + File outFile = new File(newMediaPath); + if(!outFile.getParentFile().exists()){ + outFile.getParentFile().mkdirs(); + } + if(!outFile.exists()){ + outFile.createNewFile(); + } + try(FileInputStream fileInputStream = new FileInputStream(oldMediaPath); FileOutputStream fileOutputStream = new FileOutputStream(outFile)){ + int copyResult = IOUtils.copy(fileInputStream, fileOutputStream); + if(copyResult == -1){ + logger.info("多媒体文件复制到历史文件夹中失败"); + } + } catch(Exception e){ + e.printStackTrace(); + } + multimediaItem.setMediaPath(newMediaPath); + String insertMediaToHisResult = multimediaService.insertMultiMedia(multimediaItem); + if(insertMediaToHisResult.equals(CommonConstant.FAILED)){ + logger.info("历史数据多媒体表" + table.getKey() + "_media_history插入失败"); + } + } + } + + // 根表数据更新 + String updateSqlString = GenerateSqlUtil.generateUpdateSql(task, userId, table, polygonIdFromAndroid); + String updateResult = updateSqlString(updateSqlString); + if(updateResult.equals(CommonConstant.FAILED)){ + logger.info("更新根表记录失败"); + throw new RuntimeException("更新根表记录失败"); + } + updateTableStatus(PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), table.getKey(), false, false), + PostgreSqlUtil.transformString(primaryKey), polygonIdFromAndroid, 1, null); + // 关联表、多媒体表及本地文件更新 + String deleteResult = deleteDataByPolygonId(task.getDatabaseName(), table, polygonIdFromAndroid, task.getConfig(), false); + if(!deleteResult.equals(CommonConstant.SUCCEED)){ + logger.info("删除根表的关联表和多媒体表记录失败"); + } + if(file != null && !file.isEmpty()){ + encapMediaInfoMethod(task.getId(), file, task.getDatabaseName(), table.getKey(), userId, + multimediaItemJsonArray, polygonIdFromAndroid, + Integer.valueOf(table.getFields().get(CommonConstant.FIX_FIELD_VERSION).getValue().toString()) + 1); + } + + Map map = TableOperationUtil.hasAssoAndCollField(table); + if(map.size() != 0){ + insertAssoAndCollData(task.getDatabaseName(), table, polygonIdFromAndroid, Integer.valueOf(table.getFields().get(CommonConstant.FIX_FIELD_VERSION).getValue().toString()) + 1, task.getConfig(),task.getId(),userId); + } + return polygonIdFromAndroid; + } + + /** + * 获取表的数据插入在另一个表中,既包括关联表数据插入历史数据库表中,也有将历史数据表中数据放进关联表中 + * 依据operateType值进行判断 + * + * @param dataList 数据,Map中key为字段名,value为字段值, + * 这是没有固定实体类获取数据库的数据方法 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String insertDataToTable(List> dataList, String databaseName, String tableName, String configString, int operateType){ + if(dataList != null && dataList.size() != 0){ + for(Map assoAndCollTableData : dataList){ + String insertSqlByAllFieldsSql; + if(operateType == 1){ + insertSqlByAllFieldsSql = GenerateSqlUtil.generateInsertSqlByAllFields(assoAndCollTableData, databaseName, tableName + CommonConstant.HISTORY_SUFFIX, configString); + } + else{ + insertSqlByAllFieldsSql = GenerateSqlUtil.generateInsertSqlByAllFields(assoAndCollTableData, databaseName, tableName, configString); + } + String insertResultByAllFields = insertSqlString(insertSqlByAllFieldsSql); + if(insertResultByAllFields.equals(CommonConstant.FAILED)){ + throw new RuntimeException("根表" + tableName + "向历史数据库中插入失败"); + } + } + } + return CommonConstant.SUCCEED; + } + + /** + * 递归地将根表中关联表数据插入历史数据库表中,或者将历史数据表中数据放进关联表中 + * operateType值为1表示从关联表数据插入历史数据库表中,2表示将历史数据表中数据放进关联表中 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void recursiveInsertAssoAndCollDataToTable(Task task, Table table, Long polygonId, int operateType, int versionCode){ + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tables = config.getTables(); + Map assoAndCollTableMap = CheckTableDataUtil.getAssoAndCollField(table.getKey(), task.getConfig()); + for(Map.Entry entry : assoAndCollTableMap.entrySet()){ + String selectAssoAndCollTableByPolygonIdSql; + if(operateType == 1){ + selectAssoAndCollTableByPolygonIdSql = GenerateSqlUtil.generateSelectSqlByField(task.getDatabaseName(), entry.getKey(), entry.getValue(), polygonId); + } + else{ + selectAssoAndCollTableByPolygonIdSql = GenerateSqlUtil.genSqlByPolygonIdAndVersionId(task.getDatabaseName(), entry.getKey() + CommonConstant.HISTORY_SUFFIX, entry.getValue(), polygonId, versionCode); + } + + List> assoAndCollTableDataList = selectData(selectAssoAndCollTableByPolygonIdSql); + String insertAssoAndCollToHisResult = insertDataToTable(assoAndCollTableDataList, task.getDatabaseName(), entry.getKey(), task.getConfig(), operateType); + if(!insertAssoAndCollToHisResult.equals(CommonConstant.SUCCEED)){ + throw new RuntimeException("历史数据表" + insertAssoAndCollToHisResult + "插入失败"); + } + // 判断子表是否也具有关联表 + Table assoAndCollTable = tables.get(entry.getKey()); + Map map = CheckTableDataUtil.getAssoAndCollField(assoAndCollTable.getKey(), task.getConfig()); + if(map.size() != 0){ + String primaryKey = null; + Map fields = assoAndCollTable.getFields(); + for(Map.Entry fieldEntry : fields.entrySet()){ + if(fieldEntry.getValue().isIdentity()){ + primaryKey = fieldEntry.getValue().getKey(); + break; + } + } + if (assoAndCollTableDataList != null) { + for(Map assoAndCollTableData : assoAndCollTableDataList){ + assert primaryKey != null; + Long assoAndCollPolygonId = Long.valueOf(assoAndCollTableData.get(primaryKey).toString()); + recursiveInsertAssoAndCollDataToTable(task, assoAndCollTable, assoAndCollPolygonId, operateType, versionCode); + } + } + } + } + } + + /** + * 将根表Table中polygonId对应记录删除,根表的关联表及多媒体表中对应数据也删除 + * + * @param isIncludeRootTable 删除是否包括根表数据,主要是方便复核数据时更新根表数据,而删除再插入关联、多媒体表 + * @return 若全部polygonId对应的数据删除成功返回succeed,否则返回failed + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String deleteDataByPolygonId(String databaseName, Table table, Long polygonId, String configString, boolean isIncludeRootTable){ + + Map assoAndCollFieldMap = CheckTableDataUtil.getAssoAndCollField(table.getKey(), configString); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + // 如果删除根表数据的话 + if(isIncludeRootTable){ + String rootTableName = PostgreSqlUtil.buildTableNameString(databaseName, table.getKey(), false, false); + String deleteRootTableSql = GenerateSqlUtil.genDeleteSql(rootTableName, PostgreSqlUtil.transformString(primaryKey), polygonId); + String deleteResult = delete(deleteRootTableSql); + if(deleteResult.equals(CommonConstant.FAILED)){ + throw new RuntimeException("删除根表数据失败"); + } + } + + // 删除关联表中数据(如果存在的话) + if(assoAndCollFieldMap.size() != 0){ + recursiveDeleteAssoAndCollData(assoAndCollFieldMap, polygonId, configString, databaseName, false, null); + } + + // 删除多媒体表数据及本地多媒体文件(如果存在的话) + String mediaTableName = PostgreSqlUtil.buildTableNameString(databaseName, table.getKey(), true, false); + List multimediaItemList = multimediaService.selectMultiMedia(mediaTableName, polygonId); + if(multimediaItemList != null){ + for(MultimediaItem multimediaItem : multimediaItemList){ + File file = new File(multimediaItem.getMediaPath()); + if(file.exists()){ + file.delete(); + } + } + String deleteAssoAndCollTableResult = multimediaService.deleteMultiMedia(mediaTableName, polygonId); + if(deleteAssoAndCollTableResult.equals(CommonConstant.FAILED)){ + throw new RuntimeException("删除根表数据失败"); + } + } + return CommonConstant.SUCCEED; + } + + /** + * 递归地将根表中关联表数据删除,注意这里也包括删除历史表的数据,通过isHistoryTable参数判定是不是历史表, + * 如果是历史表需要提供version参数,如果非历史表version参数为null + * 该方法主要供deleteDataByPolygonId()和rollBackDataForVersion()方法使用 + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void recursiveDeleteAssoAndCollData(Map assoAndCollTableMap, Long polygonId, String configString, String databaseName, boolean isHistoryTable, Integer version){ + Config config = JSON.toJavaObject(JSON.parseObject(configString), Config.class); + String suffixString; + if(isHistoryTable){ + suffixString = CommonConstant.HISTORY_SUFFIX; + } + else{ + suffixString = ""; + } + + for(Map.Entry assoAndCollTableEntry : assoAndCollTableMap.entrySet()){ + String parentIdFieldName = null; + Table assoAndCollTable = config.getTables().get(assoAndCollTableEntry.getKey()); + Map map = CheckTableDataUtil.getAssoAndCollField(assoAndCollTable.getKey(), configString); + if(map.size() != 0){ + Long assoAndCollPolygonId; + String selectSql = GenerateSqlUtil.generateSelectSqlByField(databaseName, assoAndCollTable.getKey() + suffixString, assoAndCollTableEntry.getValue(), polygonId); + List> dataList = selectData(selectSql); + String primaryKey = TableOperationUtil.getPrimaryKey(assoAndCollTable); + if(dataList != null){ + for(Map data : dataList){ + assoAndCollPolygonId = Long.valueOf(data.get(primaryKey).toString()); + recursiveDeleteAssoAndCollData(map, assoAndCollPolygonId, configString, databaseName, isHistoryTable, version); + } + } + } + + Map assoAndCollFieldsMap = assoAndCollTable.getFields(); + for(Map.Entry entry : assoAndCollFieldsMap.entrySet()){ + Field field = entry.getValue(); + if(field.isParentID()){ + parentIdFieldName = field.getKey(); + } + } + String assoAndCollTableName = PostgreSqlUtil.buildTableNameString(databaseName, assoAndCollTableEntry.getKey(), false, isHistoryTable); + String deleteAssoAndCollTableDataSql; + if(isHistoryTable){ + deleteAssoAndCollTableDataSql = "delete from " + PostgreSqlUtil.buildTableNameString(databaseName, assoAndCollTableEntry.getKey(), false, true) + " where " + PostgreSqlUtil.transformString(assoAndCollTableEntry.getValue()) + " = " + polygonId + " and " + CommonConstant.FIX_FIELD_VERSION + " >= " + version + ";"; + } + else{ + deleteAssoAndCollTableDataSql = GenerateSqlUtil.genDeleteSql(assoAndCollTableName, PostgreSqlUtil.transformString(parentIdFieldName), polygonId); + } + String deleteAssoAndCollTableResult = delete(deleteAssoAndCollTableDataSql); + if(deleteAssoAndCollTableResult.equals(CommonConstant.FAILED)){ + throw new RuntimeException("删除" + assoAndCollTableEntry.getKey() + "关联表的数据失败"); + } + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String rollBackDataForVersion(Task task, Table table, String updateSqlForRootTable, Long polygonId, int version) throws IOException{ + String updateResult = updateSqlString(updateSqlForRootTable); + String tableName = table.getKey(); + if(updateResult.equals(CommonConstant.FAILED)){ + logger.info("回滚更新根表" + tableName + "主键为" + polygonId + "版本为" + version + "的数据失败"); + throw new RuntimeException("回滚更新根表" + tableName + "主键为" + polygonId + "版本为" + version + "的数据失败"); + } + + // 删除关联表和多媒体表的数据 (这些数据不能更新只能先删除再增加) + String deleteResult = deleteDataByPolygonId(task.getDatabaseName(), table, polygonId, task.getConfig(), false); + if(deleteResult.equals(CommonConstant.FAILED)){ + logger.info("删除根表" + tableName + "的关联表和多媒体表数据失败"); + throw new RuntimeException("删除根表" + tableName + "的关联表和多媒体表数据失败"); + } + String hisMediaTableNameInDB = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, true, true); + List multimediaItemList = multimediaService.selectHistoryMultiMedia(hisMediaTableNameInDB, polygonId, version); + if(multimediaItemList != null && multimediaItemList.size() != 0){ + for(MultimediaItem multimediaItem : multimediaItemList){ + String mediaTableNameInDB = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, true, false); + multimediaItem.setMediaTableName(mediaTableNameInDB); + String oldMediaPath = multimediaItem.getMediaPath(); + String newMediaPath = oldMediaPath.replaceFirst(historyMediaPath, mediaPath); + File outFile = new File(newMediaPath); + if(!outFile.getParentFile().exists()){ + outFile.getParentFile().mkdirs(); + } + if(!outFile.exists()){ + outFile.createNewFile(); + } + try(FileInputStream fileInputStream = new FileInputStream(oldMediaPath); FileOutputStream fileOutputStream = new FileOutputStream(outFile)){ + int copyResult = IOUtils.copy(fileInputStream, fileOutputStream); + if(copyResult == -1){ + logger.info("从历史多媒体文件夹复制到文件夹中失败"); + } + } catch(Exception e){ + e.printStackTrace(); + } + multimediaItem.setMediaPath(newMediaPath); + String insertHisToMediaResult = multimediaService.insertMultiMedia(multimediaItem); + if(insertHisToMediaResult.equals(CommonConstant.FAILED)){ + logger.info("历史数据多媒体表" + tableName + "_media_history插入失败"); + throw new RuntimeException("历史数据多媒体表" + tableName + "_media_history插入失败"); + } + } + } + + Map map = TableOperationUtil.hasAssoAndCollField(table); + if(map.size() != 0){ + recursiveInsertAssoAndCollDataToTable(task, table, polygonId, 2, version); + } + + // 删除历史表中主键为polygonId且版本号大于等于versionId的记录,关联表及多媒体表相应的记录也要删除 + String deleteRootTableDataSql = "delete from " + PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, true) + " where " + PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)) + " = " + polygonId + " and " + CommonConstant.FIX_FIELD_VERSION + " >= " + version + ";"; + String deleteRootTableDataResult = delete(deleteRootTableDataSql); + if(deleteRootTableDataResult.equals(CommonConstant.FAILED)){ + logger.info("历史数据根表" + table.getKey() + CommonConstant.HISTORY_SUFFIX + "删除主键为" + polygonId + "版本号大于" + version + "的数据错误"); + throw new RuntimeException("删除错误"); + } + Map assoAndCollFieldMap = CheckTableDataUtil.getAssoAndCollField(tableName, task.getConfig()); + recursiveDeleteAssoAndCollData(assoAndCollFieldMap, polygonId, task.getConfig(), task.getDatabaseName(), true, version); + String deleteMediaResult = multimediaService.deleteMulitMediaGreaterThanVersion(hisMediaTableNameInDB, polygonId, version); + if(deleteMediaResult.equals(CommonConstant.FAILED)){ + logger.info("历史数据根表的多媒体表" + table.getKey() + CommonConstant.MEDIA_HISTORY_SUFFIX + "删除id为" + polygonId + "版本号大于" + version + "的数据错误"); + throw new RuntimeException("删除错误"); + } + return CommonConstant.SUCCEED; + } + + /** + * 根据审核数据对应的userId进行根表数据reviewer字段的更新 + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String updateRootTableDataForReviewer(Task task, Map> reviewerInfo){ + Config config = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class); + Map tables = config.getTables(); + for(Map.Entry> entry : reviewerInfo.entrySet()){ + String tableName = entry.getKey(); + Table table = tables.get(tableName); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + Map reviewerDataMap = entry.getValue(); + if(reviewerDataMap != null){ + for(Map.Entry reviewerDataEntry : reviewerDataMap.entrySet()){ + updateDataAndReviewer(PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false), + PostgreSqlUtil.transformString(primaryKey), reviewerDataEntry.getKey(), reviewerDataEntry.getValue(), 0); + } + } + + } + return CommonConstant.SUCCEED; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void updateTableStatus(String tableName, String primaryKey, Long polygonId, int status, + String reason){ + updateMapper.updateStatus(tableName, primaryKey, polygonId, status, reason); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String updateDataReviewer(String tableName, String primaryKey, Long polygonId, Integer reviewer){ + int result = updateMapper.updateDataReviewer(tableName, primaryKey, polygonId, reviewer); + if(result == 1){ + return CommonConstant.SUCCEED; + } + else{ + return CommonConstant.FAILED; + } + } + + @Transactional(rollbackFor = Exception.class) + public void updateDataAndReviewer(String tableName, String primaryKey, Long polygonId, Integer reviewer, int status) { + updateMapper.updateDataReviewerAndStatus(tableName, primaryKey, polygonId, reviewer, status); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public List> getNotPassDataId(String tableNameInDB, String primaryKey, Integer userId){ + return baseMapper.getNotPassDataId(tableNameInDB, primaryKey, userId); + } + + @Override + public Long getStatisticDataNumByGeoJson(String tableName, String geometryName, String geoJson){ + return baseMapper.getStatisticDataNum(tableName, geometryName, "\'" + geoJson + "\'"); + } + + @Override + public Long getDataCount(String tableName){ + return baseMapper.getDataCount(tableName); + } + + @Override + public Long getHasCollectAndPatrolDataCount(String tableName){ + return baseMapper.getHasCollectAndPatrolDataCount(tableName); + } + + @Override + public List> getDataCountAndTimeByUser(String tableName, Integer userId){ + return baseMapper.getDataCountAndTimeByUser(tableName, userId); + } + + @Override + public List> getAllFuzzySearchData(String tableNameInDB, String fieldNameInDB, String searchKey){ + return baseMapper.getAllFuzzySearchData(tableNameInDB, fieldNameInDB, searchKey); + } + + @Override + public Page> getAllFuzzySearchDataCenterPoint(String tableNameInDB, String fieldNameInDB, String geometryFieldNameInDB, String searchKey){ + return baseMapper.getAllFuzzySearchDataCenterPoint(tableNameInDB, fieldNameInDB, geometryFieldNameInDB, searchKey); + } + + @Override + public List> randomSelectDataIdNotInList(String tableNameInDB, String primaryKey, List selectIdList, Integer selectDataNum, String whereClause){ + return baseMapper.randomSelectDataIdNotInList(tableNameInDB, primaryKey, selectIdList, selectDataNum, whereClause); + } + + @Override + public List getIdsByReviewer(int taskId, String tableName, int reviewerId){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + return baseMapper.getIdsByReviewer(PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, + false, false), + reviewerId, + PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table))); + } + + @Override + public Integer getReviewerByDataId(int taskId, String tableName, int dataId){ + Task task = taskService.getTaskById(taskId); + Table table = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getTables().get(tableName); + return baseMapper.getReviewerByDataId(PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, + false, false), + PostgreSqlUtil.transformString(TableOperationUtil.getPrimaryKey(table)), + dataId); + } + @Override + public List getTableColumns(String databaseName, String tableName) { + return baseMapper.selectSingleColumn(databaseName, tableName); + } + + @Override + public Map> getIdAndGeojsonByGeohash(int taskId, String geohash){ + Task task = taskService.getTaskById(taskId); + Map rootTables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + Map> result = new HashMap<>(); + for (String tableName : rootTables.keySet()) { + Table table = rootTables.get(tableName); + String primaryKey = TableOperationUtil.getPrimaryKey(table); + String primaryKeyInDb = PostgreSqlUtil.buildColumnNameString(task.getDatabaseName(), tableName,primaryKey); + String geometry = TableOperationUtil.getShapeFieldName(table); + String geometryInDb = PostgreSqlUtil.buildColumnNameString(task.getDatabaseName(), tableName,geometry); + String sql = "SELECT {0},{1} FROM {2} " + + " INNER JOIN public.task_cell_data on {0} = public.task_cell_data.data_id" + + " where public.task_cell_data.task_id = {3} and public.task_cell_data.table_name = {4}" + + " AND public.task_cell_data.cell_geohash = {5}"; + String selectIdAndGeometryDataSql = MessageFormat.format(sql, + primaryKeyInDb, geometryInDb, + PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false), + taskId, + PostgreSqlUtil.buildString(tableName), + PostgreSqlUtil.buildString(geohash)); + List> rootTableDataList = selectData(selectIdAndGeometryDataSql); + Map resultMap = new HashMap<>(); + if (rootTableDataList == null) { + result.put(tableName, null); + continue; + } + for (Map rootTableData : rootTableDataList) { + resultMap.put(Long.parseLong(rootTableData.get(primaryKey).toString()), + rootTableData.get(geometry).toString()); + } + result.put(tableName, resultMap); + } + + return result; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/CSVExportWriterService.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/CSVExportWriterService.java new file mode 100644 index 0000000..8bb12e1 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/CSVExportWriterService.java @@ -0,0 +1,41 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.collection.service.ExportWriterService; +import com.opencsv.bean.StatefulBeanToCsv; +import com.opencsv.bean.StatefulBeanToCsvBuilder; +import com.opencsv.exceptions.CsvDataTypeMismatchException; +import com.opencsv.exceptions.CsvRequiredFieldEmptyException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Optional; + +@Service +public class CSVExportWriterService implements ExportWriterService { + private static final Logger logger = LoggerFactory.getLogger(CSVExportWriterService.class); + + @Override + public Optional writeToFile(Collection values) { + try { + Path path = Files.createTempFile("", ".csv"); + String absPath = path.toString(); + try (Writer writer = new FileWriter(absPath)) { + StatefulBeanToCsvBuilder builder = new StatefulBeanToCsvBuilder<>(writer); + StatefulBeanToCsv bw = builder.build(); + bw.write(values.iterator()); + } + return Optional.of(new File(absPath)); + } catch (IOException | CsvRequiredFieldEmptyException | CsvDataTypeMismatchException e) { + logger.error(e.getMessage()); + return Optional.empty(); + } + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/ExportServiceImpl.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/ExportServiceImpl.java new file mode 100644 index 0000000..3a68db8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/ExportServiceImpl.java @@ -0,0 +1,44 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.collection.domain.ExportUserRecord; +import cn.edu.whu.boot.collection.service.ExportService; +import cn.edu.whu.boot.collection.service.ExportWriterService; +import cn.edu.whu.boot.collection.service.IMultimediaService; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.xml.service.ITaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class ExportServiceImpl implements ExportService { + private static final Logger logger = LoggerFactory.getLogger(ExportServiceImpl.class); + + private final IMultimediaService multimediaService; + + private final ITaskService taskService; + + private final ExportWriterService writerService; + + public ExportServiceImpl(IMultimediaService multimediaService, ITaskService taskService, ExportWriterService writerService) { + this.multimediaService = multimediaService; + this.taskService = taskService; + this.writerService = writerService; + } + + @Override + public Optional exportMediaTable(int taskId, String tableName) { + return writerService.writeToFile(multimediaService.selectByTaskIdAndTableName(taskId, tableName)); + } + + @Override + public Optional exportUsers(int taskId) { + List workers = taskService.getWorkersByTask(taskId); + return writerService.writeToFile(workers.stream().map(w -> new ExportUserRecord(w.getId(), w.getRealName())).collect(Collectors.toList())); + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/ITaskSelectIdServiceImpl.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/ITaskSelectIdServiceImpl.java new file mode 100644 index 0000000..82365e5 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/ITaskSelectIdServiceImpl.java @@ -0,0 +1,50 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.collection.domain.TaskSelectId; +import cn.edu.whu.boot.collection.mapper.TaskSelectIdMapper; +import cn.edu.whu.boot.collection.service.ITaskSelectIdService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ITaskSelectIdServiceImpl implements ITaskSelectIdService { + + @Autowired + private TaskSelectIdMapper taskSelectIdMapper; + + @Override + public List getTaskSelectIdByTaskIdAndTableName (Integer srcTaskId, String srcTableName, + Integer destTaskId, String destTableName) + { + return taskSelectIdMapper.getTaskSelectIdByTaskIdAndTableName(srcTaskId, srcTableName, destTaskId, destTableName); + } + + @Override + public Integer getMaxSelectOrder (Integer srcTaskId, String srcTableName, + Integer destTaskId, String destTableName) + { + return taskSelectIdMapper.getMaxSelectOrder(srcTaskId, srcTableName,destTaskId, destTableName); + } + + @Override + public String insertTaskSelectId (TaskSelectId taskSelectId) + { + Integer result = taskSelectIdMapper.insert(taskSelectId); + if (result == 1) + { + return CommonConstant.SUCCEED; + } + else + { + return CommonConstant.FAILED; + } + } + + @Override + public void delete (Integer taskId){ + taskSelectIdMapper.delete(taskId); + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/ImportServiceImpl.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/ImportServiceImpl.java new file mode 100644 index 0000000..3659847 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/ImportServiceImpl.java @@ -0,0 +1,684 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.allocation.exceptions.InvalidShapefileException; +import cn.edu.whu.boot.collection.domain.MultimediaItem; +import cn.edu.whu.boot.collection.domain.TaskSelectId; +import cn.edu.whu.boot.collection.dto.GeometryType; +import cn.edu.whu.boot.collection.dto.SqlEnity; +import cn.edu.whu.boot.collection.mapper.UpdateMapper; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.collection.service.IMultimediaService; +import cn.edu.whu.boot.collection.service.ITaskSelectIdService; +import cn.edu.whu.boot.collection.service.ImportService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.collection.TableOperationUtil; +import cn.edu.whu.boot.common.utils.xml.GenerateSqlUtil; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.io.ParseException; +import org.geotools.geojson.geom.GeometryJSON; +import java.io.StringWriter; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.geotools.data.simple.SimpleFeatureIterator; +import org.opengis.feature.Property; +import org.opengis.feature.simple.SimpleFeature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.io.File; +import java.io.IOException; +import java.text.DecimalFormat; +import java.text.MessageFormat; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class ImportServiceImpl implements ImportService { + + @Autowired + private IBaseService baseService; + + @Autowired + private IMultimediaService multimediaService; + + @Autowired + private ITaskSelectIdService taskSelectIdService; + + @Autowired + private UpdateMapper updateMapper; + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public ResultMessage taskTableDataInsert (Task srcTask, Task destTask, String srcTableName, String destTableName, + int selectType, int selectDataNum, String whereClause, String fieldMapping) throws IOException{ + String srcTableNameInDb = PostgreSqlUtil.buildTableNameString(srcTask.getDatabaseName(), srcTableName, false, false); + Table srcRootTable = JSON.toJavaObject(JSON.parseObject(srcTask.getConfig()), Config.class).getRootTables().get(srcTableName); + Integer srcTaskId = srcTask.getId(); + Integer destTaskId = destTask.getId(); + String srcPrimaryKey = TableOperationUtil.getPrimaryKey(srcRootTable); + + List taskSelectIdList = taskSelectIdService.getTaskSelectIdByTaskIdAndTableName(srcTaskId, srcTableName, destTaskId, destTableName); + List selectIdList = getSelectIdList(taskSelectIdList); + // 当前剩余数据的个数 + int remainingCount = Integer.parseInt(baseService.getDataCount(srcTableNameInDb).toString()) - selectIdList.size(); + // 通过 selectType 字段判断是否此次操作的类型 + if(selectType == 0){ + selectDataNum = remainingCount; + } + else if(selectType == 2){ + selectDataNum = (int)(remainingCount * (selectDataNum / 100.0)); + } + if (selectDataNum == 0) { + selectDataNum = remainingCount; + } + List> srcRootTableList = baseService.randomSelectDataIdNotInList(srcTableNameInDb, PostgreSqlUtil.transformString(srcPrimaryKey), + CollectionUtils.isEmpty(selectIdList) ? null : selectIdList, selectDataNum, whereClause); + if (CollectionUtils.isEmpty(srcRootTableList)){ + return new ResultMessage(true,"无数据可抽查",400); + } + Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName); + String destTableNameInDb = PostgreSqlUtil.buildTableNameString(destTask.getDatabaseName(), destTableName, false, false); + Map destFields = destRootTable.getFields(); + List srcTableFieldOrder = new ArrayList<>(); + List destTableFieldOrder = new ArrayList <>(); + genTableFieldOrder(fieldMapping, srcTableFieldOrder, destTableFieldOrder, TableOperationUtil.getPrimaryKey(destRootTable)); + Long dataCount = 0L; + Integer collectorId = -1; + if (CollectionUtils.isNotEmpty(srcRootTableList)) + { + for (Map srcRootTableData : srcRootTableList) + { + // 用于Field的控件类型为Photo的oldFilePath和newFilePath,待数据插入成功后在复制多媒体文件 + Map srcAndDestPhotoPathMap = new HashMap <>(); + StringBuilder insertSb = new StringBuilder(" INSERT INTO ").append(destTableNameInDb).append("("); + StringBuilder valueSb = new StringBuilder(" VALUES ("); + insertSb.append(CommonConstant.FIX_FIELD_CREATE_TIME).append(",").append(CommonConstant.FIX_FIELD_UPDATE_TIME).append(",") + .append(CommonConstant.FIX_FIELD_STATUS).append(",").append(CommonConstant.FIX_FIELD_VERSION).append(",") + .append(CommonConstant.FIX_FIELD_COLLECTOR).append(",").append(CommonConstant.FIX_FIELD_REVIEWER).append(","); + valueSb.append(GenerateSqlUtil.generatePostgreSqlDateValue(new Date(), null)).append(",") + .append(GenerateSqlUtil.generatePostgreSqlDateValue(new Date(), null)).append(",") + .append(0).append(",").append(0).append(",").append(collectorId).append(",").append(-1).append(","); + for (String destTableFieldName : destTableFieldOrder) + { + String srcTableFieldName = srcTableFieldOrder.get(destTableFieldOrder.indexOf(destTableFieldName)); + if (!srcRootTableData.keySet().contains(srcTableFieldName)) + { + continue; + } + insertSb.append(PostgreSqlUtil.transformString(destTableFieldName)).append(","); + Field field = destFields.get(destTableFieldName); + if (field.getAutoDate() != null && !field.getAutoDate().equals("") && field.getDbType().equals(CommonConstant.DATE)) + { + valueSb.append(GenerateSqlUtil.generatePostgreSqlDateValue(srcRootTableData.get(srcTableFieldName).toString(), CommonConstant.DATE_FORMAT_STRING)).append(","); + continue; + } + // 针对于Field的控件类型是PHOTO的情况处理 + if (StringUtils.isNotBlank(field.getType()) && field.getType().toLowerCase().equals(CommonConstant.PHOTO)) + { + String srcPhotoPath = srcRootTableData.get(srcTableFieldName).toString(); + String srcTaskIdString = "task_" + srcTask.getId(); + String destTaskIdString = "task_" + destTask.getId(); + String destPhotoPath = srcPhotoPath.replace(srcTaskIdString,destTaskIdString); + String destUserIdString = "/user_" + collectorId; + String subDestPhotoPath = destPhotoPath.substring(0, destPhotoPath.lastIndexOf("/")); + String trueDestPhotoPath = subDestPhotoPath.substring(0,subDestPhotoPath.lastIndexOf("/")) + destUserIdString + destPhotoPath.substring(destPhotoPath.lastIndexOf("/"), destPhotoPath.length()); + valueSb.append("\'").append(trueDestPhotoPath).append("\',"); + srcAndDestPhotoPathMap.put(srcPhotoPath,trueDestPhotoPath); + continue; + } + valueSb = GenerateSqlUtil.appendValueForDifferentField(valueSb, srcRootTableData.get(srcTableFieldName), + field.getDbType().toLowerCase(), null); + } + dataCount += 1; +// if (dataCount % 100 == 0) +// { +// collectorId -= 1; +// } + String insertSql = insertSb.substring(0 , insertSb.length() - 1) + ") " + valueSb.substring(0 , valueSb.length() - 1) + ");"; + Long destPolygonId; + SqlEnity sqlEnity = new SqlEnity(); + sqlEnity.setSql(insertSql); + String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(destTask.getDatabaseName(), destRootTable); + sqlEnity.setPrimaryKeySeq(primaryKeySeq); + destPolygonId = baseService.insertSqlEnity(sqlEnity); + if (destPolygonId == null || destPolygonId == 0) + { + throw new RuntimeException("数据插入失败"); + } + // 数据插入成功后,将srcAndDestPhotoPathMap中照片迁移 + photoPathMapMigration(srcAndDestPhotoPathMap); + + // 插入源表的多媒体信息 + String srcMeidaTableName = PostgreSqlUtil.buildTableNameString(srcTask.getDatabaseName(), srcTableName,true,false); + Long srcPolygonId = Long.valueOf(srcRootTableData.get(TableOperationUtil.getPrimaryKey(srcRootTable)).toString()); + List multimediaItemList = multimediaService.selectMultiMedia(srcMeidaTableName, srcPolygonId); + if (CollectionUtils.isNotEmpty(multimediaItemList)) + { + for (MultimediaItem multimediaItem : multimediaItemList) + { + String srcMediaPath = multimediaItem.getMediaPath(); + String srcTaskIdString = "task_" + srcTask.getId(); + String destTaskIdString = "task_" + destTask.getId(); + String destMediaPath = srcMediaPath.replace(srcTaskIdString,destTaskIdString); + String destUserIdString = "/user_" + collectorId; + String subDestMediaPath = destMediaPath.substring(0, destMediaPath.lastIndexOf("/")); + String trueDestMediaPath = subDestMediaPath.substring(0,subDestMediaPath.lastIndexOf("/")) + destUserIdString + destMediaPath.substring(destMediaPath.lastIndexOf("/"), destMediaPath.length()); + multimediaItem.setMediaPath(trueDestMediaPath); + multimediaItem.setID(destPolygonId); + multimediaItem.setVersion(0); + multimediaItem.setMediaTableName(PostgreSqlUtil.buildTableNameString(destTask.getDatabaseName(), destTableName, true, false)); + String insertMediaResult = multimediaService.insertMultiMedia(multimediaItem); + if (insertMediaResult.equals(CommonConstant.FAILED)) + { + throw new RuntimeException("插入多媒体数据失败"); + } + // 在多媒体数据都插入成功的情况下,进行多媒体文件迁移 + FileUtils.copyFile(new File(CommonConstant.MEDIA_ROOT + srcMediaPath), new File(CommonConstant.MEDIA_ROOT + trueDestMediaPath)); + } + } + } + } + + // 当 srcRootTableList不为空,将本次抽查的数据主键存入 task_select_id 表中 + if (CollectionUtils.isNotEmpty(srcRootTableList)){ + Integer maxSelectOrder = taskSelectIdService.getMaxSelectOrder(srcTaskId, srcTableName, + destTaskId, destTableName); + TaskSelectId taskSelectId = new TaskSelectId(); + taskSelectId.setSrcTaskId(srcTaskId); + taskSelectId.setSrcTableName(srcTableName); + taskSelectId.setDestTaskId(destTaskId); + taskSelectId.setDestTableName(destTableName); + taskSelectId.setSelectOrder(maxSelectOrder == null ? 1 : maxSelectOrder + 1); + StringBuilder selectIdSb = new StringBuilder(); + srcRootTableList.forEach(srcRootTableData -> selectIdSb.append(srcRootTableData.get(srcPrimaryKey).toString()) + .append(",")); + taskSelectId.setSelectId(selectIdSb.substring(0, selectIdSb.length() - 1)); + if (taskSelectIdService.insertTaskSelectId(taskSelectId).equals(CommonConstant.FAILED)) + { + throw new RuntimeException("TaskSelectId数据插入失败"); + } + } + return new ResultMessage(true, CommonConstant.SUCCEED); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void fileDataInsert (Task destTask, String destTableName, Sheet sheet, String fieldMapping) throws IOException + { + Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName); + Map destFields = destRootTable.getFields(); + List srcTableFieldOrder = new ArrayList<>(); + List destTableFieldOrder = new ArrayList <>(); + String primaryKey = TableOperationUtil.getPrimaryKey(destRootTable); + genTableFieldOrder(fieldMapping, srcTableFieldOrder, destTableFieldOrder, primaryKey); + String destTableNameInDB = PostgreSqlUtil.buildTableNameString(destTask.getDatabaseName(), destTableName, false, false); + + // 用于记录数据的个数,collectorId是为了与正常采集逻辑保持一致 + Long dataCount = 0L; + Integer collectorId = -1; + // 遍历Sheet中数据 + Row firstRow = sheet.getRow(sheet.getFirstRowNum()); + for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) + { + // 用于Field的控件类型为Photo的oldFilePath和newFilePath,待数据插入成功后在复制多媒体文件 + Map srcAndDestPhotoPathMap = new HashMap <>(); + StringBuilder insertSb = new StringBuilder(" INSERT INTO ").append(destTableNameInDB).append("("); + StringBuilder valueSb = new StringBuilder(" VALUES ("); + insertSb.append(CommonConstant.FIX_FIELD_CREATE_TIME).append(",").append(CommonConstant.FIX_FIELD_UPDATE_TIME).append(",") + .append(CommonConstant.FIX_FIELD_STATUS).append(",").append(CommonConstant.FIX_FIELD_VERSION).append(",") + .append(CommonConstant.FIX_FIELD_COLLECTOR).append(","); + valueSb.append(GenerateSqlUtil.generatePostgreSqlDateValue(new Date(), null)).append(",") + .append(GenerateSqlUtil.generatePostgreSqlDateValue(new Date(), null)).append(",") + .append(0).append(",").append(0).append(",").append(collectorId).append(","); + for (String destTableFieldName : destTableFieldOrder) + { + String srcTableFieldName = srcTableFieldOrder.get(destTableFieldOrder.indexOf(destTableFieldName)); + int cellIndex = getCellIndex(firstRow, srcTableFieldName); + assert cellIndex != -1; + if (sheet.getRow(i).getCell(cellIndex) == null) + { + continue; + } + Field field = destFields.get(destTableFieldName); + Cell cell = sheet.getRow(i).getCell(cellIndex); + String cellValue; + if (cell.getCellType().name().equals("NUMERIC")) + { + DecimalFormat df = new DecimalFormat("0"); + cellValue = df.format(cell.getNumericCellValue()); + } + else + { + cellValue = cell.toString(); + } + insertSb.append(PostgreSqlUtil.transformString(destTableFieldName)).append(","); + if (field.getAutoDate() != null && !field.getAutoDate().equals("") && field.getDbType().equals(CommonConstant.DATE)) + { + valueSb.append(GenerateSqlUtil.generatePostgreSqlDateValue(cellValue, CommonConstant.DATE_FORMAT_STRING)).append(","); + continue; + } + // 针对于Field的控件类型是PHOTO的情况处理 + if (StringUtils.isNotBlank(field.getType()) && field.getType().toLowerCase().equals(CommonConstant.PHOTO)) + { + String srcPhotoFileName = cellValue.substring(cellValue.lastIndexOf("/") + 1, cellValue.length()); + String destPhotoPath = MessageFormat.format(CommonConstant.MEDIA_FILE_PATHNAME, destTask.getId(), + collectorId, srcPhotoFileName); + valueSb.append("\'").append(destPhotoPath).append("\',"); + srcAndDestPhotoPathMap.put(cellValue,destPhotoPath); + continue; + } + valueSb = GenerateSqlUtil.appendValueForDifferentField(valueSb, cellValue, field.getDbType().toLowerCase(), null); + } + dataCount += 1; +// if (dataCount % 100 == 0) +// { +// collectorId -= 1; +// } + // 判断fieldMapping中是否有主键字段 + Long destPolygonId = 0L; + if (fieldMappingContainPrimaryKey(fieldMapping, primaryKey)) + { + insertSb.append(PostgreSqlUtil.transformString(primaryKey)).append(","); + String srcPrimaryKeyFieldName = getSrcFieldNameByDestFieldName(fieldMapping, primaryKey); + int cellIndex = getCellIndex(firstRow, srcPrimaryKeyFieldName); + assert cellIndex != -1; + if (sheet.getRow(i).getCell(cellIndex) == null) + { + throw new RuntimeException("数据缺少主键值"); + } + Field field = destFields.get(primaryKey); + Cell cell = sheet.getRow(i).getCell(cellIndex); + String cellValue; + if (cell.getCellType().name().equals("NUMERIC")) + { + DecimalFormat df = new DecimalFormat("0"); + cellValue = df.format(cell.getNumericCellValue()); + } + else + { + cellValue = cell.toString(); + } + destPolygonId = Long.parseLong(cellValue); + valueSb = GenerateSqlUtil.appendValueForDifferentField(valueSb, cellValue, field.getDbType().toLowerCase(), null); + String insertSql = insertSb.substring(0 , insertSb.length() - 1) + ") " + valueSb.substring(0 , valueSb.length() - 1) + ");"; + String insertResult= baseService.insertSqlString(insertSql); + if (insertResult.equals(CommonConstant.FAILED)) + { + throw new RuntimeException("数据插入失败"); + } + // 数据插入成功后,将srcAndDestPhotoPathMap中照片迁移 + photoPathMapMigration(srcAndDestPhotoPathMap); + } + else + { + String insertSql = insertSb.substring(0 , insertSb.length() - 1) + ") " + valueSb.substring(0 , valueSb.length() - 1) + ");"; + SqlEnity sqlEnity = new SqlEnity(); + sqlEnity.setSql(insertSql); + String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(destTask.getDatabaseName(), destRootTable); + sqlEnity.setPrimaryKeySeq(primaryKeySeq); + destPolygonId = baseService.insertSqlEnity(sqlEnity); + if (destPolygonId == null || destPolygonId == 0) + { + throw new RuntimeException("插入失败"); + } + photoPathMapMigration(srcAndDestPhotoPathMap); + } + // 判断firstRow的最后一列值是否为filePath,如果是则有多媒体文件,插入多媒体信息 + if (firstRow.getCell(firstRow.getLastCellNum() - 1).toString().toLowerCase().equals(CommonConstant.FILE_PATH)) + { + insertMultiMedia(sheet.getRow(i).getCell(sheet.getRow(i).getLastCellNum() -1).toString(), destTask, + collectorId, destPolygonId, destTableName); + } + } + + String seqName = genSeqName(destTask.getDatabaseName(),destTableName , primaryKey); + Integer maxId = updateMapper.getMaxId(PostgreSqlUtil.transformString(primaryKey), destTableNameInDB); + updateMapper.updatePrimaryKey(seqName, maxId == null ? 1 : maxId + 1); + } + + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void shpDataInsert (Task destTask, String destTableName, SimpleFeatureIterator itertor, String fieldMapping, + String mediaFilePath) throws IOException, ParseException, InvalidShapefileException { + Table destRootTable = JSON.toJavaObject(JSON.parseObject(destTask.getConfig()), Config.class).getRootTables().get(destTableName); + Map destFields = destRootTable.getFields(); + List srcTableFieldOrder = new ArrayList<>(); + List destTableFieldOrder = new ArrayList <>(); + String primaryKey = TableOperationUtil.getPrimaryKey(destRootTable); + genTableFieldOrder(fieldMapping, srcTableFieldOrder, destTableFieldOrder, primaryKey); + String destTableNameInDB = PostgreSqlUtil.buildTableNameString(destTask.getDatabaseName(), destTableName, false, false); + + // 用于记录数据的个数,collectorId是为了与正常采集逻辑保持一致 + Long dataCount = 0L; + Integer collectorId = -1; + // 遍历SimpleFeatureIterator + while (itertor.hasNext()) + { + // 用于Field的控件类型为Photo的oldFilePath和newFilePath,待数据插入成功后在复制多媒体文件 + Map srcAndDestPhotoPathMap = new HashMap <>(); + StringBuilder insertSb = new StringBuilder(" INSERT INTO ").append(destTableNameInDB).append("("); + StringBuilder valueSb = new StringBuilder(" VALUES ("); + insertSb.append(CommonConstant.FIX_FIELD_CREATE_TIME).append(",").append(CommonConstant.FIX_FIELD_UPDATE_TIME).append(",") + .append(CommonConstant.FIX_FIELD_STATUS).append(",").append(CommonConstant.FIX_FIELD_VERSION).append(",") + .append(CommonConstant.FIX_FIELD_COLLECTOR).append(",").append(CommonConstant.FIX_FIELD_REVIEWER).append(","); + valueSb.append(GenerateSqlUtil.generatePostgreSqlDateValue(new Date(), null)).append(",") + .append(GenerateSqlUtil.generatePostgreSqlDateValue(new Date(), null)).append(",") + .append(0).append(",").append(0).append(",").append(collectorId).append(",").append(-1).append(","); + // 获取每个SimpleFeature的Collection + SimpleFeature feature = itertor.next(); + Collection properties = feature.getProperties(); + for (String destTableFieldName : destTableFieldOrder) + { + String srcTableFieldName = srcTableFieldOrder.get(destTableFieldOrder.indexOf(destTableFieldName)); + Object value = getValueByFieldName(properties, srcTableFieldName); + if (value == null) + { + continue; + } + Field field = destFields.get(destTableFieldName); + insertSb.append(PostgreSqlUtil.transformString(destTableFieldName)).append(","); + if (field.getAutoDate() != null && !field.getAutoDate().equals("") && field.getDbType().equals(CommonConstant.DATE)) + { + valueSb.append(GenerateSqlUtil.generatePostgreSqlDateValue(value, CommonConstant.DATE_FORMAT_STRING)).append(","); + continue; + } + // 针对于Field的控件类型是PHOTO的情况处理 + if (StringUtils.isNotBlank(field.getType()) && field.getType().toLowerCase().equals(CommonConstant.PHOTO)) + { + String valueString = value.toString(); + String srcPhotoFileName = valueString.substring(valueString.lastIndexOf("/") + 1, valueString.length()); + String destPhotoPath = MessageFormat.format(CommonConstant.MEDIA_FILE_PATHNAME, destTask.getId(), + collectorId, srcPhotoFileName); + valueSb.append("\'").append(destPhotoPath).append("\',"); + srcAndDestPhotoPathMap.put(valueString,destPhotoPath); + continue; + } + // 针对Geometry字段需要特殊处理 + if (field.isGeometry()) + { +// valueSb.append("\'").append(changeShpGeomToGeometry(value.toString())).append("\',"); +// continue; +// Geometry geometry = (Geometry) value; +// GeometryJSON geometryJson = new GeometryJSON(15); // 保留高精度 +// StringWriter writer = new StringWriter(); +// geometryJson.write(geometry, writer); // 保留完整结构(含 holes / multipolygon) +// String geoJsonString = writer.toString(); +// valueSb.append("'").append(geoJsonString.replace("'", "''")).append("',"); // 注意 SQL 转义 +// continue; + Geometry geometry = (Geometry) value; + GeometryJSON geometryJson = new GeometryJSON(15); // 保留高精度 + StringWriter writer = new StringWriter(); + geometryJson.write(geometry, writer); + String geoJsonString = writer.toString(); + + // 反序列化为自定义 GeometryType + GeometryType geometryType = JSON.toJavaObject( + JSON.parseObject(geoJsonString), + GeometryType.class + ); + + // 如果是 MultiPolygon,就降级为 Polygon,只保留第一组坐标 + if (geometryType.getType().equalsIgnoreCase(CommonConstant.MULTIPOLYGON)) { + geometryType.setType(CommonConstant.POLYGON); + + @SuppressWarnings("unchecked") + List>>> coordList = + (List>>>) geometryType.getCoordinates(); + // 只取第一组 polygon 的坐标 + geometryType.setCoordinates(coordList.get(0)); + } + + // 转回 JSON 字符串,用于存库 + String finalGeoJson = JSON.toJSONString(geometryType); + valueSb.append("'").append(finalGeoJson.replace("'", "''")).append("',"); + continue; + } + valueSb = GenerateSqlUtil.appendValueForDifferentField(valueSb, value, field.getDbType().toLowerCase(), null); + } + dataCount += 1; +// if (dataCount % 100 == 0) +// { +// collectorId -= 1; +// } + // 判断fieldMapping中是否有主键字段 + Long destPolygonId = 0L; + if (fieldMappingContainPrimaryKey(fieldMapping, primaryKey)){ + insertSb.append(PostgreSqlUtil.transformString(primaryKey)).append(","); + String srcPrimaryKeyFieldName = getSrcFieldNameByDestFieldName(fieldMapping, primaryKey); + Object value = getValueByFieldName(properties, srcPrimaryKeyFieldName); + if (value == null) + { + throw new InvalidShapefileException("数据缺少主键值"); + } + destPolygonId = Long.parseLong(value.toString()); + if (destPolygonId == 0) { + throw new InvalidShapefileException("主键不能为0"); + } + Field field = destFields.get(primaryKey); + valueSb = GenerateSqlUtil.appendValueForDifferentField(valueSb, value, field.getDbType().toLowerCase(), null); + String insertSql = insertSb.substring(0 , insertSb.length() - 1) + ") " + valueSb.substring(0 , valueSb.length() - 1) + ");"; + String insertResult= baseService.insertSqlString(insertSql); + if (insertResult.equals(CommonConstant.FAILED)) + { + throw new RuntimeException("数据插入失败"); + } + // 数据插入成功后,将srcAndDestPhotoPathMap中照片迁移 + photoPathMapMigration(srcAndDestPhotoPathMap); + } + else + { + String insertSql = insertSb.substring(0 , insertSb.length() - 1) + ") " + valueSb.substring(0 , valueSb.length() - 1) + ");"; + SqlEnity sqlEnity = new SqlEnity(); + sqlEnity.setSql(insertSql); + String primaryKeySeq = GenerateSqlUtil.generatePrimaryKeySeq(destTask.getDatabaseName(), destRootTable); + sqlEnity.setPrimaryKeySeq(primaryKeySeq); + destPolygonId = baseService.insertSqlEnity(sqlEnity); + if (destPolygonId == null || destPolygonId == 0) + { + throw new RuntimeException("数据插入失败"); + } + // 数据插入成功后,将srcAndDestPhotoPathMap中照片迁移 + photoPathMapMigration(srcAndDestPhotoPathMap); + } + // 判断firstRow的最后一列值是否为filePath,如果是则有多媒体文件,插入多媒体信息 + if (mediaFilePath != null) + { + // 另外插入多媒体信息 + if (getValueByFieldName(properties, mediaFilePath) != null) + { + insertMultiMedia(getValueByFieldName(properties, mediaFilePath).toString(), destTask, collectorId, + destPolygonId, destTableName); + } + } + } + + String seqName = genSeqName(destTask.getDatabaseName(),destTableName , primaryKey); + Integer maxId = updateMapper.getMaxId(PostgreSqlUtil.transformString(primaryKey), destTableNameInDB); + updateMapper.updatePrimaryKey(seqName, maxId == null ? 1 : maxId + 1); + } + + /** + * 向srcTableFieldOrder,destTableFieldOrder添加TableName.注意这里的List中不包括主键字段名 + */ + private void genTableFieldOrder(String fieldMapping, List srcTableFieldOrder, List destTableFieldOrder, String primaryKey) + { + JSONArray jsonArray = JSON.parseArray(fieldMapping); + for (Object object : jsonArray) + { + JSONObject jsonObject = (JSONObject) object; + if (!jsonObject.getString("destTableField").equals(primaryKey)) + { + destTableFieldOrder.add(jsonObject.getString("destTableField")); + srcTableFieldOrder.add(jsonObject.getString("srcTableField")); + } + } + } + + /** + * 检查前端传来的fieldMapping,是否有destTableField为主键,如果有主键,根据Excel或shp中主键列插值; + * 没有主键,则按照主键自增插值 + */ + private boolean fieldMappingContainPrimaryKey(String fieldMapping, String primaryKey) + { + JSONArray jsonArray = JSON.parseArray(fieldMapping); + for (Object object : jsonArray) + { + JSONObject jsonObject = (JSONObject) object; + if (jsonObject.getString("destTableField").equals(primaryKey)) + { + return true; + } + } + return false; + } + + /** + * 基于fieldMapping,根据destFieldName找到对应的srcFieldName + */ + private String getSrcFieldNameByDestFieldName(String fieldMapping, String destFieldName) + { + JSONArray jsonArray = JSON.parseArray(fieldMapping); + for (Object object : jsonArray) + { + JSONObject jsonObject = (JSONObject) object; + if (jsonObject.getString("destTableField").equals(destFieldName)) + { + return jsonObject.getString("srcTableField"); + } + } + return null; + } + + /** + * 获取Sheet的cellName所在的cellIndex + */ + private int getCellIndex(Row fisrtRow, String cellName) + { + for (int i = 0; i < fisrtRow.getLastCellNum(); i++) + { + if (fisrtRow.getCell(i).toString().equals(cellName)) + { + return i; + } + } + return -1; + } + + /** + * 在数据插入成功后,将srcAndDestPhotoPathMap中照片迁移 + */ + private void photoPathMapMigration(Map srcAndDestPhotoPathMap) + { + if (MapUtils.isNotEmpty(srcAndDestPhotoPathMap)) + { + srcAndDestPhotoPathMap.forEach((srcPath,destPath)-> { + try + { + FileUtils.copyFile(new File(srcPath), new File(destPath)); + } + catch (IOException ioe) + { + ioe.printStackTrace(); + }}); + } + } + + /** + * 从Collection中根据属性值 + */ + private Object getValueByFieldName(Collection properties, String fieldName) + { + //遍历feature的properties + for (Property pro : properties) + { + if (pro.getName().toString().equals(fieldName)) + { + return pro.getValue(); + } + } + return null; + } + + /** + * 根据传进来的mediaFilePath字符串(可能存在多个路径,用逗号隔开),进行MultiMedia插入 + */ + private void insertMultiMedia(String mediaFilePath, Task task, Integer collectorId, Long destPolygonId, + String destTableName) throws IOException + { + if (StringUtils.isNotBlank(mediaFilePath)) + { + String[] filePathStringArr = mediaFilePath.split(","); + for (String filePath : filePathStringArr) + { + String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); + String destMediaPath = MessageFormat.format(CommonConstant.MEDIA_FILE_PATHNAME, task.getId(), collectorId, fileName); + MultimediaItem multimediaItem = new MultimediaItem(); + multimediaItem.setID(destPolygonId); + multimediaItem.setFile(fileName); + multimediaItem.setMediaPath(destMediaPath); + multimediaItem.setVersion(0); + multimediaItem.setMediaTableName(PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), destTableName, true, false)); + String insertMediaResult = multimediaService.insertMultiMedia(multimediaItem); + if (insertMediaResult.equals(CommonConstant.FAILED)) + { + throw new RuntimeException("数据多媒体失败"); + } + // 在多媒体数据都插入成功的情况下,进行多媒体文件迁移 + FileUtils.copyFile(new File(filePath), new File(destMediaPath)); + } + } + } + + /** + * 将WKT字符串格式转为Geometry格式 + */ +// private String changeShpGeomToGeometry(String geomString) throws ParseException, IOException +// { +// WKTReader wktReader = new WKTReader(); +// Geometry geometry = wktReader.read(geomString); +// GeometryJSON geometryJson = new GeometryJSON(15); +// StringWriter writer = new StringWriter(); +// geometryJson.write(geometry, writer); +// GeometryType geometryType = JSON.toJavaObject(JSON.parseObject(writer.toString()), GeometryType.class); +// if (geometryType.getType().toLowerCase().equals(CommonConstant.MULTIPOLYGON.toLowerCase())) +// { +// geometryType.setType(CommonConstant.POLYGON); +// List>>> coordList = (List>>>)geometryType.getCoordinates(); +// geometryType.setCoordinates(coordList.get(0)); +// } +// return JSON.toJSONString(geometryType); +// } + + /** + * 从taskSelectIdList获取selectId的List + */ + private List getSelectIdList(List taskSelectIdList){ + List result = new ArrayList <>(); + taskSelectIdList.forEach(taskSelectId -> { + String[] selectIdArr = taskSelectId.getSelectId().split(","); + result.addAll(Arrays.stream(selectIdArr).map(Integer::valueOf).collect(Collectors.toList())); + }); + return result; + } + + public String genSeqName(String databaseName, String tableName, String primaryKey){ + return PostgreSqlUtil.transformString(databaseName) + "." + PostgreSqlUtil.transformString(tableName + "_" + primaryKey + "_seq"); + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/MultimediaServiceImpl.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/MultimediaServiceImpl.java new file mode 100644 index 0000000..106b3b0 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/MultimediaServiceImpl.java @@ -0,0 +1,125 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.collection.domain.ExportMediaRecord; +import cn.edu.whu.boot.collection.domain.MultimediaItem; +import cn.edu.whu.boot.collection.mapper.MultimediaMapper; +import cn.edu.whu.boot.collection.service.IMultimediaService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collections; +import java.util.List; + +@Service +public class MultimediaServiceImpl implements IMultimediaService { + + @Autowired + private MultimediaMapper multimediaMapper; + + @Autowired + private ITaskService taskService; + + @Value("${MediaPath}") + private String mediaPath; + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String insertMultiMedia(MultimediaItem media) + { + int id=multimediaMapper.insertMultiMedia(media); + if(id == 1) + { + return CommonConstant.SUCCEED; + } + else + { + return CommonConstant.FAILED; + } + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public String deleteMultiMedia(String mediaTableName , Long polygonId) + { + int result = multimediaMapper.deleteMulitMedia(mediaTableName,polygonId); + if(result != 0) + { + return CommonConstant.SUCCEED; + } + else + { + return CommonConstant.FAILED; + } + + } + + @Override + public String deleteMulitMediaGreaterThanVersion(String mediaTableName , Long polygonId , int version) + { + int result = multimediaMapper.deleteMulitMediaGreaterThanVersion(mediaTableName, polygonId, version); + if(result != 0) + { + return CommonConstant.SUCCEED; + } + else + { + return CommonConstant.FAILED; + } + } + + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public List selectMultiMedia(String mediaTableName, Long polygonId) { + try{ + List multimediaItemList = multimediaMapper.selectMultiMedia(mediaTableName, polygonId); + if(multimediaItemList.isEmpty()) { + return null; + } + else { + return multimediaItemList; + } + }catch (Exception e){ + return null; + } + + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public List selectHistoryMultiMedia(String mediaTableName , Long polygonId , int versionCode) + { + List multimediaItemList = multimediaMapper.selectHistoryMultiMedia(mediaTableName, polygonId, + versionCode); + if(multimediaItemList.size() == 0) + { + return null; + } + else + { + return multimediaItemList; + } + } + + @Override + public List selectByTaskIdAndTableName(int taskId, String tableName) { + Task task = taskService.getTaskById(taskId); + if (task == null) { + return Collections.emptyList(); + } + String tableNameInDb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, true, false); + List records = multimediaMapper.selectByTableName(tableNameInDb); + // 把绝对路径中的根目录路径去掉 + records.forEach(item -> { + item.setMediaPath(item.getMediaPath().substring(mediaPath.length())); + }); + return records; + } +} diff --git a/src/main/java/cn/edu/whu/boot/collection/service/impl/SearchPageServiceImpl.java b/src/main/java/cn/edu/whu/boot/collection/service/impl/SearchPageServiceImpl.java new file mode 100644 index 0000000..49a456a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/collection/service/impl/SearchPageServiceImpl.java @@ -0,0 +1,47 @@ +package cn.edu.whu.boot.collection.service.impl; + +import cn.edu.whu.boot.collection.mapper.SearchPageMapper; +import cn.edu.whu.boot.collection.service.ISearchPageService; +import com.github.pagehelper.Page; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class SearchPageServiceImpl implements ISearchPageService{ + + @Autowired + private SearchPageMapper searchPageMapper; + + @Override + public Page> getPageDataByStatus(String tableNameInDB, int status){ + if(status == 0){ + return searchPageMapper.getUncheckedPageData(tableNameInDB); + } + else{ + return searchPageMapper.getPageDataByStatus(tableNameInDB, status); + } + } + + @Override + public Page> getPageDataByWorkerAndStatus(String tableNameInDB, Integer workerId, int status) { + // TODO 统一使用 getPageDataByStatusAndWorker + if(status == 0){ + return searchPageMapper.getUncheckedPageDataByWorker(tableNameInDB, workerId); + } + else{ + return searchPageMapper.getPageDataByStatusAndWorker(tableNameInDB, status, workerId); + } + } + + @Override + public Page> getPageDataByFuzzySearch(String tableNameInDB, String fieldNameInDB, String searchKey){ + return searchPageMapper.getPageDataByFuzzySearch(tableNameInDB, fieldNameInDB, searchKey); + } + @Override + public Page> getPageDataByWorkerNoStatus(String tableNameInDb) { + return searchPageMapper.getPageDataByWorkerNoStatus(tableNameInDb); + } + +} diff --git a/src/main/java/cn/edu/whu/boot/common/component/WebLogAspect.java b/src/main/java/cn/edu/whu/boot/common/component/WebLogAspect.java new file mode 100644 index 0000000..910f5a4 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/component/WebLogAspect.java @@ -0,0 +1,103 @@ +package cn.edu.whu.boot.common.component; + +import cn.edu.whu.boot.collection.dto.WebLog; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSON; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.*; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.*; + +/** + * 统一日志处理切面 + * @author Zhou Chao + */ +@Aspect +@Component +public class WebLogAspect{ + private static final Logger LOGGER = LoggerFactory.getLogger(WebLogAspect.class); + + @Pointcut("execution(public * cn.edu.whu.boot.*.controller.*.*(..)) || execution(public * cn.edu.whu.boot.*.controllers.*.*(..))") + public void webLog(){ + } + + //@Around("webLog()") + public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{ + Object result = joinPoint.proceed(); + if(RequestContextHolder.getRequestAttributes() == null){ + return result; + } + long startTime = System.currentTimeMillis(); + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = attributes.getRequest(); + //记录请求信息 + WebLog webLog = new WebLog(); + + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + long endTime = System.currentTimeMillis(); + String urlStr = request.getRequestURL().toString(); + webLog.setBasePath(StrUtil.removeSuffix(urlStr, URLUtil.url(urlStr).getPath())); + webLog.setIp(request.getRemoteUser()); + webLog.setMethod(request.getMethod()); + webLog.setParameter(getParameter(method, joinPoint.getArgs())); + webLog.setSpendTime((int) (endTime - startTime)); + webLog.setStartTime(startTime); + webLog.setUri(request.getRequestURI()); + webLog.setUrl(request.getRequestURL().toString()); + LOGGER.info("{}", JSON.toJSONString(webLog)); + return result; + } + + /** + * 根据方法和传入的参数获取请求参数 + */ + private Object getParameter(Method method, Object[] args) { + LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); + String[] paramNames = u.getParameterNames(method); + StringBuilder params = new StringBuilder(); + if(args != null && paramNames != null){ + params = handleParams(params, args, Arrays.asList(paramNames)); + } + return params.toString(); + } + + private StringBuilder handleParams(StringBuilder params, Object[] args, List paramNames){ + for(int i = 0; i < args.length; i++){ + if(args[i] instanceof Map){ + Set set = ((Map) args[i]).keySet(); + List list = new ArrayList<>(); + List paramList = new ArrayList<>(); + for(Object key : set){ + list.add(((Map) args[i]).get(key)); + paramList.add(key); + } + return handleParams(params, list.toArray(), paramList); + } + else{ + if(args[i] instanceof MultipartFile){ + MultipartFile file = (MultipartFile) args[i]; + params.append(" ").append(paramNames.get(i)).append(": ").append(file.getName()); + } + else{ + params.append(" ").append(paramNames.get(i)).append(": ").append(args[i]); + } + } + } + return params; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/config/BaseRedisConfig.java b/src/main/java/cn/edu/whu/boot/common/config/BaseRedisConfig.java new file mode 100644 index 0000000..c263a57 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/config/BaseRedisConfig.java @@ -0,0 +1,62 @@ +package cn.edu.whu.boot.common.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; + +/** + * Redis 基础配置 + * @author Zhou Chao + */ +@Configuration +public class BaseRedisConfig{ + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisSerializer serializer = redisSerializer(); + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(serializer); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(serializer); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + @Bean + public RedisSerializer redisSerializer() { + //创建JSON序列化器 + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 必须设置,否则无法将JSON转化为对象,会转化成Map类型 + objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); + serializer.setObjectMapper(objectMapper); + return serializer; + } + + @Bean + public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); + //设置Redis缓存有效期为1天 + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer())).entryTtl(Duration.ofDays(1)); + return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration); + } + +} diff --git a/src/main/java/cn/edu/whu/boot/common/domain/CommonConstant.java b/src/main/java/cn/edu/whu/boot/common/domain/CommonConstant.java new file mode 100644 index 0000000..926df4d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/CommonConstant.java @@ -0,0 +1,274 @@ +package cn.edu.whu.boot.common.domain; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * CommonConstant 类主要定义固定常量字符串! + * + * @author Zhou Chao + */ +@Component +public class CommonConstant { + + public static final String FAILED = "failed"; + public static final String SUCCEED = "succeed"; + + /** + * 在 TaskController 类中的创建任务接口中,传入的 String configString 是以 Json 形式传输的! + * Json 形式如下: + * { + * "name":"", + * "key":"", + * "taskUploadTime":"", + * "introduction":"", + * "id":"", + * "isAllocationOptional":"" + * "config":{...} + * } + * 上面 key 分别对应着任务名称、关键字、任务上传时间、任务备注、当前操作用户id、具体的 xml 文件配置!!! + * 其中 "config":{...} 中的 Json 内容参考下面解释!!! + * 另外因为其他地方也会用到 name 和 key 字符串,所以这里并没有添加特定的 TASK_ 前缀 + */ + public static final String NAME = "name"; + public static final String KEY = "key"; + public static final String TASK_INTRODUCTION = "introduction"; + public static final String TASK_UPLOADTIME = "taskUploadTime"; + public static final String TASK_USER_ID = "id"; + public static final String TASK_IS_ALLOCATION_OPTIONAL = "isAllocationOptional"; + public static final String TASK_XML_CONFIG = "config"; + + /** + * "config":{...} 中的 Json 内容如下所示,看这部分注释时同时观察 XML 文件更容易理解!!! + * { + * "meta":{ + * "drawtool":[{ "name":"location" }, ... ], + * "position":[{ "name":"gps" }, ... ], + * "basemap":[{ "name":"天地图底图", "index":"0", "subType":"VEC_C", "type":"tianditu", + * "group":"vector", "url":""}, ... ] + * }, + * "tables":[{ + * "name":"测试1", "key":"test", + * "fields":[{ "index":"", "name":"", "type":"", "selector":[], "select":"" ,"mode":"" , + * "key":"ID" ,"parentID":"", "dbType":"integer", "resultType":"", "geometry":"", + * "required":"", "identity":true, "uploadName":"", "autoDate":"", "show":"", + * "enable":"", "script":"", "associate":"", "collection":"", "autoIncrement":true + * }, ... ] + * }, ... ] + * } + */ + public static final String TAG_META = "meta"; + public static final String TAG_TABLES = "tables"; + public static final String TAG_DRAWTOOL = "drawtool"; + public static final String TAG_DRAWTOOL_GROUP = "group"; + public static final String TAG_POSITIOON = "position"; + public static final String TAG_BASEMAP = "basemap"; + public static final String TAG_TYPE = "type"; + public static final String TAG_LAYER = "layer"; + public static final String TAG_TABLE = "table"; + public static final String TAG_FIELD = "field"; + public static final String TABLES_FIELDS = "fields"; + public static final String FIELD_KEY = "key"; + public static final String FIELD_NAME = "name"; + public static final String FIELD_TYPE = "type"; + public static final String FIELD_SELECTOR = "selector"; + public static final String FIELD_INDEX = "index"; + public static final String FIELD_SELECT = "select"; + public static final String FIELD_MODE = "mode"; + public static final String FIELD_PARENT_ID = "parentID"; + public static final String FIELD_DB_TYPE = "dbType"; + public static final String FIELD_RESULT_TYPE = "resultType"; + public static final String FIELD_GEOMETRY = "geometry"; + public static final String FIELD_REQUIRED = "required"; + public static final String FIELD_IDENTITY = "identity"; + public static final String FIELD_UPLOAD_NAME = "uploadName"; + public static final String FIELD_AUTO_DATE = "autoDate"; + public static final String FIELD_SHOW = "show"; + public static final String FIELD_ENABLE = "enable"; + public static final String FIELD_SCRIPT = "script"; + public static final String FIELD_ASSOCIATE = "associate"; + public static final String FIELD_COLLECTION = "collection"; + public static final String FIELD_AUTO_INCREMENT = "autoIncrement"; + + /** + * 每个表中固定会有的字段!!! 所以这些字段名不能被使用! + * version 版本号 + * collector 采集人 + * reviewer 审核人 + * create_time 创建时间 + * update_time 更新时间 + * status 数据状态 : -1 审核未通过 + * 0 已分配,未审核(经过韦瀚植的自动分配) ; + * 1 已采集,未审核 + * 2 已审核 + * reason 数据未通过审核原因 + *

+ * 另外 geometry 和 date 虽然不是固定字段,但是这两个字符串比较特殊,也不能被使用! + * filepath 是通过文件向表中导入数据的作为多媒体文件标志的固定列名!!! + */ + public static final String FIX_FIELD_VERSION = "version"; + public static final String FIX_FIELD_COLLECTOR = "collector"; + public static final String FIX_FIELD_REVIEWER = "reviewer"; + public static final String FIX_FIELD_CREATE_TIME = "create_time"; + public static final String FIX_FIELD_UPDATE_TIME = "update_time"; + public static final String FIX_FIELD_STATUS = "status"; + public static final String FIX_FIELD_REASON = "reason"; + public static final String GEOMETRY = "geometry"; + public static final String FILE_PATH = "filepath"; + public static final Set FIX_FIELD_SET = new HashSet() { + private static final long serialVersionUID = 1263688440065455203L; + + { + add(FIX_FIELD_VERSION); + add(FIX_FIELD_COLLECTOR); + add(FIX_FIELD_REVIEWER); + add(FIX_FIELD_CREATE_TIME); + add(FIX_FIELD_UPDATE_TIME); + add(FIX_FIELD_STATUS); + add(FIX_FIELD_REASON); + add(GEOMETRY); + add(FILE_PATH); + add(DATE); + add(""); + } + }; + + /** + * DATE_FORMAT_STRING 是正常时间的字符串格式 + */ + public static final String DATE_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss"; + public static final String FILE_DATE_FORMAT_STRING = "yyyy-MM-dd HH-mm-ss"; + + /** + * 网页端编辑任务中几个可选择的 DBType 字符串 + */ + public static final String INTEGER = "integer"; + public static final String STRING = "string"; + public static final String TEXT = "text"; + public static final String BLOB = "blob"; + public static final String DATE = "date"; + public static final String LONG = "long"; + public static final String DOUBLE = "double"; + + /** + * 安卓端控件类型 + */ + public static final String PHOTO = "photo"; + public static final String CAMERA = "camera"; + + /** + * 数据库多媒体和历史表后缀字符串,以及固定轨迹和草图表名 + */ + public static final String MEDIA_SUFFIX = "_media"; + public static final String HISTORY_SUFFIX = "_history"; + public static final String MEDIA_HISTORY_SUFFIX = "_media_history"; + public static final String ROUTE_LINE = "route_line"; + public static final String DRAFT = "draft"; + + /** + * 移动端上传的空间数据涉及到的字符串 + */ + public static final String X = "x"; + public static final String Y = "y"; + public static final String PATHS = "paths"; + public static final String RINGS = "rings"; + + /** + * 定义前端要求的Feature类中涉及的常量字符串 + */ + public static final String MULTIPOLYGON = "MultiPolygon"; + public static final String POINT = "Point"; + public static final String LINESTRING = "LineString"; + public static final String POLYGON = "Polygon"; + public static final String FEATURE = "Feature"; + + /** + * 访问图片及视频文件的固定ip前缀字符串 + */ + public static final String GET_PICTURE_PREFIX = "/get/getPicture/"; + public static final String GET_VIDEO_PREFIX = "/get/getVideo/"; + + /** + * xml文件名前缀 + */ + public static final String XML_FILENAME_PREFIX = "Xml_"; + + /** + * 定义两个固定字符串表示Android 和 Browser 端 + */ + public static final String ANDROID = "android"; + public static final String BROWSER = "browser"; + + /** + * 安卓端传来的 ShapeString 中"spatialReference"相关固定个字符串 + */ + public static final String SPATIAL_REFERENCE = "spatialReference"; + public static final Map SPATIAL_REFERENCE_VALUE = new HashMap() { + private static final long serialVersionUID = 6477119511765851104L; + + { + put("wkid", 4490); + } + }; + + /** + * 静态资源根目录 + */ + public static String STATIC_RESOURCE_ROOT; + + @Value("${static.file.path}") + public void setStaticResourceRoot(String staticResourceRoot) { + CommonConstant.STATIC_RESOURCE_ROOT = staticResourceRoot; + } + + /** + * 多媒体文件的根目录 + */ + public static String MEDIA_ROOT; + + @Value("${MediaPath}") + public void setMediaRoot(String mediaRoot) { + CommonConstant.MEDIA_ROOT = mediaRoot; + } + + /** + * 中间文件路径,多媒体文件路径,历史多媒体文件路径 + */ + public static String TEMP_FILE_PATHNAME; + + @Value("#{'${static.file.path}' + '/temp'}") + public void setTempFilePathname(String tempFilePathname) { + CommonConstant.TEMP_FILE_PATHNAME = tempFilePathname; + } + + public static String MEDIA_FILE_PATHNAME; + + @Value("#{'${MediaPath}' + '/task_{0}/user_{1}/{2}'}") + public void setMediaFilePathname(String mediaFilePathname) { + CommonConstant.MEDIA_FILE_PATHNAME = mediaFilePathname; + } + // 只包含 task 层级目录 + public static final String MEDIA_TASK_FOLDER_PATH = "D:/TJ_project/back_end/static/MediaFile/task_{0}"; + + public static String HISTORY_MEDIA_FILE_PATHNAME; + + @Value("#{'${HistoryMediaPath}' + '/task_{0}/user_{1}/{2}'}") + public void setHistoryMediaFilePathname(String historyMediaFilePathname) { + CommonConstant.HISTORY_MEDIA_FILE_PATHNAME = historyMediaFilePathname; + } + + /** + * 数据个数 + */ + public static String DATACOUNT = "datacount"; + + /** + * 分页查询的PageSize + */ + public static int PAGE_SIZE = 7; +} diff --git a/src/main/java/cn/edu/whu/boot/common/domain/ExceptionInfo.java b/src/main/java/cn/edu/whu/boot/common/domain/ExceptionInfo.java new file mode 100644 index 0000000..2c3fead --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/ExceptionInfo.java @@ -0,0 +1,58 @@ +package cn.edu.whu.boot.common.domain; + +import com.alibaba.fastjson.JSON; + +import java.io.Serializable; + +/** + * 异常信息 + * @author CXJ + */ +public class ExceptionInfo implements Serializable { + + private static final Long serialVersionUID = 1007L; + public static final Integer OK = 200; + public static final Integer ERROR = 500; + + private Integer code; + private String message; + private String url; + private T data; + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/domain/GlobalExceptionHandler.java b/src/main/java/cn/edu/whu/boot/common/domain/GlobalExceptionHandler.java new file mode 100644 index 0000000..972bf2a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/GlobalExceptionHandler.java @@ -0,0 +1,89 @@ +package cn.edu.whu.boot.common.domain; + +import cn.edu.whu.boot.allocation.exceptions.InvalidShapefileException; +import cn.edu.whu.boot.allocation.exceptions.InvalidAssignmentStatus; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authz.UnauthenticatedException; +import org.apache.shiro.authz.UnauthorizedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.ConstraintViolationException; +import java.io.IOException; +import java.nio.file.InvalidPathException; +import java.sql.SQLException; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 全局异常处理类 + * + * @author CXJ + */ +@ControllerAdvice +public class GlobalExceptionHandler{ + + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(Exception.class) + @ResponseBody + public String handle(HttpServletRequest req, Exception exception){ + log.error(ExceptionUtils.getStackTrace(exception)); + + ExceptionInfo exceptionInfo = new ExceptionInfo<>(); + String info; + if(exception instanceof NullPointerException){ + info = "空指针错误"; + } + else if(exception instanceof InvalidPathException){ + info = "文件路径错误"; + } + else if(exception instanceof IOException){ + info = "读写文件时发生异常"; + } + else if(exception instanceof UnauthenticatedException){ + info = "用户未认证"; + } + else if(exception instanceof UnauthorizedException){ + info = "用户权限不足"; + } + else if(exception instanceof AuthenticationException){ + info = "用户认证失败"; + } + else if(exception instanceof DuplicateKeyException){ + info = exception.getMessage(); + if(info.contains("unique_username")){ + info = "用户名已被使用"; + } + else if(info.contains("unique_phone")){ + info = "手机号码已被使用"; + } + else if(info.contains("unique_email")){ + info = "邮箱已被使用"; + } + } + else if(exception instanceof ConstraintViolationException){ + info = Stream.of(exception.getMessage().split(",")).map(message -> message.substring(message.indexOf(": ") + ": ".length())).collect(Collectors.joining(",")); + } + else if(exception instanceof SQLException){ + info = "操作数据库时发生异常"; + } else if (exception instanceof InvalidAssignmentStatus) { + info = exception.getMessage(); + } else if (exception instanceof InvalidShapefileException) { + info = exception.getMessage(); + } else { + info = "程序内部错误"; + } + exceptionInfo.setCode(ExceptionInfo.ERROR); + exceptionInfo.setMessage(info); + exceptionInfo.setData(null); + exceptionInfo.setUrl(req.getRequestURL().toString()); + return exceptionInfo.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/common/domain/RedisExpireTime.java b/src/main/java/cn/edu/whu/boot/common/domain/RedisExpireTime.java new file mode 100644 index 0000000..95f7e02 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/RedisExpireTime.java @@ -0,0 +1,28 @@ +package cn.edu.whu.boot.common.domain; + +/** + * Redis 相关过期时间枚举类 + * @author Zhou Chao + */ +public enum RedisExpireTime{ + + HALF_HOUR(1800L), + ONE_HOUR(3600L), + HALF_DAY(43200L), + ONE_DAY(86400L), + ONE_WEEK(604800L); + + private long time; + + RedisExpireTime(long time){ + this.time = time; + } + + public long getTime(){ + return time; + } + + public void setTime(long time){ + this.time = time; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/domain/ResultMessage.java b/src/main/java/cn/edu/whu/boot/common/domain/ResultMessage.java new file mode 100644 index 0000000..b609d48 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/ResultMessage.java @@ -0,0 +1,123 @@ +package cn.edu.whu.boot.common.domain; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; + +import java.io.Serializable; + +/** + * 返回给前端的通用类 + */ +public class ResultMessage implements Serializable{ + + private static final long serialVersionUID = -5295491166625639702L; + + /** + * 是否成功标志 + */ + private boolean success; + + /** + * 提示信息 + */ + private String message; + + /** + * 封装数据 + */ + private T data; + + /** + * 状态码 + */ + private int status; + + public ResultMessage(boolean success, String message){ + this.success = success; + this.message = message; + } + + public ResultMessage(boolean success, String message, T data){ + this(success, message, data, StatusCode.SUCCESS.getStatus()); + } + + public ResultMessage(boolean success, String message, int status){ + this(success, message, null, status); + } + + public ResultMessage(boolean success, String message, T data, int status){ + this.success = success; + this.message = message; + this.data = data; + this.status = status; + } + + /** + * 成功返回结果 + */ + public static ResultMessage success(T data) { + return new ResultMessage<>(true, StatusCode.SUCCESS.getMessage(), data, StatusCode.SUCCESS.getStatus()); + } + + /** + * 失败返回结果 + */ + public static ResultMessage failed(int status, String message) { + return new ResultMessage<>(false, message, status); + } + + /** + * 失败返回结果 + */ + public static ResultMessage failed( String message) { + return new ResultMessage<>(false, message, StatusCode.FAILED.getStatus()); + } + + public boolean isSuccess(){ + return success; + } + + public void setSuccess(boolean success){ + this.success = success; + } + + public String getMessage(){ + return message; + } + + public void setMessage(String message){ + this.message = message; + } + + public T getData(){ + return data; + } + + public void setData(T data){ + this.data = data; + } + + public int getStatus(){ + return status; + } + + public void setStatus(int status){ + this.status = status; + } + + @Override + public String toString(){ + return JSON.toJSONString(this); + } + + /** + * 关闭 fastJson 的循环引用 + */ + public String toStringByDisableCircularReference(){ + return JSON.toJSONString(this, SerializerFeature.DisableCircularReferenceDetect); + } + + +} + + diff --git a/src/main/java/cn/edu/whu/boot/common/domain/SqlStringConstant.java b/src/main/java/cn/edu/whu/boot/common/domain/SqlStringConstant.java new file mode 100644 index 0000000..252e2f9 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/SqlStringConstant.java @@ -0,0 +1,97 @@ +package cn.edu.whu.boot.common.domain; + +/** + * 存放 SQL 的模板常量类! 该类中的常量主要供 MessageFormat 使用,所以存在 {0} {1} 等样式!!! + * + * 为什么会存在这个类呢?系统用于自定义项目,也就是或表名、字段名你都不知道,那么你能通过 + * Task 来获取数据库表相关信息,然后基于这些信息组装 SQL ! 下面提供常用的模板,只需要确定参数即可!!! + */ +public class SqlStringConstant{ + /** + * PostgreSQL 数据库 schema 相关的 SQL + */ + public static final String DROP_SCHEMA = "DROP SCHEMA IF EXISTS {0} CASCADE;"; + public static final String CREATE_SCHEMA = "CREATE SCHEMA {0};"; + + /** + * PostgreSQL 数据库 table 相关的 SQL ! + * 注意 CREATE_Table 并没有带 ";" ,因为后面还需要追加字段的信息!!! + */ + public static final String DROP_TABLE = "DROP TABLE IF EXISTS {0};"; + public static final String CREATE_TABLE_PREFIX = "CREATE TABLE {0}( "; + public static final String CREATE_TABLE_COMMENT = "COMMENT on TABLE {0} is {1};"; + public static final String CREATE_COLUMN_COMMENT = "COMMENT on COLUMN {0} is {1};"; + + /** + * 创建多媒体表、轨迹表、草图表相关的 SQL ! + */ + public static final String CREATE_MEDIA_TABLE_SQL = "DROP TABLE IF EXISTS {0};" + + "CREATE TABLE {0}( media_id serial, id integer NOT NULL, " + + "file VARCHAR(255) NOT NULL ,media_path VARCHAR(255), azimuth decimal(13,8)," + + "satellites INTEGER, longitude decimal(13,10), latitude decimal(13,10), " + + "altitude decimal(13,8), accuracy decimal(13,8), camera_angle decimal(13,10), " + + "camera_pitch decimal(13,10), camera_roll decimal(13,10), method VARCHAR(10), " + + "time VARCHAR(50), focal_length decimal(13,8), type INTEGER , version smallint default 0, "; + + public static final String CREATE_ROUTE_TABLE_SQL = "DROP TABLE IF EXISTS {0}; " + + "CREATE TABLE {0}(id serial PRIMARY key,collector varchar(255), collector_id integer, route text ," + + " begin_time timestamp without time zone, stop_time timestamp without time zone);"; + + public static final String CREATE_DRAFT_TABLE_SQL = "DROP TABLE IF EXISTS {0}; " + + "CREATE TABLE {0}(id serial PRIMARY key,username varchar(255), collector_id integer," + + "shape text , draw_time timestamp without time zone);"; + + /** + * PostgreSQL 数据库设置主键相关的 SQL ! + */ + public static final String CREATE_PRIMARY_KEY = "PRIMARY KEY ({0}));"; + public static final String CREATE_UNION_PRIMARY_KEY = "PRIMARY KEY ({0},{1}));"; + public static final String CREATE_MEDIA_PRIMARY_KEY = "PRIMARY KEY (media_id));"; + public static final String CREATE_MEDIA_UNION_PRIMARY_KEY = "PRIMARY KEY (media_id, version));"; + + // 数据库查询中使用到的 SQL 模板 + + /** + * 抽稀获取 GeoHash 的边界 + */ + public static String SELECT_SQL_BY_GEOHASH = " select count(*) as datacount,geometry from ( " + + " select ST_ASGEOJSON(st_geomfromgeohash(ST_GeoHash(ST_GeomFromGeoJSON({1}), {2}),{2})) as geometry,{1} " + + " from {0} {7} ) AS geohash where ST_Intersects(ST_MakeEnvelope({3},{4},{5},{6},4490), st_setsrid(ST_GeomFromGeoJSON({1}), 4490)) " + + " group by geometry "; + + /** + * 网页端进行抽稀查询的固定SELECT_SQL_BY_GEOHASH,获取的是geohash的中心点 + */ + public static String SELECT_CENTROID_SQL_BY_GEOHASH = " select count(*) as datacount,geometry from ( " + + " select ST_ASGEOJSON(ST_Centroid(st_geomfromgeohash(ST_GeoHash(ST_GeomFromGeoJSON({1}), {2}),{2}))) as geometry,{1} " + + " from {0} ) AS geohash where ST_Intersects(ST_MakeEnvelope({3},{4},{5},{6},4490), st_setsrid(ST_GeomFromGeoJSON({1}), 4490)) " + + " group by geometry "; + + /** + * postgis中标准的点的GeoJson格式,主要是 SELECT_SQL_BY_DISTANCE 中用到 + */ + public static String POINT_GEOGSON = "\"coordinates\":[{0},{1}],\"type\":\"Point\""; + + /** + * 网页端查询与中心点距离小于 30 m 的数据点 + */ + public static String SELECT_SQL_BY_DISTANCE = " select * from {0} where ST_distance(ST_GeomFromGeoJSON({1})::geography, ST_GeomFromGeoJSON({2})::geography) < 30"; + + /** + * 获取全部数据固定Sql + */ + public static String SELECT_ALLDATA_SQL = "select * from {0}"; + + /** + * 网页端获取某范围全部数据 + */ + public static String SELECT_SQL_BY_RANGE_INTERSECTION = " select {1},{2},{3}, reviewer FROM {0}" + + " where ST_Intersects(ST_MakeEnvelope({4},{5},{6},{7},4490), st_setsrid(ST_GeomFromGeoJSON({2}), 4490)) "; + + /** + * 网页端获取某范围全部数据的中心点 + */ + public static String SELECTCENTER_SQL_BY_RANGE_INTERSECTION = " select {1},ST_ASGEOJSON(ST_GeomFromGeoJSON({2})) as geometry " + + " FROM {0} where ST_Intersects(ST_MakeEnvelope({3},{4},{5},{6},4490), " + + " st_setsrid(ST_GeomFromGeoJSON({2}), 4490)) "; +} diff --git a/src/main/java/cn/edu/whu/boot/common/domain/StatusCode.java b/src/main/java/cn/edu/whu/boot/common/domain/StatusCode.java new file mode 100644 index 0000000..d495349 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/domain/StatusCode.java @@ -0,0 +1,37 @@ +package cn.edu.whu.boot.common.domain; + +/** + * 枚举了一些常用 API 操作码 + */ +public enum StatusCode { + SUCCESS(200, "操作成功"), + FAILED(500, "操作失败"), + FAILED_AND_SHOW(400,"自定义的错误状态码,前端接受到该错误状态码需要显示返回的message! 一般 message 自定义!!!"), + VALIDATE_FAILED(404, "参数检验失败"), + UNAUTHORIZED(401, "暂未登录或token已经过期"), + FORBIDDEN(403, "没有相关权限"); + + private int status; + private String message; + + StatusCode(int status, String message) { + this.status = status; + this.message = message; + } + + public int getStatus(){ + return status; + } + + public void setStatus(int status){ + this.status = status; + } + + public String getMessage(){ + return message; + } + + public void setMessage(String message){ + this.message = message; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/service/CacheService.java b/src/main/java/cn/edu/whu/boot/common/service/CacheService.java new file mode 100644 index 0000000..331db2d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/service/CacheService.java @@ -0,0 +1,26 @@ +package cn.edu.whu.boot.common.service; + +/** + * 用于操作缓存的 Service ,该类的本质还是调用 RedisService, + * 但是将 RedisService 中的命令与应用代码低耦合可以解决其他问题,比如出现 Redis 宕机, + * 可通过切面指定该接口,针对不同的方法进行宕机后不同操作!!! + */ +public interface CacheService{ + + /** + * 获取 Redis 中 key 对应的value + */ + Object get(String key); + + + /** + * 向 Redis 中添加 key - value 对象 + * expireTime 单位为秒 + */ + void set(String key, Object value, long expireTime); + + /** + * 删除 Redis 中 key 对应的value + */ + void delete(String key); +} diff --git a/src/main/java/cn/edu/whu/boot/common/service/RedisService.java b/src/main/java/cn/edu/whu/boot/common/service/RedisService.java new file mode 100644 index 0000000..5f00005 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/service/RedisService.java @@ -0,0 +1,181 @@ +package cn.edu.whu.boot.common.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Redis 操作 Service + */ +public interface RedisService { + + /** + * 保存属性 + */ + void set(String key, Object value, long time); + + /** + * 保存属性 + */ + void set(String key, Object value); + + /** + * 获取属性 + */ + Object get(String key); + + /** + * 删除属性 + */ + Boolean del(String key); + + /** + * 批量删除属性 + */ + Long del(List keys); + + /** + * 设置过期时间 + */ + Boolean expire(String key, long time); + + /** + * 获取过期时间 + */ + Long getExpire(String key); + + /** + * 判断是否有该属性 + */ + Boolean hasKey(String key); + + /** + * 按delta递增 + */ + Long incr(String key, long delta); + + /** + * 按delta递减 + */ + Long decr(String key, long delta); + + /** + * 获取Hash结构中的属性 + */ + Object hGet(String key, String hashKey); + + /** + * 向Hash结构中放入一个属性 + */ + Boolean hSet(String key, String hashKey, Object value, long time); + + /** + * 向Hash结构中放入一个属性 + */ + void hSet(String key, String hashKey, Object value); + + /** + * 直接获取整个Hash结构 + */ + Map hGetAll(String key); + + /** + * 直接设置整个Hash结构 + */ + Boolean hSetAll(String key, Map map, long time); + + /** + * 直接设置整个Hash结构 + */ + void hSetAll(String key, Map map); + + /** + * 删除Hash结构中的属性 + */ + void hDel(String key, Object... hashKey); + + /** + * 判断Hash结构中是否有该属性 + */ + Boolean hHasKey(String key, String hashKey); + + /** + * Hash结构中属性递增 + */ + Long hIncr(String key, String hashKey, Long delta); + + /** + * Hash结构中属性递减 + */ + Long hDecr(String key, String hashKey, Long delta); + + /** + * 获取Set结构 + */ + Set sMembers(String key); + + /** + * 向Set结构中添加属性 + */ + Long sAdd(String key, Object... values); + + /** + * 向Set结构中添加属性 + */ + Long sAdd(String key, long time, Object... values); + + /** + * 是否为Set中的属性 + */ + Boolean sIsMember(String key, Object value); + + /** + * 获取Set结构的长度 + */ + Long sSize(String key); + + /** + * 删除Set结构中的属性 + */ + Long sRemove(String key, Object... values); + + /** + * 获取List结构中的属性 + */ + List lRange(String key, long start, long end); + + /** + * 获取List结构的长度 + */ + Long lSize(String key); + + /** + * 根据索引获取List中的属性 + */ + Object lIndex(String key, long index); + + /** + * 向List结构中添加属性 + */ + Long lPush(String key, Object value); + + /** + * 向List结构中添加属性 + */ + Long lPush(String key, Object value, long time); + + /** + * 向List结构中批量添加属性 + */ + Long lPushAll(String key, Object... values); + + /** + * 向List结构中批量添加属性 + */ + Long lPushAll(String key, Long time, Object... values); + + /** + * 从List结构中移除属性 + */ + Long lRemove(String key, long count, Object value); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/common/service/impl/CacheServiceImpl.java b/src/main/java/cn/edu/whu/boot/common/service/impl/CacheServiceImpl.java new file mode 100644 index 0000000..8abe6d9 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/service/impl/CacheServiceImpl.java @@ -0,0 +1,32 @@ +package cn.edu.whu.boot.common.service.impl; + +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class CacheServiceImpl implements CacheService{ + + private final RedisService redisService; + + @Autowired + public CacheServiceImpl(RedisService redisService){ + this.redisService = redisService; + } + + @Override + public Object get(String key){ + return redisService.get(key); + } + + @Override + public void set(String key, Object value, long expireTime){ + redisService.set(key, value, expireTime); + } + + @Override + public void delete(String key) { + redisService.del(key); + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/service/impl/RedisServiceImpl.java b/src/main/java/cn/edu/whu/boot/common/service/impl/RedisServiceImpl.java new file mode 100644 index 0000000..0fb9e7e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/service/impl/RedisServiceImpl.java @@ -0,0 +1,199 @@ +package cn.edu.whu.boot.common.service.impl; + +import cn.edu.whu.boot.common.service.RedisService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * Redis 操作实现类 + */ +@Service +public class RedisServiceImpl implements RedisService{ + + @Autowired + private RedisTemplate redisTemplate; + + @Override + public void set(String key, Object value, long time) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } + + @Override + public void set(String key, Object value) { + redisTemplate.opsForValue().set(key, value); + } + + @Override + public Object get(String key) { + return redisTemplate.opsForValue().get(key); + } + + @Override + public Boolean del(String key) { + return redisTemplate.delete(key); + } + + @Override + public Long del(List keys) { + return redisTemplate.delete(keys); + } + + @Override + public Boolean expire(String key, long time) { + return redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + + @Override + public Long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + @Override + public Boolean hasKey(String key) { + return redisTemplate.hasKey(key); + } + + @Override + public Long incr(String key, long delta) { + return redisTemplate.opsForValue().increment(key, delta); + } + + @Override + public Long decr(String key, long delta) { + return redisTemplate.opsForValue().increment(key, -delta); + } + + @Override + public Object hGet(String key, String hashKey) { + return redisTemplate.opsForHash().get(key, hashKey); + } + + @Override + public Boolean hSet(String key, String hashKey, Object value, long time) { + redisTemplate.opsForHash().put(key, hashKey, value); + return expire(key, time); + } + + @Override + public void hSet(String key, String hashKey, Object value) { + redisTemplate.opsForHash().put(key, hashKey, value); + } + + @Override + public Map hGetAll(String key) { + return redisTemplate.opsForHash().entries(key); + } + + @Override + public Boolean hSetAll(String key, Map map, long time) { + redisTemplate.opsForHash().putAll(key, map); + return expire(key, time); + } + + @Override + public void hSetAll(String key, Map map) { + redisTemplate.opsForHash().putAll(key, map); + } + + @Override + public void hDel(String key, Object... hashKey) { + redisTemplate.opsForHash().delete(key, hashKey); + } + + @Override + public Boolean hHasKey(String key, String hashKey) { + return redisTemplate.opsForHash().hasKey(key, hashKey); + } + + @Override + public Long hIncr(String key, String hashKey, Long delta) { + return redisTemplate.opsForHash().increment(key, hashKey, delta); + } + + @Override + public Long hDecr(String key, String hashKey, Long delta) { + return redisTemplate.opsForHash().increment(key, hashKey, -delta); + } + + @Override + public Set sMembers(String key) { + return redisTemplate.opsForSet().members(key); + } + + @Override + public Long sAdd(String key, Object... values) { + return redisTemplate.opsForSet().add(key, values); + } + + @Override + public Long sAdd(String key, long time, Object... values) { + Long count = redisTemplate.opsForSet().add(key, values); + expire(key, time); + return count; + } + + @Override + public Boolean sIsMember(String key, Object value) { + return redisTemplate.opsForSet().isMember(key, value); + } + + @Override + public Long sSize(String key) { + return redisTemplate.opsForSet().size(key); + } + + @Override + public Long sRemove(String key, Object... values) { + return redisTemplate.opsForSet().remove(key, values); + } + + @Override + public List lRange(String key, long start, long end) { + return redisTemplate.opsForList().range(key, start, end); + } + + @Override + public Long lSize(String key) { + return redisTemplate.opsForList().size(key); + } + + @Override + public Object lIndex(String key, long index) { + return redisTemplate.opsForList().index(key, index); + } + + @Override + public Long lPush(String key, Object value) { + return redisTemplate.opsForList().rightPush(key, value); + } + + @Override + public Long lPush(String key, Object value, long time) { + Long index = redisTemplate.opsForList().rightPush(key, value); + expire(key, time); + return index; + } + + @Override + public Long lPushAll(String key, Object... values) { + return redisTemplate.opsForList().rightPushAll(key, values); + } + + @Override + public Long lPushAll(String key, Long time, Object... values) { + Long count = redisTemplate.opsForList().rightPushAll(key, values); + expire(key, time); + return count; + } + + @Override + public Long lRemove(String key, long count, Object value) { + return redisTemplate.opsForList().remove(key, count, value); + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/ArcGisGeoJsonParser.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/ArcGisGeoJsonParser.java new file mode 100644 index 0000000..7e2cec3 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/ArcGisGeoJsonParser.java @@ -0,0 +1,195 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import cn.edu.whu.boot.common.utils.allocation.dtos.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import org.geojson.Feature; +import org.geojson.FeatureCollection; +import org.geojson.LngLatAlt; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.LineString; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 解析 ArcGIS REST API JSON 数据的工具类 + */ +public class ArcGisGeoJsonParser { + + private static final Logger log = LoggerFactory.getLogger(ArcGisGeoJsonParser.class); + + private static final Gson gson = new Gson(); + + private static final GeometryFactory geometryFactory = new GeometryFactory(); + + /** + * 将 ArcGIS REST API JSON 字符串解析为 org.locationtech.jts.geom.Geometry 对象 + * + * @param json ArcGIS REST API JSON 字符串 + * @return org.locationtech.jts.geom.Geometry 对象 + */ + public static Geometry toGeometryObject(String json) + { + if (json.contains("xmin") && json.contains("ymin") && json.contains("xmax") && json.contains("ymax")) + { + // Envelope + try + { + Envelope envelope = gson.fromJson(json , Envelope.class); + Coordinate[] coordinates = new Coordinate[]{new Coordinate(envelope.getXmin() , envelope.getYmax()) , new Coordinate(envelope.getXmax() , envelope.getYmax()) , new Coordinate(envelope.getXmax() , envelope.getYmin()) , new Coordinate(envelope.getXmin() , envelope.getYmin()) , new Coordinate(envelope.getXmin() , envelope.getYmax())}; + return geometryFactory.createPolygon(coordinates); + } catch (JsonSyntaxException e) + { + log.error("无法解析的数据:{},数据应为 ArcGIS GeoJSON 格式" , json); + } + } + else if (json.contains("x") && json.contains("y")) + { + // Point + try + { + Point point = gson.fromJson(json , Point.class); + return geometryFactory.createPoint(new Coordinate(point.getX() , point.getY())); + } catch (JsonSyntaxException e) + { + log.error("无法解析的数据:{},数据应为 ArcGIS GeoJSON 格式" , json); + } + } + else if (json.contains("points")) + { + // MultiPoint + try + { + MultiPoint multiPoint = gson.fromJson(json , MultiPoint.class); + org.locationtech.jts.geom.Point[] points = Arrays.stream(multiPoint.getPoints()).map(coords -> geometryFactory.createPoint(new Coordinate(coords[0] , coords[1]))).toArray(org.locationtech.jts.geom.Point[]::new); + return geometryFactory.createMultiPoint(points); + } catch (JsonSyntaxException e) + { + log.error("无法解析的数据:{},数据应为 ArcGIS GeoJSON 格式" , json); + } + } + else if (json.contains("paths")) + { + // Polyline + try + { + Polyline polyline = gson.fromJson(json , Polyline.class); + LineString[] lineStrings = Arrays.stream(polyline.getPaths()).map(path -> { + Coordinate[] coordinates = Arrays.stream(path).map(coordinate -> new Coordinate(coordinate[0] , coordinate[1])).toArray(Coordinate[]::new); + return geometryFactory.createLineString(coordinates); + }).toArray(LineString[]::new); + return geometryFactory.createMultiLineString(lineStrings); + } catch (JsonSyntaxException e) + { + log.error("无法解析的数据:{},数据应为 ArcGIS GeoJSON 格式" , json); + } + } + else if (json.contains("rings")) + { + // Polygon + try + { + Polygon polygon = gson.fromJson(json , Polygon.class); + org.locationtech.jts.geom.Polygon[] polygons = Arrays.stream(polygon.getRings()).map(ring -> { + Coordinate[] shells = Arrays.stream(ring).map(coordinate -> new Coordinate(coordinate[0] , coordinate[1])).toArray(Coordinate[]::new); + return geometryFactory.createPolygon(shells); + }).toArray(org.locationtech.jts.geom.Polygon[]::new); + return geometryFactory.createMultiPolygon(polygons); + } catch (JsonSyntaxException e) + { + log.error("无法解析的数据:{},数据应为 ArcGIS GeoJSON 格式" , json); + } + } + return null; + } + + /** + * 将 ArcGIS REST API GeoJSON 转换为标准 GeoJSON + * + * @param arcgisJson ArcGIS REST API GeoJSON 字符串 + * @param properties 需要添加的属性 + * @return 标准 GeoJSON 字符串 + */ + public static String toStandardGeoJson(String arcgisJson , Map properties) + { + ObjectMapper mapper = new ObjectMapper(); + Object result; + Optional> optionalMap = Optional.ofNullable(properties); + if (arcgisJson.contains("xmin") && arcgisJson.contains("ymin") && arcgisJson.contains("xmax") && arcgisJson.contains("ymax")) + { + // Envelope + Envelope envelope = gson.fromJson(arcgisJson , Envelope.class); + Feature feature = new Feature(); + feature.setGeometry(new org.geojson.Polygon(new LngLatAlt(envelope.getXmin() , envelope.getYmax()) , new LngLatAlt(envelope.getXmax() , envelope.getYmax()) , new LngLatAlt(envelope.getXmax() , envelope.getYmin()) , new LngLatAlt(envelope.getXmin() , envelope.getYmin()) , new LngLatAlt(envelope.getXmin() , envelope.getYmax()))); + optionalMap.ifPresent(feature::setProperties); + result = feature; + } + else if (arcgisJson.contains("x") && arcgisJson.contains("y")) + { + // Point + Point point = gson.fromJson(arcgisJson , Point.class); + Feature feature = new Feature(); + feature.setGeometry(new org.geojson.Point(point.getX() , point.getY())); + optionalMap.ifPresent(feature::setProperties); + result = feature; + } + else if (arcgisJson.contains("points")) + { + // MultiPoint + MultiPoint multiPoint = gson.fromJson(arcgisJson , MultiPoint.class); + Feature feature = new Feature(); + feature.setGeometry(new org.geojson.MultiPoint(Arrays.stream(multiPoint.getPoints()).map(coords -> new LngLatAlt(coords[0] , coords[1])).toArray(LngLatAlt[]::new))); + optionalMap.ifPresent(feature::setProperties); + result = feature; + } + else if (arcgisJson.contains("paths")) + { + // Polyline + Polyline polyline = gson.fromJson(arcgisJson , Polyline.class); + List features = Arrays.stream(polyline.getPaths()).map(path -> new org.geojson.LineString(Arrays.stream(path).map(coordinate -> new LngLatAlt(coordinate[0] , coordinate[1])).toArray(LngLatAlt[]::new))).map(lineString -> { + Feature feature = new Feature(); + feature.setGeometry(lineString); + optionalMap.ifPresent(feature::setProperties); + return feature; + }).collect(Collectors.toList()); + FeatureCollection featureCollection = new FeatureCollection(); + featureCollection.addAll(features); + result = featureCollection; + } + else if (arcgisJson.contains("rings")) + { + // Polygon + Polygon polygon = gson.fromJson(arcgisJson , Polygon.class); + List features = Arrays.stream(polygon.getRings()).map(ring -> new org.geojson.Polygon(Arrays.stream(ring).map(coordinate -> new LngLatAlt(coordinate[0] , coordinate[1])).toArray(LngLatAlt[]::new))).map(p -> { + Feature feature = new Feature(); + feature.setGeometry(p); + optionalMap.ifPresent(feature::setProperties); + return feature; + }).collect(Collectors.toList()); + FeatureCollection featureCollection = new FeatureCollection(); + featureCollection.addAll(features); + result = featureCollection; + } + else + { + // 不知道是什么几何类型 + return null; + } + try + { + return mapper.writeValueAsString(result); + } catch (JsonProcessingException e) + { + log.error(e.getMessage()); + return null; + } + } +} + diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/GeohashUtil.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/GeohashUtil.java new file mode 100644 index 0000000..c9feac9 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/GeohashUtil.java @@ -0,0 +1,134 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import java.util.Arrays; + +/** + * Geohash 工具类 + */ +public class GeohashUtil { + private static final int[] BITS = {16, 8, 4, 2, 1}; + + private static final char[] BASE_32 = {'0', '1', '2', '3', '4', '5', '6', + '7', '8', '9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; + + // 不同精度的 Geohash 对应的网格宽和高,单位为 km + // 比如 CELL_SIZES[1] 为长度为 1 的 GeoHash 所对应网格的宽和高 + private static final double[][] CELL_SIZES = {{}, {5000.0, 5000.0}, {1250.0, 625.0}, {156.0, 156.0}, {39.1, 19.5}, {4.89, 4.89}, {1.22, 0.61}, {0.153, 0.153}, {0.0382, 0.0191}, {0.00477, 0.00477}, {0.00119, 0.000596}, {0.000149, 0.000149}, {3.72e-5, 1.86e-5}}; + + // 不同精度的 Geohash 对应的网格的面积,单位为 km2 + private static final double[] CELL_AREA; + + private static final int[] BASE_32_IDX; + + static { + CELL_AREA = new double[CELL_SIZES.length]; + for (int i = 1; i < CELL_SIZES.length; i++) { + CELL_AREA[i] = CELL_SIZES[i][0] * CELL_SIZES[i][1]; + } + + BASE_32_IDX = new int[BASE_32[BASE_32.length - 1] - BASE_32[0] + 1]; + Arrays.fill(BASE_32_IDX, -500); + for (int i = 0; i < BASE_32.length; i++) { + BASE_32_IDX[BASE_32[i] - BASE_32[0]] = i; + } + } + + /** + * 将经纬度编码为指定精度 Geohash 字符串 + * + * @param longitude + * @param latitude + * @param precision + * @return + */ + public static String geohashPoint(double longitude, double latitude, int precision) { + double[] latInterval = {-90.0, 90.0}; + double[] lngInterval = {-180.0, 180.0}; + + final StringBuilder geohash = new StringBuilder(precision); + boolean isEven = true; + + int bit = 0; + int ch = 0; + + while (geohash.length() < precision) { + double mid; + if (isEven) { + mid = (lngInterval[0] + lngInterval[1]) / 2D; + if (longitude > mid) { + ch |= BITS[bit]; + lngInterval[0] = mid; + } else { + lngInterval[1] = mid; + } + } else { + mid = (latInterval[0] + latInterval[1]) / 2D; + if (latitude > mid) { + ch |= BITS[bit]; + latInterval[0] = mid; + } else { + latInterval[1] = mid; + } + } + + isEven = !isEven; + + if (bit < 4) { + bit++; + } else { + geohash.append(BASE_32[ch]); + bit = 0; + ch = 0; + } + } + return geohash.toString(); + } + + /** + * 指定 Geohash 精度,获取对应的网格大小 + * + * @param precision Geohash 精度,即字符串长度 + * @return 网格的大小,格式为 [宽度,高度] + */ + public static double[] getCellSize(int precision) { + if (precision < 1 || precision > 12) { + return null; + } else { + return CELL_SIZES[precision]; + } + } + + /** + * 根据期望的网格面积,找到对应的 Geohash 精度 + * + * @param expectedArea 期望的 Geohash 对应的网格面积 + * @return 最合适的 Geohash 精度 + */ + public static int findPrecision(double expectedArea) { + int last = CELL_AREA.length - 1; + int i = last; + while (i > 0 && CELL_AREA[i] <= expectedArea) { + i--; + } + return i == last ? i : i + 1; + } + + public static int findPrecisionByWidth(double width) { + int last = CELL_AREA.length - 1; + int i = last; + while (i > 0 && CELL_SIZES[i][0] <= width) { + i--; + } + return i == last ? i : i + 1; + } + + public static int findPrecisionByHeight(double height) { + int last = CELL_AREA.length - 1; + int i = last; + while (i > 0 && CELL_SIZES[i][1] <= height) { + i--; + } + return i == last ? i : i + 1; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/KMeansClustering.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/KMeansClustering.java new file mode 100644 index 0000000..a06adb3 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/KMeansClustering.java @@ -0,0 +1,34 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import org.apache.commons.math3.ml.clustering.CentroidCluster; +import org.apache.commons.math3.ml.clustering.KMeansPlusPlusClusterer; +import org.locationtech.jts.geom.Point; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * 实现 K Means 聚类 + */ +public class KMeansClustering { + public static Map> clustering(List points, int k) { + List clusterInput = points.stream() + .map(PointWrapper::new).collect(Collectors.toList()); + KMeansPlusPlusClusterer clusterer = new KMeansPlusPlusClusterer<>(k, 10000); + List> clusterResults = clusterer.cluster(clusterInput); + Map> res = new HashMap<>(); + IntStream + .range(0, clusterResults.size()) + .forEach( + i -> res.put( + i, + clusterResults.get(i).getPoints().stream().map(PointWrapper::getOriginal).collect(Collectors.toList()) + ) + ); + return res; + } +} + diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/MixedEndianDataInputStream.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/MixedEndianDataInputStream.java new file mode 100644 index 0000000..4975025 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/MixedEndianDataInputStream.java @@ -0,0 +1,52 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import java.io.DataInputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +/** + * Augments DataInputStream with methods to read little-endian primitives, as the ESRI + * shapefile format is mixed. + */ +class MixedEndianDataInputStream extends DataInputStream { + private byte readBuffer[] = new byte[8]; + + MixedEndianDataInputStream(InputStream inputStream) { + super(inputStream); + } + + /** + * modification of {@link DataInputStream#readInt()} reversing byte order + */ + final int readLittleEndianInt() throws IOException { + int ch4 = in.read(); + int ch3 = in.read(); + int ch2 = in.read(); + int ch1 = in.read(); + if ((ch1 | ch2 | ch3 | ch4) < 0) + throw new EOFException(); + return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4)); + } + + /** + * modification {@link DataInputStream#readLong()} ()} reversing the array indices + */ + private long readLittleEndianLong() throws IOException + { + readFully(readBuffer, 0, 8); + return (((long) readBuffer[7] << 56) + + ((long) (readBuffer[6] & 255) << 48) + + ((long) (readBuffer[5] & 255) << 40) + + ((long) (readBuffer[4] & 255) << 32) + + ((long) (readBuffer[3] & 255) << 24) + + ((readBuffer[2] & 255) << 16) + + ((readBuffer[1] & 255) << 8) + + ((readBuffer[0] & 255))); + } + + double readLittleEndianDouble() throws IOException { + return Double.longBitsToDouble(readLittleEndianLong()); + } + +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/PiEncryptUtils.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/PiEncryptUtils.java new file mode 100644 index 0000000..48183b6 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/PiEncryptUtils.java @@ -0,0 +1,153 @@ +package cn.edu.whu.boot.common.utils.allocation; + +public class PiEncryptUtils { + + private static String pi = null; + private static final int startNum = 10;//从第几位开始选择圆周率来构建加密矩阵 + private static int[][] matrix = null; + + public static int[] encrypt(int[] origin) { + if (matrix == null) { + do { + matrix = PiEncryptUtils.getMatrix(startNum, origin.length); + } while (PiEncryptUtils.det(matrix, origin.length - 1) == 0); + } + return PiEncryptUtils.multiply(origin, matrix); + } + + private static double det(int[][] matrix, int N) { + double num = 0; + int cha = 0; + double[][] B = new double[N][N]; + if (N > 0) { + if (N == 1) + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + for (int t0 = 0; t0 <= N; t0++) { + for (int t1 = 1; t1 <= N; t1++) { + for (int t2 = 0; t2 <= N - 1; t2++) { + if (t2 == t0) + cha = 1; + B[t1 - 1][t2] = matrix[t1][t2 + cha]; + }//T2循环 + cha = 0; + }//T1循环 + num = num + matrix[0][t0] * det(B, N - 1) * Math.pow((-1), t0); + }//T0循环 + return num; + } else if (N == 0) { + return matrix[0][0]; + } + return 0; + } + + // 求行列式的值 + private static double det(double[][] matrix, int N) { // 计算n阶行列式(N=n-1) + double num = 0; + int cha = 0; + double[][] B = new double[N][N]; + if (N > 0) { + if (N == 1) + return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; + for (int t0 = 0; t0 <= N; t0++) { + for (int t1 = 1; t1 <= N; t1++) { + for (int t2 = 0; t2 <= N - 1; t2++) { + if (t2 == t0) + cha = 1; + B[t1 - 1][t2] = matrix[t1][t2 + cha]; + }//T2循环 + cha = 0; + }//T1循环 + num = num + matrix[0][t0] * det(B, N - 1) * Math.pow((-1), t0); + }//T0循环 + return num; + } else if (N == 0) { + return matrix[0][0]; + } + return 0; + } + + private static String getPiValue() { + int a = 10000; + int c = 56000;// 最大的精度 + int b = 0, d, e = 0, g; + StringBuilder ans = new StringBuilder(); + int f[] = new int[c + 1]; + + for (; b != c; ) f[b++] = a / 5; + do { + d = 0; + g = c * 2; + if (g == 0) break; + b = c; + do { + d += f[b] * a; + f[b] = d % --g; + d /= g--; + --b; + if (b == 0) break; + d *= b; + } while (true); + c -= 14; + ans.append(e + d / a); + e = d % a; + } while (true); + return ans.toString(); + } + + private static int[][] getMatrix(int startNum, int n) { + if (pi == null) + pi = getPiValue(); + String v = pi.substring(startNum, (int) (startNum + Math.pow(n, 2) - 1)); + int[][] result = new int[n][n]; + for (int i = 0; i < v.length(); i++) { + int r = Integer.parseInt(v.substring(i, i + 1)); + result[i / n][i % n] = r; + } + return result; + } + + private static int[] multiply(int[] origin, int[][] matrix) { + int n = origin.length; + int[] result = new int[n]; + for (int i = 0; i < n; i++) { + int sum = 0; + for (int j = 0; j < n; j++) { + sum += origin[j] * matrix[j][i]; + } + result[i] = sum; + } + return result; + } + + public static double[][] inverse(double[][] Matrix, int N) { + double[][] MatrixC = new double[N][N]; + double[][] B = new double[N][N]; + + double add = 1 / det(Matrix, N); + for (int T0 = 0; T0 <= N; T0++) { + for (int T3 = 0; T3 <= N; T3++) { + int Chay; + int Chax; + for (int T1 = 0; T1 <= N - 1; T1++) { + if (T1 < T0) { + Chax = 0; + } else { + Chax = 1; + } + for (int T2 = 0; T2 <= N - 1; T2++) { + if (T2 < T3) { + Chay = 0; + } else { + Chay = 1; + } + B[T1][T2] = Matrix[T1 + Chax][T2 + Chay]; + } + //T2循环 + }//T1循环 + det(B, N - 1); + MatrixC[T3][T0] = det(B, N - 1) * add * (Math.pow(-1, T0 + T3)); + } + } + return MatrixC; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/PointWrapper.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/PointWrapper.java new file mode 100644 index 0000000..78e2352 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/PointWrapper.java @@ -0,0 +1,23 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import org.apache.commons.math3.ml.clustering.Clusterable; +import org.locationtech.jts.geom.Point; + +class PointWrapper implements Clusterable { + private double[] points; + + private org.locationtech.jts.geom.Point original; + + PointWrapper(org.locationtech.jts.geom.Point point) { + this.original = point; + this.points = new double[]{point.getX(), point.getY()}; + } + + Point getOriginal() { + return this.original; + } + + public double[] getPoint() { + return points; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/ShapefileGeometryCursor.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/ShapefileGeometryCursor.java new file mode 100644 index 0000000..e459b32 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/ShapefileGeometryCursor.java @@ -0,0 +1,173 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import com.esri.core.geometry.Envelope2D; +import com.esri.core.geometry.Geometry; +import com.esri.core.geometry.GeometryCursor; +import com.esri.core.geometry.OperatorImportFromESRIShape; + +import java.io.*; +import java.nio.ByteBuffer; + +/** + * Reads a shapefile + * Created by willtemperley@gmail.com on 07-Nov-16. + */ +public class ShapefileGeometryCursor extends GeometryCursor { + + private final MixedEndianDataInputStream inputStream; + private final Envelope2D envelope2D; + + private OperatorImportFromESRIShape importFromESRIShape = OperatorImportFromESRIShape.local(); + private final int fileLengthBytes; + private int position = 0; //keeps track of where inputstream is + private int recordNumber; //the record number according to shapefile + + private final Geometry.Type geomType; + + @Override + public Geometry next() { + if (!hasNext()) { + return null; + } + try { + + recordNumber = inputStream.readInt();//1 based + int recLength = inputStream.readInt(); + position += 8; + + int recordSizeBytes = (recLength * 2); + byte[] bytes = new byte[recordSizeBytes]; + int read = inputStream.read(bytes); + + Geometry polyline = importFromESRIShape.execute(0, geomType, ByteBuffer.wrap(bytes)); + position += recordSizeBytes; + + return polyline; + + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public int getGeometryID() { + return recordNumber; + } + + public Envelope2D getEnvelope2D() { + return envelope2D; + } + + public ShapefileGeometryCursor(File inFile) throws IOException { + this(new FileInputStream(inFile)); + } + + public ShapefileGeometryCursor(InputStream in) throws IOException { + + this.inputStream = new MixedEndianDataInputStream(in); + + /* + Byte 0 File Code 9994 Integer Big + */ + int fileCode = inputStream.readInt(); + if (fileCode != 9994) { + throw new IOException("file code " + fileCode + " is not supported."); + } + + /* + Byte 4 Unused 0 Integer Big + Byte 8 Unused 0 Integer Big + Byte 12 Unused 0 Integer Big + Byte 16 Unused 0 Integer Big + Byte 20 Unused 0 Integer Big + */ + inputStream.skipBytes(20); + + fileLengthBytes = inputStream.readInt() * 2; + + int v = this.inputStream.readLittleEndianInt(); + + if (v != 1000) { + throw new IOException("version " + v + " is not supported."); + } + + int shpTypeId = this.inputStream.readLittleEndianInt(); + geomType = geometryTypeFromShpType(shpTypeId); + + /* + Byte 24 File Length File Length Integer Big + Byte 28 Version 1000 Integer Little + Byte 32 Shape Type Shape Type Integer Little + Byte 36 Bounding Box Xmin Double Little + Byte 44 Bounding Box Ymin Double Little + Byte 52 Bounding Box Xmax Double Little + Byte 60 Bounding Box Ymax Double Little + Byte 68* Bounding Box Zmin Double Little + Byte 76* Bounding Box Zmax Double Little + Byte 84* Bounding Box Mmin Double Little + Byte 92* Bounding Box Mmax Double Little + */ + double xmin = this.inputStream.readLittleEndianDouble(); + double ymin = this.inputStream.readLittleEndianDouble(); + double xmax = this.inputStream.readLittleEndianDouble(); + double ymax = this.inputStream.readLittleEndianDouble(); + double zmin = this.inputStream.readLittleEndianDouble(); + double zmax = this.inputStream.readLittleEndianDouble(); + double mmin = this.inputStream.readLittleEndianDouble(); + double mmax = this.inputStream.readLittleEndianDouble(); + + envelope2D = new Envelope2D(xmin, ymin, xmax, ymax); +// envelope3D = new Envelope3D(xmin, ymin, zmin, xmax, ymax, zmax); + + position = 2 * 50; //header is always 50 words long + + } + + /** + * from esri spec: + * 0 Null Shape + * 1 Point + * 3 PolyLine + * 5 Polygon + * 8 MultiPoint + * 11 PointZ + * 13 PolyLineZ + * 15 PolygonZ + * 18 MultiPointZ + * 21 PointM + * 23 PolyLineM + * 25 PolygonM + * 28 MultiPointM + * 31 MultiPatch + * therefore final digit suffices to determine type (PolyLine, PolyLineM, PolylineZ are 1, 13 and 23 respectively). + * + * @param shpTypeId shape type id from shapfile + * @return the geom type + */ + private Geometry.Type geometryTypeFromShpType(int shpTypeId) { + int shpType = shpTypeId % 10; + + switch (shpType) { + case 1: //Point + return Geometry.Type.Point; + case 3: //Polyline + return Geometry.Type.Polyline; + case 5: //Polygon + return Geometry.Type.Polygon; + case 8: //Multipoint + return Geometry.Type.MultiPoint; + default: + return Geometry.Type.Unknown; + } + } + + + public boolean hasNext() { + return position < fileLengthBytes; + } + + public Geometry.Type getGeometryType() { + return geomType; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/TpkEncryptHelper.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/TpkEncryptHelper.java new file mode 100644 index 0000000..efa8001 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/TpkEncryptHelper.java @@ -0,0 +1,115 @@ +package cn.edu.whu.boot.common.utils.allocation; + +import java.io.*; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +/** + * 加密 TPK 文件 + */ +public class TpkEncryptHelper { + private static final String BundlxFileSuffix = ".bundlx"; + + /** + * 加密 .tpk 文件,生成 tpkx 文件 + * + * @param tpkUrl 原始 tpk 文件的 URL + * @param tpkxRoot tpkx 文件的根目录 + * @throws IOException + */ + public static void encryptTpk(String tpkUrl, String tpkxRoot) throws IOException { + File file = new File(tpkUrl); + String suffix = ".tpkx"; + String fileNameWithExtension = file.getName(); + String fileNameWithoutExtension = fileNameWithExtension.substring(0, fileNameWithExtension.indexOf('.')); + if (!file.exists()) { + throw new FileNotFoundException(); + } + + try (FileOutputStream fos = new FileOutputStream(tpkxRoot + fileNameWithoutExtension + suffix); + ZipOutputStream zipOutStream = new ZipOutputStream(fos); + BufferedOutputStream bufferOutStream = new BufferedOutputStream(zipOutStream); + ZipFile zf = new ZipFile(file, Charset.forName("GBK"))) { + Enumeration entries = zf.entries(); + List bundlx = new ArrayList<>(); + while (entries.hasMoreElements()) { + ZipEntry ele = (ZipEntry) entries.nextElement(); + if (ele.getName().contains(BundlxFileSuffix)) { + bundlx.add(ele); + } else if (!ele.isDirectory()) { + ZipEntry zipEntry = new ZipEntry(ele.getName()); + zipOutStream.putNextEntry(zipEntry); + try (InputStream is = zf.getInputStream(ele)) { + byte[] data = new byte[4096]; + int length; + while ((length = is.read(data)) != -1) { + zipOutStream.write(data, 0, length); + } + zipOutStream.flush();//刷新输出流 + } + } + } + for (ZipEntry entry : bundlx) { + try (InputStream bundlxInputStream = zf.getInputStream(entry); + BufferedInputStream bundlxInput = new BufferedInputStream(bundlxInputStream)) { + ZipEntry zipEntry = new ZipEntry(entry.getName()); + zipOutStream.putNextEntry(zipEntry); + byte[] header = new byte[16]; + int len = bundlxInput.read(header); + bufferOutStream.write(header, 0, len); + + byte[] data = new byte[5]; + int length; + int count = 0; + while ((length = bundlxInput.read(data)) != -1 && count < 128 * 128) { + int[] tmp = byte2int(data, length); + int[] pwd = PiEncryptUtils.encrypt(tmp); + bufferOutStream.write(int2byte(pwd, length), 0, length * 4); + count++; + } + + byte[] footer = new byte[16]; + int fLen = bundlxInput.read(header); + bufferOutStream.write(footer, 0, fLen); + bufferOutStream.flush();//刷新输出流 + } + } + } + } + + // 为了配合圆周率加密,将原来的byte[5]改为byte[16] + // 只是把每一个byte转为double + private static int[] byte2int(byte[] data, int n) { + int[] result = new int[n]; + for (int i = 0; i < n; i++) { + result[i] = data[i]; + } + return result; + } + + private static byte[] int2byte(int[] data, int n) { + byte[] result = new byte[n * 4]; + for (int i = 0; i < n; i++) { + byte[] tmp = int2ByteArray(data[i]); + result[i * 4] = tmp[0]; + result[i * 4 + 1] = tmp[1]; + result[i * 4 + 2] = tmp[2]; + result[i * 4 + 3] = tmp[3]; + } + return result; + } + + private static byte[] int2ByteArray(int i) { + byte[] result = new byte[4]; + result[0] = (byte) ((i >> 24) & 0xFF); + result[1] = (byte) ((i >> 16) & 0xFF); + result[2] = (byte) ((i >> 8) & 0xFF); + result[3] = (byte) (i & 0xFF); + return result; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Envelope.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Envelope.java new file mode 100644 index 0000000..fbd510e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Envelope.java @@ -0,0 +1,63 @@ +package cn.edu.whu.boot.common.utils.allocation.dtos; + +public class Envelope { + private Double xmin; + + private Double ymin; + + private Double xmax; + + private Double ymax; + + private SpatialReference spatialReference; + + public Double getXmin() + { + return xmin; + } + + public void setXmin(Double xmin) + { + this.xmin = xmin; + } + + public Double getYmin() + { + return ymin; + } + + public void setYmin(Double ymin) + { + this.ymin = ymin; + } + + public Double getXmax() + { + return xmax; + } + + public void setXmax(Double xmax) + { + this.xmax = xmax; + } + + public Double getYmax() + { + return ymax; + } + + public void setYmax(Double ymax) + { + this.ymax = ymax; + } + + public SpatialReference getSpatialReference() + { + return spatialReference; + } + + public void setSpatialReference(SpatialReference spatialReference) + { + this.spatialReference = spatialReference; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/MultiPoint.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/MultiPoint.java new file mode 100644 index 0000000..ddcc36a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/MultiPoint.java @@ -0,0 +1,27 @@ +package cn.edu.whu.boot.common.utils.allocation.dtos; + +public class MultiPoint { + private Double[][] points; + + private SpatialReference spatialReference; + + public Double[][] getPoints() + { + return points; + } + + public void setPoints(Double[][] points) + { + this.points = points; + } + + public SpatialReference getSpatialReference() + { + return spatialReference; + } + + public void setSpatialReference(SpatialReference spatialReference) + { + this.spatialReference = spatialReference; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Point.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Point.java new file mode 100644 index 0000000..e3ec0e3 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Point.java @@ -0,0 +1,39 @@ +package cn.edu.whu.boot.common.utils.allocation.dtos; + +public class Point { + private Double x; + + private Double y; + + private SpatialReference spatialReference; + + public Double getX() + { + return x; + } + + public void setX(Double x) + { + this.x = x; + } + + public Double getY() + { + return y; + } + + public void setY(Double y) + { + this.y = y; + } + + public SpatialReference getSpatialReference() + { + return spatialReference; + } + + public void setSpatialReference(SpatialReference spatialReference) + { + this.spatialReference = spatialReference; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polygon.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polygon.java new file mode 100644 index 0000000..41c3e93 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polygon.java @@ -0,0 +1,27 @@ +package cn.edu.whu.boot.common.utils.allocation.dtos; + +public class Polygon { + private Double[][][] rings; + + private SpatialReference spatialReference; + + public Double[][][] getRings() + { + return rings; + } + + public void setRings(Double[][][] rings) + { + this.rings = rings; + } + + public SpatialReference getSpatialReference() + { + return spatialReference; + } + + public void setSpatialReference(SpatialReference spatialReference) + { + this.spatialReference = spatialReference; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polyline.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polyline.java new file mode 100644 index 0000000..53d5f39 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/Polyline.java @@ -0,0 +1,27 @@ +package cn.edu.whu.boot.common.utils.allocation.dtos; + +public class Polyline { + private Double[][][] paths; + + private SpatialReference spatialReference; + + public Double[][][] getPaths() + { + return paths; + } + + public void setPaths(Double[][][] paths) + { + this.paths = paths; + } + + public SpatialReference getSpatialReference() + { + return spatialReference; + } + + public void setSpatialReference(SpatialReference spatialReference) + { + this.spatialReference = spatialReference; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/SpatialReference.java b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/SpatialReference.java new file mode 100644 index 0000000..d8dbad2 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/allocation/dtos/SpatialReference.java @@ -0,0 +1,15 @@ +package cn.edu.whu.boot.common.utils.allocation.dtos; + +public class SpatialReference { + private Integer wkid; + + public Integer getWkid() + { + return wkid; + } + + public void setWkid(Integer wkid) + { + this.wkid = wkid; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/collection/DbTypeMappingUtil.java b/src/main/java/cn/edu/whu/boot/common/utils/collection/DbTypeMappingUtil.java new file mode 100644 index 0000000..eacd0ba --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/collection/DbTypeMappingUtil.java @@ -0,0 +1,30 @@ +package cn.edu.whu.boot.common.utils.collection; + +import cn.edu.whu.boot.common.domain.CommonConstant; + +import java.util.HashMap; +import java.util.Map; + +/** + * 工具类:将前端传进来的字段类型转换为 PostgreSql 数据库中的字段类型 + */ +public class DbTypeMappingUtil{ + + private static final Map POSTGRESQL_DATA_TYPE_MAP = new HashMap(){ + private static final long serialVersionUID = -2609965797767791136L;{ + put(CommonConstant.INTEGER, "integer"); + put(CommonConstant.STRING, "varchar(255)"); + put(CommonConstant.TEXT, "text"); + put(CommonConstant.BLOB, "text"); + put(CommonConstant.DATE, "timestamp"); + put(CommonConstant.LONG, "bigint"); + put(CommonConstant.DOUBLE, "double precision"); + }}; + + public static String changeDataType(String rawDataType){ + if(POSTGRESQL_DATA_TYPE_MAP.containsKey(rawDataType)){ + return POSTGRESQL_DATA_TYPE_MAP.get(rawDataType); + } + return null; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/collection/EncryptUtils.java b/src/main/java/cn/edu/whu/boot/common/utils/collection/EncryptUtils.java new file mode 100644 index 0000000..c27542d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/collection/EncryptUtils.java @@ -0,0 +1,97 @@ +package cn.edu.whu.boot.common.utils.collection; + +import org.apache.commons.codec.digest.DigestUtils; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import javax.crypto.spec.IvParameterSpec; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +/** + * 加密相关的工具类 + */ +public class EncryptUtils { + + /** + * 基于File 获取文件的唯一标志码 + * @param file 文件 + */ + public static String getMd5ByFile(File file) throws IOException + { + FileInputStream fileInputStream = new FileInputStream(file); + String value = DigestUtils.md2Hex(fileInputStream); + fileInputStream.close(); + return value; + } + + /** + * @param message 待加密的字符串 + * @param key 用于加密的Key + * @return byte[] 加密后的结果 + */ + public static byte[] encrypt(String message, String key) throws Exception { + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); + + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); + + return cipher.doFinal(message.getBytes("UTF-8")); + } + + /** + * 身份证解密算法 + * @param message 加密后的字符串 + * @param key encrypt方法加密的Key + * @return 原字符串 + */ + public static String decrypt(String message, String key) throws Exception { + + byte[] bytesrc = convertHexString(message); + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8")); + + cipher.init(Cipher.DECRYPT_MODE, secretKey, iv); + + byte[] retByte = cipher.doFinal(bytesrc); + return new String(retByte); + } + + /** + * 将byte[] 转成String + */ + public static String toHexString(byte[] b) { + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + String plainText = Integer.toHexString(0xff & b[i]); + if (plainText.length() < 2) + plainText = "0" + plainText; + hexString.append(plainText); + } + + return hexString.toString(); + } + + /** + * 将String转成byte[] + */ + public static byte[] convertHexString(String ss) { + byte digest[] = new byte[ss.length() / 2]; + for (int i = 0; i < digest.length; i++) { + String byteString = ss.substring(2 * i, 2 * i + 2); + int byteValue = Integer.parseInt(byteString, 16); + digest[i] = (byte) byteValue; + } + return digest; + } +} diff --git a/src/main/java/cn/edu/whu/boot/common/utils/collection/OtherUtil.java b/src/main/java/cn/edu/whu/boot/common/utils/collection/OtherUtil.java new file mode 100644 index 0000000..04c90e5 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/common/utils/collection/OtherUtil.java @@ -0,0 +1,256 @@ +package cn.edu.whu.boot.common.utils.collection; + +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import cn.edu.whu.boot.collection.dto.Feature; +import cn.edu.whu.boot.collection.dto.GeometryType; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; +import com.alibaba.fastjson.JSON; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.input.SAXBuilder; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.util.*; + +/** + * 放置一些零散的方法 + */ +public class OtherUtil{ + + /** + * 利用 HttpServletResponse 上传文件 + */ + public static String uploadFileByResponse(File file, HttpServletResponse response){ + if(file.exists()){ + try(InputStream inputStream = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(inputStream); + ServletOutputStream servletOutputStream = response.getOutputStream(); + BufferedOutputStream bos = new BufferedOutputStream(servletOutputStream)){ + byte[] buff = new byte[2048]; + // 根据 BufferedInputStream 里内容写入到 BufferedOutputStream 中 + int bytesRead; + while(-1 != (bytesRead = bis.read(buff, 0, buff.length))){ + bos.write(buff, 0, bytesRead); + } + bos.flush(); + } catch(final IOException e){ + return CommonConstant.FAILED; + } + } + else{ + return CommonConstant.FAILED; + } + return CommonConstant.SUCCEED; + } + + /** + * 根据xmlEnity类的文件路径和其对应的MD5Code判断xml文件是否被更改 + */ + public static boolean checkXmlFileIsModified(XmlEnity xmlEnity){ + String filePath = xmlEnity.getFilePath(); + String fileMD5CodeOld = xmlEnity.getMd5Code(); + String fileMD5CodeNew = ""; + try{ + fileMD5CodeNew = EncryptUtils.getMd5ByFile(new File(filePath)); + } + catch(Exception e){ + e.printStackTrace(); + } + return !fileMD5CodeOld.equals(fileMD5CodeNew); + } + + /** + * 检查 List> 的 size 值,只有 size 为 1 才返回 succeed + */ + public static ResultMessage checkDataListGetByPolygonId(List> rootTableDataList){ + if(rootTableDataList == null){ + return ResultMessage.failed("无数据,请核对"); + } + if(rootTableDataList.size() == 1){ + return ResultMessage.success(null); + } + else{ + return ResultMessage.failed(null); + } + } + + /** + * RouteLine、RoutePoint以及Draft类从安卓端上传的时间是"20190922161832763",将其转换为"2019-09-22 16:18:32.763" + */ + public static String changeTimeString(String timeString){ + return timeString.substring(0, 4) + "-" + timeString.substring(4, 6) + "-" + timeString.substring(6, 8) + " " + timeString.substring(8, 10) + ":" + timeString.substring(10, 12) + ":" + timeString.substring(12, 14) + "." + timeString.substring(14, timeString.length()); + } + + /** + * 用于获取xml文件中标签下含有标签 +// result.putAll(addSelectKeyValueToMap(fieldElement)); +// } +// // 如果标签下有标签 +// if(fieldElement.getChildren("group").size() != 0){ +// for(Object groupObj : fieldElement.getChildren("group")){ +// Element groupElement = (Element) groupObj; +// result.putAll(addSelectKeyValueToMap(groupElement)); +// } +// } +// } +// } +// } +// return result; +// } + /** + * 用于获取xml文件中标签下含有 + result.putAll(addSelectKeyValueToMap(fieldElement)); + // 如果 也有 标签,则添加

标签 + */ + private static void jsonToElementForTable(Element rootElement, JSONArray tableArray){ + for(Object obj : tableArray){ + JSONObject tableObj = (JSONObject) obj; + Set keySet = tableObj.keySet(); + List tableAttributes = new ArrayList<>(); + + // 针对于
标签添加属性 + for(String key : keySet){ + if(!CommonConstant.TABLES_FIELDS.equals(key)){ + Attribute attribute = new Attribute(key, tableObj.getString(key)); + tableAttributes.add(attribute); + } + } + Element childElement = new Element(CommonConstant.TAG_TABLE); + childElement.setAttributes(tableAttributes); + + // 针对于
节点 添加 子节点 + JSONArray fieldsArray = (JSONArray) tableObj.get(CommonConstant.TABLES_FIELDS); + + for(Object fieldObj : fieldsArray){ + Element grandchildElement = new Element(CommonConstant.TAG_FIELD); + + // 定义变量,为后面存储 "selector" 数据使用(如果存在的话) + JSONArray selectorJsonArray = null; + JSONObject fieldJsonObj = (JSONObject) fieldObj; + Set fieldKeySet = fieldJsonObj.keySet(); + List fieldAttributes = new ArrayList<>(); + + // 针对于 标签添加属性 , 特别是针对于 type = "checkbox" 的属性 + for(String key : fieldKeySet){ + boolean defaultContains = defaultTrue.contains(key); + if(CommonConstant.FIELD_SELECTOR.equals(key)){ + selectorJsonArray = (JSONArray) fieldJsonObj.get(key); + } + else if(CommonConstant.KEY.equals(key)){ + Attribute attribute = new Attribute(key, fieldJsonObj.getString(key)); + fieldAttributes.add(attribute); + } + // 如果属性值为空字符串,直接跳过 + // 如果该属性的默认值是 true,则只有当该属性的值为 false 的时候才记录 + // 对于其他属性,只有当该属性的值不为 false 的时候才记录 + else if(!"".equals(fieldJsonObj.get(key)) && + ((defaultContains && "false".equals(fieldJsonObj.getString(key)))|| + (!defaultContains && !"false".equals(fieldJsonObj.getString(key))))){ + Attribute attribute = new Attribute(key, fieldJsonObj.getString(key)); + fieldAttributes.add(attribute); + } + } + try{ + if(selectorJsonArray != null && selectorJsonArray.size() != 0){ + List groupNumList = new ArrayList<>(); + for(Object groupObj : selectorJsonArray){ + JSONObject groupJsonObj = (JSONObject) groupObj; + String groupNum = groupJsonObj.getString("group"); + if("".equals(groupNum)){ + Element selectElement = genSelectElement(groupJsonObj); + grandchildElement.addContent(selectElement); + } + else{ + groupNumList.add(groupNum); + } + } + Set groupNumSet = new HashSet<>(groupNumList); + for(String groupNum : groupNumSet){ + Element groupElement = new Element("group"); + Attribute attribute = new Attribute("key", groupNum); + groupElement.setAttribute(attribute); + for(Object groupObj : selectorJsonArray){ + JSONObject groupJsonObj = (JSONObject) groupObj; + if(groupNum.equals(groupJsonObj.getString("group"))){ + Element selectElement = genSelectElement(groupJsonObj); + groupElement.addContent(selectElement); + } + } + grandchildElement.addContent(groupElement); + } + } + } catch(Exception e){ + e.printStackTrace(); + } + grandchildElement.setAttributes(fieldAttributes); + childElement.addContent(grandchildElement); + } + rootElement.addContent(childElement); + } + } + + /** + * 根据传入的groupJsonObj生成
标签的 key + * @param filePath XML 文件路径 + * @return table 标签中的 key 值 + * @throws Exception 解析错误时抛出 + */ + public static String getTableKey(String filePath) throws Exception { + File xmlFile = new File(filePath); + if (!xmlFile.exists()) { + throw new FileNotFoundException("XML 文件不存在: " + filePath); + } + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(xmlFile); + doc.getDocumentElement().normalize(); + + NodeList tableNodes = doc.getElementsByTagName("table"); + if (tableNodes.getLength() == 0) { + throw new RuntimeException("XML 中未找到
标签"); + } + Element tableElement = (Element) tableNodes.item(0); + return tableElement.getAttribute("key"); + } +} diff --git a/src/main/java/cn/edu/whu/boot/photozip/util/ZipUtil.java b/src/main/java/cn/edu/whu/boot/photozip/util/ZipUtil.java new file mode 100644 index 0000000..3f2f5e7 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/photozip/util/ZipUtil.java @@ -0,0 +1,74 @@ +package cn.edu.whu.boot.photozip.util; + +import java.io.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class ZipUtil { + + /** + * 直接压缩指定的文件夹,并保持文件夹结构 + * @param folderPath 需要压缩的文件夹路径 + * @param zipPath 生成的 ZIP 文件路径 + */ + public static void createZip(String folderPath, String zipPath) { + File folder = new File(folderPath); + if (!folder.exists() || !folder.isDirectory()) { + throw new IllegalArgumentException("路径不是有效的文件夹: " + folderPath); + } + + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath))) { + addDirectoryToZip(folder, folder.getParentFile(), zos); + } catch (IOException e) { + throw new RuntimeException("创建 ZIP 失败", e); + } + } + + /** + * 递归添加文件夹及其内容到 ZIP 文件中 + * @param folder 需要压缩的文件夹 + * @param baseFolder ZIP 内的相对路径起始点 + * @param zos Zip 输出流 + */ + private static void addDirectoryToZip(File folder, File baseFolder, ZipOutputStream zos) throws IOException { + File[] files = folder.listFiles(); + if (files == null) return; + + for (File file : files) { + String zipEntryName = baseFolder.toURI().relativize(file.toURI()).getPath(); + if (file.isDirectory()) { + // 目录项需要以 `/` 结尾,以表明是目录 + zos.putNextEntry(new ZipEntry(zipEntryName.endsWith("/") ? zipEntryName : zipEntryName + "/")); + zos.closeEntry(); + addDirectoryToZip(file, baseFolder, zos); + } else { + addFileToZip(file, zipEntryName, zos); + } + } + } + + /** + * 将文件添加到 ZIP 文件中,并保持相对路径 + * @param file 需要添加的文件 + * @param zipEntryName ZIP 入口名称(相对路径) + * @param zos Zip 输出流 + */ + private static void addFileToZip(File file, String zipEntryName, ZipOutputStream zos) throws IOException { + // 创建输入流读取文件 + try (FileInputStream fis = new FileInputStream(file)) { + // 为文件创建 ZipEntry + zos.putNextEntry(new ZipEntry(zipEntryName)); + + // 创建缓冲区并读取文件内容 + byte[] buffer = new byte[1024]; + int length; + while ((length = fis.read(buffer)) > 0) { + zos.write(buffer, 0, length); + } + + // 关闭文件的 ZipEntry + zos.closeEntry(); + } + } + +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/bean/Collector.java b/src/main/java/cn/edu/whu/boot/statistics/bean/Collector.java new file mode 100644 index 0000000..2107c59 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/bean/Collector.java @@ -0,0 +1,60 @@ +package cn.edu.whu.boot.statistics.bean; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.stereotype.Component; + +@Component +public class Collector { + + private String name; + private int userId; + private int taskId; + private String phone; + private String email; + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getTaskId() { + return taskId; + } + + public void setTaskId(int taskId) { + this.taskId = taskId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return JSONObject.toJSONString(this); + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/bean/CollectorWorkload.java b/src/main/java/cn/edu/whu/boot/statistics/bean/CollectorWorkload.java new file mode 100644 index 0000000..b2aa11d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/bean/CollectorWorkload.java @@ -0,0 +1,27 @@ +package cn.edu.whu.boot.statistics.bean; + +public class CollectorWorkload { + private Integer user; + + private Long newDataCount; + + public CollectorWorkload() { + newDataCount = 0L; + } + + public Integer getUser() { + return user; + } + + public void setUser(Integer user) { + this.user = user; + } + + public Long getNewDataCount() { + return newDataCount; + } + + public void setNewDataCount(Long newDataCount) { + this.newDataCount = newDataCount; + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/bean/ReviewerWorkload.java b/src/main/java/cn/edu/whu/boot/statistics/bean/ReviewerWorkload.java new file mode 100644 index 0000000..c64ee74 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/bean/ReviewerWorkload.java @@ -0,0 +1,60 @@ +package cn.edu.whu.boot.statistics.bean; + +public class ReviewerWorkload { + private Integer user; + + private Long totalWorkload; + + private Long toBeReviewedDataCount; + + private Long validDataCount; + + private Long invalidDataCount; + + public ReviewerWorkload() { + totalWorkload = 0L; + toBeReviewedDataCount = 0L; + validDataCount = 0L; + invalidDataCount = 0L; + } + + public Integer getUser() { + return user; + } + + public void setUser(Integer user) { + this.user = user; + } + + public Long getTotalWorkload() { + return totalWorkload; + } + + public void setTotalWorkload(Long totalWorkload) { + this.totalWorkload = totalWorkload; + } + + public Long getToBeReviewedDataCount() { + return toBeReviewedDataCount; + } + + public void setToBeReviewedDataCount(Long toBeReviewedDataCount) { + this.toBeReviewedDataCount = toBeReviewedDataCount; + } + + public Long getValidDataCount() { + return validDataCount; + } + + public void setValidDataCount(Long validDataCount) { + this.validDataCount = validDataCount; + } + + public Long getInvalidDataCount() { + return invalidDataCount; + } + + public void setInvalidDataCount(Long invalidDataCount) { + this.invalidDataCount = invalidDataCount; + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/bean/RouteLine.java b/src/main/java/cn/edu/whu/boot/statistics/bean/RouteLine.java new file mode 100644 index 0000000..fd23d0a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/bean/RouteLine.java @@ -0,0 +1,47 @@ +package cn.edu.whu.boot.statistics.bean; + +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +public class RouteLine { + + private String collector; + private String route; + private LocalDateTime beginTime; + private LocalDateTime stopTime; + + public String getCollector() { + return collector; + } + + public void setCollector(String collector) { + this.collector = collector; + } + + public String getRoute() { + return route; + } + + public void setRoute(String route) { + this.route = route; + } + + public LocalDateTime getBeginTime() { + return beginTime; + } + + public void setBeginTime(LocalDateTime beginTime) { + this.beginTime = beginTime; + } + + public LocalDateTime getStopTime() { + return stopTime; + } + + public void setStopTime(LocalDateTime stopTime) { + this.stopTime = stopTime; + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/bean/UserWorkload.java b/src/main/java/cn/edu/whu/boot/statistics/bean/UserWorkload.java new file mode 100644 index 0000000..2449a53 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/bean/UserWorkload.java @@ -0,0 +1,120 @@ +package cn.edu.whu.boot.statistics.bean; + +public class UserWorkload { + private String realName; + + // 巡查人员分配到的任务量 + private Long reviewerTotalWorkload; + + // 该用户采集的数据量 + private Long collectedDataCount; + + // 该用户采集的数据中,待审核的数据量 + private Long toBeReviewedDataCount; + + // 该用户采集的数据中,通过审核的数据量 + private Long validDataCount; + + // 该用户采集的数据中,未通过审核的数据量 + private Long invalidDataCount; + + // 该用户额外新采集的数据量(不包括从网页端导入的数据) + private Long newDataCount; + + public UserWorkload() { + reviewerTotalWorkload = 0L; + collectedDataCount = 0L; + toBeReviewedDataCount = 0L; + validDataCount = 0L; + invalidDataCount = 0L; + newDataCount = 0L; + } + + public UserWorkload(String realName) { + this(); + this.realName = realName; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public Long getReviewerTotalWorkload() { + return reviewerTotalWorkload; + } + + public void setReviewerTotalWorkload(Long reviewerTotalWorkload) { + this.reviewerTotalWorkload = reviewerTotalWorkload; + } + + public void incrementReviewerTotalWorkload(long reviewerTotalWorkload) { + this.reviewerTotalWorkload += reviewerTotalWorkload; + } + + public Long getCollectedDataCount() { + return collectedDataCount; + } + + public void setCollectedDataCount(Long collectedDataCount) { + this.collectedDataCount = collectedDataCount; + } + + public void incrementCollectedDataCount(long collectedDataCount) { + this.collectedDataCount += collectedDataCount; + } + + public Long getToBeReviewedDataCount() { + return toBeReviewedDataCount; + } + + public void setToBeReviewedDataCount(Long toBeReviewedDataCount) { + this.toBeReviewedDataCount = toBeReviewedDataCount; + } + + public void incrementToBeReviewedDataCount(long toBeReviewedDataCount) { + this.toBeReviewedDataCount += toBeReviewedDataCount; + } + + public void incrementReviewerDoneWorkload(long reviewerDoneWorkload) { + } + + public Long getValidDataCount() { + return validDataCount; + } + + public void setValidDataCount(Long validDataCount) { + this.validDataCount = validDataCount; + } + + public void incrementValidDataCount(long validDataCount) { + this.validDataCount += validDataCount; + } + + public Long getInvalidDataCount() { + return invalidDataCount; + } + + public void setInvalidDataCount(Long invalidDataCount) { + this.invalidDataCount = invalidDataCount; + } + + public void incrementInvalidDataCount(long invalidDataCount) { + this.invalidDataCount += invalidDataCount; + } + + public Long getNewDataCount() { + return newDataCount; + } + + public void setNewDataCount(Long newDataCount) { + this.newDataCount = newDataCount; + } + + public void incrementNewDataCount(long newDataCount) { + this.newDataCount += newDataCount; + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/controller/BasicStatController.java b/src/main/java/cn/edu/whu/boot/statistics/controller/BasicStatController.java new file mode 100644 index 0000000..6cd6a5e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/controller/BasicStatController.java @@ -0,0 +1,44 @@ +package cn.edu.whu.boot.statistics.controller; + + +import cn.edu.whu.boot.statistics.service.BasicStatService; +import org.apache.ibatis.annotations.Param; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Li Haoming + */ +@RestController +@RequestMapping("/basicStat") +public class BasicStatController { + + @Autowired + BasicStatService basicStatService; + + @RequestMapping("/getTasks") + public String getTasks() { + return basicStatService.getTasks(); + } + + + @RequestMapping("/getTables") + public String getTaskTables(@Param("tskName") String tskName) { + return basicStatService.getTables(tskName); + } + + @RequestMapping("/getFields") + public String getFields(@Param("tskName") String tskName, @Param("tblName") String tblName) { + return basicStatService.getFields(tskName, tblName); + } + + + @RequestMapping("/stat") + public String stat(@Param("tskName") String tskName, + @Param("tblName") String tblName, + @Param("statField") String statField, + @Param("groupField") String groupField) { + return basicStatService.stat(tskName, tblName, statField, groupField); + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/controller/ProgressStatController.java b/src/main/java/cn/edu/whu/boot/statistics/controller/ProgressStatController.java new file mode 100644 index 0000000..3de1c8a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/controller/ProgressStatController.java @@ -0,0 +1,102 @@ +package cn.edu.whu.boot.statistics.controller; + +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.statistics.service.ProgressStatService; +import cn.edu.whu.boot.xml.service.ITaskService; +import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.text.SimpleDateFormat; +import java.util.Date; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.user.services.UserService; + +/** + * @author Li Haoming + */ +@RestController +@RequestMapping("/statistic") +public class ProgressStatController { + + private final ProgressStatService progressStatService; + + private final ITaskService taskService; + private final UserService userService; + + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + public ProgressStatController(ITaskService taskService, ProgressStatService progressStatService, UserService userService) { + this.taskService = taskService; + this.progressStatService = progressStatService; + this.userService = userService; + } + + /** + * 返回任务列表 + * @return + */ + @RequestMapping("/getTasks") + public String getTasks() { + return progressStatService.getTasks(); + } + + + @RequestMapping("/getTables") + public String getTaskTables(@Param("tskName") String tskName) { + return progressStatService.getTables(tskName); + } + //获取全部表 + @RequestMapping("/getAllTables") + public String getAllTables(@Param("tskName") String tskName) { + return progressStatService.getAllTables(tskName); + } + + @RequestMapping("/getWorkers") + public String getWorkers(@Param("taskId") int taskId) { + Task task = taskService.getTaskById(taskId); + return task.getIsAllocationOptional() == 0? + new ResultMessage<>(true, "", taskService.getWorkersByTask(taskId)).toString(): + new ResultMessage<>(true, "", userService.findAll()).toString(); + + } + + + @RequestMapping("/stat") + public String proStat(@Param("tskName") String tskName, + @Param("tblName") String tblName, + @Param("operation") String operation, + @Param("startTime") String startTime, + @Param("endTime") String endTime) { + + try { + Date sTime = DATE_FORMAT.parse(startTime); + Date eTime = DATE_FORMAT.parse(endTime); + + if (sTime.after(eTime)) { + return new ResultMessage(false, "起始时间晚于开始时间",400).toString(); + } + } catch (Exception e) { + return new ResultMessage(false, "日期格式不正确", 400).toString(); + } + + + if ("day".equals(operation) || "month".equals(operation)) { + return progressStatService.stat(operation, tskName, tblName, startTime, endTime); + } else { + return new ResultMessage(false, "查询操作非法").toString(); + } + } + + + + @RequestMapping("/getFields") + public String getFields(@Param("tblName") String tblName) { + return null; + } + + + + + +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/controller/ReportController.java b/src/main/java/cn/edu/whu/boot/statistics/controller/ReportController.java new file mode 100644 index 0000000..176dfc7 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/controller/ReportController.java @@ -0,0 +1,34 @@ +package cn.edu.whu.boot.statistics.controller; + +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.statistics.service.ReportService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Li Haoming + */ +@RestController +@RequestMapping("/report") +public class ReportController { + + @Autowired + ReportService reportService; + + @RequestMapping("/featuresInfo") + public String getFeaturesInfo(Integer taskId) { + return reportService.featuresInfo(taskId).toJSONString(); + } + + @RequestMapping("/collectorsInfo") + public String getCollectorsInfo(Integer taskId) { + return reportService.collectorsInfo(taskId).toJSONString(); + } + + @RequestMapping("/workloadByUser") + public String countWorkloadByUser(@RequestParam("taskId") int taskId) { + return new ResultMessage<>(true, "成功获取统计信息", reportService.countWorkloadByUser(taskId)).toString(); + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/mapper/BasicStatMapper.java b/src/main/java/cn/edu/whu/boot/statistics/mapper/BasicStatMapper.java new file mode 100644 index 0000000..2ae7c86 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/mapper/BasicStatMapper.java @@ -0,0 +1,19 @@ +package cn.edu.whu.boot.statistics.mapper; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; + +@Repository +public interface BasicStatMapper { + + List getTasks(); + + String getTaskXmlName(@Param("tskName") String tskName); + + String getTaskDBName(@Param("tskName") String tskName); + + List stat(@Param("tskName") String tskName , @Param("tblName") String tblName , @Param("statField") String statField , @Param("groupField") String groupField); +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/mapper/CollectorMapper.java b/src/main/java/cn/edu/whu/boot/statistics/mapper/CollectorMapper.java new file mode 100644 index 0000000..94d5573 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/mapper/CollectorMapper.java @@ -0,0 +1,36 @@ +package cn.edu.whu.boot.statistics.mapper; + +import cn.edu.whu.boot.statistics.bean.Collector; +import cn.edu.whu.boot.statistics.bean.CollectorWorkload; +import cn.edu.whu.boot.statistics.bean.ReviewerWorkload; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; + +@Repository +public interface CollectorMapper { + + int getTaskId(@Param("tskName") String tskName); + + List getTaskWorkers(@Param("taskId") int taskId); + + List getCollectorRoute(@Param("collector") String name , @Param("tblName") String tblName); + + int getCollectorWorkLoad(@Param("tblName") String tblName , @Param("collector") int id); + + List getCollectorWorkLoadDaily(@Param("tblName") String tblName , @Param("collector") int id); + + List> statDaily(@Param("tblName") String tblName); + + List> statMonthly(@Param("tblName") String tblName); + + List> statDailyRatio(@Param("tblName") String tblName); + + List> statMonthlyRatio(@Param("tblName") String tblName); + + List countWorkloadByReviewer(@Param("table") String table); + + List countWorkloadByCollector(@Param("table") String table); +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/mapper/ProgressStatMapper.java b/src/main/java/cn/edu/whu/boot/statistics/mapper/ProgressStatMapper.java new file mode 100644 index 0000000..5e293c5 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/mapper/ProgressStatMapper.java @@ -0,0 +1,30 @@ +package cn.edu.whu.boot.statistics.mapper; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.List; + +@Repository +public interface ProgressStatMapper { + + + String getTaskDBNameById(@Param("taskId") int taskId); + + String getTaskXmlNameById(@Param("taskId") int taskId); + + List getTasks(); + + String getTaskXmlName(@Param("tskName") String tskName); + + String getTaskDBName(@Param("tskName") String tskName); + + int getCount(@Param("tblName") String tblName); + + List> statDaily(@Param("tblName") String tblName , @Param("startTime") String startTime , @Param("endTime") String endTime); + + List> statMonthly(@Param("tblName") String tblName , @Param("startTime") String startTime , @Param("endTime") String endTime); + + int getCountInAPeriod(@Param("tblName") String tblName , @Param("startTime") String startTime , @Param("endTime") String endTime); +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/service/BasicStatService.java b/src/main/java/cn/edu/whu/boot/statistics/service/BasicStatService.java new file mode 100644 index 0000000..caddf1a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/service/BasicStatService.java @@ -0,0 +1,95 @@ +package cn.edu.whu.boot.statistics.service; + +import cn.edu.whu.boot.statistics.mapper.BasicStatMapper; +import cn.edu.whu.boot.xml.xmlreader.XmlTemplateReader; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.text.DecimalFormat; +import java.util.Map; + +@Service +public class BasicStatService { + + @Value("#{'${XmlFilePath}' + '/'}") + private String XML_FOLDER; + + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("#.000"); + + @Autowired + BasicStatMapper basicStatMapper; + + public String getTasks() { + JSONArray result = new JSONArray(); + result.addAll(basicStatMapper.getTasks()); + return result.toJSONString(); + } + + public String getTables(String tskName) { + + String fileName = basicStatMapper.getTaskXmlName(tskName); + String path = XML_FOLDER + fileName + ".xml"; + Config config = XmlTemplateReader.read(path); + Map tables = config.getTables(); + + JSONObject result = new JSONObject(true); + tables.forEach((k, v)->{ + result.put(k, v.getName()); + }); + + return result.toJSONString(); + + } + + public String getFields(String tskName, String tblName) { + + String fileName = basicStatMapper.getTaskXmlName(tskName); + String path = XML_FOLDER + fileName + ".xml"; + + Config config = XmlTemplateReader.read(path); + Map rootTbls = config.getRootTables(); + + Table table = rootTbls.get(tblName); + + Map fields = table.getFields(); + + JSONObject result = new JSONObject(true); + JSONArray statFields = new JSONArray(); + JSONArray groupFields = new JSONArray(); + + fields.forEach((k, v)->{ + String dbType = v.getDbType(); + if ("integer".equals(dbType) || "long".equals(dbType) || "double".equals(dbType)) { + if (null != v.getName()) { + JSONObject temp = new JSONObject(); + temp.put(k, v.getName()); + statFields.add(temp); + } + } else { + if (null != v.getName()) { + JSONObject temp = new JSONObject(); + temp.put(k, v.getName()); + groupFields.add(temp); + } + } + }); + + result.put("可统计字段", statFields); + result.put("分组字段", groupFields); + return result.toJSONString(); + } + + public String stat(String tskName, String tblName, String statField, String groupField) { + String taskDBName = basicStatMapper.getTaskDBName(tskName); + tblName = '"' + taskDBName + '"' + "." + '"' + tblName + '"'; + statField = '"' + statField + '"'; + groupField = '"' + groupField + '"'; + return JSONObject.toJSONString(basicStatMapper.stat(tskName, tblName, statField, groupField)); + } +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/service/ProgressStatService.java b/src/main/java/cn/edu/whu/boot/statistics/service/ProgressStatService.java new file mode 100644 index 0000000..ff591e8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/service/ProgressStatService.java @@ -0,0 +1,108 @@ +package cn.edu.whu.boot.statistics.service; + +import cn.edu.whu.boot.statistics.mapper.ProgressStatMapper; +import cn.edu.whu.boot.xml.xmlreader.XmlTemplateReader; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class ProgressStatService { + + @Autowired + ProgressStatMapper progressStatMapper; + + @Value("#{'${XmlFilePath}' + '/'}") + private String XML_FOLDER; + + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("#.000"); + + public String getTasks() { + JSONArray result = new JSONArray(); + result.addAll(progressStatMapper.getTasks()); + return result.toJSONString(); + } + + public String getTables(String tskName) { + + String fileName = progressStatMapper.getTaskXmlName(tskName); + String path = XML_FOLDER + fileName + ".xml"; + Config config = XmlTemplateReader.read(path); + Map Tbls = config.getRootTables(); +// Map Tbls = config.getTables(); + JSONObject result = new JSONObject(true); + Tbls.forEach((k, v)->{ + result.put(k, v.getName()); + }); + + return result.toJSONString(); + + } + public String getAllTables(String tskName) { + + String fileName = progressStatMapper.getTaskXmlName(tskName); + String path = XML_FOLDER + fileName + ".xml"; + Config config = XmlTemplateReader.read(path); + Map Tbls = config.getTables(); + JSONObject result = new JSONObject(true); + Tbls.forEach((k, v)->{ + result.put(k, v.getName()); + }); + + return result.toJSONString(); + + } + + + public String stat(String operation, String tskName, String tblName, String startTime, String endTime ) { + + String taskDBName = progressStatMapper.getTaskDBName(tskName); + tblName = '"' + taskDBName + '"' + "." + '"' + tblName + '"'; + + //拼写起始时间和结束时间 + //这里是无奈的写法,如果使用通配符,传入数据类型应该是 LocalDateTime + //但目前系统没有统一日期格式,所以暂时使用字符串拼接传入日期 + startTime = "'" + startTime + "'"; + endTime = "'" + endTime + "'"; + + //本表中记录总数 + int count = progressStatMapper.getCount(tblName); + + //在查询时间内的总数 + int countInAPeriod = progressStatMapper.getCountInAPeriod(tblName, startTime, endTime); + + JSONObject jsonResult = new JSONObject(true); + jsonResult.put("total", countInAPeriod); + + List> statData = null; + if ("day".equals(operation)) { + statData = progressStatMapper.statDaily(tblName, startTime, endTime); + } else { + statData = progressStatMapper.statMonthly(tblName, startTime, endTime); + } + + JSONArray ratioArray = new JSONArray(); + for (int i = 0; i < statData.size(); i++) { + HashMap record = statData.get(i); + JSONObject ratio = new JSONObject(true); + ratio.put("date", record.get("date")); + ratio.put("ratio", DOUBLE_FORMAT.format(record.get("count")/(double)count)); + ratioArray.add(ratio); + } + + jsonResult.put("data", statData); + jsonResult.put("ratio", ratioArray); + return jsonResult.toJSONString(); + } + + +} diff --git a/src/main/java/cn/edu/whu/boot/statistics/service/ReportService.java b/src/main/java/cn/edu/whu/boot/statistics/service/ReportService.java new file mode 100644 index 0000000..c2e6471 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/statistics/service/ReportService.java @@ -0,0 +1,293 @@ +package cn.edu.whu.boot.statistics.service; + + +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.statistics.bean.CollectorWorkload; +import cn.edu.whu.boot.statistics.bean.ReviewerWorkload; +import cn.edu.whu.boot.statistics.bean.UserWorkload; +import cn.edu.whu.boot.statistics.mapper.CollectorMapper; +import cn.edu.whu.boot.statistics.mapper.ProgressStatMapper; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.XmlTemplateReader; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.*; + +@Service +public class ReportService { + + @Autowired + ProgressStatMapper progressStatMapper; + + @Autowired + CollectorMapper collectorMapper; + + @Autowired + ITaskService taskService; + + @Autowired + UserService userService; + + @Value("#{'${XmlFilePath}' + '/'}") + private String XML_FOLDER; + + /** + * 获取该 task 下的所有地理信息表 + * + * @param taskId + * @return + */ + private Map getTables(int taskId) { + String fileName = progressStatMapper.getTaskXmlNameById(taskId); + String path = XML_FOLDER + fileName + ".xml"; + Config config = XmlTemplateReader.read(path); + + // 获取存储有地理信息的表 + return config.getRootTables(); + } + + + /** + * 统计 task 下地理信息表的相关信息 + * + * @param taskId + * @return + */ + public JSONArray featuresInfo(int taskId) { + JSONArray result = new JSONArray(); + + //1. 获取 task 对应的数据库名称 + String taskDBName = progressStatMapper.getTaskDBNameById(taskId); + + //2. 获取该 task 下的所有根表 ,即所有地理属性的表 + Map rootTbls = getTables(taskId); + + //3. 对所有的地理信息表做遍历统计 + for (String key : rootTbls.keySet()) { + String tblName = '"' + taskDBName + '"' + "." + '"' + key + '"'; + JSONObject featureInfo = new JSONObject(true); + featureInfo.put("name", key); + featureInfo.put("name_ch", rootTbls.get(key).getName()); + // 数据总量 + featureInfo.put("count", progressStatMapper.getCount(tblName)); + + featureInfo.put("statDaily", statDaily(tblName)); + + featureInfo.put("statMonthly", statMonthly(tblName)); + + + result.add(featureInfo); + } + + return result; + } + + + private JSONObject statDaily(String tblName) { + + JSONObject result = new JSONObject(true); + + List> data = collectorMapper.statDaily(tblName); + + double avg = 0; + int sum = 0; + int size = data.size(); + long max = Integer.MIN_VALUE; + long min = Integer.MAX_VALUE; + String maxDay = null; + String minDay = null; + HashMap maxMap = new HashMap<>(); + HashMap minMap = new HashMap<>(); + + for (Iterator iterator = data.iterator(); iterator.hasNext(); ) { + HashMap dayRecord = (HashMap) iterator.next(); + String date = (String) dayRecord.get("date"); + long count = (long) dayRecord.get("count"); + if (count >= max) { + max = count; + maxDay = date; + } + + if (count <= min) { + min = count; + minDay = date; + } + sum += count; + } + + // 每日采集的均值 + result.put("avg", (double) sum / size); + // 按日统计 + result.put("data", data); + // 按日统计比例 + result.put("ratio", collectorMapper.statDailyRatio(tblName)); + // 采集最多的一天与采集最少的一天 + if (maxDay == null) { + maxMap.put("无数据", 0L); + } else { + maxMap.put(maxDay, max); + } + + if (minDay == null) { + minMap.put("无数据", 0L); + } else { + minMap.put(minDay, min); + } + result.put("maxDay", maxMap); + result.put("minDay", minMap); + + return result; + } + + private JSONObject statMonthly(String tblName) { + + JSONObject result = new JSONObject(true); + + List> data = collectorMapper.statMonthly(tblName); + + double avg = 0; + int sum = 0; + int size = data.size(); + long max = Integer.MIN_VALUE; + long min = Integer.MAX_VALUE; + String maxMonth = null; + String minMonth = null; + + HashMap maxMap = new HashMap<>(); + HashMap minMap = new HashMap<>(); + + for (Iterator iterator = data.iterator(); iterator.hasNext(); ) { + HashMap monthRecord = (HashMap) iterator.next(); + String date = (String) monthRecord.get("date"); + long count = (long) monthRecord.get("count"); + if (count >= max) { + max = count; + maxMonth = date; + } + + if (count <= min) { + min = count; + minMonth = date; + } + sum += count; + } + + // 每月采集的均值 + result.put("avg", (double) sum / size); + // 按月统计 + result.put("data", data); + // 按月统计比例 + result.put("ratio", collectorMapper.statMonthlyRatio(tblName)); + // 采集最多的一月与采集最少的一月 + if (maxMonth == null) { + maxMap.put("无数据", 0L); + } else { + maxMap.put(maxMonth, max); + } + + if (minMonth == null) { + minMap.put("无数据", 0L); + } else { + minMap.put(minMonth, min); + } + + result.put("maxMonth", maxMap); + result.put("minMonth", minMap); + + return result; + + } + + public JSONArray collectorsInfo(int taskId) { + JSONArray result = new JSONArray(); + + String taskDBName = progressStatMapper.getTaskDBNameById(taskId); +// int taskId = collectorMapper.getTaskId(tskName); + + // 1. 获取参与该任务的所有人员 + List workers = taskService.getWorkersByTask(taskId); + + // 2. 获取该任务的所有地理信息表 + Map rootTbls = getTables(taskId); + + for (User worker : workers) { + + JSONObject workerInfo = new JSONObject(true); + workerInfo.put("name", worker.getUsername()); + workerInfo.put("phone", worker.getPhone()); + workerInfo.put("email", worker.getEmail()); + + for (Map.Entry entry : rootTbls.entrySet()) { + + String tblName = '"' + taskDBName + '"' + "." + '"' + entry.getKey() + '"'; + Table table = (Table) entry.getValue(); + workerInfo.put(table.getName(), statCollectorInfo(tblName, worker)); + + } + + result.add(workerInfo); + + } + + return result; + } + + private JSONObject statCollectorInfo(String tblName, User collector) { + JSONObject result = new JSONObject(true); + + // 1.获取采集的点总数 + int workLoad = collectorMapper.getCollectorWorkLoad(tblName, collector.getId()); + + // 2.获取某个人按天统计的工作量 + List workLoadDaily = collectorMapper.getCollectorWorkLoadDaily(tblName, collector.getId()); + + // 3.每天的平均工作量 + double avgWorkLoad = (workLoadDaily.size() != 0) ? workLoad / workLoadDaily.size() : 0; + + result.put("workLoad", workLoad); + result.put("avgWorkLoad", avgWorkLoad); + result.put("workLoadDaily", workLoadDaily); + return result; + } + + public List countWorkloadByUser(int taskId) { + Map id2workload = new HashMap<>(); + // 获取该任务下所有的工作人员 + List workers = taskService.getWorkersByTask(taskId); + if (workers.isEmpty()) { + return Collections.emptyList(); + } + for (User worker : workers) { + id2workload.put(worker.getId(), new UserWorkload(worker.getRealName())); + } + + Task task = taskService.getTaskById(taskId); + Map tables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + for (String tableName : tables.keySet()) { + String tb = PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, false, false); + // 统计每个工作人员分配到的任务量、巡查上传后待审核的数据量、通过审核的数据量和未通过审核的数据量,以及额外新采集的数据量 + for (ReviewerWorkload rw : collectorMapper.countWorkloadByReviewer(tb)) { + UserWorkload workload = id2workload.computeIfAbsent(rw.getUser(), id -> new UserWorkload(userService.findRealNameById(id))); + workload.incrementReviewerTotalWorkload(rw.getTotalWorkload()); + workload.incrementToBeReviewedDataCount(rw.getToBeReviewedDataCount()); + workload.incrementValidDataCount(rw.getValidDataCount()); + workload.incrementInvalidDataCount(rw.getInvalidDataCount()); + workload.incrementCollectedDataCount(workload.getToBeReviewedDataCount() + workload.getInvalidDataCount() + workload.getValidDataCount()); + } + for (CollectorWorkload cw : collectorMapper.countWorkloadByCollector(tb)) { + id2workload.computeIfAbsent(cw.getUser(), id -> new UserWorkload(userService.findRealNameById(id))).incrementNewDataCount(cw.getNewDataCount()); + } + } + return new ArrayList<>(id2workload.values()); + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/components/CustomSessionListener.java b/src/main/java/cn/edu/whu/boot/user/components/CustomSessionListener.java new file mode 100644 index 0000000..5eb74b0 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/components/CustomSessionListener.java @@ -0,0 +1,34 @@ +package cn.edu.whu.boot.user.components; + +import org.apache.shiro.session.Session; +import org.apache.shiro.session.SessionListener; +import org.springframework.stereotype.Component; + +import java.util.concurrent.atomic.AtomicInteger; + +@Component +public class CustomSessionListener implements SessionListener { + private final AtomicInteger sessionCount = new AtomicInteger(0); // 用于统计在线的 session 数量 + + @Override + public void onStart(Session session) { + sessionCount.incrementAndGet(); + } + + @Override + public void onStop(Session session) { + sessionCount.decrementAndGet(); + } + + @Override + public void onExpiration(Session session) { + sessionCount.decrementAndGet(); + } + + /** + * 获取在线人数使用 + */ + public AtomicInteger getSessionCount() { + return sessionCount; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/config/CORSConfig.java b/src/main/java/cn/edu/whu/boot/user/config/CORSConfig.java new file mode 100644 index 0000000..faffe85 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/config/CORSConfig.java @@ -0,0 +1,16 @@ +package cn.edu.whu.boot.user.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import static org.springframework.web.cors.CorsConfiguration.ALL; + +@Configuration +public class CORSConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) + { + registry.addMapping("/**").allowedOrigins(ALL).allowedMethods(ALL).allowedHeaders(ALL).allowCredentials(true); + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/config/ShiroConfig.java b/src/main/java/cn/edu/whu/boot/user/config/ShiroConfig.java new file mode 100644 index 0000000..703222c --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/config/ShiroConfig.java @@ -0,0 +1,169 @@ +package cn.edu.whu.boot.user.config; + +import cn.edu.whu.boot.user.components.CustomSessionListener; +import cn.edu.whu.boot.user.realms.UserRealm; +import cn.edu.whu.boot.common.utils.user.PasswordEncoder; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.mgt.SessionsSecurityManager; +import org.apache.shiro.session.SessionListener; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.session.mgt.eis.MemorySessionDAO; +import org.apache.shiro.session.mgt.eis.SessionDAO; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.DependsOn; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class ShiroConfig { + + @Bean + public HashedCredentialsMatcher hashedCredentialsMatcher() + { + HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); + hashedCredentialsMatcher.setHashAlgorithmName(PasswordEncoder.getALGORITHM()); + hashedCredentialsMatcher.setHashIterations(PasswordEncoder.getITERATION()); + return hashedCredentialsMatcher; + } + + @Bean + public UserRealm shiroRealm() + { + UserRealm userRealm = new UserRealm(); + userRealm.setCredentialsMatcher(hashedCredentialsMatcher()); + return userRealm; + } + + // 使用 Spring Boot 的场景中,这个 Bean 的类型是 SessionsSecurityManager + @Bean + public SessionsSecurityManager securityManager() + { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + securityManager.setRealm(shiroRealm()); + securityManager.setSessionManager(sessionManager()); + return securityManager; + } + + @Bean + @DependsOn({"lifecycleBeanPostProcessor"}) + public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() + { + DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); + defaultAdvisorAutoProxyCreator.setUsePrefix(true); + return defaultAdvisorAutoProxyCreator; + } + + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() + { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager()); + return authorizationAttributeSourceAdvisor; + } + + @Bean + public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() + { + return new LifecycleBeanPostProcessor(); + } + + @Bean + public ShiroFilterFactoryBean shiroFilterFactoryBean() + { + ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); + filterFactoryBean.setSecurityManager(securityManager()); + filterFactoryBean.setLoginUrl("/user/unauthc"); // 用户没有认证时请求此 URL + filterFactoryBean.setUnauthorizedUrl("/user/unautho"); // 用户没有权限时请求此 URL + // 配置 URL 的访问权限 + Map definitionMap = new HashMap() {{ + // 无需认证 + put("/user/password_recover/authentication", "anon"); + put("/user/password_recover/action", "anon"); + put("/user/password_reset", "anon"); + put("/static/**", "anon"); + //需要认证和特定权限的 URL + //put("/user/all", "authc, perms[user:read]"); + //put("/user/all_worker", "authc, perms[user:readWorker]"); + //put("/user/role_change", "authc, perms[user:changeRole]"); + //put("/user/new", "authc, perms[user:new]"); + //put("/allocation/assignment", "authc, perms[task:assign]"); + //put("/allocation/info/all", "authc, perms[task:read]"); + //put("/allocation/info/worker", "authc, perms[task:readWorker]"); + //put("/allocation/change/cell", "authc, perms[task:changeCellToUser]"); + //put("/allocation/change/cell_worker", "authc, perms[task:changeCellToUser]"); + //put("/allocation/change/worker", "authc, perms[task:appendWorkersToTask]"); + //put("/allocation/change/data", "authc, perms[task:changeDataToUser]"); + //put("/allocation/worker/appending", "authc, perms[task:appendWorkersToTask]"); + //put("/allocation/worker/deleting", "authc, perms[task:deleteWorker]"); + //put("/allocation/worker_status", "authc, perms[task:checkWorkerStatus]"); + //put("/allocation/cell/worker/appending", "authc, perms[task:appendWorkersToCell]"); + //put("/allocation/cell/worker/deleting", "authc, perms[task:deleteWorkerFromCell]"); + //put("/base/rollBackDataForVersion", "authc"); + //put("/base/setDataNotPass", "authc"); + //put("/base/getWarningForUser", "authc"); + //put("/base/getCountByGeoHash", "authc"); + //put("/get/getAllData", "authc"); + //put("/get/getCountByFuzzySearchAndGeohash", "authc"); + //put("/get/getDataByFuzzySearchAndRangeIntersection", "authc"); + //put("/get/getDataByRangeIntersection", "authc"); + //put("/table/**", "authc"); + //put("/basicStat/**", "authc"); + //put("/statistic/**", "authc"); + //put("/report/**", "authc"); + //put("/task/selectAll", "authc"); + //put("/task/selectAllWithTableName", "authc"); + //put("/task/selectTaskHasCreated", "authc"); + }}; + filterFactoryBean.setFilterChainDefinitionMap(definitionMap); + return filterFactoryBean; + } + + /** + * 配置 session 保存的方式 + */ + @Bean + public SessionDAO sessionDAO() + { + return new MemorySessionDAO(); + } + + /** + * 配置 session 管理 + * + * @return SessionManager + */ + @Bean + public SessionManager sessionManager() + { + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + Collection listeners = new ArrayList<>(); + // 配置 session 监听器 + listeners.add(sessionListener()); + sessionManager.setSessionListeners(listeners); + sessionManager.setSessionDAO(sessionDAO()); + // 指定本系统 SESSIONID, 默认为: JSESSIONID 问题: 与 SERVLET 容器名冲突, 如JETTY, TOMCAT 等默认 JSESSIONID, + // 当跳出 SHIRO SERVLET 时如 ERROR-PAGE 容器会为 JSESSIONID 重新分配值导致登录会话丢失! + sessionManager.setSessionIdCookie(new SimpleCookie("shiro.session.id")); + sessionManager.setGlobalSessionTimeout(2 * 60 * 60 * 1000); // 设置全局 session 过期时间为 2 小时 + sessionManager.setSessionValidationInterval(60 * 60 * 1000); // 每隔 1 小时清除用户关闭页面但是没有手动登出造成的孤立 session + sessionManager.setSessionIdUrlRewritingEnabled(false); // 去掉 URL 后面的 JSESSIONID + return sessionManager; + } + + @Bean + public SessionListener sessionListener() + { + return new CustomSessionListener(); + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/controllers/UserController.java b/src/main/java/cn/edu/whu/boot/user/controllers/UserController.java new file mode 100644 index 0000000..44cae69 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/controllers/UserController.java @@ -0,0 +1,545 @@ +package cn.edu.whu.boot.user.controllers; + +import cn.edu.whu.boot.allocation.exceptions.InvalidUserRoleCodeException; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.utils.user.PasswordEncoder; +import cn.edu.whu.boot.user.controllers.dtos.UserWithoutPrivateInfo; +import cn.edu.whu.boot.user.entities.Role; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.RoleService; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.RedisKeyType; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.MailException; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.util.DigestUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Positive; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/user") +@Validated +public class UserController { + + private static final Logger log = LoggerFactory.getLogger(UserController.class); + + private final String userCountCacheKey = "users:count"; + + private Map IdToRoleName = new HashMap() {{ + put(1, "SuperAdmin"); + put(2, "Leader"); + put(3, "Admin"); + put(4, "Worker"); + put(5, "Operator"); + }}; + + private Map roleNameToId = new HashMap() {{ + put("SuperAdmin", 1); + put("Leader", 2); + put("Admin", 3); + put("Worker", 4); + put("Operator", 5); + }}; + + private final int pageSize = 9; + + @Value("${spring.mail.username}") + private String FROM; + + @Value("${email.subject}") + private String emailSubject; + + private final UserService userService; + + private final RoleService roleService; + + private final JavaMailSender mailSender; + + private final CacheService cacheService; + + public UserController(UserService userService, RoleService roleService, JavaMailSender mailSender, CacheService cacheService) { + this.userService = userService; + this.roleService = roleService; + this.mailSender = mailSender; + this.cacheService = cacheService; + } + + /** + * 用户注册,注册成功则返回用户 ID + * + * @param username + * @param password + * @param phone + * @param code 用于确认用户身份的邀请码 + * @throws Exception 用户名已被使用、手机号码已被使用、邀请码错误等异常 + */ + @RequestMapping("/register") + @ResponseBody + public ResultMessage register(@RequestParam("username") + @NotBlank(message = "用户名不能为空") + String username, + @RequestParam("realName") + @NotBlank(message = "真实姓名不能为空") + String realName, + @RequestParam("password") + @NotBlank(message = "密码不能为空") + String password, + @RequestParam("phone") + @Pattern(regexp = "\\d{11}", message = "非法的手机号码") + String phone, + @RequestParam("email") + @Email(message = "邮箱格式错误") + String email, + @RequestParam("code") + @NotBlank(message = "邀请码不能为空") + String code) throws Exception { + // 创建用户成功则返回 ID + try { + int numCode = Integer.parseInt(code); + User newUser = userService.createUser(username, realName, password, phone, email, numCode); + cacheService.delete(userCountCacheKey); + return new ResultMessage<>(true, "注册成功", newUser.getId()); + } catch (NumberFormatException e) { + return new ResultMessage<>(false, "验证码错误"); + } catch (InvalidUserRoleCodeException e) { + return new ResultMessage<>(false, "无效的验证码"); + } + } + + /** + * 管理员在后台注册用户,用户名、真实姓名、密码和用户角色必须由用户指定 + * 邮箱和手机号码可以过后由用户补充 + * + * @param username + * @param realName + * @param role + * @param password + */ + @RequestMapping("/new") + @ResponseBody + public ResultMessage registerByAdmin(@RequestParam("username") + @NotBlank(message = "用户名不能为空") + String username, + @RequestParam("realName") + @NotBlank(message = "真实姓名不能为空") + String realName, + @RequestParam("role") + @NotBlank(message = "角色不能为空") + String role, + @RequestParam(value = "password") + @NotBlank(message = "密码不能为空") + String password) throws Exception { + Optional optional = Optional.ofNullable(roleNameToId.get(role)); + if (!optional.isPresent()) { + return new ResultMessage<>(false, "不存在此类用户角色: " + role); + } + User user = userService.createUser(username, realName, password, optional.get()); + cacheService.delete(userCountCacheKey); + return new ResultMessage<>(true, "注册成功", user.getId()); + } + + /** + * 用户登录,登录成功则返回用户 ID + * 如果用户的角色是管理人员,还会返回外业人员名单 + * + * @param username + * @param password + */ + @RequestMapping("/login") + @ResponseBody + public ResultMessage login(@RequestParam("username") + @NotBlank(message = "用户名不能为空") + String username, + @RequestParam("password") + @NotBlank(message = "密码不能为空") + String password, + @RequestParam(value = "isAndroid", defaultValue = "false") boolean isAndroid) { + // 确保之前的用户已经登出 + ensureUserLoggedOut(); + // 登录 + Subject subject = SecurityUtils.getSubject(); + UsernamePasswordToken token = new UsernamePasswordToken(username, password); + subject.login(token); // 失败则抛出异常,已在 GlobalExceptionHandler 中处理 + User user = (User) subject.getPrincipal(); + if (!isAndroid && (user.getPhone() == null || + user.getPhone().equals("") || + user.getEmail() == null || + user.getEmail().equals(""))) { + return new ResultMessage<>(false, "用户信息不完整", 204); + } + log.info(user.getUsername() + "已登录"); + Map result = new HashMap<>(); + result.put("id", user.getId()); + result.put("username", user.getUsername()); + result.put("role", IdToRoleName.get(user.getRole())); + return new ResultMessage<>(true, "登录成功", result, 200); + } + + /** + * 确保之前的用户已经登出,避免失效的 session 的干扰 + */ + private void ensureUserLoggedOut() { + try { + // Get the user if one is logged in. + Subject currentUser = SecurityUtils.getSubject(); + if (currentUser == null) { + return; + } + // Log the user out and kill their session if possible. + currentUser.logout(); + Optional.ofNullable(currentUser.getSession(false)) + .ifPresent(org.apache.shiro.session.Session::stop); + } catch (Exception e) { + // Ignore all errors, as we're trying to silently + // log the user out. + log.error(e.getMessage()); + } + } + + /** + * 获取找回密码的验证码,将验证码发送到用户的注册邮箱 + * + * @param email 用户的注册邮箱 + */ + @RequestMapping("/password_recover/authentication") + @ResponseBody + public ResultMessage sendRecoverPwdCode(@RequestParam("email") + @Email String email) { + Optional optionalUser = userService.findByEmail(email); + if (!optionalUser.isPresent()) { + return new ResultMessage<>(false, "无此用户"); + } + User user = optionalUser.get(); + // 生成四位随机数 + Random random = new Random(System.currentTimeMillis()); + int code = 1000 + random.nextInt(9000); + // 将验证码保存在 session 中 + cacheService.set(RedisKeyType.EMAIL_AUTH_CODE + email, String.valueOf(code), 600); + // 发送邮件 + String message = String.format("您好,您的验证码为 %d,请在 10 分钟内进行操作。", code); + if (sendMail(user.getEmail(), message)) { + return new ResultMessage<>(true, "验证码发送成功"); + } else { + return new ResultMessage<>(false, "验证码发送失败"); + } + } + + /** + * 发送邮件 + * + * @param to 收件人邮箱 + * @param content 邮件内容 + * @return true 则发送成功 + * @throws MailException 发送邮件时发生异常 + */ + private boolean sendMail(String to, String content) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(FROM); + message.setTo(to); + message.setSubject(emailSubject); + message.setText(content); + try { + mailSender.send(message); + } catch (MailException e) { + log.error(e.getMessage()); + return false; + } + return true; + } + + /** + * 用户找回密码 + * + * @param code 验证码 + * @param email 注册时的邮箱 + * @param newPassword 新密码 + * @throws Exception 验证码错误、用户不存在、密码修改失败 + */ + @RequestMapping("/password_recover/action") + @ResponseBody + public ResultMessage recoverPassword(@RequestParam("code") + @NotBlank(message = "验证码不能为空") + String code, + @RequestParam("email") + @Email(message = "邮箱格式错误") + String email, + @RequestParam("newPassword") + @NotBlank(message = "新密码不能为空") + String newPassword) throws Exception { + String actualCode = (String) cacheService.get(RedisKeyType.EMAIL_AUTH_CODE + email); + if (!code.equals(actualCode)) { + return new ResultMessage<>(false, "验证码错误或已失效"); + } + Optional optionalUser = userService.findByEmail(email); + if (!optionalUser.isPresent()) { + return new ResultMessage<>(false, "无此用户"); + } + User user = optionalUser.get(); + String hashed = PasswordEncoder.encode(newPassword, user.getSalt()); + user.setPassword(hashed); + user = userService.updateUser(user); + if (!user.getPassword().equals(hashed)) { + throw new Exception("密码修改失败"); + } else { + return new ResultMessage<>(true, "密码修改成功"); + } + } + + /** + * 修改密码 + * + * @param username + * @param oldPassword 原始密码 + * @param newPassword 新密码 + * @throws Exception 用户不存在、原始密码错误、密码修改失败 + */ + @RequestMapping("/password_reset") + @ResponseBody + public ResultMessage resetPassword(@RequestParam("username") + @NotBlank(message = "用户名不能为空") + String username, + @RequestParam("oldPassword") + @NotBlank(message = "原始密码不能为空") + String oldPassword, + @RequestParam("newPassword") + @NotBlank(message = "新密码不能为空") + String newPassword) throws Exception { + Optional optionalUser = userService.findByUsername(username); + if (!optionalUser.isPresent()) { + return new ResultMessage<>(false, "用户不存在"); + } + User user = optionalUser.get(); + if (!user.getPassword().equals(PasswordEncoder.encode(oldPassword, user.getSalt()))) { + return new ResultMessage<>(false, "原始密码错误"); + } + String hashed = PasswordEncoder.encode(newPassword, user.getSalt()); + user.setPassword(hashed); + user = userService.updateUser(user); + if (!user.getPassword().equals(hashed)) { + throw new Exception("密码修改失败"); + } else { + return new ResultMessage<>(true, "密码修改成功"); + } + } + + /** + * 用户修改手机和邮箱 + * + * @param username 用户名 + * @param phone 手机 + * @param email 邮箱 + * @throws Exception 该用户不存在 + */ + @RequestMapping("/update") + @ResponseBody + public ResultMessage updateEmailAndPhone(@RequestParam("username") + @NotBlank + String username, + @RequestParam("phone") + @Pattern(regexp = "\\d{11}") + String phone, + @RequestParam("email") + @Email + String email) throws Exception { + Optional optional = userService.findByUsername(username); + if (!optional.isPresent()) { + return new ResultMessage<>(false, "不存在此用户"); + } + User user = optional.get(); + user.setEmail(email); + user.setPhone(phone); + user = userService.updateUser(user); + if (!user.getEmail().equals(email) || !user.getPhone().equals(phone)) { + return new ResultMessage<>(false, "修改失败"); + } else { + return new ResultMessage<>(true, "成功修改邮箱和手机"); + } + } + + /** + * 获取所有用户 + */ + @RequestMapping("/all") + @ResponseBody + public ResultMessage getAllUsers(@RequestParam("page") @Positive(message = "页码从1开始") + int pageNum) { + Object cache = cacheService.get(userCountCacheKey); + int count; + if (cache != null) { + count = (Integer) cache; + } else { + count = userService.countAll(); + cacheService.set(userCountCacheKey, count, 24 * 60 * 60); + } + + Map result = new HashMap<>(); + if (!pageInRange(pageNum, count, result)) { + return new ResultMessage<>(false, "请求的页码大于总页数", result); + } + + List users = userService.findAllPagination(pageSize, pageNum); + result.put("users", toUserWithoutPrivateInfo(users)); + return new ResultMessage<>(true, "用户列表获取成功", result); + } + + /** + * 根据用户名进行模糊查询 + */ + @RequestMapping("/search") + @ResponseBody + public ResultMessage searchUsersByNamePattern(@RequestParam("username") @NotBlank(message = "搜索内容不能为空") + String username, + @RequestParam("page") @Positive(message = "页码从1开始") + int pageNum) { + int count = userService.countLikeUsername(username); + Map result = new HashMap<>(); + if (!pageInRange(pageNum, count, result)) { + return new ResultMessage<>(false, "请求的页码大于总页数", result); + } + + List users = userService.findLikeUsernamePagination(username, pageSize, pageNum); + result.put("users", toUserWithoutPrivateInfo(users)); + return new ResultMessage<>(true, "搜索成功", result); + } + + private boolean pageInRange(int pageNum, int count, Map result) { + int totalPages = (int) Math.ceil((double) count / (double) pageSize); + result.put("totalPages", totalPages); + return pageNum <= totalPages; + } + + private List toUserWithoutPrivateInfo(List original) { + return original + .parallelStream() + .map(user -> { + String role = IdToRoleName.get(user.getRole()); + UserWithoutPrivateInfo userInfo = new UserWithoutPrivateInfo(user.getId(), user.getUsername(), role); + userInfo.setRealName(user.getRealName()); + return userInfo; + }) + .collect(Collectors.toList()); + } + + /** + * 获取所有可以进行外业任务的人员,即外业人员和管理员 + */ + @RequestMapping("/all_worker") + @ResponseBody + public ResultMessage getAllWorkers() { + List> workers = userService + .findAll() + .parallelStream() + .map(it -> new HashMap() {{ + put("id", it.getId()); + put("username", it.getRealName()); + }}) + .collect(Collectors.toList()); + return new ResultMessage<>(true, "成功获取外业人员列表", workers); + } + + /** + * 修改用户的角色 + * + * @param id 用户 ID + * @param role 修改之后的角色 + */ + @RequestMapping("/role_change") + @ResponseBody + public ResultMessage changeRole(@RequestParam("id") + int id, + @RequestParam("role") + @NotBlank(message = "角色不能为空") + String role) { + // 根据角色名称查询角色 ID + Optional optionalRole = roleService.findRoleByName(role); + if (!optionalRole.isPresent()) { + return new ResultMessage<>(false, "角色" + role + "不存在"); + } + // 查询用户 + Optional optionalUser = userService.findById(id); + if (!optionalUser.isPresent()) { + return new ResultMessage<>(false, "用户" + id + "不存在"); + } + // 修改用户角色 + User user = optionalUser.get(); + Integer roleId = optionalRole.get().getId(); + user.setRole(roleId); + user = userService.updateUser(user); + if (user.getRole().equals(roleId)) { + return new ResultMessage<>(true, "用户角色修改成功"); + } else { + return new ResultMessage<>(false, "用户角色修改失败"); + } + } + + @RequestMapping("/delete") + @ResponseBody + public ResultMessage deleteUserById(@RequestParam("id") int id) { + if (userService.deleteById(id) == 1) { + cacheService.delete(userCountCacheKey); + } + return new ResultMessage<>(true, "成功删除用户"); + } + /** + * 管理员重置指定用户密码为默认值 123456 + * + * @param id 用户ID + */ + @RequestMapping("/resetPassword") + @ResponseBody + public ResultMessage resetPasswordByAdmin(@RequestParam("id") int id) { + // 查询用户 + Optional optionalUser = userService.findById(id); + if (!optionalUser.isPresent()) { + return new ResultMessage<>(false, "用户不存在"); + } + User user = optionalUser.get(); + + // 固定密码 123456,加密后保存 + String frontEndMd5 = DigestUtils.md5DigestAsHex("123456".getBytes()); + frontEndMd5 = DigestUtils.md5DigestAsHex(frontEndMd5.getBytes()); + String hashed = PasswordEncoder.encode(frontEndMd5, user.getSalt()); + user.setPassword(hashed); + // 更新用户信息 + user = userService.updateUser(user); + + if (!user.getPassword().equals(hashed)) { + return new ResultMessage<>(false, "密码重置失败"); + } + + return new ResultMessage<>(true, "密码已重置为默认密码"); + } + + + /** + * 用户没有登录、没有权限时返回错误信息 + */ + @RequestMapping("/unauthc") + @ResponseBody + public ResultMessage unauthc() { + return new ResultMessage<>(false, "用户未登录", 401); + } + + @RequestMapping("/unautho") + @ResponseBody + public ResultMessage unautho() { + return new ResultMessage<>(false, "用户没有权限进行此操作", 403); + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/controllers/dtos/UserWithoutPrivateInfo.java b/src/main/java/cn/edu/whu/boot/user/controllers/dtos/UserWithoutPrivateInfo.java new file mode 100644 index 0000000..4cd678b --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/controllers/dtos/UserWithoutPrivateInfo.java @@ -0,0 +1,63 @@ +package cn.edu.whu.boot.user.controllers.dtos; + +/** + * 只包含用户 ID、用户名、用户角色名称 + */ +public class UserWithoutPrivateInfo { + private Integer id; + + private String username; + + private String role; + + private String realName; + + public UserWithoutPrivateInfo() + { + } + + public UserWithoutPrivateInfo(Integer id , String username , String role) + { + this.id = id; + this.username = username; + this.role = role; + } + + public Integer getId() + { + return id; + } + + public void setId(Integer id) + { + this.id = id; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getRole() + { + return role; + } + + public void setRole(String role) + { + this.role = role; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/entities/Permission.java b/src/main/java/cn/edu/whu/boot/user/entities/Permission.java new file mode 100644 index 0000000..60b3732 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/entities/Permission.java @@ -0,0 +1,28 @@ +package cn.edu.whu.boot.user.entities; + +import java.io.Serializable; + +public class Permission implements Serializable{ + + private static final long serialVersionUID = 4224280491997444571L; + + private Integer id; + + private String description; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/entities/Role.java b/src/main/java/cn/edu/whu/boot/user/entities/Role.java new file mode 100644 index 0000000..3913abd --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/entities/Role.java @@ -0,0 +1,39 @@ +package cn.edu.whu.boot.user.entities; + + +import java.io.Serializable; + +public class Role implements Serializable{ + + private static final long serialVersionUID = 6715954130408287608L; + + private Integer id; + + private String name; + + private Integer code; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/entities/RoleToPermission.java b/src/main/java/cn/edu/whu/boot/user/entities/RoleToPermission.java new file mode 100644 index 0000000..bd27a3f --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/entities/RoleToPermission.java @@ -0,0 +1,38 @@ +package cn.edu.whu.boot.user.entities; + +import java.io.Serializable; + +public class RoleToPermission implements Serializable{ + + private static final long serialVersionUID = -3510872739743175003L; + + private Integer id; + + private Integer role; + + private Integer permission; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRole() { + return role; + } + + public void setRole(Integer role) { + this.role = role; + } + + public Integer getPermission() { + return permission; + } + + public void setPermission(Integer permission) { + this.permission = permission; + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/entities/User.java b/src/main/java/cn/edu/whu/boot/user/entities/User.java new file mode 100644 index 0000000..2fe3a02 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/entities/User.java @@ -0,0 +1,88 @@ +package cn.edu.whu.boot.user.entities; + +import java.io.Serializable; + +public class User implements Serializable{ + + private static final long serialVersionUID = 6103094325297251758L; + + private Integer id; + + private String username; + + private String realName; + + private String password; + + private String salt; + + private String phone; + + private String email; + + private Integer role; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getRole() { + return role; + } + + public void setRole(Integer role) { + this.role = role; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/mapper/PermissionMapper.java b/src/main/java/cn/edu/whu/boot/user/mapper/PermissionMapper.java new file mode 100644 index 0000000..6c0c973 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/mapper/PermissionMapper.java @@ -0,0 +1,32 @@ +package cn.edu.whu.boot.user.mapper; + +import cn.edu.whu.boot.user.entities.Permission; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface PermissionMapper { + @Select({""}) + List findByIdIn(List list); + + @Select("SELECT description FROM user_permission") + List findAllDescriptions(); + + @Select("SELECT description FROM user_permission WHERE id = #{id}") + String findDescriptionById(@Param("id") int id); + + @Select("SELECT description FROM user_permission " + + "WHERE id IN (SELECT permission FROM user_role_permission WHERE role = #{role})") + List findDescriptionsByRole(@Param("role") int role); +} diff --git a/src/main/java/cn/edu/whu/boot/user/mapper/RoleMapper.java b/src/main/java/cn/edu/whu/boot/user/mapper/RoleMapper.java new file mode 100644 index 0000000..9448d20 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/mapper/RoleMapper.java @@ -0,0 +1,19 @@ +package cn.edu.whu.boot.user.mapper; + +import cn.edu.whu.boot.user.entities.Role; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Repository; + +@Repository +public interface RoleMapper { + + @Select("SELECT * FROM user_role WHERE id = #{id}") + Role findById(@Param("id") int id); + + @Select("SELECT * FROM user_role WHERE name = #{name}") + Role findByName(@Param("name") String name); + + @Select("SELECT * FROM user_role WHERE code = #{code}") + Role findByCode(@Param("code") int code); +} diff --git a/src/main/java/cn/edu/whu/boot/user/mapper/RoleToPermissionMapper.java b/src/main/java/cn/edu/whu/boot/user/mapper/RoleToPermissionMapper.java new file mode 100644 index 0000000..2052dbb --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/mapper/RoleToPermissionMapper.java @@ -0,0 +1,14 @@ +package cn.edu.whu.boot.user.mapper; + +import cn.edu.whu.boot.user.entities.RoleToPermission; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface RoleToPermissionMapper { + @Select("SELECT * FROM user_role_permission WHERE role = #{role}") + List findByRole(int role); +} + diff --git a/src/main/java/cn/edu/whu/boot/user/mapper/UserMapper.java b/src/main/java/cn/edu/whu/boot/user/mapper/UserMapper.java new file mode 100644 index 0000000..afa3144 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/mapper/UserMapper.java @@ -0,0 +1,88 @@ +package cn.edu.whu.boot.user.mapper; + +import cn.edu.whu.boot.user.entities.User; +import org.apache.ibatis.annotations.*; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface UserMapper { + @Select("SELECT * FROM user_staff") + @Results({ + @Result(property = "realName", column = "real_name") + }) + List findAll(); + + @Select("SELECT * FROM user_staff " + + "ORDER BY id " + + "LIMIT #{limit} " + + "OFFSET #{offset}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + List findWithinPage(@Param("limit") int limit, @Param("offset") int offset); + + @Select("SELECT COUNT(*) FROM user_staff") + int countAll(); + + @Select("SELECT * FROM user_staff WHERE id = #{id}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + User findById(int id); + + @Select("SELECT * FROM user_staff WHERE username = #{username}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + User findByUsername(String username); + + @Select("SELECT COUNT(*) FROM user_staff WHERE username LIKE #{pattern}") + int countLikeUsername(String pattern); + + @Select("SELECT * FROM user_staff WHERE username LIKE #{pattern} " + + "ORDER BY id " + + "LIMIT #{limit} " + + "OFFSET #{offset}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + List findLikeUsernameWithinPage(@Param("pattern") String pattern, @Param("limit") int limit, @Param("offset") int offset); + + @Select("SELECT * FROM user_staff WHERE phone = #{phone}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + User findByPhone(String phone); + + @Select("SELECT * FROM user_staff WHERE email = #{email}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + User findByEmail(String email); + + + @Select("SELECT * FROM user_staff WHERE role = #{role}") + @Results({ + @Result(property = "realName", column = "real_name") + }) + List findByRole(int role); + + @Select("INSERT INTO user_staff(username, real_name, password, salt, phone, email, role) VALUES(#{username}, #{realName}, #{password}, #{salt}, #{phone}, #{email}, #{role}) RETURNING *") + @Results({ + @Result(property = "realName", column = "real_name") + }) + @Options(flushCache = Options.FlushCachePolicy.TRUE) + User insert(User user); + + @Select("UPDATE user_staff SET username = #{username}, password = #{password}, salt = #{salt}, phone = #{phone}, email = #{email}, role = #{role} WHERE id = #{id} RETURNING *") + @Results({ + @Result(property = "realName", column = "real_name") + }) + @Options(flushCache = Options.FlushCachePolicy.TRUE) + User update(User user); + + @Delete("DELETE FROM user_staff WHERE id = #{id}") + int deleteById(@Param("id") int id); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/realms/UserRealm.java b/src/main/java/cn/edu/whu/boot/user/realms/UserRealm.java new file mode 100644 index 0000000..c0fb989 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/realms/UserRealm.java @@ -0,0 +1,120 @@ +package cn.edu.whu.boot.user.realms; + +import cn.edu.whu.boot.user.entities.Role; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.*; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.subject.support.DefaultSubjectContext; +import org.apache.shiro.util.ByteSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; +import java.util.Set; + +@Component +public class UserRealm extends AuthorizingRealm { + + private final Logger log = LoggerFactory.getLogger(UserRealm.class); + + @Autowired + private UserService userService; + + @Autowired + private RoleService roleService; + + @Autowired + private PermissionService permissionService; + + @Autowired + private SessionService sessionService; + + @Autowired + private PermissionCacheService cacheService; + + /** + * 授权,确定用户具有哪些权限 + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + if (principalCollection == null) { + return null; + } + User user = (User) getAvailablePrincipal(principalCollection); + SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); + Integer role = user.getRole(); + if (role == null) { + return simpleAuthorizationInfo; + } + // 查询用户权限 + if (cacheService.permissionsCached(role)) { + // 先查询缓存 + simpleAuthorizationInfo.setStringPermissions(cacheService.getPermissionsByRole(role)); + } else { + // 如果没有缓存,则查询数据库并更新缓存 + // 超级管理员(1)拥有所有权限 + // 决策人员(2)拥有管理员(3)的全部权限 + Set dbPermissions = role == 1 ? permissionService.findAllDescriptions() : permissionService.findByRole(role == 2 ? 3 : role); + simpleAuthorizationInfo.setStringPermissions(dbPermissions); + cacheService.addPermissions(role, dbPermissions.toArray(new String[0])); + } + return simpleAuthorizationInfo; + } + + /** + * 认证,即检查用户名和密码是否正确 + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken; + String username = upToken.getUsername(); + // 检查用户名是否为空 + if (username == null) { + throw new AccountException("用户名不能为空"); + } + // 并发登录控制 + // 查找和当前尝试登录的用户具有相同用户名的 session, + // 如果存在这样的 session,就删除旧的 session,实现强制下线 + sessionService + .getAllSessions() + .stream() + .filter(session -> + Optional.ofNullable((SimplePrincipalCollection) session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)) + .map(simplePrincipalCollection -> { + User onlineUser = (User) simplePrincipalCollection.getPrimaryPrincipal(); + return onlineUser.getUsername().equals(username); + }) + .orElse(false) + ) + .findFirst() + .ifPresent(session -> { + log.info(String.format("Session %s expired because of the limit of concurrent logging in.", (String) session.getId())); + Subject subject = new Subject.Builder().sessionId(session.getId()).buildSubject(); + subject.logout(); + }); // 删除 session + // 查询用户 + Optional optionalUser = userService.findByUsername(username); + if (!optionalUser.isPresent()) { + throw new UnknownAccountException(String.format("用户 %s 不存在", username)); + } + User user = optionalUser.get(); + Optional optionalRole = roleService.findById(user.getRole()); + if (!optionalRole.isPresent()) { + throw new AuthenticationException("角色不存在"); + } + return new SimpleAuthenticationInfo( + user, + user.getPassword(), + ByteSource.Util.bytes(user.getSalt()), + user.getUsername() + ); + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/services/PermissionCacheService.java b/src/main/java/cn/edu/whu/boot/user/services/PermissionCacheService.java new file mode 100644 index 0000000..a7e5a01 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/PermissionCacheService.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.user.services; + +import java.util.Set; + +public interface PermissionCacheService { + Set getPermissionsByRole(int role); + + void deletePermissionsByRole(int role); + + void addPermissions(int role, String[] permissions); + + boolean permissionsCached(int role); +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/PermissionService.java b/src/main/java/cn/edu/whu/boot/user/services/PermissionService.java new file mode 100644 index 0000000..70061b1 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/PermissionService.java @@ -0,0 +1,14 @@ +package cn.edu.whu.boot.user.services; + +import java.util.List; +import java.util.Set; + +public interface PermissionService { + Set findByIdIn(List permissionIds); + + Set findAllDescriptions(); + + String findDescriptionById(int id); + + Set findByRole(int roleId); +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/RoleService.java b/src/main/java/cn/edu/whu/boot/user/services/RoleService.java new file mode 100644 index 0000000..68bc0c1 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/RoleService.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.user.services; + +import cn.edu.whu.boot.user.entities.Role; + +import java.util.Optional; + +public interface RoleService { + Optional findRoleByName(String name); + + Optional findById(int id); + + Optional findByCode(int code); +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/RoleToPermissionService.java b/src/main/java/cn/edu/whu/boot/user/services/RoleToPermissionService.java new file mode 100644 index 0000000..83064b8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/RoleToPermissionService.java @@ -0,0 +1,7 @@ +package cn.edu.whu.boot.user.services; + +import java.util.List; + +public interface RoleToPermissionService { + List findByRole(int roleId); +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/SessionService.java b/src/main/java/cn/edu/whu/boot/user/services/SessionService.java new file mode 100644 index 0000000..d590aae --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/SessionService.java @@ -0,0 +1,27 @@ +package cn.edu.whu.boot.user.services; + +import org.apache.shiro.session.Session; + +import java.util.List; +import java.util.Optional; + +public interface SessionService { + List getAllSessions(); + + /** + * 获取用户的 session + * + * @param userId 用户 id + * @return 用户的 session,若不存在则返回 null + */ + Optional getSessionByUserId(int userId); + + Optional getSessionByUsername(String username); + + /** + * 根据用户的 session,强制该用户下线 + * + * @param sessionId 该用户的 session id + */ + void forceLogout(String sessionId); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/services/UserService.java b/src/main/java/cn/edu/whu/boot/user/services/UserService.java new file mode 100644 index 0000000..562411e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/UserService.java @@ -0,0 +1,53 @@ +package cn.edu.whu.boot.user.services; + + +import cn.edu.whu.boot.user.entities.User; + +import java.util.List; +import java.util.Optional; + +public interface UserService { + User createUser(String username, String realName, String password, String phone, String email, int code) throws Exception; + + User createUser(String username, String realName, String password, int role); + + Optional findById(int id); + + Optional findByUsername(String name); + + int countLikeUsername(String username); + + /** + * 根据用户名进行模糊查询,对结果进行分页 + * + * @param username 查询条件为 username LIKE %#{username}% + * @param pageSize 每页的记录数量 + * @param pageNum 页码(从1开始) + */ + List findLikeUsernamePagination(String username, int pageSize, int pageNum); + + Optional findByPhone(String phone); + + Optional findByEmail(String email); + + User updateUser(User user); + + List findByRole(int role); + + List findAll(); + + List findAllPagination(int pageSize, int pageNum); + + int countAll(); + + int deleteById(int id); + + /** + * 获取当前在线用户 + * + * @return 所有在线用户 + */ + List getOnlineUsers(); + + String findRealNameById(int id); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/services/impl/PermissionCacheServiceImpl.java b/src/main/java/cn/edu/whu/boot/user/services/impl/PermissionCacheServiceImpl.java new file mode 100644 index 0000000..bff3de3 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/impl/PermissionCacheServiceImpl.java @@ -0,0 +1,53 @@ +package cn.edu.whu.boot.user.services.impl; + +import cn.edu.whu.boot.user.services.PermissionCacheService; +import org.springframework.data.redis.core.SetOperations; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Set; +import java.util.concurrent.TimeUnit; + +@Service +public class PermissionCacheServiceImpl implements PermissionCacheService { + + private final StringRedisTemplate redisTemplate; + + private final SetOperations setOps; + + public PermissionCacheServiceImpl(StringRedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + this.setOps = this.redisTemplate.opsForSet(); + } + + @Override + public Set getPermissionsByRole(int role) { + return setOps.members(getKey(role)); + } + + @Override + public void deletePermissionsByRole(int role) { + redisTemplate.delete(getKey(role)); + } + + @Override + public void addPermissions(int role, String[] permissions) { + String key = getKey(role); + Boolean keyExists = redisTemplate.hasKey(key); + setOps.add(key, permissions); + if (keyExists != null && keyExists.equals(false)) { + // 如果是首次创建,则设置过期时间 + redisTemplate.expire(key, 1, TimeUnit.DAYS); + } + } + + @Override + public boolean permissionsCached(int role) { + Boolean keyExists = redisTemplate.hasKey(getKey(role)); + return keyExists != null && keyExists; + } + + private String getKey(int role) { + return String.format("roles:%d:permissions", role); + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/impl/PermissionServiceImpl.java b/src/main/java/cn/edu/whu/boot/user/services/impl/PermissionServiceImpl.java new file mode 100644 index 0000000..14b7279 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/impl/PermissionServiceImpl.java @@ -0,0 +1,45 @@ +package cn.edu.whu.boot.user.services.impl; + +import cn.edu.whu.boot.user.entities.Permission; +import cn.edu.whu.boot.user.mapper.PermissionMapper; +import cn.edu.whu.boot.user.services.PermissionService; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Service +public class PermissionServiceImpl implements PermissionService { + + private final PermissionMapper permissionMapper; + + public PermissionServiceImpl(PermissionMapper permissionMapper) { + this.permissionMapper = permissionMapper; + } + + @Override + public Set findByIdIn(List permissionIds) { + return permissionMapper + .findByIdIn(permissionIds) + .stream() + .map(Permission::getDescription) + .collect(Collectors.toSet()); + } + + @Override + public Set findAllDescriptions() { + return new HashSet<>(permissionMapper.findAllDescriptions()); + } + + @Override + public String findDescriptionById(int id) { + return permissionMapper.findDescriptionById(id); + } + + @Override + public Set findByRole(int roleId) { + return new HashSet<>(permissionMapper.findDescriptionsByRole(roleId)); + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/user/services/impl/RoleServiceImpl.java b/src/main/java/cn/edu/whu/boot/user/services/impl/RoleServiceImpl.java new file mode 100644 index 0000000..10ce2e5 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/impl/RoleServiceImpl.java @@ -0,0 +1,35 @@ +package cn.edu.whu.boot.user.services.impl; + +import cn.edu.whu.boot.user.entities.Role; +import cn.edu.whu.boot.user.mapper.RoleMapper; +import cn.edu.whu.boot.user.services.RoleService; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class RoleServiceImpl implements RoleService { + + + private final RoleMapper roleMapper; + + public RoleServiceImpl(RoleMapper roleMapper) { + this.roleMapper = roleMapper; + } + + + @Override + public Optional findRoleByName(String name) { + return Optional.ofNullable(roleMapper.findByName(name)); + } + + @Override + public Optional findById(int id) { + return Optional.ofNullable(roleMapper.findById(id)); + } + + @Override + public Optional findByCode(int code) { + return Optional.ofNullable(roleMapper.findByCode(code)); + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/impl/RoleToPermissionServiceImpl.java b/src/main/java/cn/edu/whu/boot/user/services/impl/RoleToPermissionServiceImpl.java new file mode 100644 index 0000000..f600d04 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/impl/RoleToPermissionServiceImpl.java @@ -0,0 +1,28 @@ +package cn.edu.whu.boot.user.services.impl; + +import cn.edu.whu.boot.user.entities.RoleToPermission; +import cn.edu.whu.boot.user.mapper.RoleToPermissionMapper; +import cn.edu.whu.boot.user.services.RoleToPermissionService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class RoleToPermissionServiceImpl implements RoleToPermissionService { + private final RoleToPermissionMapper roleToPermissionMapper; + + public RoleToPermissionServiceImpl(RoleToPermissionMapper roleToPermissionMapper) { + this.roleToPermissionMapper = roleToPermissionMapper; + } + + @Override + public List findByRole(int roleId) { + return roleToPermissionMapper + .findByRole(roleId) + .stream() + .map(RoleToPermission::getPermission) + .collect(Collectors.toList()); + } +} + diff --git a/src/main/java/cn/edu/whu/boot/user/services/impl/SessionServiceImpl.java b/src/main/java/cn/edu/whu/boot/user/services/impl/SessionServiceImpl.java new file mode 100644 index 0000000..b9a35d2 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/impl/SessionServiceImpl.java @@ -0,0 +1,75 @@ +package cn.edu.whu.boot.user.services.impl; + +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.SessionService; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.eis.SessionDAO; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.apache.shiro.subject.support.DefaultSubjectContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@Service +public class SessionServiceImpl implements SessionService { + + private final SessionDAO sessionDAO; + + public SessionServiceImpl(SessionDAO sessionDAO) { + this.sessionDAO = sessionDAO; + } + + @Override + public List getAllSessions() { + return new ArrayList<>(sessionDAO.getActiveSessions()); + } + + @Override + public Optional getSessionByUserId(int userId) { + // 在当前所有会话中查找指定用户的会话 + return sessionDAO + .getActiveSessions() + .stream() + .filter(session -> { + if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) != null) { + SimplePrincipalCollection simplePrincipalCollection = (SimplePrincipalCollection) + session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); + User user = (User) simplePrincipalCollection.getPrimaryPrincipal(); + return user.getId() == userId; + } else { + return false; + } + }) + .findFirst(); + } + + @Override + public Optional getSessionByUsername(String username) { + return sessionDAO + .getActiveSessions() + .stream() + .filter(session -> { + if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) != null) { + SimplePrincipalCollection simplePrincipalCollection = (SimplePrincipalCollection) + session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); + User user = (User) simplePrincipalCollection.getPrimaryPrincipal(); + return user.getUsername().equals(username); + } else { + return false; + } + }) + .findFirst(); + } + + @Override + public void forceLogout(String sessionId) { + Session session = sessionDAO.readSession(sessionId); + // 设置 session 过期 + // session 并不会立刻从 ActiveSessions 中剔除, + // 需要通过 timeout 属性判断是否过期 + session.setTimeout(0); + } +} diff --git a/src/main/java/cn/edu/whu/boot/user/services/impl/UserServiceImpl.java b/src/main/java/cn/edu/whu/boot/user/services/impl/UserServiceImpl.java new file mode 100644 index 0000000..4a1994f --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/user/services/impl/UserServiceImpl.java @@ -0,0 +1,179 @@ +package cn.edu.whu.boot.user.services.impl; + +import cn.edu.whu.boot.allocation.exceptions.InvalidUserRoleCodeException; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.user.entities.Role; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.mapper.UserMapper; +import cn.edu.whu.boot.user.services.RoleService; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.common.utils.user.PasswordEncoder; +import cn.edu.whu.boot.xml.domain.RedisKeyType; +import org.apache.shiro.session.mgt.eis.SessionDAO; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.apache.shiro.subject.support.DefaultSubjectContext; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class UserServiceImpl implements UserService { + + private final UserMapper userMapper; + + private final RoleService roleService; + + private final CacheService cacheService; + + private final SessionDAO sessionDAO; + + public UserServiceImpl(UserMapper userMapper, RoleService roleService, CacheService cacheService, SessionDAO sessionDAO) { + this.userMapper = userMapper; + this.roleService = roleService; + this.cacheService = cacheService; + this.sessionDAO = sessionDAO; + } + + @Override + public User createUser(String username, String realName, String password, String phone, String email, int code) throws InvalidUserRoleCodeException { + // 查询邀请码对应的角色 + Optional role = roleService.findByCode(code); + if (!role.isPresent()) { + throw new InvalidUserRoleCodeException("邀请码错误"); + } + // 生成盐值 + String salt = UUID.randomUUID().toString(); + // hash 密码 + String hashedPwd = PasswordEncoder.encode(password, salt); + User newUser = new User(); + newUser.setUsername(username); + newUser.setRealName(realName); + newUser.setPassword(hashedPwd); + newUser.setSalt(salt); + newUser.setPhone(phone); + newUser.setEmail(email); + newUser.setRole(role.get().getId()); + return userMapper.insert(newUser); + } + + @Override + public User createUser(String username, String realName, String password, int role) { + User user = new User(); + user.setUsername(username); + user.setRealName(realName); + user.setRole(role); + // 生成盐值 + String salt = UUID.randomUUID().toString(); + user.setSalt(salt); + // hash 密码 + String hashedPwd = PasswordEncoder.encode(password, salt); + user.setPassword(hashedPwd); + return userMapper.insert(user); + } + + @Override + public Optional findById(int id) { + return Optional.ofNullable(userMapper.findById(id)); + } + + @Override + public Optional findByUsername(String name) { + return Optional.ofNullable(userMapper.findByUsername(name)); + } + + @Override + public int countLikeUsername(String username) { + return userMapper.countLikeUsername("%" + username + "%"); + } + + @Override + public List findLikeUsernamePagination(String username, int pageSize, int pageNum) { + if (username.isEmpty() || pageSize <= 0 || pageNum <= 0) { + return Collections.emptyList(); + } + return userMapper.findLikeUsernameWithinPage("%" + username + "%", pageSize, pageSize * (pageNum - 1)); + } + + @Override + public Optional findByPhone(String phone) { + return Optional.ofNullable(userMapper.findByPhone(phone)); + } + + @Override + public Optional findByEmail(String email) { + return Optional.ofNullable(userMapper.findByEmail(email)); + } + + @Override + public User updateUser(User user) { + return userMapper.update(user); + } + + @Override + public List findByRole(int role) { + return userMapper.findByRole(role); + } + + @Override + public List findAll() { + return userMapper.findAll(); + } + + @Override + public List findAllPagination(int pageSize, int pageNum) { + if (pageSize <= 0 || pageNum <= 0) { + return Collections.emptyList(); + } + return userMapper.findWithinPage(pageSize, pageSize * (pageNum - 1)); + } + + @Override + public int countAll() { + return userMapper.countAll(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteById(int id) { + return userMapper.deleteById(id); + } + + @Override + public List getOnlineUsers() { + // 通过统计目前还活跃的 session 来粗略估计当前在线用户数量 + return sessionDAO + .getActiveSessions() + .stream() + .map(session -> { + if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) != null) { + SimplePrincipalCollection simplePrincipalCollection = (SimplePrincipalCollection) + session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); + return (User) simplePrincipalCollection.getPrimaryPrincipal(); + } else { + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + @Override + public String findRealNameById(int id) { + String realName; + Object value = cacheService.get(RedisKeyType.REAL_NAME.toString() + id); + if (value != null) { + realName = (String) value; + } else { + // 查询数据库,并更新缓存 + Optional optionalUser = findById(id); + if (!optionalUser.isPresent()) { + return ""; + } + realName = optionalUser.get().getRealName(); + cacheService.set(RedisKeyType.REAL_NAME.toString() + id, realName, 24 * 60 * 60); + } + return realName; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/xml/controller/DataBaseTableController.java b/src/main/java/cn/edu/whu/boot/xml/controller/DataBaseTableController.java new file mode 100644 index 0000000..d46d6ee --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/controller/DataBaseTableController.java @@ -0,0 +1,112 @@ +package cn.edu.whu.boot.xml.controller; + +import cn.edu.whu.boot.xml.service.ITableService; +import cn.edu.whu.boot.common.domain.StatusCode; +import cn.edu.whu.boot.common.utils.xml.GenerateSqlUtil; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.service.IXmlEnityService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 创建任务配置的数据库表,对应网页端任务管理中的任务创库按钮!!! + * @author Zhou Chao + */ +@RestController +@RequestMapping("table") +public class DataBaseTableController{ + + private final ITableService tableService; + private final ITaskService taskService; + private final IXmlEnityService xmlEnityService; + + @Autowired + public DataBaseTableController(ITableService tableService, ITaskService taskService, IXmlEnityService xmlEnityService){ + this.tableService = tableService; + this.taskService = taskService; + this.xmlEnityService = xmlEnityService; + } + + /** + * 创建数据库表 + */ + @RequestMapping(value = "createTable", produces = "text/html;charset=UTF-8") + public String createTable(Integer id){ + Task task = taskService.getTaskById(id); + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(task.getXmlId()); + if(task.getHasCreateTables() == (short) 1){ + return ResultMessage.failed(StatusCode.FAILED.getStatus(),"hasCreated").toString(); + } + + boolean xmlFileIsModified = OtherUtil.checkXmlFileIsModified(xmlEnity); + if(xmlFileIsModified){ + return ResultMessage.failed(StatusCode.FAILED_AND_SHOW.getStatus(), + xmlEnity.getFileName().trim() + ".xml文件已被修改").toString(); + } + + tableService.createTableAndUpdateTask(task, xmlEnity, buildAllSqlString(task)); + return ResultMessage.success(null).toString(); + } + + /** + * 删除旧的数据库表,再创建新的数据库表 + */ + @RequestMapping(value = "deleteAndCreateTable", produces = "text/html;charset=UTF-8") + public String deleteAndCreateTable(Integer id){ + Task task = taskService.getTaskById(id); + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(task.getXmlId()); + boolean xmlFileIsModified = OtherUtil.checkXmlFileIsModified(xmlEnity); + if(xmlFileIsModified){ + return new ResultMessage<>(false, "xml文件被修改", null).toString(); + } + tableService.createTableAndUpdateTask(task, xmlEnity, buildAllSqlString(task)); + return ResultMessage.success(null).toString(); + } + + /** + * 判断某任务中是否存在多个空间对象表,该方法获取这些表名,后期需要创建于之对应的多媒体表 + */ + private List getGeometryTablesName(Map tables){ + List resultList = new ArrayList<>(); + for(Map.Entry entry : tables.entrySet()){ + Map fields = entry.getValue().getFields(); + for(Map.Entry fieldEntry : fields.entrySet()){ + if(fieldEntry.getValue().isGeometry()){ + resultList.add(entry.getKey()); + break; + } + } + } + return resultList; + } + + /** + * 构造一个完整的创建数据库表的 SQL + */ + private String buildAllSqlString(Task task){ + JSONObject configJsonObject = JSON.parseObject(task.getConfig()); + Config config = JSON.toJavaObject(configJsonObject, Config.class); + // 获取空间表名集合,后期用于创建多媒体表!!! + List geometryTableKeyList = getGeometryTablesName(config.getTables()); + return GenerateSqlUtil.generateSchemaCreateSql(task) + + GenerateSqlUtil.generateDatabaseTableSql(task, false) + + GenerateSqlUtil.generateDatabaseTableSql(task, true) + + GenerateSqlUtil.generateMultiMediaSql(task, false, geometryTableKeyList) + + GenerateSqlUtil.generateMultiMediaSql(task, true, geometryTableKeyList) + + GenerateSqlUtil.generateRouteAndDraftSql(task); + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/controller/TaskManagementController.java b/src/main/java/cn/edu/whu/boot/xml/controller/TaskManagementController.java new file mode 100644 index 0000000..d6eb0a8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/controller/TaskManagementController.java @@ -0,0 +1,484 @@ +package cn.edu.whu.boot.xml.controller; + +import cn.edu.whu.boot.allocation.entities.TaskUserRole; +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.common.domain.CommonConstant; +import cn.edu.whu.boot.common.domain.ResultMessage; +import cn.edu.whu.boot.common.utils.collection.EncryptUtils; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.common.utils.xml.CheckTableDataUtil; +import cn.edu.whu.boot.common.utils.xml.JsonToElementUtil; +import cn.edu.whu.boot.common.utils.xml.XmlFileToJsonUtil; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.user.services.UserService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.service.IXmlEnityService; +import cn.edu.whu.boot.xml.xmlreader.XmlTemplateReader; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Field; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import org.jdom.Document; +import org.jdom.output.Format; +import org.jdom.output.XMLOutputter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 对应网页端任务管理模块!!! + * 本系统可以定制任务,所以每个任务是独立的,互相之间不会影响!!! + */ +@RestController +@RequestMapping("task") +public class TaskManagementController{ + + private final ITaskService taskService; + private final IXmlEnityService xmlEnityService; + private final UserService userService; + private final TaskUserRoleService taskUserRoleService; + private final IBaseService baseService; + + /** + * XML 文件的存储路径 + */ + @Value("${XmlFilePath}") + private String xmlFilePath; + + @Autowired + public TaskManagementController(ITaskService taskService, IXmlEnityService xmlEnityService, UserService userService, + TaskUserRoleService taskUserRoleService, IBaseService baseService){ + this.taskService = taskService; + this.xmlEnityService = xmlEnityService; + this.userService = userService; + this.taskUserRoleService = taskUserRoleService; + this.baseService = baseService; + } + + /** + * 根据前端配置的内容,创建 Task!!! + * String configString 解释参考 CommonConstant 类 + */ + @RequestMapping(value = "createTask", produces = "text/html;charset=UTF-8") + public String createTask(String configString){ + JSONObject obj = JSON.parseObject(configString); + String databaseName = obj.getString(CommonConstant.KEY); + if(taskService.hasDatabaseName(databaseName.trim())){ + return ResultMessage.failed("数据库名已经存在,请更换!").toString(); + } + String taskName = obj.getString(CommonConstant.NAME); + String xmlConfigJsonString = obj.getString(CommonConstant.TASK_XML_CONFIG); + String introduction = obj.getString(CommonConstant.TASK_INTRODUCTION); + String uploadDeadLine = obj.getString(CommonConstant.TASK_UPLOADTIME); + Integer userId = obj.getInteger(CommonConstant.TASK_USER_ID); + Integer isAllocationOptional = obj.getInteger(CommonConstant.TASK_IS_ALLOCATION_OPTIONAL) == null ? 0 : obj.getInteger(CommonConstant.TASK_IS_ALLOCATION_OPTIONAL); + assert userService.findById(userId).isPresent(); + User user = userService.findById(userId).get(); + + // 将 xmlConfigJsonString 转换成 Document 对象 + ResultMessage genDocumentResultMessage = JsonToElementUtil.createTaskgenerateDocument(xmlConfigJsonString); + if(!genDocumentResultMessage.isSuccess()){ + return genDocumentResultMessage.toString(); + } + + XMLOutputter out = new XMLOutputter(Format.getPrettyFormat()); + out.setFormat(out.getFormat().setEncoding("UTF-8")); + SimpleDateFormat df = new SimpleDateFormat(CommonConstant.FILE_DATE_FORMAT_STRING); + Date currentDate = new Date(); + + // 将 Document 中内容写入到 XML 文件中 + String filePath = xmlFilePath + "/" + CommonConstant.XML_FILENAME_PREFIX + df.format(currentDate) + ".xml"; + File file = new File(filePath); + Document document = (Document) genDocumentResultMessage.getData(); + try(FileOutputStream fileOutputStream = new FileOutputStream(file)){ + out.output(document, fileOutputStream); + } catch(Exception e){ + e.printStackTrace(); + } + + // 创建 XmlEnity 对象 + XmlEnity xmlEnity = new XmlEnity(); + xmlEnity.setFileName(CommonConstant.XML_FILENAME_PREFIX + df.format(currentDate)); + xmlEnity.setFilePath(filePath); + xmlEnity.setCreateTime(currentDate); + try{ + xmlEnity.setMd5Code(EncryptUtils.getMd5ByFile(file)); + } catch(Exception e){ + e.printStackTrace(); + } + xmlEnity.setModifyTime(currentDate); + + // 创建 Task 对象 + Task task = new Task(); + task.setTaskName(taskName); + task.setOperator(user.getUsername()); + task.setCreateTime(new Date()); + task.setModifyTime(new Date()); + task.setDatabaseName(databaseName); + task.setIntroduction(introduction); + task.setIsAllocationOptional(isAllocationOptional); + task.setIsReviewerRestricted(1); + task.setUploadDeadline(uploadDeadLine); + Config config = XmlTemplateReader.read(xmlEnity.getFilePath()); + config = appendFieldToTable(config); + task.setConfig(JSON.toJSONString(config, SerializerFeature.DisableCircularReferenceDetect)); + taskService.insertTaskAndXmlEnity(task, xmlEnity); + return ResultMessage.success(null).toString(); + } + + /** + * 基于前端配置的内容和上传的 XML 文件创建 Task ! + * 相当于不用一点点配置,直接用 XML 文件来创建任务 + */ + @RequestMapping(value = "createTaskByXmlFile", produces = "text/html;charset=UTF-8") + public String createTaskByXmlFile(String configString, @RequestParam(value = "file") MultipartFile file) throws Exception{ + JSONObject obj = JSON.parseObject(configString); + String taskName = obj.getString(CommonConstant.NAME); + String databaseName = obj.getString(CommonConstant.KEY); + if(taskService.hasDatabaseName(databaseName)){ + return ResultMessage.failed("数据库名已经存在,请更换!").toString(); + } + String introduction = obj.getString(CommonConstant.TASK_INTRODUCTION); + String uploadDeadLine = obj.getString(CommonConstant.TASK_UPLOADTIME); + Integer userId = obj.getInteger(CommonConstant.TASK_USER_ID); + assert userService.findById(userId).isPresent(); + User user = userService.findById(userId).get(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + Date currentDate = new Date(); + String filePath = xmlFilePath + "/" + CommonConstant.XML_FILENAME_PREFIX + df.format(currentDate) + ".xml"; + File xmlFile = new File(filePath); + file.transferTo(xmlFile); + + // 获取xml文件中的objectTables然后进行检查 + String tablesString = XmlFileToJsonUtil.xmlReader(filePath); + JSONObject tableObj = JSON.parseObject(tablesString); + JSONArray objectTables = (JSONArray) tableObj.get(CommonConstant.TAG_TABLES); + // 对传来的 objectTables 进行多项数据核对,确保数据不出错之后再生成xml文件,但同时也要给提示哪里出错 + ResultMessage checkMessage = CheckTableDataUtil.checkTables(objectTables); + if(!checkMessage.isSuccess()){ + return checkMessage.toString(); + } + + // 将xml文件保存在数据库的xml表中 + XmlEnity xmlEnity = new XmlEnity(); + xmlEnity.setFileName(CommonConstant.XML_FILENAME_PREFIX + df.format(currentDate)); + xmlEnity.setFilePath(filePath); + xmlEnity.setCreateTime(currentDate); + xmlEnity.setMd5Code(EncryptUtils.getMd5ByFile(new File(filePath))); + xmlEnity.setModifyTime(currentDate); + + Task task = new Task(); + task.setTaskName(taskName); + task.setOperator(user.getUsername()); + task.setCreateTime(new Date()); + task.setModifyTime(new Date()); + task.setDatabaseName(databaseName); + task.setXmlId(xmlEnity.getId()); + task.setIntroduction(introduction); + task.setIsAllocationOptional(obj.getInteger(CommonConstant.TASK_IS_ALLOCATION_OPTIONAL) == null ? 0 : obj.getInteger(CommonConstant.TASK_IS_ALLOCATION_OPTIONAL)); + task.setUploadDeadline(uploadDeadLine); + task.setIsReviewerRestricted(1); + Config config = XmlTemplateReader.read(xmlEnity.getFilePath()); + config = appendFieldToTable(config); + task.setConfig(JSON.toJSONString(config, SerializerFeature.DisableCircularReferenceDetect)); + taskService.insertTaskAndXmlEnity(task, xmlEnity); + return ResultMessage.success(null).toString(); + } + + /** + * 在任务没有创建数据库之前,可以对配置内容进行更改!!! + */ + @RequestMapping(value = "updateTask", method = RequestMethod.POST) + public String updateTask(Integer id, String configString){ + Task task = taskService.getTaskById(id); + if(task == null || task.getHasCreateTables() == Task.HAS_CREATE_TABLES){ + return ResultMessage.failed( "该任务已经创建数据库!!!").toString(); + } + task.setModifyTime(new Date()); + ResultMessage genDocumentResultMessage = JsonToElementUtil.generateDocument(configString); + if(!genDocumentResultMessage.isSuccess()){ + return genDocumentResultMessage.toString(); + } + XMLOutputter out = new XMLOutputter(Format.getPrettyFormat()); + out.setFormat(out.getFormat().setEncoding("UTF-8")); + Integer xmlId = taskService.getXmlId(id); + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(xmlId); + String filePath = xmlEnity.getFilePath(); + File file = new File(filePath); + Document document = (Document) genDocumentResultMessage.getData(); + try(FileOutputStream fileOutputStream = new FileOutputStream(file)){ + out.output(document, fileOutputStream); + } catch(Exception e){ + e.printStackTrace(); + } + + // 将更新的xml文件在数据库的xml表中更新 + Date currentDate = new Date(); + try{ + xmlEnity.setMd5Code(EncryptUtils.getMd5ByFile(file)); + } catch(Exception e){ + e.printStackTrace(); + } + xmlEnity.setModifyTime(currentDate); + + Config config = XmlTemplateReader.read(xmlEnity.getFilePath()); + config = appendFieldToTable(config); + task.setConfig(JSON.toJSONString(config, SerializerFeature.DisableCircularReferenceDetect)); + taskService.updateTaskAndXmlEnity(task, xmlEnity); + return ResultMessage.success(null).toString(); + } + + /** + * 当 Task 创建了数据库之后,检查 Task 对应的 Xml 文件是否发生更改!!! + */ + @RequestMapping(value = "checkTaskXmlMD5Code", method = RequestMethod.POST) + public String checkTaskXmlMD5Code(Integer id){ + Task task = taskService.getTaskById(id); + // 先检查该 Task 是否已经创建数据库 + if(task.getHasCreateTables() == 0){ + return ResultMessage.failed("未创建数据库").toString(); + } + else{ + Integer xmlId = taskService.getXmlId(id); + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(xmlId); + // 再检查创建数据库时的 MD5 码与XML配置文件的MD5码是否一致 + if(task.getCreateTablesMd5code().equals(xmlEnity.getMd5Code())){ + return ResultMessage.failed("").toString(); + } + else{ + String message = MessageFormat.format("{0} 任务的配置文件发生改动,请重新创建数据库!", + task.getTaskName()); + return ResultMessage.success(message).toString(); + } + } + } + + /** + * 删除任务 + */ + @RequestMapping(value = "deleteTask", produces = "text/html;charset=UTF-8") + public String deleteTask(Integer id){ + Task task = taskService.getTaskById(id); + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(task.getXmlId()); + // 如果已经创建数据库,先将Task任务对应的数据库名(即schema名)更改 + if(task.getHasCreateTables() == Task.HAS_CREATE_TABLES){ + String oldSchemaName = task.getDatabaseName(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + String newSchemaName = "delete_" + oldSchemaName + "_" + simpleDateFormat.format(task.getCreateTime()); + String alterSchemaNameSql = MessageFormat.format("ALTER SCHEMA {0} RENAME TO {1}", + PostgreSqlUtil.transformString(oldSchemaName), + PostgreSqlUtil.transformString(newSchemaName)); + baseService.updateSqlString(alterSchemaNameSql); + } + // 把任务对应的xml文件也删除掉 + File file = new File(xmlEnity.getFilePath()); + if(file.exists()){ + file.delete(); + } + taskService.deleteTaskAndXmlEnity(task); + return ResultMessage.success(null).toString(); + } + + /** + * 安卓端传入 userId,查询 userId 所在的所有任务 + */ + @RequestMapping(value = "selectTaskForUserId", produces = "text/html;charset=UTF-8") + public String selectAllTaskForUserId(Integer userId){ + List result = new ArrayList<>(); + // 先获取不需要分配的任务 + List allTasks = taskService.getAllTask(); + allTasks.forEach(task -> { + if(task.getIsAllocationOptional() == Task.WITHOUT_ALLOCATION){ + result.add(task); + } + }); + // 再获取需要分配,并且用户在该任务中的任务 + List taskUserRoles = taskUserRoleService.findByUserId(userId); + if(taskUserRoles != null && taskUserRoles.size() != 0){ + for(TaskUserRole taskUserRole : taskUserRoles){ + result.add(taskService.getTaskById(taskUserRole.getTaskId())); + } + + } + // 生成移动端需要的返回结果 + if(result.size() != 0){ + return ResultMessage.success(getTaskInfo(result)).toString(); + } + else{ + return ResultMessage.success(null).toString(); + } + } + + /** + * 网页端任务管理模块获取任务相关信息,有任务名称、数据库名、创建时间、修改时间和操作人员 + */ + @RequestMapping(value = "selectAll", produces = "text/html;charset=UTF-8") + public String selectAllTaskInfo(){ + List taskList = taskService.getAllTask(); + String result = getTaskInfo(taskList); + return ResultMessage.success(result).toString(); + } + + /** + * 网页端决策管理模块获取任务相关信息,有任务名称、数据库名、任务下所有根表名 + */ + @RequestMapping(value = "selectAllWithTableName", produces = "text/html;charset=UTF-8") + public String selectAllTaskInfoWithTableName(){ + List taskList = taskService.getAllTask(); + List> resultList = new ArrayList<>(); + + for(Task task : taskList){ + List> tableKeyAndNameList = new ArrayList<>(); + Map rootTables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables(); + rootTables.forEach((key, value) -> { + Map tableKeyAndNameMap = new HashMap<>(); + tableKeyAndNameMap.put("tableKey", key); + tableKeyAndNameMap.put("tableName", value.getName()); + tableKeyAndNameList.add(tableKeyAndNameMap); + }); + Map taskMap = new HashMap<>(); + taskMap.put("id", task.getId()); + taskMap.put("taskName", task.getTaskName()); + taskMap.put("databaseName", task.getDatabaseName()); + taskMap.put("tableNames", tableKeyAndNameList); + resultList.add(taskMap); + } + return ResultMessage.success(resultList).toString(); + } + + /** + * 网页端决策管理模块获取已经创建数据库的任务 + */ + @RequestMapping(value = "selectTaskHasCreated", produces = "text/html;charset=UTF-8") + public String selectTaskHasCreateTable(){ + List taskList = taskService.getTaskHasCreateTable(); + SimpleDateFormat df = new SimpleDateFormat(CommonConstant.DATE_FORMAT_STRING); + List> list = new ArrayList<>(); + for(Task task : taskList){ + Map map = new HashMap<>(); + List taskUserRoleList = taskUserRoleService.findByTaskId(task.getId()); + String allocated = "false"; + if(taskUserRoleList != null && taskUserRoleList.size() != 0){ + allocated = "true"; + } + // 获取 Task 任务下根表中数据,如果任务中有数据则为核查任务,任务中没有数据为采集任务 + Long dataCount = 0L; + Set tableNameSet = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables().keySet(); + for(String tableName : tableNameSet){ + dataCount += baseService.getDataCount( + PostgreSqlUtil.buildTableNameString(task.getDatabaseName(), tableName, + false, false)); + } + map.put("id", task.getId()); + map.put("taskName", task.getTaskName()); + map.put("databaseName", task.getDatabaseName()); + map.put("operator", task.getOperator()); + map.put("createTime", df.format(task.getCreateTime())); + map.put("allocated", allocated); + map.put("introduction", task.getIntroduction()); + map.put("taskType", dataCount == 0 ? 0 : 1); + map.put("modifyTime", df.format(task.getModifyTime())); + map.put("isAllocationOptional", task.getIsAllocationOptional()); + map.put("isReviewerRestricted", task.getIsReviewerRestricted()); + list.add(map); + } + Map result = new HashMap<>(); + result.put("data", list); + return new ResultMessage<>(true, "获取已经创建数据库的任务数据成功", JSON.toJSONString(result)).toString(); + } + + private String getTaskInfo(List tasks){ + SimpleDateFormat df = new SimpleDateFormat(CommonConstant.DATE_FORMAT_STRING); + List> list = new ArrayList<>(); + for(Task task : tasks){ + Map map = new HashMap<>(); + map.put("id", task.getId()); + map.put("taskName", task.getTaskName()); + map.put("databaseName", task.getDatabaseName()); + map.put("operator", task.getOperator()); + map.put("createTime", df.format(task.getCreateTime())); + map.put("hasCreateTables", task.getHasCreateTables()); + map.put("introduction", task.getIntroduction()); + map.put("isAllocationOptional", task.getIsAllocationOptional()); + map.put("isReviewerRestricted", task.getIsReviewerRestricted()); + map.put("modifyTime", df.format(task.getModifyTime())); + list.add(map); + } + Map result = new HashMap<>(); + result.put("data", list); + return JSON.toJSONString(result); + } + + /** + * 向 Config 的 Table 中追加固定字段,若为根表增加 collector、reviewer、create_time、update_time、 + * status、reason、version字段,非根表增加 version 字段! + * 具体含义参考 CommonConstant 类 + */ + private Config appendFieldToTable(Config config){ + if(config != null){ + Map tables = config.getTables(); + for(Map.Entry tableEntry : tables.entrySet()){ + Map fields = tableEntry.getValue().getFields(); + if(tableEntry.getValue().isRoot()){ + Field collectorField = new Field(); + collectorField.setKey(CommonConstant.FIX_FIELD_COLLECTOR); + collectorField.setDbType(CommonConstant.INTEGER); + fields.put(CommonConstant.FIX_FIELD_COLLECTOR, collectorField); + + Field reviewerField = new Field(); + reviewerField.setKey(CommonConstant.FIX_FIELD_REVIEWER); + reviewerField.setDbType(CommonConstant.INTEGER); + fields.put(CommonConstant.FIX_FIELD_REVIEWER, reviewerField); + + Field createTimeField = new Field(); + createTimeField.setKey(CommonConstant.FIX_FIELD_CREATE_TIME); + createTimeField.setDbType(CommonConstant.DATE); + fields.put(CommonConstant.FIX_FIELD_CREATE_TIME, createTimeField); + + Field updateTimeField = new Field(); + updateTimeField.setKey(CommonConstant.FIX_FIELD_UPDATE_TIME); + updateTimeField.setDbType(CommonConstant.DATE); + fields.put(CommonConstant.FIX_FIELD_UPDATE_TIME, updateTimeField); + + Field statusField = new Field(); + statusField.setKey(CommonConstant.FIX_FIELD_STATUS); + statusField.setDbType(CommonConstant.INTEGER); + fields.put(CommonConstant.FIX_FIELD_STATUS, statusField); + + Field reasonField = new Field(); + reasonField.setKey(CommonConstant.FIX_FIELD_REASON); + reasonField.setDbType(CommonConstant.STRING); + fields.put(CommonConstant.FIX_FIELD_REASON, reasonField); + } + Field versionField = new Field(); + versionField.setKey(CommonConstant.FIX_FIELD_VERSION); + versionField.setDbType(CommonConstant.INTEGER); + fields.put(CommonConstant.FIX_FIELD_VERSION, versionField); + tableEntry.getValue().setFields(fields); + } + } + return config; + } + + @RequestMapping("/setReviewerMode") + public String setIsReviewerUnrestricted(@RequestParam int taskId, @RequestParam int isReviewerRestricted) { + taskService.setReviewerMode(taskId, isReviewerRestricted); + return new ResultMessage<>(true, "设置成功").toString(); + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/controller/XmlFileManagementController.java b/src/main/java/cn/edu/whu/boot/xml/controller/XmlFileManagementController.java new file mode 100644 index 0000000..a6a403a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/controller/XmlFileManagementController.java @@ -0,0 +1,79 @@ +package cn.edu.whu.boot.xml.controller; + +import cn.edu.whu.boot.common.domain.*; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import cn.edu.whu.boot.common.utils.xml.XmlFileToJsonUtil; +import cn.edu.whu.boot.xml.domain.RedisKeyType; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.service.IXmlEnityService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; + +/** + * XML 文件相关的接口 + * @author Zhou Chao + */ +@RestController +@RequestMapping("xml") +public class XmlFileManagementController{ + + private final IXmlEnityService xmlEnityService; + private final ITaskService taskService; + private final CacheService cacheService; + + @Autowired + public XmlFileManagementController(IXmlEnityService xmlEnityService, ITaskService taskService, + CacheService cacheService){ + this.xmlEnityService = xmlEnityService; + this.taskService = taskService; + this.cacheService = cacheService; + } + + /** + * 前端请求当前任务的配置内容! + */ + @RequestMapping(value = "requesting", produces = "text/html;charset=UTF-8") + public String requestXmlFileData(Integer id){ + Task task = taskService.getTaskById(id); + if(task == null){ + return ResultMessage.failed(StatusCode.FAILED_AND_SHOW.getStatus(), "未查询到对应的任务").toString(); + } + else{ + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(task.getXmlId()); + if(xmlEnity == null){ + return ResultMessage.failed(StatusCode.FAILED_AND_SHOW.getStatus(), "未查询到对应的XML").toString(); + } + else{ + String someXmlFileDataRedisKey = RedisKeyType.XML_FILE_DATA + String.valueOf(xmlEnity.getId()); + Object redisObject = cacheService.get(someXmlFileDataRedisKey); + if(redisObject != null){ + return ResultMessage.success(redisObject).toString(); + } + String xmlFileData = XmlFileToJsonUtil.xmlReader(xmlEnity.getFilePath()); + cacheService.set(someXmlFileDataRedisKey, xmlFileData, RedisExpireTime.ONE_WEEK.getTime()); + return ResultMessage.success(xmlFileData).toString(); + } + } + } + + /** + * 下载 XML 文件 + */ + @RequestMapping(value = "downloading", produces = "text/html;charset=UTF-8") + public String downloadXmlFile(Integer id, HttpServletResponse response){ + Task task = taskService.getTaskById(id); + XmlEnity xmlEnity = xmlEnityService.getXmlEnityById(task.getXmlId()); + String filePath = xmlEnity.getFilePath(); + File file = new File(filePath); + response.setContentType("text/xml"); + response.addHeader("Content-Disposition", "attachment;fileName=application.xml"); + return ResultMessage.success(OtherUtil.uploadFileByResponse(file, response)).toString(); + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/domain/RedisKeyType.java b/src/main/java/cn/edu/whu/boot/xml/domain/RedisKeyType.java new file mode 100644 index 0000000..76f9082 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/domain/RedisKeyType.java @@ -0,0 +1,32 @@ +package cn.edu.whu.boot.xml.domain; + +/** + * 存储 redis key 前缀 + */ +public enum RedisKeyType{ + + TASK("redis_key_prefix_task:"), + XML_FILE_DATA("redis_key_prefix_xml_file_data:"), + CELL("redis_key_prefix_cell:"), + EMAIL_AUTH_CODE("redis_key_prefix_email_auth_code:"), + REAL_NAME("redis_key_prefix_real_name:"); + + private String redisKeyPrefix; + + RedisKeyType(String redisKeyPrefix){ + this.redisKeyPrefix = redisKeyPrefix; + } + + public String getRedisKeyPrefix(){ + return redisKeyPrefix; + } + + public void setRedisKeyPrefix(String redisKeyPrefix){ + this.redisKeyPrefix = redisKeyPrefix; + } + + @Override + public String toString(){ + return getRedisKeyPrefix(); + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/domain/Task.java b/src/main/java/cn/edu/whu/boot/xml/domain/Task.java new file mode 100644 index 0000000..33dfd2a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/domain/Task.java @@ -0,0 +1,206 @@ +package cn.edu.whu.boot.xml.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * 对应 public.task 表 + */ +public class Task implements Serializable{ + + private static final long serialVersionUID = 4569485495696088421L; + + public static final int HAS_CREATE_TABLES = 1; + public static final int NOT_CREATE_TABLES = 0; + public static final int WITHOUT_ALLOCATION = 1; + + /** + * 主键 + */ + private Integer id; + + /** + * 项目名称 + */ + private String taskName; + + /** + * 该项目对应的数据库名! + * 注意 PostgreSQL 数据库有一个 schema(模式) 的概念! 为了更好地使每个项目对应的数据库独立, + * 这里就使用了 schema ! 像 public 就是个 schema ! 也就是说通过 schema.table 可以唯一的确定一个表!!! + */ + private String databaseName; + + /** + * 创建该任务的操作员 + */ + private String operator; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 修改时间 + */ + private Date modifyTime; + + /** + * 是否已经创建数据库!!! + * 如果没有创建数据库,这个时候任务可以重新修改配置! + * 如果已经创建数据库,这个时候任务只能查看,不能修改! + */ + private int hasCreateTables = NOT_CREATE_TABLES; + + /** + * 任务介绍 + */ + private String introduction; + + /** + * 该字段标记任务是否无需进行分配操作,就可以进行采集 + */ + private int isAllocationOptional; + + /** + * 该任务对应的 XmlEnity 的主键 + */ + private Integer xmlId; + + /** + * 记录当前任务的 config 字符串,这里面主要就是配置的内容 + * 基于该字符串可以生成 cn.edu.whu.boot.xml.xmlreader.bean.Config 对象!!! + */ + private String config; + + /** + * 上传截止时间,这个字段主要用于统计采集人员的每日工作量! + * 既然统计每日工作量,需要确定每日的具体时间是什么时候。 + * 例如 uploadDeadline 为 17:00 ,昨天的17:00 - 今天的17:00 算一个工作日 + */ + private String uploadDeadline; + + /** + * 创建数据库时,此时的 XML 文件对应的 md5Code, + * 通过该字段和 XmlEnity.md5Code 字段就可以知道 XML 文件是否发生修改 + */ + private String createTablesMd5code; + + /** + * 如果为 0,巡查人员只能获取 collector = -1 OR reviewer = -1 OR reviewer = userId 的数据 + */ + private int isReviewerRestricted; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public Integer getXmlId() { + return xmlId; + } + + public void setXmlId(Integer xmlId) { + this.xmlId = xmlId; + } + + public int getHasCreateTables() { + return hasCreateTables; + } + + public void setHasCreateTables(int hasCreateTables) { + this.hasCreateTables = hasCreateTables; + } + + public String getConfig() { + return config; + } + + public void setConfig(String config) { + this.config = config; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getIntroduction() { + return introduction; + } + + public void setIntroduction(String introduction) { + this.introduction = introduction; + } + + public int getIsAllocationOptional(){ + return isAllocationOptional; + } + + public void setIsAllocationOptional(int isAllocationOptional){ + this.isAllocationOptional = isAllocationOptional; + } + + public String getUploadDeadline() { + return uploadDeadline; + } + + public void setUploadDeadline(String uploadDeadline) { + this.uploadDeadline = uploadDeadline; + } + + public String getCreateTablesMd5code() { + return createTablesMd5code; + } + + public void setCreateTablesMd5code(String createTablesMd5code) { + this.createTablesMd5code = createTablesMd5code; + } + + public int getIsReviewerRestricted() { + return isReviewerRestricted; + } + + public void setIsReviewerRestricted(int isReviewerRestricted) { + this.isReviewerRestricted = isReviewerRestricted; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/xml/domain/TaskExample.java b/src/main/java/cn/edu/whu/boot/xml/domain/TaskExample.java new file mode 100644 index 0000000..e0dc7b8 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/domain/TaskExample.java @@ -0,0 +1,991 @@ +package cn.edu.whu.boot.xml.domain; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class TaskExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public TaskExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Integer value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Integer value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Integer value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Integer value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Integer value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Integer value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Integer value1, Integer value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Integer value1, Integer value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andTaskNameIsNull() { + addCriterion("task_name is null"); + return (Criteria) this; + } + + public Criteria andTaskNameIsNotNull() { + addCriterion("task_name is not null"); + return (Criteria) this; + } + + public Criteria andTaskNameEqualTo(String value) { + addCriterion("task_name =", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameNotEqualTo(String value) { + addCriterion("task_name <>", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameGreaterThan(String value) { + addCriterion("task_name >", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameGreaterThanOrEqualTo(String value) { + addCriterion("task_name >=", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameLessThan(String value) { + addCriterion("task_name <", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameLessThanOrEqualTo(String value) { + addCriterion("task_name <=", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameLike(String value) { + addCriterion("task_name like", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameNotLike(String value) { + addCriterion("task_name not like", value, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameIn(List values) { + addCriterion("task_name in", values, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameNotIn(List values) { + addCriterion("task_name not in", values, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameBetween(String value1, String value2) { + addCriterion("task_name between", value1, value2, "taskName"); + return (Criteria) this; + } + + public Criteria andTaskNameNotBetween(String value1, String value2) { + addCriterion("task_name not between", value1, value2, "taskName"); + return (Criteria) this; + } + + public Criteria andOperatorIsNull() { + addCriterion("operator is null"); + return (Criteria) this; + } + + public Criteria andOperatorIsNotNull() { + addCriterion("operator is not null"); + return (Criteria) this; + } + + public Criteria andOperatorEqualTo(String value) { + addCriterion("operator =", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotEqualTo(String value) { + addCriterion("operator <>", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThan(String value) { + addCriterion("operator >", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThanOrEqualTo(String value) { + addCriterion("operator >=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThan(String value) { + addCriterion("operator <", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThanOrEqualTo(String value) { + addCriterion("operator <=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLike(String value) { + addCriterion("operator like", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotLike(String value) { + addCriterion("operator not like", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorIn(List values) { + addCriterion("operator in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotIn(List values) { + addCriterion("operator not in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorBetween(String value1, String value2) { + addCriterion("operator between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotBetween(String value1, String value2) { + addCriterion("operator not between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andXmlIdIsNull() { + addCriterion("xml_id is null"); + return (Criteria) this; + } + + public Criteria andXmlIdIsNotNull() { + addCriterion("xml_id is not null"); + return (Criteria) this; + } + + public Criteria andXmlIdEqualTo(Integer value) { + addCriterion("xml_id =", value, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdNotEqualTo(Integer value) { + addCriterion("xml_id <>", value, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdGreaterThan(Integer value) { + addCriterion("xml_id >", value, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdGreaterThanOrEqualTo(Integer value) { + addCriterion("xml_id >=", value, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdLessThan(Integer value) { + addCriterion("xml_id <", value, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdLessThanOrEqualTo(Integer value) { + addCriterion("xml_id <=", value, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdIn(List values) { + addCriterion("xml_id in", values, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdNotIn(List values) { + addCriterion("xml_id not in", values, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdBetween(Integer value1, Integer value2) { + addCriterion("xml_id between", value1, value2, "xmlId"); + return (Criteria) this; + } + + public Criteria andXmlIdNotBetween(Integer value1, Integer value2) { + addCriterion("xml_id not between", value1, value2, "xmlId"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesIsNull() { + addCriterion("has_create_tables is null"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesIsNotNull() { + addCriterion("has_create_tables is not null"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesEqualTo(Short value) { + addCriterion("has_create_tables =", value, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesNotEqualTo(Short value) { + addCriterion("has_create_tables <>", value, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesGreaterThan(Short value) { + addCriterion("has_create_tables >", value, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesGreaterThanOrEqualTo(Short value) { + addCriterion("has_create_tables >=", value, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesLessThan(Short value) { + addCriterion("has_create_tables <", value, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesLessThanOrEqualTo(Short value) { + addCriterion("has_create_tables <=", value, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesIn(List values) { + addCriterion("has_create_tables in", values, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesNotIn(List values) { + addCriterion("has_create_tables not in", values, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesBetween(Short value1, Short value2) { + addCriterion("has_create_tables between", value1, value2, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andHasCreateTablesNotBetween(Short value1, Short value2) { + addCriterion("has_create_tables not between", value1, value2, "hasCreateTables"); + return (Criteria) this; + } + + public Criteria andConfigIsNull() { + addCriterion("config is null"); + return (Criteria) this; + } + + public Criteria andConfigIsNotNull() { + addCriterion("config is not null"); + return (Criteria) this; + } + + public Criteria andConfigEqualTo(String value) { + addCriterion("config =", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotEqualTo(String value) { + addCriterion("config <>", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThan(String value) { + addCriterion("config >", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigGreaterThanOrEqualTo(String value) { + addCriterion("config >=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThan(String value) { + addCriterion("config <", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLessThanOrEqualTo(String value) { + addCriterion("config <=", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigLike(String value) { + addCriterion("config like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotLike(String value) { + addCriterion("config not like", value, "config"); + return (Criteria) this; + } + + public Criteria andConfigIn(List values) { + addCriterion("config in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotIn(List values) { + addCriterion("config not in", values, "config"); + return (Criteria) this; + } + + public Criteria andConfigBetween(String value1, String value2) { + addCriterion("config between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andConfigNotBetween(String value1, String value2) { + addCriterion("config not between", value1, value2, "config"); + return (Criteria) this; + } + + public Criteria andDatabaseNameIsNull() { + addCriterion("database_name is null"); + return (Criteria) this; + } + + public Criteria andDatabaseNameIsNotNull() { + addCriterion("database_name is not null"); + return (Criteria) this; + } + + public Criteria andDatabaseNameEqualTo(String value) { + addCriterion("database_name =", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameNotEqualTo(String value) { + addCriterion("database_name <>", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameGreaterThan(String value) { + addCriterion("database_name >", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameGreaterThanOrEqualTo(String value) { + addCriterion("database_name >=", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameLessThan(String value) { + addCriterion("database_name <", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameLessThanOrEqualTo(String value) { + addCriterion("database_name <=", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameLike(String value) { + addCriterion("database_name like", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameNotLike(String value) { + addCriterion("database_name not like", value, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameIn(List values) { + addCriterion("database_name in", values, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameNotIn(List values) { + addCriterion("database_name not in", values, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameBetween(String value1, String value2) { + addCriterion("database_name between", value1, value2, "databaseName"); + return (Criteria) this; + } + + public Criteria andDatabaseNameNotBetween(String value1, String value2) { + addCriterion("database_name not between", value1, value2, "databaseName"); + return (Criteria) this; + } + + public Criteria andIntroductionIsNull() { + addCriterion("introduction is null"); + return (Criteria) this; + } + + public Criteria andIntroductionIsNotNull() { + addCriterion("introduction is not null"); + return (Criteria) this; + } + + public Criteria andIntroductionEqualTo(String value) { + addCriterion("introduction =", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionNotEqualTo(String value) { + addCriterion("introduction <>", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionGreaterThan(String value) { + addCriterion("introduction >", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionGreaterThanOrEqualTo(String value) { + addCriterion("introduction >=", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionLessThan(String value) { + addCriterion("introduction <", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionLessThanOrEqualTo(String value) { + addCriterion("introduction <=", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionLike(String value) { + addCriterion("introduction like", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionNotLike(String value) { + addCriterion("introduction not like", value, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionIn(List values) { + addCriterion("introduction in", values, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionNotIn(List values) { + addCriterion("introduction not in", values, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionBetween(String value1, String value2) { + addCriterion("introduction between", value1, value2, "introduction"); + return (Criteria) this; + } + + public Criteria andIntroductionNotBetween(String value1, String value2) { + addCriterion("introduction not between", value1, value2, "introduction"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineIsNull() { + addCriterion("upload_deadline is null"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineIsNotNull() { + addCriterion("upload_deadline is not null"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineEqualTo(String value) { + addCriterion("upload_deadline =", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineNotEqualTo(String value) { + addCriterion("upload_deadline <>", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineGreaterThan(String value) { + addCriterion("upload_deadline >", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineGreaterThanOrEqualTo(String value) { + addCriterion("upload_deadline >=", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineLessThan(String value) { + addCriterion("upload_deadline <", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineLessThanOrEqualTo(String value) { + addCriterion("upload_deadline <=", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineLike(String value) { + addCriterion("upload_deadline like", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineNotLike(String value) { + addCriterion("upload_deadline not like", value, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineIn(List values) { + addCriterion("upload_deadline in", values, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineNotIn(List values) { + addCriterion("upload_deadline not in", values, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineBetween(String value1, String value2) { + addCriterion("upload_deadline between", value1, value2, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andUploadDeadlineNotBetween(String value1, String value2) { + addCriterion("upload_deadline not between", value1, value2, "uploadDeadline"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeIsNull() { + addCriterion("create_tables_md5code is null"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeIsNotNull() { + addCriterion("create_tables_md5code is not null"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeEqualTo(String value) { + addCriterion("create_tables_md5code =", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeNotEqualTo(String value) { + addCriterion("create_tables_md5code <>", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeGreaterThan(String value) { + addCriterion("create_tables_md5code >", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeGreaterThanOrEqualTo(String value) { + addCriterion("create_tables_md5code >=", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeLessThan(String value) { + addCriterion("create_tables_md5code <", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeLessThanOrEqualTo(String value) { + addCriterion("create_tables_md5code <=", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeLike(String value) { + addCriterion("create_tables_md5code like", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeNotLike(String value) { + addCriterion("create_tables_md5code not like", value, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeIn(List values) { + addCriterion("create_tables_md5code in", values, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeNotIn(List values) { + addCriterion("create_tables_md5code not in", values, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeBetween(String value1, String value2) { + addCriterion("create_tables_md5code between", value1, value2, "createTablesMd5code"); + return (Criteria) this; + } + + public Criteria andCreateTablesMd5codeNotBetween(String value1, String value2) { + addCriterion("create_tables_md5code not between", value1, value2, "createTablesMd5code"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/xml/domain/XmlEnity.java b/src/main/java/cn/edu/whu/boot/xml/domain/XmlEnity.java new file mode 100644 index 0000000..95561f1 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/domain/XmlEnity.java @@ -0,0 +1,90 @@ +package cn.edu.whu.boot.xml.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * 对应 public.xml 表! 主要是将 XML 文件的相关信息保存起来 + */ +public class XmlEnity implements Serializable { + + private static final long serialVersionUID = -4579083587507180460L; + + /** + * 主键 + */ + private Integer id; + + /** + * XML 文件名 + */ + private String fileName; + + /** + * XML 文件对应的 md5Code + */ + private String md5Code; + + /** + * XML 文件路径 + */ + private String filePath; + + /** + * 文件创建时间 + */ + private Date createTime; + + /** + * 文件修改时间 + */ + private Date modifyTime; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getMd5Code() { + return md5Code; + } + + public void setMd5Code(String md5Code) { + this.md5Code = md5Code; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/xml/domain/XmlEnityExample.java b/src/main/java/cn/edu/whu/boot/xml/domain/XmlEnityExample.java new file mode 100644 index 0000000..5418f5c --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/domain/XmlEnityExample.java @@ -0,0 +1,591 @@ +package cn.edu.whu.boot.xml.domain; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class XmlEnityExample{ + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public XmlEnityExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Integer value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Integer value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Integer value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Integer value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Integer value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Integer value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Integer value1, Integer value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Integer value1, Integer value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andFileNameIsNull() { + addCriterion("file_name is null"); + return (Criteria) this; + } + + public Criteria andFileNameIsNotNull() { + addCriterion("file_name is not null"); + return (Criteria) this; + } + + public Criteria andFileNameEqualTo(String value) { + addCriterion("file_name =", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameNotEqualTo(String value) { + addCriterion("file_name <>", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameGreaterThan(String value) { + addCriterion("file_name >", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameGreaterThanOrEqualTo(String value) { + addCriterion("file_name >=", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameLessThan(String value) { + addCriterion("file_name <", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameLessThanOrEqualTo(String value) { + addCriterion("file_name <=", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameLike(String value) { + addCriterion("file_name like", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameNotLike(String value) { + addCriterion("file_name not like", value, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameIn(List values) { + addCriterion("file_name in", values, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameNotIn(List values) { + addCriterion("file_name not in", values, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameBetween(String value1, String value2) { + addCriterion("file_name between", value1, value2, "fileName"); + return (Criteria) this; + } + + public Criteria andFileNameNotBetween(String value1, String value2) { + addCriterion("file_name not between", value1, value2, "fileName"); + return (Criteria) this; + } + + public Criteria andMd5CodeIsNull() { + addCriterion("md5_code is null"); + return (Criteria) this; + } + + public Criteria andMd5CodeIsNotNull() { + addCriterion("md5_code is not null"); + return (Criteria) this; + } + + public Criteria andMd5CodeEqualTo(String value) { + addCriterion("md5_code =", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeNotEqualTo(String value) { + addCriterion("md5_code <>", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeGreaterThan(String value) { + addCriterion("md5_code >", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeGreaterThanOrEqualTo(String value) { + addCriterion("md5_code >=", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeLessThan(String value) { + addCriterion("md5_code <", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeLessThanOrEqualTo(String value) { + addCriterion("md5_code <=", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeLike(String value) { + addCriterion("md5_code like", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeNotLike(String value) { + addCriterion("md5_code not like", value, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeIn(List values) { + addCriterion("md5_code in", values, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeNotIn(List values) { + addCriterion("md5_code not in", values, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeBetween(String value1, String value2) { + addCriterion("md5_code between", value1, value2, "md5Code"); + return (Criteria) this; + } + + public Criteria andMd5CodeNotBetween(String value1, String value2) { + addCriterion("md5_code not between", value1, value2, "md5Code"); + return (Criteria) this; + } + + public Criteria andFilePathIsNull() { + addCriterion("file_path is null"); + return (Criteria) this; + } + + public Criteria andFilePathIsNotNull() { + addCriterion("file_path is not null"); + return (Criteria) this; + } + + public Criteria andFilePathEqualTo(String value) { + addCriterion("file_path =", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathNotEqualTo(String value) { + addCriterion("file_path <>", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathGreaterThan(String value) { + addCriterion("file_path >", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathGreaterThanOrEqualTo(String value) { + addCriterion("file_path >=", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathLessThan(String value) { + addCriterion("file_path <", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathLessThanOrEqualTo(String value) { + addCriterion("file_path <=", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathLike(String value) { + addCriterion("file_path like", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathNotLike(String value) { + addCriterion("file_path not like", value, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathIn(List values) { + addCriterion("file_path in", values, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathNotIn(List values) { + addCriterion("file_path not in", values, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathBetween(String value1, String value2) { + addCriterion("file_path between", value1, value2, "filePath"); + return (Criteria) this; + } + + public Criteria andFilePathNotBetween(String value1, String value2) { + addCriterion("file_path not between", value1, value2, "filePath"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNull() { + addCriterion("modify_time is null"); + return (Criteria) this; + } + + public Criteria andModifyTimeIsNotNull() { + addCriterion("modify_time is not null"); + return (Criteria) this; + } + + public Criteria andModifyTimeEqualTo(Date value) { + addCriterion("modify_time =", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotEqualTo(Date value) { + addCriterion("modify_time <>", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThan(Date value) { + addCriterion("modify_time >", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeGreaterThanOrEqualTo(Date value) { + addCriterion("modify_time >=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThan(Date value) { + addCriterion("modify_time <", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeLessThanOrEqualTo(Date value) { + addCriterion("modify_time <=", value, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeIn(List values) { + addCriterion("modify_time in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotIn(List values) { + addCriterion("modify_time not in", values, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeBetween(Date value1, Date value2) { + addCriterion("modify_time between", value1, value2, "modifyTime"); + return (Criteria) this; + } + + public Criteria andModifyTimeNotBetween(Date value1, Date value2) { + addCriterion("modify_time not between", value1, value2, "modifyTime"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndConfig.java b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndConfig.java new file mode 100644 index 0000000..bfa19b9 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndConfig.java @@ -0,0 +1,33 @@ +package cn.edu.whu.boot.xml.dto; + +import java.util.List; + +/** + * 封装 XML 文件 标签的内容,主要用于生成 Json 字符串返回给前端 ! + * 前端需要字符串样式参考 CommonConstant 注释 + */ +public class FrontEndConfig { + + private List tables; + private FrontEndMeta meta; + + public List getTables() + { + return tables; + } + + public void setTables(List tables) + { + this.tables = tables; + } + + public FrontEndMeta getMeta() + { + return meta; + } + + public void setMeta(FrontEndMeta meta) + { + this.meta = meta; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndField.java b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndField.java new file mode 100644 index 0000000..81c4e90 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndField.java @@ -0,0 +1,276 @@ +package cn.edu.whu.boot.xml.dto; + +import java.util.List; +import java.util.Map; + +/** + * 封装 XML 文件 标签的内容,前端需要字符串样式参考 CommonConstant 注释 + */ +public class FrontEndField { + + private String name = ""; + private String type = ""; + private List selector; + private List> group; + private String select = ""; + private String mode = ""; + private String key = ""; + private String parentID = ""; + private String dbType = ""; + private String resultType = ""; + private boolean geometry = false; + private boolean required = false; + private boolean autoIncrement = false; + private boolean identity = false; + private boolean uploadName = false; + private boolean zipField = false; + private String autoDate = ""; + private String show = ""; + private String enable = ""; + private String script = ""; + private String associate = ""; + private String collection = ""; + private String index; + private String tooltips; + private String check; + public String getCheck() { + return check; + } + public void setCheck(String check){ this.check= check ;} + public String getTooltips() { + return tooltips; + } + + public void setTooltips(String tooltips) { + this.tooltips = tooltips; + } + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + public String getSelect() + { + return select; + } + + public void setSelect(String select) + { + this.select = select; + } + + public String getMode() + { + return mode; + } + + public void setMode(String mode) + { + this.mode = mode; + } + + public String getKey() + { + return key; + } + + public void setKey(String key) + { + this.key = key; + } + + public String getParentID() + { + return parentID; + } + + public void setParentID(String parentID) + { + this.parentID = parentID; + } + + public String getDbType() + { + return dbType; + } + + public void setDbType(String dbType) + { + this.dbType = dbType; + } + + public String getResultType() + { + return resultType; + } + + public void setResultType(String resultType) + { + this.resultType = resultType; + } + + public boolean isGeometry() + { + return geometry; + } + + public void setGeometry(boolean geometry) + { + this.geometry = geometry; + } + + public boolean isRequired() + { + return required; + } + + public void setRequired(boolean required) + { + this.required = required; + } + + public boolean isAutoIncrement() + { + return autoIncrement; + } + + public void setAutoIncrement(boolean autoIncrement) + { + this.autoIncrement = autoIncrement; + } + + public boolean isIdentity() + { + return identity; + } + + public void setIdentity(boolean identity) + { + this.identity = identity; + } + + public boolean isUploadName() + { + return uploadName; + } + + public void setUploadName(boolean uploadName) + { + this.uploadName = uploadName; + } + + public boolean isZipField() + { + return zipField; + } + + public void setZipField(boolean zipField) + { + this.zipField = zipField; + } + + public String getAutoDate() + { + return autoDate; + } + + public void setAutoDate(String autoDate) + { + this.autoDate = autoDate; + } + + public String getShow() + { + return show; + } + + public void setShow(String show) + { + this.show = show; + } + + public String getEnable() + { + return enable; + } + + public void setEnable(String enable) + { + this.enable = enable; + } + + public String getScript() + { + return script; + } + + public void setScript(String script) + { + this.script = script; + } + + public String getAssociate() + { + return associate; + } + + public void setAssociate(String associate) + { + this.associate = associate; + } + + public String getCollection() + { + return collection; + } + + public void setCollection(String collection) + { + this.collection = collection; + } + + public String getIndex() + { + return index; + } + + public void setIndex(String index) + { + this.index = index; + } + + public List getSelector() + { + return selector; + } + + public void setSelector(List selector) + { + this.selector = selector; + } + + public List> getGroup() + { + return group; + } + + public void setGroup(List> group) + { + this.group = group; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndMeta.java b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndMeta.java new file mode 100644 index 0000000..f753f07 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndMeta.java @@ -0,0 +1,67 @@ +package cn.edu.whu.boot.xml.dto; + +import cn.edu.whu.boot.xml.xmlreader.bean.Layer; + +import java.util.List; +import java.util.Map; + +/** + * 封装 XML 文件 标签的内容,前端需要字符串样式参考 CommonConstant 注释 + */ +public class FrontEndMeta { + + private List basemap; +// private List> drawtool; + private Map>> drawtool; + private List> position; + private List operationLayers; + + public List getBasemap() + { + return basemap; + } + + public void setBasemap(List basemap) + { + this.basemap = basemap; + } + +// public List> getDrawtool() +// { +// return drawtool; +// } +// +// public void setDrawtool(List> drawtool) +// { +// this.drawtool = drawtool; +// } + + + public Map>> getDrawtool() { + return drawtool; + } + + public void setDrawtool(Map>> drawtool) { + this.drawtool = drawtool; + } + + public List> getPosition() + { + return position; + } + + public void setPosition(List> position) + { + this.position = position; + } + + public List getOperationLayers() + { + return operationLayers; + } + + public void setOperationLayers(List operationLayers) + { + this.operationLayers = operationLayers; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndSelect.java b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndSelect.java new file mode 100644 index 0000000..0e384ab --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/dto/FrontEndSelect.java @@ -0,0 +1,41 @@ +package cn.edu.whu.boot.xml.dto; + +/** + * 封装 XML 文件
标签的内容,前端需要字符串样式参考 CommonConstant 注释 + */ +public class FrontEndTable { + + private String name; + private String key; + private boolean root; + private String drawTool; + private List fields; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getKey() + { + return key; + } + + public void setKey(String key) + { + this.key = key; + } + + public List getFields() + { + return fields; + } + + public void setFields(List fields) + { + this.fields = fields; + } + public boolean isRoot() { + return root; + } + public void setRoot(boolean root) { + this.root = root; + } + + public String getDrawTool() { + return drawTool; + } + + public void setDrawTool(String drawTool) { + this.drawTool = drawTool; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/mapper/TableMapper.java b/src/main/java/cn/edu/whu/boot/xml/mapper/TableMapper.java new file mode 100644 index 0000000..fade8ce --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/mapper/TableMapper.java @@ -0,0 +1,10 @@ +package cn.edu.whu.boot.xml.mapper; + +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface TableMapper { + + void createTable(@Param("createTableSqlString") String createTableSqlString); +} diff --git a/src/main/java/cn/edu/whu/boot/xml/mapper/TaskMapper.java b/src/main/java/cn/edu/whu/boot/xml/mapper/TaskMapper.java new file mode 100644 index 0000000..a043510 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/mapper/TaskMapper.java @@ -0,0 +1,36 @@ +package cn.edu.whu.boot.xml.mapper; + +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.TaskExample; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface TaskMapper { + long countByExample(TaskExample example); + + int deleteByExample(TaskExample example); + + int deleteByPrimaryKey(Integer id); + + int insert(Task record); + + int insertSelective(Task record); + + List selectByExample(TaskExample example); + + Task selectByPrimaryKey(Integer id); + + int updateByExampleSelective(@Param("record") Task record, @Param("example") TaskExample example); + + int updateByExample(@Param("record") Task record, @Param("example") TaskExample example); + + int updateByPrimaryKeySelective(Task record); + + int updateByPrimaryKey(Task record); + + List selectUsersByTaskId(int taskId); + + List selectUsersByTableNameAndIdFieldName(@Param("tableName") String tableName, @Param("IdFieldName") String IdFieldName); +} \ No newline at end of file diff --git a/src/main/java/cn/edu/whu/boot/xml/mapper/XmlEnityMapper.java b/src/main/java/cn/edu/whu/boot/xml/mapper/XmlEnityMapper.java new file mode 100644 index 0000000..abae7ca --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/mapper/XmlEnityMapper.java @@ -0,0 +1,34 @@ +package cn.edu.whu.boot.xml.mapper; + +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.domain.XmlEnityExample; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface XmlEnityMapper { + + long countByExample(XmlEnityExample example); + + int deleteByExample(XmlEnityExample example); + + int deleteByPrimaryKey(Integer id); + + int insert(XmlEnity record); + + int insertSelective(XmlEnity record); + + List selectByExample(XmlEnityExample example); + + XmlEnity selectByPrimaryKey(Integer id); + + int updateByExampleSelective(@Param("record") XmlEnity record, @Param("example") XmlEnityExample example); + + int updateByExample(@Param("record") XmlEnity record, @Param("example") XmlEnityExample example); + + int updateByPrimaryKeySelective(XmlEnity record); + + int updateByPrimaryKey(XmlEnity record); +} diff --git a/src/main/java/cn/edu/whu/boot/xml/service/ITableService.java b/src/main/java/cn/edu/whu/boot/xml/service/ITableService.java new file mode 100644 index 0000000..2731a6e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/service/ITableService.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.xml.service; + + +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; + +public interface ITableService { + + /** + * 根据 String createTableSqlString 创建数据库,并进行 Task.has_create_tables 字段更新! + */ + void createTableAndUpdateTask(Task task , XmlEnity xmlEnity , String createTableSqlString); +} diff --git a/src/main/java/cn/edu/whu/boot/xml/service/ITaskService.java b/src/main/java/cn/edu/whu/boot/xml/service/ITaskService.java new file mode 100644 index 0000000..76cbb76 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/service/ITaskService.java @@ -0,0 +1,65 @@ +package cn.edu.whu.boot.xml.service; + +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; + +import java.util.List; + +public interface ITaskService { + + /** + * 更新 Task 对象 + */ + void updateTask(Task task); + + /** + * 基于事务插入 + */ + void insertTaskAndXmlEnity(Task task, XmlEnity xmlEnity); + + /** + * 基于事务更新 + */ + void updateTaskAndXmlEnity(Task task, XmlEnity xmlEnity); + + /** + * 基于事务删除 + */ + void deleteTaskAndXmlEnity(Task task); + + /** + * 基于 taskId 获取 xmlId + */ + Integer getXmlId(Integer id); + + /** + * 基于 taskId 获取 Task 对象 + */ + Task getTaskById(Integer id); + + /** + * 获取已经创建创建库的所有 Task 对象 + */ + List getTaskHasCreateTable(); + + /** + * 获取所有 Task 对象 + */ + List getAllTask(); + + /** + * 判断是否已经有 databaseName 的模式名 + */ + boolean hasDatabaseName(String databaseName); + + /** + * 获取任务的工作人员列表 + */ + List getWorkersByTask(int taskId); + + /** + * 设置巡查人员是否可以查看别人上传的数据 + */ + void setReviewerMode(int taskId, int isReviewerRestricted); +} diff --git a/src/main/java/cn/edu/whu/boot/xml/service/IXmlEnityService.java b/src/main/java/cn/edu/whu/boot/xml/service/IXmlEnityService.java new file mode 100644 index 0000000..78ea619 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/service/IXmlEnityService.java @@ -0,0 +1,13 @@ +package cn.edu.whu.boot.xml.service; + +import cn.edu.whu.boot.xml.domain.XmlEnity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface IXmlEnityService { + /** + * 基于 id 获取 XmlEnity 对象 + */ + XmlEnity getXmlEnityById(Integer id); +} diff --git a/src/main/java/cn/edu/whu/boot/xml/service/impl/TableServiceImpl.java b/src/main/java/cn/edu/whu/boot/xml/service/impl/TableServiceImpl.java new file mode 100644 index 0000000..584412e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/service/impl/TableServiceImpl.java @@ -0,0 +1,33 @@ +package cn.edu.whu.boot.xml.service.impl; + +import cn.edu.whu.boot.xml.mapper.TableMapper; +import cn.edu.whu.boot.xml.service.ITableService; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.service.ITaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class TableServiceImpl implements ITableService{ + + private final TableMapper tableMapper; + private final ITaskService taskService; + + @Autowired + public TableServiceImpl(TableMapper tableMapper, ITaskService taskService){ + this.tableMapper = tableMapper; + this.taskService = taskService; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void createTableAndUpdateTask(Task task, XmlEnity xmlEnity, String createTableSqlString){ + tableMapper.createTable(createTableSqlString); + task.setHasCreateTables(Task.HAS_CREATE_TABLES); + task.setCreateTablesMd5code(xmlEnity.getMd5Code()); + taskService.updateTask(task); + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/service/impl/TaskServiceImpl.java b/src/main/java/cn/edu/whu/boot/xml/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..7d262bd --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/service/impl/TaskServiceImpl.java @@ -0,0 +1,241 @@ +package cn.edu.whu.boot.xml.service.impl; + +import cn.edu.whu.boot.allocation.services.TaskCellDataService; +import cn.edu.whu.boot.allocation.services.TaskCellService; +import cn.edu.whu.boot.allocation.services.TaskUserCellService; +import cn.edu.whu.boot.allocation.services.TaskUserRoleService; +import cn.edu.whu.boot.collection.service.ITaskSelectIdService; +import cn.edu.whu.boot.common.domain.RedisExpireTime; +import cn.edu.whu.boot.common.service.CacheService; +import cn.edu.whu.boot.common.utils.collection.PostgreSqlUtil; +import cn.edu.whu.boot.user.entities.User; +import cn.edu.whu.boot.xml.domain.RedisKeyType; +import cn.edu.whu.boot.xml.domain.Task; +import cn.edu.whu.boot.xml.domain.TaskExample; +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.mapper.TaskMapper; +import cn.edu.whu.boot.xml.mapper.XmlEnityMapper; +import cn.edu.whu.boot.xml.service.ITaskService; +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import com.alibaba.fastjson.JSON; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 注意有些地方涉及到 Redis 缓存!!! + * @author Zhou Chao + */ +@Service +public class TaskServiceImpl implements ITaskService{ + + private final TaskMapper taskMapper; + private final XmlEnityMapper xmlEnityMapper; + private final TaskCellDataService taskCellDataService; + private final TaskUserCellService taskUserCellService; + private final TaskUserRoleService taskUserRoleService; + private final TaskCellService taskCellService; + private final ITaskSelectIdService taskSelectIdService; + private final CacheService cacheService; + + @Autowired + public TaskServiceImpl(TaskMapper taskMapper, XmlEnityMapper xmlEnityMapper, + TaskCellDataService taskCellDataService, TaskUserCellService taskUserCellService, + TaskUserRoleService taskUserRoleService, TaskCellService taskCellService, + ITaskSelectIdService taskSelectIdService, CacheService cacheService){ + this.taskMapper = taskMapper; + this.xmlEnityMapper = xmlEnityMapper; + this.taskCellDataService = taskCellDataService; + this.taskUserCellService = taskUserCellService; + this.taskUserRoleService = taskUserRoleService; + this.taskCellService = taskCellService; + this.taskSelectIdService = taskSelectIdService; + this.cacheService = cacheService; + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void updateTaskAndXmlEnity(Task task, XmlEnity xmlEnity){ + xmlEnityMapper.updateByPrimaryKey(xmlEnity); + taskMapper.updateByPrimaryKey(task); + deleteAllTaskKey(); + deleteAllHasCreatedTaskKey(); + deleteSomeTaskKey(task.getId()); + deleteSomeXmlFileDataKey(xmlEnity.getId()); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void updateTask(Task task){ + taskMapper.updateByPrimaryKey(task); + deleteAllTaskKey(); + deleteAllHasCreatedTaskKey(); + deleteSomeTaskKey(task.getId()); + deleteSomeXmlFileDataKey(task.getXmlId()); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void insertTaskAndXmlEnity(Task task, XmlEnity xmlEnity){ + xmlEnityMapper.insert(xmlEnity); + task.setXmlId(xmlEnity.getId()); + taskMapper.insert(task); + deleteAllTaskKey(); + deleteAllHasCreatedTaskKey(); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) + public void deleteTaskAndXmlEnity(Task task){ + xmlEnityMapper.deleteByPrimaryKey(task.getXmlId()); + int taskId = task.getId(); + taskMapper.deleteByPrimaryKey(taskId); + taskCellDataService.deleteByTaskId(taskId); + taskUserCellService.deleteByTaskId(taskId); + taskUserRoleService.deleteByTaskId(taskId); + taskCellService.deleteByTaskId(taskId); + taskSelectIdService.delete(taskId); + deleteAllTaskKey(); + deleteAllHasCreatedTaskKey(); + deleteSomeTaskKey(task.getId()); + deleteSomeXmlFileDataKey(task.getXmlId()); + } + + @Override + public Integer getXmlId(Integer id){ + return taskMapper.selectByPrimaryKey(id).getXmlId(); + } + + @Override + public Task getTaskById(Integer id){ + String someTaskRedisKey = RedisKeyType.TASK + String.valueOf(id); + Object redisObject = cacheService.get(someTaskRedisKey); + if(redisObject != null){ + return (Task) redisObject; + } + Task task = taskMapper.selectByPrimaryKey(id); + if(task != null){ + cacheService.set(someTaskRedisKey, task, RedisExpireTime.ONE_DAY.getTime()); + } + return task; + } + + @Override + public List getTaskHasCreateTable(){ + String hasCreateTaskRedisKey = RedisKeyType.TASK + "hasCreate"; + Object redisObject = cacheService.get(hasCreateTaskRedisKey); + if(redisObject != null){ + return (List) redisObject; + } + TaskExample taskExample = new TaskExample(); + taskExample.createCriteria().andHasCreateTablesEqualTo((short)1); + List taskList = taskMapper.selectByExample(taskExample); + if(!CollectionUtils.isEmpty(taskList)){ + cacheService.set(hasCreateTaskRedisKey, taskList, RedisExpireTime.ONE_DAY.getTime()); + } + return taskList; + } + + @Override + public List getAllTask(){ + String allTaskRedisKey = RedisKeyType.TASK + "all"; + Object redisObject = cacheService.get(allTaskRedisKey); + if(redisObject != null){ + return (List) redisObject; + } + List taskList = taskMapper.selectByExample(new TaskExample()); + if(!CollectionUtils.isEmpty(taskList)){ + cacheService.set(allTaskRedisKey, taskList, RedisExpireTime.ONE_DAY.getTime()); + } + return taskList; + } + + @Override + public boolean hasDatabaseName(String databaseName){ + TaskExample taskExample = new TaskExample(); + taskExample.createCriteria().andDatabaseNameEqualTo(databaseName); + List taskList = taskMapper.selectByExample(taskExample); + return taskList.size() != 0; + } + + /** + * 清除 Redis中的 redis_key_prefix_task:all 键 + */ + private void deleteAllTaskKey(){ + String allTaskRedisKey = RedisKeyType.TASK + "all"; + cacheService.delete(allTaskRedisKey); + } + + /** + * 清除 Redis中的 redis_key_prefix_task:all 键 + */ + private void deleteAllHasCreatedTaskKey(){ + String allHasCreatedTaskRedisKey = RedisKeyType.TASK + "hasCreate"; + cacheService.delete(allHasCreatedTaskRedisKey); + } + + /** + * 清除 Redis 中的 redis_key_prefix_task:"id" 键 + */ + private void deleteSomeTaskKey(int taskId){ + String someTaskRedisKey = RedisKeyType.TASK + String.valueOf(taskId); + cacheService.delete(someTaskRedisKey); + } + + /** + * 清除 Redis 中的 redis_key_prefix_xml_file_data:"id" 键 + */ + private void deleteSomeXmlFileDataKey(int xmlEnityId){ + String someTaskRedisKey = RedisKeyType.XML_FILE_DATA + String.valueOf(xmlEnityId); + cacheService.delete(someTaskRedisKey); + } + + @Override + public List getWorkersByTask(int taskId) { + Task task = getTaskById(taskId); + if (task == null) { + return Collections.emptyList(); + } + + if (task.getIsAllocationOptional() == 0) { + // 该任务需要分配,工作人员的信息从 task_user_role 表中获取 + return taskMapper.selectUsersByTaskId(taskId); + } else { + // 该任务无需分配,工作人员为上传数据的人员 + 上传轨迹的人员 + 上传草图的人员 + String databaseName = task.getDatabaseName(); + Set rootTables = JSON.toJavaObject(JSON.parseObject(task.getConfig()), Config.class).getRootTables().keySet(); + Map idToUser = new HashMap<>(); + // 1. 从根表中获取所有上传了数据的用户 + for (String tableName : rootTables) { + for (User user : taskMapper.selectUsersByTableNameAndIdFieldName(PostgreSqlUtil.buildTableNameString(databaseName, tableName, false, false), "collector")) { + idToUser.put(user.getId(), user); + } + } + // 2. 从轨迹表中获取上传了轨迹的用户 + for (User user : taskMapper.selectUsersByTableNameAndIdFieldName(PostgreSqlUtil.buildTableNameString(databaseName, "route_line", false, false), "collector_id")) { + idToUser.put(user.getId(), user); + } + // 3. 从草图表中获取上传了草图的用户 + for (User user : taskMapper.selectUsersByTableNameAndIdFieldName(PostgreSqlUtil.buildTableNameString(databaseName, "draft", false, false), "collector_id")) { + idToUser.put(user.getId(), user); + } + return new ArrayList<>(idToUser.values()); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void setReviewerMode(int taskId, int isReviewerRestricted) { + Task task = getTaskById(taskId); + if (task == null) { + return; + } + + task.setIsReviewerRestricted(isReviewerRestricted); + updateTask(task); + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/service/impl/XmlEnityServiceImpl.java b/src/main/java/cn/edu/whu/boot/xml/service/impl/XmlEnityServiceImpl.java new file mode 100644 index 0000000..f3186e6 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/service/impl/XmlEnityServiceImpl.java @@ -0,0 +1,29 @@ +package cn.edu.whu.boot.xml.service.impl; + +import cn.edu.whu.boot.xml.domain.XmlEnity; +import cn.edu.whu.boot.xml.mapper.XmlEnityMapper; +import cn.edu.whu.boot.xml.service.IXmlEnityService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class XmlEnityServiceImpl implements IXmlEnityService{ + + private final XmlEnityMapper xmlEnityMapper; + + @Autowired + public XmlEnityServiceImpl(XmlEnityMapper xmlEnityMapper){ + this.xmlEnityMapper = xmlEnityMapper; + } + + @Override + public XmlEnity getXmlEnityById(Integer id){ + return xmlEnityMapper.selectByPrimaryKey(id); + } + + +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/XmlTemplateReader.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/XmlTemplateReader.java new file mode 100644 index 0000000..36ce95d --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/XmlTemplateReader.java @@ -0,0 +1,306 @@ +package cn.edu.whu.boot.xml.xmlreader; + +import cn.edu.whu.boot.xml.xmlreader.bean.Config; +import cn.edu.whu.boot.xml.xmlreader.bean.Layer; +import cn.edu.whu.boot.xml.xmlreader.bean.Meta; +import cn.edu.whu.boot.xml.xmlreader.bean.Table; +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.ParameterizedType; +import java.util.*; + +/** + * @author Li Bozhao + */ +public class XmlTemplateReader { + + //path的相对路径格式src/res/books.xml + public static Config read(String path) { + // 解析books.xml文件 + // 创建SAXReader的对象reader + Config config = new Config(); + SAXReader reader = new SAXReader(); + try { + // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。 + Document document = reader.read(new File(path)); + // 通过document对象获取根节点config + Element root = document.getRootElement(); + // 通过element对象的elementIterator方法获取迭代器 + Iterator it = root.elementIterator(); + // 遍历迭代器,获取根节点中的信息 + while (it.hasNext()) { + Element element = it.next(); + if(config.getMeta()==null && element.getName().equals("meta")){ + solveMeta(element, config); + }else if(config.getTables()==null && element.getName().equals("tables")){ + solveTables(element, config); + } +// List bookAttrs = book.attributes(); +// for (Attribute attr : bookAttrs) { +// System.out.println("属性名:" + attr.getName() + "--属性值:" +// + attr.getValue()); +// } +// Iterator itt = book.elementIterator(); +// while (itt.hasNext()) { +// Element bookChild = (Element) itt.next(); +// System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue()); +// } + } + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return config; + } + private static void solveMeta(Element metaElement, Config config){ + Meta meta = new Meta(); + Iterator it = metaElement.elementIterator(); + while(it.hasNext()){ + Element element = it.next(); + switch (element.getName()){ + case "drawtool": +// meta.setDrawTool(solveList(element,"type","name")); + meta.setDrawTool(solveListWithGroup(element)); + break; + case "position": +// meta.setPosition(solveList(element,"type","name")); + meta.setPosition(solveList(element)); + break; + case "basemap": + meta.setBaseMap(solveListClass(element,null, Layer.class)); + break; + case "operationlayers": + meta.setOperationLayers(solveListClass(element,null, Layer.class)); + break; + } + } + config.setMeta(meta); + } + private static void solveTables(Element tablesElement, Config config){ + Map tables = solveMapClass(tablesElement,"key",null, Table.class); + config.setTables(tables); + } + // 通用工具类 + // 通用工具类 + private static List solveList(Element element){ + List result = new ArrayList<>(); + Iterator it = element.elementIterator(); + while(it.hasNext()){ + Element sub = it.next(); + if(sub.getName().equals("type")){ + Attribute attr = sub.attribute("name"); + if(attr!=null) + result.add(attr.getValue()); + } + } + return result; + } + private static Map> solveListWithGroup(Element element){ + Map> result = new HashMap<>(); + List defaultList = new ArrayList<>(); + Iterator it = element.elementIterator(); + while(it.hasNext()){ + Element sub = it.next(); + if(sub.getName().equals("type")){ + Attribute attr = sub.attribute("name"); + if(attr!=null) + defaultList.add(attr.getValue()); + }else if(sub.getName().equals("group")){ + Attribute attr = sub.attribute("key"); + String key = attr.getValue(); + List list = solveList(sub); + result.put(key, list); + } + } + result.put("default", defaultList); + return result; + } +// private static List solveList(Element element, String label,String attribute){ +// List result = new ArrayList<>(); +// Iterator it = element.elementIterator(); +// while(it.hasNext()){ +// Element sub = it.next(); +// if(sub.getName().equals(label)){ +// Attribute attr = sub.attribute(attribute); +// if(attr!=null) +// result.add(attr.getValue()); +// } +// } +// return result; +// } + private static List solveListClass(Element element,String label, Class clazz) { + List result = new ArrayList<>(); + Iterator it = element.elementIterator(); + while(it.hasNext()){ + Element sub = it.next(); + if(label!=null && !sub.getName().equals(label)) + continue; + T item = solveClass(sub,clazz); + if(item!=null) + result.add(item); + } + return result; + } + private static Map solveMapClass(Element element,String key,String label, Class clazz){ + if(key==null) + key = "key"; + Map result = new HashMap<>(); + Iterator it = element.elementIterator(); + while(it.hasNext()){ + Element sub = it.next(); + if(label!=null && !sub.getName().equals(label)) + continue; + T item = solveClass(sub,key,clazz); + if(item==null) + continue; + Object value = null; + try { + value = clazz.getMethod("get" + upperFirstLetter(key)).invoke(item); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + if(value!=null) + result.put(value.toString(), item); + } + return result; + } + private static T solveClass(Element element,Class clazz) { + return solveClass(element,null, clazz); + } + private static T solveClass(Element element,String key, Class clazz) { + T result = null; + try { + result = clazz.newInstance(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + if(result==null) + return null; + List attributes = element.attributes(); + for(Attribute attribute:attributes){ + addValue(attribute,result,clazz); + } + //获取关联的子元素并赋值 + List elements = element.elements(); + Set set = new HashSet<>(); + for(Element child:elements){ + set.add(child.getName()); + } + //这里就是List和Map + for(String label:set){ + String fieldName = label+"s"; + Field field = null; + try { + field = clazz.getDeclaredField(fieldName); + if(field==null) + continue; + Object item = null; + if(field.getType() == List.class){ + ParameterizedType pt = (ParameterizedType) field.getGenericType() ; + Class clz = (Class) pt.getActualTypeArguments()[0];//这里可以记录relationTable类 + item = solveListClass(element,label,clz); + + }else if (field.getType() == Map.class){ + ParameterizedType pt = (ParameterizedType) field.getGenericType() ; + Class clz = (Class) pt.getActualTypeArguments()[1]; + item = solveMapClass(element,key,label,clz); + + } + if(item!=null) { + try { + clazz.getMethod("set" + upperFirstLetter(fieldName),field.getType()).invoke(result,item); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + } catch (NoSuchFieldException e) { + // 忽略不存在的字段 + continue; + } + } + + return result; + } + private static void addValue(Attribute attribute,T data, Class clazz){ + String fieldName = attribute.getName(); + String value = attribute.getValue(); + Field field = null; + try { + field = clazz.getDeclaredField(fieldName); + if(field==null) + return; + Object v; + switch (field.getType().getSimpleName()){ + case "Integer": + case "int": + v = Integer.parseInt(value); + break; + case "String": + v = value; + break; + case "Double": + case "double": + v = Double.parseDouble(value); + break; + case "Float": + case "float": + v = Float.parseFloat(value); + break; + case "Boolean": + case "boolean": + v = Boolean.parseBoolean(value); + break; + case "byte[]": + v = value.getBytes(); + break; + case "Long": + case "long": + v = Long.parseLong(value); + break; + case "Short": + case "short": + v = Short.parseShort(value); + break; + default: + v = value; + break; + } + try { + clazz.getMethod("set" + upperFirstLetter(fieldName),field.getType()).invoke(data,v); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } catch (NoSuchFieldException e) { + // 忽略不存在的字段 + return; + } + } + private static String upperFirstLetter(String columnName) { + StringBuilder builder = new StringBuilder(columnName); + String firstLetter = columnName.substring(0, 1).toUpperCase(); + builder.replace(0, 1, firstLetter); + return builder.toString(); + } +} + diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Config.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Config.java new file mode 100644 index 0000000..b97b25b --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Config.java @@ -0,0 +1,49 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Li Bozhao + */ +public class Config implements Serializable { + private static final long serialVersionUID = -4357709582704153333L; + private Meta meta = null; + /** + * 有 geometry 的是根表 + */ + private Map rootTables = null;//一个rootTable相当于是一种采集的类型 + private Map tables = null; + + public Meta getMeta() { + return meta; + } + + public void setMeta(Meta meta) { + this.meta = meta; + } + + public Map getTables() { + return tables; + } + + public void setTables(Map tables) { + this.tables = tables; + this.rootTables = new HashMap<>(); + for(String key:tables.keySet()){ + Table table = tables.get(key); + if(table!=null && table.isRoot()) + this.rootTables.put(key,table); + } + } + + public void addTable(Table table){ + this.tables.put(table.getKey(),table); + if(table.isRoot()) + this.rootTables.put(table.getKey(),table); + } + public Map getRootTables(){ + return rootTables; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Field.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Field.java new file mode 100644 index 0000000..60c836a --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Field.java @@ -0,0 +1,295 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Li Bozhao + */ +public class Field implements Serializable { + private static final long serialVersionUID = -8992769078483751487L;//,Cloneable + private String key;//字段名称* + private String viewKey;//这个用于索引,比如在associate中这个的key就应该带着检索名称,格式为表.字段 + private String dbType;//数据类型 + private String name;//显示的中文名称 + private String type;//组件名称 + private String mode;//组件模式 + private String resultType;//对于单选、多选、下拉框啥的,是返回value还是返回key + private String script;//脚本 + private String show;//是否可见 可以输入脚本表达式 + private boolean parentID;//用于子表格关联父表格中的ID + private String autoDate;//默认为"yyyyMMddYYmmss" + private String associate;//* + private String collection;//* + private int index; + private boolean enable = true;//是否可用 + private boolean identity;//是否主键* + private boolean autoIncrement;//是否自增长 + private boolean geometry;//是否是空间对象* + private boolean zipField; + private boolean uploadName; + private boolean required; + private String tooltips;//工具使用注释 + private String check; + /*可分组的选项*/ + private String select;//控制Select的脚本 + private String lastSelectValue;//记录当前select的值,如果不记录可能会导致循环不止 + private Map selects = new HashMap<>();//固定显示的选项 + private Map groups = new HashMap<>();//由select控制的选项分组 + private List getShowSelects() { + return showSelects; + } + + public void setShowSelects(List selects; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public List selects) { + this.selects = selects; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Layer.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Layer.java new file mode 100644 index 0000000..c874ec7 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Layer.java @@ -0,0 +1,64 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +import java.io.Serializable; + +/** + * @author Li Bozhao + */ +public class Layer implements Serializable { + private static final long serialVersionUID = -2456061046336735535L; + private String url;//服务地址 + private String name;//服务名称 + private String type;//类型 tianditu esri google ArcGISTiledLayer ArcGISMapImageLayer ArcGISVectorTiledLayer OpenStreetMapLayer等 + private String subType;//在选择tianditu esri google 时 这个来标识具体的枚举类型 + private String group;//image 影像 vector 矢量 + private int index;//显示顺序 + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getSubType() { + return subType; + } + + public void setSubType(String subType) { + this.subType = subType; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Meta.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Meta.java new file mode 100644 index 0000000..80f0c5c --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Meta.java @@ -0,0 +1,65 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @author Li Bozhao + */ +public class Meta implements Serializable { + private static final long serialVersionUID = -7066838880974639139L; +// private List drawTool; + private Map> drawTool; + private List position; + private List baseMap; + private List operationLayers; + +// public List getDrawTool() { +// return drawTool; +// } +// +// public void setDrawTool(List drawTool) { +// this.drawTool = drawTool; +// } + public Map> getDrawTool() { + return drawTool; + } + public List getDrawTool(String key) { + List res = new ArrayList<>(Objects.requireNonNull(drawTool.get("default"))); + if(key!=null && drawTool.containsKey(key)){ + res.addAll(Objects.requireNonNull(drawTool.get(key))); + } + return res; + } + + public void setDrawTool(Map> drawTool) { + this.drawTool = drawTool; + } + + public List getPosition() { + return position; + } + + public void setPosition(List position) { + this.position = position; + } + + public List getBaseMap() { + return baseMap; + } + + public void setBaseMap(List baseMap) { + this.baseMap = baseMap; + } + + public List getOperationLayers() { + return operationLayers; + } + + public void setOperationLayers(List operationLayers) { + this.operationLayers = operationLayers; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Select.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Select.java new file mode 100644 index 0000000..95fc41e --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Select.java @@ -0,0 +1,50 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +import java.io.Serializable; + +/** + * @author Li Bozhao + */ +public class Select implements Serializable { + private static final long serialVersionUID = -711696572849403577L; + private String key; + private String value; + private boolean check; + + public Select() { + } + + public Select(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public boolean isCheck() { + return check; + } + + public void setCheck(boolean check) { + this.check = check; + } + + @Override + public String toString() { + return value; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Table.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Table.java new file mode 100644 index 0000000..3ec6122 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/Table.java @@ -0,0 +1,86 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Li Bozhao + */ +public class Table implements Serializable { + private static final long serialVersionUID = -3856096401850481429L; + /** + * 在数据库中表现为表名 + */ + private String key; + + /** + * 表的中文名称,在数据库中表现为注释 + */ + private String name; + /** + * 原本是包含geometry的叫根表,现在是有root=true的是根表 + */ + private boolean root = false; + private boolean useMap = false;//是否包含geometry + private String drawTool = null; + private Map fields = new HashMap<>(); + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setFields(Map fields) { + this.fields = fields; + for(Field field:fields.values()){ + if(field.isGeometry()) { +// root = true; + useMap = true; + break; + } + } + } + + public Map getFields() { + return fields; + } + + public boolean isRoot() { + return root; + } + + public void setRoot(boolean root) { + this.root = root; + } + + public String getDrawTool() { + return drawTool; + } + + public void setDrawTool(String drawTool) { + this.drawTool = drawTool; + } + + public boolean isUseMap() { + return useMap; + } + private boolean isRootTable; + public void setIsRootTable(boolean isRootTable) { + this.isRootTable = isRootTable; + } + public void setUseMap(boolean useMap) { + this.useMap = useMap; + } +} diff --git a/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/ViewType.java b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/ViewType.java new file mode 100644 index 0000000..9fcb127 --- /dev/null +++ b/src/main/java/cn/edu/whu/boot/xml/xmlreader/bean/ViewType.java @@ -0,0 +1,20 @@ +package cn.edu.whu.boot.xml.xmlreader.bean; + +/** + * @author Li Bozhao + */ +// TODO: 2019/4/25 目前先这么多吧,用到啥再添加啥 +public enum ViewType { + INPUT_TEXT, + INPUT_INT, + INPUT_DOUBLE, + INPUT_PHONE, + SELECTOR, + RADIOBUTTON, + CHECKBOX, + CAMERA, + CITY_PICKER, + DATE_PICKER, + CHECK_VIEW, + LABEL +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..4947899 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,74 @@ +spring.profiles.active=dev + +server.port=9001 +server.address=0.0.0.0 + +spring.datasource.host=localhost +spring.datasource.port=5432 +spring.datasource.database=tj_project +spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://${spring.datasource.host}:${spring.datasource.port}/${spring.datasource.database}?useSSL=true&allowMultiQueries=true +spring.datasource.username=postgres +spring.datasource.password=503503 +spring.datasource.hikari.minimum-idle=5 +spring.datasource.hikari.idle-timeout=180000 +spring.datasource.hikari.maximum-pool-size=30 +spring.datasource.hikari.max-lifetime=1800000 +spring.datasource.hikari.connection-timeout=30000 + +spring.redis.host=localhost +spring.redis.port=6379 +#spring.redis.database=0 +#spring.redis.password=redis +spring.redis.timeout=3000ms + +pagehelper.helper-dialect=postgresql +pagehelper.reasonable=true +pagehelper.support-methods-arguments=true + +spring.jmx.enabled=false + +logging.level.cn.edu.whu.boot.*.mapper=debug + +mybatis.mapper-locations=classpath:mapper/**/*.xml +mybatis.configuration.map-underscore-to-camel-case=true + +static.file.path=E:/503/TJ_project/static + +ApkFilePath=${static.file.path}/apk +photozippath=${static.file.path}/zip +spring.thymeleaf.prefix=classpath:/templates/ +spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,\ + classpath:/public/,classpath:/templates/,file:///${ApkFilePath} + +MediaPath=${static.file.path}/MediaFile +HistoryMediaPath=${static.file.path}/HistoryMediaFile +XmlFilePath=${static.file.path}/Xml + +tpkx.ext=tpkx + +tpk.root=${static.file.path}/tpk/ +tpkx.root=${static.file.path}/tpkx/ + +static.url.prefix=/static + +spring.servlet.multipart.max-file-size=500MB +spring.servlet.multipart.max-request-size=500MB + +spring.cache.ehcache.config=classpath:config/ehcache.xml + +# Session +spring.session.store-type=jdbc +spring.session.jdbc.initialize-schema=always +spring.session.timeout=1800s + +# Email configuration +spring.mail.host= +spring.mail.username= +spring.mail.password= +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.port=465 +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.properties.mail.smtp.ssl.enable=true +email.subject= \ No newline at end of file diff --git a/src/main/resources/config/ehcache.xml b/src/main/resources/config/ehcache.xml new file mode 100644 index 0000000..080ed42 --- /dev/null +++ b/src/main/resources/config/ehcache.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/PhotoZipMapper/PhotoZipMapper.xml b/src/main/resources/mapper/PhotoZipMapper/PhotoZipMapper.xml new file mode 100644 index 0000000..89b8d7f --- /dev/null +++ b/src/main/resources/mapper/PhotoZipMapper/PhotoZipMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + INSERT INTO zip_task_status (task_name, status, updated_at) + VALUES (#{taskName}, #{status}, NOW()) + ON CONFLICT (task_name) DO UPDATE + SET status = #{status}, updated_at = NOW(); + + + + + diff --git a/src/main/resources/mapper/allocation/DraftMapper.xml b/src/main/resources/mapper/allocation/DraftMapper.xml new file mode 100644 index 0000000..d13e246 --- /dev/null +++ b/src/main/resources/mapper/allocation/DraftMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + INSERT INTO ${databaseName}."draft"(collector_id, username,draw_time,shape) + VALUES (#{draft.collectorId}, #{draft.userName},to_timestamp(#{draft.date},'YYYY-MM-DD HH24:MI:SS'),#{draft.shape}) + + \ No newline at end of file diff --git a/src/main/resources/mapper/allocation/RouteLineMapper.xml b/src/main/resources/mapper/allocation/RouteLineMapper.xml new file mode 100644 index 0000000..f4d26ed --- /dev/null +++ b/src/main/resources/mapper/allocation/RouteLineMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + INSERT INTO ${databaseName}."route_line"(collector_id, collector, route, begin_time, stop_time) + VALUES(#{routeLine.collectorId}, #{routeLine.name}, #{routeLine.polyline}, to_timestamp(#{routeLine.begindate},'YYYY-MM-DD HH24:MI:SS'), + to_timestamp(#{routeLine.stopdate},'YYYY-MM-DD HH24:MI:SS')) + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/apkversion/ApkVersionMapper.xml b/src/main/resources/mapper/apkversion/ApkVersionMapper.xml new file mode 100644 index 0000000..d225b3c --- /dev/null +++ b/src/main/resources/mapper/apkversion/ApkVersionMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/collection/BaseMapper.xml b/src/main/resources/mapper/collection/BaseMapper.xml new file mode 100644 index 0000000..22ebb2f --- /dev/null +++ b/src/main/resources/mapper/collection/BaseMapper.xml @@ -0,0 +1,99 @@ + + + + + + ${insertSql} + + + + + + SELECT currval(${sqlEnity.primaryKeySeq}::regclass) + + ${sqlEnity.sql} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/collection/MultimediaMapper.xml b/src/main/resources/mapper/collection/MultimediaMapper.xml new file mode 100644 index 0000000..baad543 --- /dev/null +++ b/src/main/resources/mapper/collection/MultimediaMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO ${mediaTableName}(id, file, media_path, azimuth, satellites, longitude, latitude, altitude, accuracy, + camera_angle, camera_pitch, camera_roll, method, time, focal_length,type,version) + VALUES (#{ID,jdbcType=INTEGER}, + #{file,jdbcType=VARCHAR}, + #{mediaPath,jdbcType=VARCHAR}, + #{azimuth,jdbcType=NUMERIC}, + #{satellites,jdbcType=INTEGER}, + #{longitude,jdbcType=NUMERIC}, + #{latitude,jdbcType=NUMERIC}, + #{altitude,jdbcType=NUMERIC}, + #{accuracy,jdbcType=NUMERIC}, + #{cameraAngle,jdbcType=NUMERIC}, + #{cameraPitch,jdbcType=NUMERIC}, + #{cameraRoll,jdbcType=NUMERIC}, + #{method,jdbcType=VARCHAR}, + #{time,jdbcType=VARCHAR}, + #{focalLength,jdbcType=NUMERIC}, + #{type,jdbcType=NUMERIC}, + #{version,jdbcType=INTEGER}) + + + + DELETE FROM ${mediaTableName} + WHERE id = #{polygonId} + + + + DELETE FROM ${mediaTableName} + WHERE id = #{polygonId} AND version >= #{version} + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/collection/SearchPageMapper.xml b/src/main/resources/mapper/collection/SearchPageMapper.xml new file mode 100644 index 0000000..0040ea5 --- /dev/null +++ b/src/main/resources/mapper/collection/SearchPageMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/collection/TableMapper.xml b/src/main/resources/mapper/collection/TableMapper.xml new file mode 100644 index 0000000..25ea25d --- /dev/null +++ b/src/main/resources/mapper/collection/TableMapper.xml @@ -0,0 +1,8 @@ + + + + + + ${createTableSqlString} + + \ No newline at end of file diff --git a/src/main/resources/mapper/collection/TaskSelectIdMapper.xml b/src/main/resources/mapper/collection/TaskSelectIdMapper.xml new file mode 100644 index 0000000..7c5de9f --- /dev/null +++ b/src/main/resources/mapper/collection/TaskSelectIdMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + INSERT INTO task_select_id(src_task_id,src_table_name,dest_task_id,dest_table_name,select_order,select_id) + VALUES (#{srcTaskId},#{srcTableName},#{destTaskId},#{destTableName},#{selectOrder},#{selectId}) + + + + DELETE FROM task_select_id WHERE src_task_id = #{taskId} or dest_task_id = #{taskId} + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/collection/UpdateMapper.xml b/src/main/resources/mapper/collection/UpdateMapper.xml new file mode 100644 index 0000000..62f6f22 --- /dev/null +++ b/src/main/resources/mapper/collection/UpdateMapper.xml @@ -0,0 +1,41 @@ + + + + + + ${updateSql} + + + + ${deleteSql} + + + + UPDATE ${tableName} + SET status = #{status}, + reason = #{reason} + WHERE ${primaryKey} = #{polygonId} + + + + UPDATE ${tableName} SET reviewer = #{reviewer} + WHERE ${primaryKey} = #{polygonId} + + + + + + + + SELECT setval('${seqName}'::regclass, #{primaryKey}) + + + + UPDATE ${tableName} + SET status = #{status}, + reviewer = #{reviewer} + WHERE ${primaryKey} = #{polygonId} + + \ No newline at end of file diff --git a/src/main/resources/mapper/statistics/BasicStatMapper.xml b/src/main/resources/mapper/statistics/BasicStatMapper.xml new file mode 100644 index 0000000..fea6f1b --- /dev/null +++ b/src/main/resources/mapper/statistics/BasicStatMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/statistics/CollectorMapper.xml b/src/main/resources/mapper/statistics/CollectorMapper.xml new file mode 100644 index 0000000..9d313d8 --- /dev/null +++ b/src/main/resources/mapper/statistics/CollectorMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/statistics/ProgressStatMapper.xml b/src/main/resources/mapper/statistics/ProgressStatMapper.xml new file mode 100644 index 0000000..5595b8d --- /dev/null +++ b/src/main/resources/mapper/statistics/ProgressStatMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/xml/TaskMapper.xml b/src/main/resources/mapper/xml/TaskMapper.xml new file mode 100644 index 0000000..57049a1 --- /dev/null +++ b/src/main/resources/mapper/xml/TaskMapper.xml @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, task_name, operator, create_time, modify_time, xml_id, has_create_tables, config, + database_name, introduction, upload_deadline, create_tables_md5code, is_allocation_optional, is_reviewer_restricted + + + + + delete from task + where id = #{id,jdbcType=INTEGER} + + + delete from task + + + + + + + SELECT currval('task_id_seq'::regclass) + + insert into task (task_name, operator, + create_time, modify_time, xml_id, + has_create_tables, config, database_name, + introduction, upload_deadline, create_tables_md5code, + is_allocation_optional, is_reviewer_restricted) + values (#{taskName,jdbcType=VARCHAR}, #{operator,jdbcType=VARCHAR}, + #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP}, #{xmlId,jdbcType=INTEGER}, + #{hasCreateTables,jdbcType=SMALLINT}, #{config,jdbcType=VARCHAR}, #{databaseName,jdbcType=VARCHAR}, + #{introduction,jdbcType=VARCHAR}, #{uploadDeadline,jdbcType=VARCHAR}, #{createTablesMd5code,jdbcType=VARCHAR}, + #{isAllocationOptional,jdbcType=SMALLINT}, #{isReviewerRestricted,jdbcType=SMALLINT}) + + + + SELECT currval('task_id_seq'::regclass) + + insert into task + + + task_name, + + + operator, + + + create_time, + + + modify_time, + + + xml_id, + + + has_create_tables, + + + config, + + + database_name, + + + introduction, + + + upload_deadline, + + + create_tables_md5code, + + + is_allocation_optional, + + + is_reviewer_restricted, + + + + + #{id,jdbcType=INTEGER}, + + + #{taskName,jdbcType=VARCHAR}, + + + #{operator,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + #{xmlId,jdbcType=INTEGER}, + + + #{hasCreateTables,jdbcType=SMALLINT}, + + + #{config,jdbcType=VARCHAR}, + + + #{databaseName,jdbcType=VARCHAR}, + + + #{introduction,jdbcType=VARCHAR}, + + + #{uploadDeadline,jdbcType=VARCHAR}, + + + #{createTablesMd5code,jdbcType=VARCHAR}, + + + #{isAllocationOptional,jdbcType=SMALLINT}, + + + + + + update task + + + id = #{record.id,jdbcType=INTEGER}, + + + task_name = #{record.taskName,jdbcType=VARCHAR}, + + + operator = #{record.operator,jdbcType=VARCHAR}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + xml_id = #{record.xmlId,jdbcType=INTEGER}, + + + has_create_tables = #{record.hasCreateTables,jdbcType=SMALLINT}, + + + config = #{record.config,jdbcType=VARCHAR}, + + + database_name = #{record.databaseName,jdbcType=VARCHAR}, + + + introduction = #{record.introduction,jdbcType=VARCHAR}, + + + upload_deadline = #{record.uploadDeadline,jdbcType=VARCHAR}, + + + create_tables_md5code = #{record.createTablesMd5code,jdbcType=VARCHAR}, + + + is_allocation_optional = #{record.isAllocationOptional,jdbcType=SMALLINT}, + + + is_reviewer_restricted = #{isReviewerRestricted, jdbcType=SMALLINT}, + + + + + + + + update task + set id = #{record.id,jdbcType=INTEGER}, + task_name = #{record.taskName,jdbcType=VARCHAR}, + operator = #{record.operator,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + xml_id = #{record.xmlId,jdbcType=INTEGER}, + has_create_tables = #{record.hasCreateTables,jdbcType=SMALLINT}, + config = #{record.config,jdbcType=VARCHAR}, + database_name = #{record.databaseName,jdbcType=VARCHAR}, + introduction = #{record.introduction,jdbcType=VARCHAR}, + upload_deadline = #{record.uploadDeadline,jdbcType=VARCHAR}, + create_tables_md5code = #{record.createTablesMd5code,jdbcType=VARCHAR}, + is_allocation_optional = #{record.isAllocationOptional,jdbcType=SMALLINT}, + is_reviewer_restricted = #{isReviewerRestricted, jdbcType=SMALLINT} + + + + + + update task + + + task_name = #{taskName,jdbcType=VARCHAR}, + + + operator = #{operator,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + xml_id = #{xmlId,jdbcType=INTEGER}, + + + has_create_tables = #{hasCreateTables,jdbcType=SMALLINT}, + + + config = #{config,jdbcType=VARCHAR}, + + + database_name = #{databaseName,jdbcType=VARCHAR}, + + + introduction = #{introduction,jdbcType=VARCHAR}, + + + upload_deadline = #{uploadDeadline,jdbcType=VARCHAR}, + + + create_tables_md5code = #{createTablesMd5code,jdbcType=VARCHAR}, + + + is_allocation_optional = #{isAllocationOptional,jdbcType=SMALLINT}, + + + is_reviewer_restricted = #{isReviewerRestricted, jdbcType=SMALLINT}, + + + where id = #{id,jdbcType=INTEGER} + + + update task + set task_name = #{taskName,jdbcType=VARCHAR}, + operator = #{operator,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + xml_id = #{xmlId,jdbcType=INTEGER}, + has_create_tables = #{hasCreateTables,jdbcType=SMALLINT}, + config = #{config,jdbcType=VARCHAR}, + database_name = #{databaseName,jdbcType=VARCHAR}, + introduction = #{introduction,jdbcType=VARCHAR}, + upload_deadline = #{uploadDeadline,jdbcType=VARCHAR}, + create_tables_md5code = #{createTablesMd5code,jdbcType=VARCHAR}, + is_allocation_optional = #{isAllocationOptional,jdbcType=SMALLINT}, + is_reviewer_restricted = #{isReviewerRestricted, jdbcType=SMALLINT} + where id = #{id,jdbcType=INTEGER} + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/xml/XmlEnityMapper.xml b/src/main/resources/mapper/xml/XmlEnityMapper.xml new file mode 100644 index 0000000..ee9dee4 --- /dev/null +++ b/src/main/resources/mapper/xml/XmlEnityMapper.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, file_name, md5_code, file_path, create_time, modify_time + + + + + delete from xml + where id = #{id,jdbcType=INTEGER} + + + delete from xml + + + + + + + SELECT currval('xml_id_seq'::regclass) + + insert into xml (file_name, md5_code, + file_path, create_time, modify_time + ) + values (#{fileName,jdbcType=VARCHAR}, #{md5Code,jdbcType=VARCHAR}, + #{filePath,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{modifyTime,jdbcType=TIMESTAMP} + ) + + + + SELECT currval('xml_id_seq'::regclass) + + insert into xml + + + id, + + + file_name, + + + md5_code, + + + file_path, + + + create_time, + + + modify_time, + + + + + #{id,jdbcType=INTEGER}, + + + #{fileName,jdbcType=VARCHAR}, + + + #{md5Code,jdbcType=VARCHAR}, + + + #{filePath,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{modifyTime,jdbcType=TIMESTAMP}, + + + + + + update xml + + + id = #{record.id,jdbcType=INTEGER}, + + + file_name = #{record.fileName,jdbcType=VARCHAR}, + + + md5_code = #{record.md5Code,jdbcType=VARCHAR}, + + + file_path = #{record.filePath,jdbcType=VARCHAR}, + + + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP}, + + + + + + + + update xml + set id = #{record.id,jdbcType=INTEGER}, + file_name = #{record.fileName,jdbcType=VARCHAR}, + md5_code = #{record.md5Code,jdbcType=VARCHAR}, + file_path = #{record.filePath,jdbcType=VARCHAR}, + create_time = #{record.createTime,jdbcType=TIMESTAMP}, + modify_time = #{record.modifyTime,jdbcType=TIMESTAMP} + + + + + + update xml + + + file_name = #{fileName,jdbcType=VARCHAR}, + + + md5_code = #{md5Code,jdbcType=VARCHAR}, + + + file_path = #{filePath,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + modify_time = #{modifyTime,jdbcType=TIMESTAMP}, + + + where id = #{id,jdbcType=INTEGER} + + + update xml + set file_name = #{fileName,jdbcType=VARCHAR}, + md5_code = #{md5Code,jdbcType=VARCHAR}, + file_path = #{filePath,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + modify_time = #{modifyTime,jdbcType=TIMESTAMP} + where id = #{id,jdbcType=INTEGER} + + \ No newline at end of file diff --git a/src/test/java/cn/edu/whu/boot/BootApplicationTests.java b/src/test/java/cn/edu/whu/boot/BootApplicationTests.java new file mode 100644 index 0000000..ded0195 --- /dev/null +++ b/src/test/java/cn/edu/whu/boot/BootApplicationTests.java @@ -0,0 +1,35 @@ +package cn.edu.whu.boot; + +import cn.edu.whu.boot.collection.service.IBaseService; +import cn.edu.whu.boot.common.utils.collection.OtherUtil; +import com.alibaba.fastjson.JSON; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.File; +import java.io.FileInputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class BootApplicationTests { + + @Autowired + public IBaseService baseService; + + @Test + public void contextLoads(){} + + @Test + public void test() throws Exception{ +// File file = new File("D:\\TimFile\\1\\仙桃行政村测试.dbf"); +// System.out.println(OtherUtil.getShpFileCodingByDbf(file)); + } +} \ No newline at end of file diff --git a/字段排序.csv b/字段排序.csv new file mode 100644 index 0000000..95fa18c --- /dev/null +++ b/字段排序.csv @@ -0,0 +1,118 @@ +序号,字段?别名,类型, +1,SHENG,省(区市?STRING, +2,XIAN,区代?STRING, +3,XIANG,乡镇编码,STRING +4,CUN,村编?STRING, +5,ZLWZ,坐落位置,STRING +6,LIN_CHANG,林场,STRING +7,XBH,小班?STRING, +8,XI_BH,细班?STRING, +9,NYXBH,内业小班?STRING, +10,XBZ,小班?STRING, +11,QYXBH,迁移小班?STRING, +12,XBMJ,小班面积,DOUBLE +13,XBMJ_GQ,小班面积_公顷,DOUBLE +14,YDS,样地?INT, +15,BG_DLTB,国土地类,STRING +16,DI_LEI,林地地类,STRING +17,ZDKJLX,主导空间类型,STRING +18,STQW,生区位类?STRING, +19,LIN_ZHONG,林种,STRING +20,SLLB,森林类别,STRING +21,SQDJ,公益林事权等?STRING, +22,BHDJ,公益林保护等?STRING, +23,BHLYDJ,保护利用等级,STRING +24,SPLJYDJ,商品林经营等?STRING, +25,LDSYQS_O,林地扢有权?STRING, +26,LDSYQS_U,林地使用权属,STRING +27,LMQS,林木扢有权?STRING, +28,LMSYQS,林木使用权属,STRING +29,LDBHDJ,林地保护等级,STRING +30,GCLX,工程类型,STRING +31,TDGLLX,土地管理类型,STRING +32,JTQW,交区?STRING, +33,DI_MAO,地貌类型,STRING +34,HAI_BA,海拔,STRING +35,PO_XIANG,坡向,STRING +36,PO_WEI,坡位,STRING +37,PO_DU,坡度,STRING +38,PO_DU_DM,坡度代码,STRING +39,TRLX,土壤类型,STRING +40,TCHD,土层厚度,STRING +41,TCHDDM,土层厚度代码,STRING +42,TRZD,土壤质地,STRING +43,FZZHD,腐殖质厚?STRING, +44,FZZHDDM,腐殖质厚度代?STRING, +45,KZLYHD,枯枝落叶厚度,STRING +46,KZLYHDDM,枯枝落叶厚度代码,STRING +47,SLHLDJ,石砾含量等级,STRING +48,LDLX,立地类型,STRING +49,LDZLDJ,林地质量等级,STRING +50,LDWSDJ,林地卫生等级,STRING +51,LDSHDJ,林地受害等级,STRING +52,LDFLDJ,林地肥力等级,STRING +53,LYZYLB,林业资源类别,STRING +54,ZBFGLX,植被覆盖类型,STRING +55,QI_YUAN,起源,STRING +56,ZRD,自然?STRING, +57,ZLND,造林年度,STRING +58,PJNL,平均年龄,STRING +59,LJ,龄级,STRING +60,LJZ,龄级?STRING, +61,YSSZ,优势树种,STRING +62,SZZC,树种组成,STRING +63,SLQLJG,森林群落结构,STRING +64,LCJG,林层结构,STRING +65,SZJG,树种结构,STRING +66,YU_BI_DU,郁闭?DOUBLE, +67,YBDDJ,郁闭度等?STRING, +68,ZBGD,植被总盖?DOUBLE, +69,HQJYCSLX,后期经营措施类型,STRING +70,QQJYCSLX,前期经营措施类型,STRING +71,QQJYCX,经营措施成效,STRING +72,LXJJZL ,林下经济种类,STRING +73,SLLYZY,森林旅游资源,STRING +74,SLZHLX,森林灾害类型,STRING +75,SLZHDJ,森林灾害等级,STRING +76,SLJKDJ,森林健康等级,STRING +77,KJD,可及?STRING, +78,LMZL,林木质量,STRING +79,LFCCL,林分出材?STRING, +80,JJZ,径级?STRING, +81,DJMXJBDJ,大径木蓄积比等级,STRING +82,PJ_XJ,平均胸径,DOUBLE +83,PJ_SG,平均树高,DOUBLE +84,XBZS,小班株数,INT +85,BCL,保存?DOUBLE, +86,ZHJ,株行?STRING, +87,ZJ,株距,DOUBLE +88,HJ,行距,DOUBLE +89,QMLXJ,乔木林蓄?DOUBLE, +90,HUO_LM_XJ,活立木蓄?DOUBLE, +91,MEI_GQ_XJ,每公顷蓄?DOUBLE, +92,ZYNT,占用农田情况,STRING +93,LDAI_HJ,林带行距,DOUBLE +94,LDAI_ZJ,林带株距,DOUBLE +95,LDAI_HS,林带行数,DOUBLE +96,collector,调查?STRING, +97,reviewer,巡检?STRING, +98,BZ,备注1,STRING +99,bc0,补充0,STRING +100,bc1,补充1,STRING +101,bc2,补充2,STRING +102,bc3,补充3,STRING +103,bc4,补充4,STRING +104,DWHJ,动物痕迹,STRING +105,DWZL,动物种类,STRING +106,SJ,动物生境,STRING +107,GRLX,干扰类型,STRING +108,GRQD,干扰强度,STRING +109,ZFSBLX,直服设备类型,STRING +110,KYQK,可用情况,STRING +111,PJMSG,平均木树?DOUBLE, +112,PJMXJ,平均木胸?DOUBLE, +113,KDM_FBLX,枯木分布类型,STRING +114,KDM_SL,枯木数量,STRING +115,WCL_ZDFS,未成林整地方?STRING, +116,WCL_ZDGG,未成林整地规?STRING, +117,LFCCL_DJ,林分出材率等?STRING, diff --git a/对应关系v1.txt b/对应关系v1.txt new file mode 100644 index 0000000..83775e0 --- /dev/null +++ b/对应关系v1.txt @@ -0,0 +1,28 @@ +roottable1,小班表 +t1sub1,样地表 +t1sub2,样木表 +t1sub3,没有 +t1sub4,幼树样方 +t1sub5,幼树表 +t1sub6,下木样方 +t1sub7,下木表 +t1sub8,未成林样方 +t1sub9,未成林表 +t1sub10,生物多样性 +t1sub12,经济林样方 +t1sub13,经济树种表 +t1sub201,灌木样方 +t1sub21,灌木调查表 +t1sub202,藤本样方 +t1sub22,藤本调查表 +t1sub203,草本样方 +t1sub23,草本调查表 +t1sub204,地被样方 +t1sub24,地被调查表 +t1sub25,目测项目表 +t1sub251,目测单项表 +roottable3,散生木表 +t3sub,散生单木表 +roottable4,四旁树表 +t4sub,四旁树单木表 + diff --git a/数据下载需求.pdf b/数据下载需求.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c26b234de6feab35f214f26cd91d9390198a2581 GIT binary patch literal 706459 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
  • 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 JH7m!mW6HD7~ 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

    d&z(}Sh4w4TPLRE+Vo;JX%^2bn{9 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

    dB2pQ}7K2qmCt6Ly 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�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 h9iiH7%W6Bey>;7?Pe{3G4(! zrOodZpBw2@kA6JA5^IYl*tK)o&5@SsFi@9^rRLM^9&PK`EnEUoPi{7aM|ic&dx1 zdy^eXuU8P}>G#~m&ty!foUP2~Ebb)5T6w-3 zSJ1LcIK_aj|IX3|-1}O^a6dGjpETu3e>_y51d(JhuP~Y#0u9FCuB+Tq-x+Xzqd#rl zB!4gPTPWYTF5M(Z-t1McQ8xoZOMyp{{ntgap`q!&wyE5h%;_ghqnQ5@$m~ihEYd7P z$kRGGJvC_)mps)s)zw83Oj0&#>dbJ%E!<^t3p(^h@E;pHH{9bIV$_nXZ8y%%-&lkr z5}^U>YnYqgIzn&IE-kr-I+%HDzlj26IWNPUuWWkcGy6v!kUPQo<|J{=g8#!M&bhQ2 z=lUj*%^3Wygox-aRp_mPcvjJ$(&$C8Zz1~Vk$$mQTm#uSOzLf{68=S~f`1Ty3G=F0 z+eaJ7$Da=Gyq#d)wF%i`+JpJGe7)oOTquWyv!@Qk_5ano2qG+OU&%}K8 z#2c@F&%e-;ZEBu5T={1;>e2mdk?buQi|M-EYizinIB5y%8Qycd)3;#oM^H6EB)ghv z@@KaN9cj&b$N5$5sWqQpX>1iNyER^1ohKa-)oNgN(91^~^(D%2q`^{_WWSydVR{BV z-@>7TS{236m)(}bO4 z!M#tsKXA^9_`BH=REBwBXi%YB0Oyn$|S(!X$ zoQWxLI)zksix;AO`QK$0+Km7Mu6Z#pX=-DE5wqv8(%u86B)DZzy~}t2W63{VjZXz( zT~7FR9xz>gBowl)1&8vA0jf{l54Uzbh{|YGc@p|wbiQ`1@7Us1l@G5>YTeB(5c*Eu zFQP%BGbZf}4|qAMU6_zF65mRTi<0!(G%X?MB)sQ}jG6LV%_>=l4yxIdf;A z>g-eCdqWzyG|})8WL-=KQVeVT{LTvOR&rX_G%~>JL&QaV#$+^7L67u}r~R1fy;e@Y zEZySieSGCqN~wMR7w3%g!@7!si1hiQjnU;6k`3s*(34Qqf0Oz@Q(TV4Wi5Yd052BE zdXe^vA`9@p)asx1D4D46Ax@ zEBsWOg-UU3im@R{WY6d(DiR(eN1{r^Yt##VxTS({KNoWRWNdulH%gw^^DTyuD;A>ZF=yV)aNVFIq-wX`1O(`>3KlUc8j&TxNe1(K2#B ztazFq7b0S=uu_sOI@V1;hX?z*X!&!nxIM|~WZMJ?BfdOl+_%h*-%9V?a=6$PyoDW` zj4tYI?7sDBv+lvo25wViXxaD7=;^ynM8BUC+2*UvRQ`eF@p@<4e}>~uTfI}xcIXB? zwYb%(w6>u?%FWzA1v|NfG>e+#O?PhnX6ne+Cl{=IIfX70uRk)6cR7__X7T$fX=|vd z?lYh*(kBuGunEhl>=qRy-&^nK&s;fu5)E+k=?c}0Ass~{xb2V1ijtK`@qo0ftM)aE zZ&_eoU8AZVvV?%Ji2y(%lzcIk(gMfMbTtOT0f+QW0%Qg222hYS`H zu22whG}xDnR_P{M|Fca4~XX|eyB$NRBurDfQ)OKkL>&Hu!td9 z_EuKNZjW7}Org-Qq4ZuJ;7Lvj86(-5c>%JkwYnW}W3MxeP-yv`!yoyjKC!)7ixfV? zq;cQBiNgRZ2fkmz=szaVNW-V)wEhFv!rt(tqjecse97*qAc*7R)1DSX!9?1A!*nW91 zsNZV^>&ms}`O;Dl)=9riRF1g3;5-C zr%2`a26i2sCS5I^#n&zVmy6M>^wO#2KD#V$*rE>O}cjvz`>2E#yFr^ z%d=M8jJMa5+}I}pbK|!dro&g|tBp`Z>n)ka5n*uIX@<^>br=nA4BDV@uyx9YoXoJ4 zdi%{B4~5yTQep3Sn$X50xJhN%JYYVA(zkrcY&VbOh(X6#+Y&k@wk7sPyZ5&i##kvi zM8C6&_=n=l-y=uF$Q`TEu{q=4&wO=DuP-69N7_`j&s7e${PpKsH8nM?%coOcIYeo* zP~&CRrxl!V98!F%~eHTH}iuT)(Bv^-FbY-vX3pfjs^i&lxYaC=L#VVa43! zn!U#7jc>Qewwq+CBjjW10VzXn=HKKQ%i~1>cdgZFapS@4$LbsQzt-!XU8!hHvly8Rn^CUpVQzv}^}MV&Kjqcwcn61yu?xui z1Zq>y%V?viXoPJRd{~TPDbi!_&962@w6%@_c@@r93kN4VfaUaIdvP4mM?mOLA`050 zG5S3UW1RAMVrMvCY*(4HxU`=22jQs{PxrDkq^-DgS$TUdsXZwv319@|gD9U2ejDpF zRpnYCCps7RUeltJ?+wmmuQ9{oY|D-@5F#I`rR1N)^#i)F`lSQM40az}S8NQvjsGUN zG7&5$w+pwswq;cm!ztQm{$fNP^X^rsYZ_D-U?$(tJ3kAY<}$RK;{y2DBK7_zby zW zC^!$#plAQrutwVqluV3xqGoej;(4}QWVczn^JizVi?6{*?!!S|narIwj}_3MjN4cd zN6u@)>IrgVMm0)H9q0S>tthFB{^3;{`1fYPU{)0a|dMa{HjUSSDZzy#;iF&tnlQmsN zH| zP%N3^c2%l!b7g>)nuE#fDYcpPt(R@mB5iO6OrK?5eHR(9e3iAl1`epLaZh}S>;vQ3 z>*H6Z2$EGK?%kZ~@`#}QU&6AhFR?y|&utuQ>)J=u30s`n*Yu4hz9Tc>PSS>Zm<*}l z`%ICW;L!iks6}$7c0Ay=}-Z2x>DWS zvq!^I*=-Y7<%D{6%mVpKea8Z5W4C%yyQRSfbo$bijxR!6m@+!Mp3^M*nzHbNvr=SR&+`_S?04 zS>dXveE5mJp!XZ)W!|_GqTl_^XZ3QBx;s-E=PKXIHK3AxO6%`t3?=qWbvSthvfLP+ zH3yzt^#ZaUmFLzQ$$KR(D-MhLO`GiTC3 z6Ju~OXHKq7>uz7aa-FV10OO{IV#BRNS?F3X2YEq?$+__Qass_hD>~O5XL@Y{rw&7k z_Dq{d$6O3YJNp~z()v$0vT78N10ZD$rgfCyOF>vZi5@oMu&lo7fFyj5LF5xUEGp1F zQ6G?jt zcwr~o^4+Dn_7fAGIJw`Fd(EIfEt`i^d2jeSI3mfm->colg{ZlBXeYoXD=V6>riEN8 zN1ogIJL++km5SrR_O{zJK?bsQrlP1V{nOr?xk?3 z!$Rj&-z$(}?(>k1Zo!@lLpfN>8ChKEB>|_Mq66-XK2|gQs6I|7Az&b)Xyjr;MQhbm zkkKU^ME%Xr#01te#;kGl(U9a$>REy_k>6kU;3&|QGkWt|uitgUaxEP9 zfc<6+>34Qwphw`^nVuZ%*!=yON5KuYZpVdx4OR{wxA+Pcc9=`3sGic-O&itJU*&wZ z?yvQwO}Py(woA$7J4k$#BT`}9H{nkvpRcN2uGK)wH+VTsGV1-hA{u^f-F;$$Eh)6* znp>^j7vtf5TG*3eBtVD0 zS;KR=;6TR>GOQ=>Kw@@M6^!jFuY;tX5%Ng%rLD0hY37?^7)@^wQElo=-yAWiK?lI`>jS@;!ZT zerie-q(|?ZHJV3#SJMuiSZ-i5Q$pf}pJ2?1_0n zbxO@ikm5%2!oii6)n6f~?)_s;=8Q`%$}uyY&_^^ZH{ll_^m{(uG-9@k7*^=zkUp zzgY$6jMhLqVk2b&UN$0LWE(aJGsD4BVge+gdH1a0r`Rv()Lu7sW4#;ub~Y`VR2LBA zeZ%&@EmPxI>BT!j1$;byq4iiCKwE^>R&mW}s*D#3RA1Mf(<#zjl9lWYB_Rm+j9WbEd7wx5&9J zFR^Q{|G(hv)74+VcPz)MK%ZVY;hTkrcY9Meqq9&$7o2~(x-$=K`KD2#(^Y6wFEg5S zODt{yF4JGv+ig9mx&Fk_*W^}qE~F~()HtuyMhd16b^F|1Tt<~W{_1a3Bv)>C1r1v^ z9#-_%#GOsu!sCttV6e(D>)iB6`-Q;X9c9La%m?xMsc+aNMMo5g0Q$+@5fXAZy>iHB zV`8GSgdnmA$bdU0Z2lOVxEZCFCwKPJsmdH&(eschlS<+4Z^7VbBMl!tAK$TQeW=L% zciumk)hXe4X9>qd(0XafIC%C+!rB|WU_Ixsww2N8p-^VoDex=8zJi}Zz$tT6isj#JN`-dL!E&M+@ z0|OERpOS|$<;fxsTNDpV%F5a^sK4fJDO35G6UurE?G=J>jUf{+982?-0vK){0hxf` zDlZQnzc)snSuZJdhA2+_!596otzdc=_aFXgmP!A?Q%}{LeA$&qZB0PM^40u5b-#s( zZu>%=#;)O_uvl5n`-tzEgEg*WA3Uy;e6+eF!U@HS_08VmW8|JW=?vm~O}mn1K~R;P zi=S_c4J+H#7jp@m9Z3QY!NvEM5DWfQCc(dU=0e#W>n^n3*GvBJdIvpJHh5g432)Yp zGX@ZdI^wea-;XksR2QEWJFA;-k;8u>1P@VDE(zS&iQ0@uFLQ6Z*Hq2?-eMN|w|`Pl z{66`$tHTKoVw=v+YqvG1#D;}<>tiFiqh-ga%h^^~lZk=h)saWuE*a|?k9CfHH-s$b zfF^4VYKpxGIoQySQ%YQyzB)l)HF*BNzR|GBp7kb732I*-Q+XVx(TlY?o5uBX+A-*p;t5n_3GXhTyyu|Kj_Q%BNVs zC&9rd?v;4E8`mAN5O}Q7)OkAU`OZM_Z@LsdC92 zI=QT<+QTbqI@t6&l&K1Vm-lCQAF$vmpZiJi;HnvA-oQn^Kxq5WY*vr)%mi1Wu0pE) z;a64`i9q@@~wlgCu7 z3Pjz=_Z*v(w0(iSPc*b6#ZCq?^oe>YXQpqgB(3y%<9fWzugyNbl<--014nKz4#*kA z#Ny^$fAg|POdbVoCyPncizgYk5-u#oH&)7r9LximVi%RYwcdi3c9*(L}9ytZu{C#5@?DVNhrei|GQETXLv_P08? zcfC7$ek)tzCB2y&=DxIGIP_h;lp17o3LMR?xo7aN&5*ZM#0qLPFyLzM;7gecDz{K} zIcH&l?-_f}dqLwZa}9?!;A<`YIswyH&W-(@&=Y-UsW#L5ub5}$i$+f2vL}lJ{e`x> zG!u6q5sJ`?aADJW1tLF`+01R`QtO!P26X;m#k+?sBn~9;XN7(A{bnCi@6W!RSxQ6# z;|`1bu2W)uGx^uYf1$^U?}=80qZSwPFz?{m0_qQIvxqR#2UECrgPBlCI6!_jPpwg$ zuqV?5SuQm5(yV2-fXLJZ^)S2WD7vwvO_~#K8<3K|pLZ-!fQTIMuZObG{L-A8UAg8th{Y|IxOU?zg4d$mcebsFiN9kVySZ=CBR8xI z>GQhB3bEy~Ryc4#9$0LAzOEhRVC?`LVjtN&UbR~~;-zRw`O%`LrRlx@x=!#7*xexi zBT;Q~#qO4s$+W8KqJN@Ie1G3QYFO6DSv&HqPE%NvHN3E2Y2pu?le(!`FNuRih3WR* z)_1G4zPF)A7l*=HPjl?TwTd6O29+A_7QVwjC@2+tmkckSy%jzBoZ~8vFc}tlICx!53Cu07wcppUOzCU5+jGnJsg{y<+efFVi!l}O ztLV`BtL#(@HzY0w(s_TQ;Vvx6v7@vY0Ond&FxP&`En^XRPh*yA^R99$PDR~Ky{Olx z+vAK=&50V&7L>lhzK*(?5&E^S&|q7vzLV~7fN<|z2;sOeFXE(1jxX7E>CuQI!mP%1 zVwK-RX(Rg8wxY?nUk!+>V|VA-<0pR>{JVeu))V+S7$+ zA4YpXA63V}*7Uh?A*-KhW>vr^5dnE<|D}?6{F8%KgRAb7$ER+KVBz;>!OL|4^}OPA zHmB~8{=E*RLcm|KJyem9Lp2Q9@|*vHZ64*ybM@%3q_EtZGb!%K;Mrnh$EhHn`89+| z*7=GFal-V@5bV`lNeRe>&2Ri08RI>u7~C$E!vgBD<^>nyb)1k8gwzX z^?~xy{BtXLZRB*-fHQa;+E&9Ht_Rja$)G_)l`Vnv@ z_bLv({Hjr2Qsu4@0yUPbCb;X=8nP=kT3hcPDnWt!iS$O*fTA_$)xUj}DZM62z&*}G zD+@yLilzjUftOclOz1~>ukZs%lgPxj9Jfj$)lE_x$DPWgTPOAWR9sh(T$3K9yawHv zTn6T7!6vUPrq@$ht9DozdoUV&0X^BerZ`3ZY1blPU#sMtIW;3K7```Fwoa6_UG(6r z+|i|5(Y}!`nfbB1n?ImI(;J5n&Ar@OzSq_~=^mKcp&cL95fG4(tM^)3+4&_I;)1d; z*+3$-usjaU)pBTiFU*k4ch9!=9IgnTnyXtH87{aqI@nO54?BLvPU|@M2eT=e;N*47 zY8T*T5bt!`_MY z)-&fXIpzfMSat!r)K^P}sETCDdH5OfY$HuIW&adQXtYfL!9 zwE2bVQQEZtJEdXu7hxZZ!<;hQt9BR5nRHI&y;12?NuEpC_6UvG%=!XH8Vo)-kYHJK zkEywGuyzn`{81axW0}tR7MDjnA*R+(jG zJvyB?{<+%sy1`eI1_79b#mya-_g}HkKis3VufD@DAi!w!Anc4%UDkWZM_KbPI{FmZ zmhxYolkW%>>fJW5rJl3HhC;N0zd&fk7(n3aaqhFo&jmOW`rW0!whwZ4lt_6|gdF`fh+mQJfW)RV#ktm zuFYRZt!AE^abCtM^V(*%4?!sR`~{0Fal6YeRx?lCil)H~1YGBajCy?2XakZCDa z)o(Qfp9eQI;=*IR(6AhYA1k)F%NzGxW0Y4R-nW3Bw#ulJZ@SVIsh2cbaP@1{x8spP z>;h_xZ(X{2>iyp;Gf`>B*Z1L!xGMos!*afE=R`&ec@}- zx}_&FNo1h{O}dzSQEKfLJ~@f5NVERK6x8Cn`f3U_@x@qYE_x=}z;qL}H{^uwuyxb; z1;nEaWI8t!7Ce(#*Ng`tHl8o?{DcYRegRw-y!{NVKtuRHB_oq7xR|to_eBcLa1M#& zeXHiMf?>_J){LNRv~I{wF8;DW$+^^_9e&GC)E80w8VEyU5|1l;P( z1u9FaHW4GQ`CzONy{$BvTXSXd82JnCr6JDaljJ)ehRE-iy@+_h_-X!U>De7npzId$ zDSaOdMG$?$oQ_bt&&!bvYkGKY*_<&Ry1wJT2U<&d>)HlSaU8Z(QT!N;9`Pf<;p^~c z#@^4vQQC>bZz%~Sny)220!-IzTb;*hu+OA>Hu3LZG^OFuwhI`Vh#f8oxL!aHJSqMo!k!UYx~@G7T@Fcm?$tfd;*oSy+;qws`nAi)x$L=?@lP$P#yKfIHO zA8ZR(mXDKR)$an{?ZiXy1Cjh}cSy@+#?w=^{R!jvf_DWD!G#WV8^IDD*IjM3w6GuzNuD`Y2_0-?S@>MAaeosiYZPOzjs@qHerv zpPK+X5__5hs^N^Ue?>F&U3m{q6ee@F=1Z#oi%7#k-{ zUX1y3^0Y4yCF;p3tr_(3jEP?x8sw1lQT(7K5`Jq>J>BBhee{s|l-EzaF{Vcz%3uCP zDE|&hqeyt1OdXE0QwyCwGnO^fR?c!d-9Xw>` z_3a3q{`r-A(ofazkPv5RLz1H3NL83W;hOpT0?FW5b;PU&&i|%j6#(TG=ttTR{$?9k zfXSBR45`AV8?xLI7zyfGJETUZ@Is~ziagkhPw=Tliy>3?*CZ*Il-CPBz-Ai4OWHG5 z)7#kkaRaTcLlCdo=)*-xfV0wnd8F`ahWx(LziEGitr`wh9T~E~YbIKsK-+qjzo(f; zZ;Vv*s1G(=5eChd5!wS6~Cy&o96 zDt#mT$Nml2-ur~;DeLn5+5BXfrMU*($mGFl=k&Gy1)& z`hUWWfV_-ARx!qI)EBs9o!~NY+i|KX^o38c9A@%s|JOb*ULknnba!$xHcG>aq2<-9 z-Oc#$A+j{fRbjXM3$OQC**YB+BmJHj`bJAV6sumkSD`_8?^-Z(Ydqb3e$tgrjLF}` zU>VZmVhg{8DKz z>4VZOn&gBjrI`yjDJD|=#=?6dRy=1P0wa8U+`+g>q z$`B@99?*2LE&f=(aCm|lf26Xo@6W{jE0*}-^=2sOJ=MXO>r49smCfY3eto7)fd(S@ zKuM;hoE>Ut%V6u1W#et9_1Z{%;oCj|OAx3yj&DV)!Y0t=X(Chy=@k)M+93T%J5v;Ot9QXVOu`LQjekUkn7`2{*5){7kGR5?@OhS?Hf zKRaPL*0QrQUq3=E)I|6S)0Z6vVN@`k$BEGvCgIZ;YPwg?3p1lZ!PLIj=HaW{ zy%ML`th^++zLbfbjpVxEZjyU}s;Arb#AwZ&V2z{<>D6HA~RH@o^oER`F;L*vO z+RIlmhIYA^S`PzV*z{=sL;w(#uX_EQ>?b~=V{QCzLsIO;2oItA3w>SAY1#kEvo*Pu z+c3M$__!By9qvBqPX4%XK^E+LX`AboPe2c$hb=J`o9wu)27v$#H6&a)s_qe z1yfemTy!c@mxIKP`ObbHfH+kHS`XNE2VRjJZ@`ws2)bDA3}PWpM|DW5J^7miQi>Kc ztRtkSW%RBDVOf>Zy=6TP$I$tF3&|svqseR;Fpcx+GBBI~1!ai;x4t!U6`3O(cFf_P zyDGYc1df53b{j{-yf3SidQ~5?5gUveu5^iK8u2?mIJdzcjrf6udi>X+uM3{x*nzQc z3&jWPnIX%WRZbAt_7}koY*te!!3E}Bc1;CUCF3njY#o8$$3}XtaN+d^0v}1WB&jQ= zYtnhDcr5@;tErVgheL^kfjL+2_B3a?%&Zx9~-IsYT7q;J;RCjR>s^j>B0>p{QA;UE%&tfkNcjGWVs!o2G^ekpIi$^x|_FLT0Isf@-^g`bVz)-F$Q za6yF2KsuOM_i6h>f7`s5zp~)p;=>}gZ9VB+g8=GzEZO=-I@^s&Dju7N4uiqLp zK2x`KZtfyX@+FP*6mb>!$#ik$Zt5I*^Gkm;ReHMFSa6#W#FJW}KTE2QcWe9r=%H_W zBy)X4J2$P8y6L%fvrhK1$^Jlpf-lNvWFacmuBHkF`5hin0zF>`${(!%l(}}&9c1)*V@rL>a`5oTDh6`$ol2?_>-i>~T8lUtQPjCL@^oP05hV9ap;P@q zoSXalWC-rTg1YHHOFzT~y>B)fn3kcpWAC*&kEpn%Iv(M+nS8b}1hb}gAwSLOMtX%k zRd0C#5%K5loHlTemNR_NA<|grQ2E+p4!eN~vNB$%h%9Wvi<`JD>W>wdjLO|X`f)oF z&X=x&zN4I&tl_Eb!wP^S&5<;u6(a$WR4{$_5Hx;;cP0}|sXIhFwi)A-fm|8XLIqhD zkuEOwPk4-z=##}t_GDHKxTla1;(sihEGYj(r&`&HfpIqjoIG@Bw2sKf1cPY#rfl;x z!AO?*38LTf)j52SM^tksa_(aE>ovz$&ehLvDviBqWk2VQknUz5_U%D?5ig%B@qgNi`Yw zytA4pG=eT#3%_RP3)#)nSyhgD<<^N>!dQvals{EZkEnC555ui|TQalGU|6M?v`Tde zOuPAsZ7tBvh;FoHh;ZbVoj)wN=H?ykcbU}jrQDpg9haw{Zd7?joZ_2dRj5^z0q21-k!lvFH%A}b5(hQd3J%vL9i|q1g5SjD zNSioz{%+qFPAXK6{{f##dTbfS-9^?0r(1*Ky3ybY>z7@U8LJ#_L#SLnXt7DtaAlFH z!;2E=CvDFl$(hTN%%~hMKhXoT#li(?rBsKhjtznpTPx25cANr0n}4>n1?aGJuWwC) z2W($OU8^vjGHNL32-(~>qPjgPUYE=1wI~kzwD|&Ao>%jAEc$4QChSg6X$k0>|Mi@@ z`=S}v3J=BKzvv=73-W|#G3^H3UUw48R$iA}m8nksHRVJ9S@0A;hFoF%amVKd*W*I? z?RiL<+z6Ti>d(`wm6C}fXYIee`Z3jvZe8a=6$!Ky2+38~ts+!Oap7~sC98@xBZ(n8 z(4SZwfVBVam>>NzUD`>}||Vq~_d_Ez(oqtu9pS=}~Q=)<&>r!XWO> zmiwmh?PR|G*cDO``Zj@Bk* zT6IIm^j<Oj1KvAYUwh279e*?L4*dNMutDY6x`={-pkjC#@UzV;VA!p zt{Gdwy-Zl-mHWGr1xZ$iQ{LTxf13Vh6pAXnQTwO%% zdkd<}b>AkLM9kCLj5SA1T23+^Ba&+#3&p7J<6q-H5u3eF@a|Wis<|Y0k8^rKxg%jc zS9p^(GA^@-d9qe0xtU(HmSVX;bxX8i|GlJw0dIO&rbH+!uw2bLF~Rhwbfa1=(Z5?p z7(Dko&vILZzT@GWest|B|4)wiZvN9;`_-{=9^R^&+}hlh?)Yo^#oI_(kSnCJ!SH$5 z8%!9FQYRt>Y?VK+6(eIZt!=}0T3~0*a~0r}hla06eI*vhCezl^Os|yZYWO($?h@>z z4A1XJ&#t6+f9>bQW68~4gbM{MW%A*I_nc(uo?#{b?@*!*U z=B@a-xS`NI4hK85d42&{is;RKD9kaI<~ErG>WJ==u3mUtnl08dkqkgtLcM; zg6uA*4?`m_oQEm24{2J9LuekzEM$^*d;NxR|0_99Zt{N0p5W`0v%WLjHGps_4HHqd zw^$%gbX8bL=~%mT-ZT_S){oR?`+AQL&IU#rH}8o&8%INzUys)Ejaxe2oU&!7M=U=S zT;BG|rRn^ZIpU*MI=5u@2HBIKufDd(UbOkyvL0Z@(}*l>v@s`BX<~fK5WzGUO^7y%_sOnN-Fxh_2r&Pa)N|vuN_*4JW}dx2>46;sxrRd9>!_&tXhfk@p>GV?BFH(`y{+3^r-QYUT;36p8A2iA*&i$FV7bQesbz!s2Jq(5bssN! zcEFM5o2eA0D4P`E^&9I9=3nqrW?Sqb_=Vfc1nc`o02(?Zb@Z#&XXDqlb-||1dl9EA zChZRh0INo*eDMJdHDvXn>#nQj%SYKgE2dMK$z=yPm^|qPRlEIf;aSF|UiO}uae?*G zf$kd@;!2ElsLG!fB94ARfhFPvh5A1=?&!Xd71=l9p@X;y7256|`oJCmUt$&v^sg!z3qEE}YYc=G&XVnUDvJjrN7w(v zyzDPZpfZt57emRS`wrvp(RWi9oyRI)S*m>60b%bM@_1p0fBXA+&si{J7L1G3lH421 z^Kh8msNSI|@$$O{P6eY@yy-oQ_hn8&lllCs`l@^o_=;?`-~;5r6bs(@(#>*v$J|DK z*#}U=*B;9Aowc0g!gz9s2irKVb%e@DFj@3^;hh7N(6`i+J*5fbjSt1t{uJQR1K$Sy z9rDBg5IPRw?}N=ll*`{^x(+Fn*Rf$7SN;Cyg&`B}*;R}n%Ys#n&IFuV$*29-u?8l8 zt$MNS=5x&~4MdrZ1tz+`1AjHqQW)-gmG6~xM+Yx2E0)VE-kUwPaUOIEE7^gf2ij;G|zuuuKmJP2F1@beXjZ+`5XzcX@%%J>2tWIs|jo*t#Lq2MU8OV^1X_!(R#)>2d{r= zSEy5gSGKc2I^4wUl52Ep(c>-ABxKs)XIK3Cp*kG;ffv(F(|7#E;xaMBkHIYWX#Eno zRJi7tKn70vHr zmhp||ab?6rBaxHRB$M`22#>jiJRh%8k6zA}SUHYN{Mw3+S~cqXN7GnoeoMNNi#jO) zGx>AzPIlD;tKWSFx7h;+{4hyzB$q!>8QK?_g>u%sO2B=aMUHb8y14EK9Sz}IW^Zt6e+ch7Px+1BUA%5sNN-69W|o1xxDefgTwKQuoy1KW9T zcdvdP0Yn&jQa9i5nQ>*?!-tWf1}X4TwVVCR=|Gtwy*c98g2$gR4^fGh3LUX-3-(Gr z5g^%`yj&4ZAS$G?Z!+)tnjj*8<_F4I7-KCM0#Z!MVw0zr3JwQHICt-fY9Ub_#&8GbU=Z{%O_I<{zwMnzQC#XJaoaP~A zhS6JT9_*|jw|HAM@<;tfu5>0`epzom(_!*^ExH1|E2aOd8pLbpTa0>uosd6DD0-ql zbG=lN79s_CK~DZSmQGF$jFq(NU8(#4&3n8u~0vwkHz!645) zLpENK!2jCU@}m~2e)?)jrYud;0(g3&XX@jMUb~5(6%YD8wIkC_h}x^H?Tq>?QvRE? zDCFsxc++Ac?xGGoc zvmKfGc-GZOM||^Vd^fl%+*TNaS&@ThTi;ELn$GOku~oWcS+m@%V{n3kth(4KKgpij z2Hi6L-N4L6E zutuDYdX9)4v@mtY=Z$C_wJR6~E=6OmyRDoT2X~aNNcbr<8Vsf}os`6n}_v zI&(OIA)*)KKlzEb-g7LeCO4p&+I!pgGqOfG{1fG)J2xEkb7=?WN~JMSGgtTsSqA)Z z#ZO7wfBPE}*8l2|;o;F-B(lYpqcqVBqUGJsuu7bhU$7LP17t9N-`9;!O z<>%b;0R1XVptbl?Sd@Nt7(V~nYB1-5B>zrg08T`8 zKc;)G%YbZO_6+3!(3>?2xoGd}@I{h4QXC@SlBGZ=5`A)VKVbVL3tiLQ93VYC861`Xj@Iu z_HUl%H+Pi^J+{69{2BRg)Y#7YFJt479w__3@}E|pNvq1yuY8H|RYl&KCM?~R8^-X* z+k3qF06f)Pfx4_=SY5Dd*18Miy}#dPx3rb?0dNg#N^2sj{wzs~);HD_xwLNB#q%9tYHwIL{JU;&A)M{m@Q(Gk3vs@fhj|2Gy6rm!K}F1@;u2onC@(n(uj3Ts8ixa=oBd2;7IW4s=go)N_41<_6&Xo3H?^` zQ8TU@iUpw)r+mT+|;vO^Omvhfxf_O&x2zsRhcH+vk49j)`5{HWd>=(Rjbb& zP0Cw=B?y{_KvKg07Uw=0wZKbtHyGj$=TQQKPavA^<}y^8_s|WcLzAAG&} zQf>#Srj_ie$+ho2XQEiFxaL_YrO~!3m75?_uANN@0CPeG0=)Xq24!Wb( zg?Knvr*XwXGNk>bFH~Lf1XjYll=i2?FdAO*Yd|M9i<0%rULEx8NKb`Hys*WdhXf|U zJ96ivtO`0A;bu)rWrs9Uw|ipKNDkKS^SGm!zqqt5bJMQ;=uQ(n=n-yJ9hit%J|2E- z_E|yFglCPBDEh+C<_F1Isu26*N-A<6k(-4 zgM_Lx*(&z}|2!2gUu4Z5c=ZvZNH&94WDaL|Pn2aSn_a0#AJ9crY+g9Oc@_H35fJAC z!R<%=!ltVI(BzpIB@Jr#D;3u524BuACB@DxGqhO|Ra!K!=`&;8lekl5+m2rQW)YcidDPvl70S+u!|4iCvgUJyz8f8n)!{^M_ zJo4kW{R|4entbjaI%*03o6RCuGH!jOy{K8pRUR6tUp@(y#=+dzuLzG;I+v_qs;9@F zSi^K8$7)i%=nZOkx41uVhx-IwT)t`Kcv66%;McH-9Bjn~ z;X7Bu5EgskMNCU@w(khyj$V74u|M;v2M(Jg=IkZfINq@r$F7<}6^ldIckzN#a9detKyki?L) zlK$jR-1OJ7L)XAlquzV*(ezHEgNB)03wv3dCFnOf|n+L&^atYibq#!@ihts+kZZb$*a=EdwrbeH`c~Cr zjq>7Kl3rGiA^|};CPpqs&c9%Cf~sUfvnts?vr&imB^eL35i{F0z9XdP+fYhm1kGC? zxh!14!1x99xbE}R?G~!=%JsZSKlIW`_2+Bpowd3udmte)8Gh?L z1+Tr?*|&6Oa$~TZw^bR}p;+;d#&Jck9X5VBa$evY7?vAkYE&6YP;EmhRb-TiYF8#y(_Zv+ep{AuPQrzj;l1`de5GAvuH#XP~kX z*Lz1v_oN>iy(Gg*N_)YpTQ|LGvfAIx-!|g><7vD@rrvB(_O5%ezlN}q%y4K*5_*tc zM%1A&tr&w|mp^#LfWhY@a`xJG=i;i6?Rs~{)S?6E*R##+AbGnX%&rf}VBY0dv0uHQ=?r$-ZiwmsWz%vye|VyaS+}Gg;ZB>ZHLEw-9q_tTFhb7;WgLtWCJ`Kj zc$1q)7SXZ$4>o z70R@m-%*RLSLom?rN=qn$;!I&!7d2xn#@fPl#8XpavOX9s$AIzEYpobrrFKYlZu*c z7qo@oM4)5b)>{DtJ+ zrpK189~M#;g2!IC$;aW0K?A>>%OOkdqyJbH_zS|7n6UhgFo)s(;<+yWV#S?E_1b3@ ziA!$~eg^;O&D9m>vl@X7GRLL;4nMtO8D_FlDB_t}c=>dPJe!+et&Hiyed@+J>^tYy zqwwY?>o%9zJbnoM7O@)#AjpDz{t?Tg%(@lQ1ZZG4=k{db#*K;x){jBj!g|9h!K2)( z7R&XTqc?xrh2U_Dg3MU6*j@KbL97Si*6q9J)z%g#3O{w2Kq7t>r4I6HzVS^Nw&h_% zJe)w8@8gM=nyX)99CwlQGz;f2yGDxzS?)KZc!60}uokye^Iqn0bX^Kg#XS#$@TmBD zxiG)_b?9qd!;G3t;jcSw>Gf?AW2fhKiSlS-OaNyv{)KCl18OVSomLeVOOUi{_jbo* zz-xhp5x<0<0Ms&wQ}EWGj@vGpcH-$Hg0i;14VJ#?KVYXh0v8z8Txw!_F3=iAH*bA} zVbC>xn`*wT1Cl1w4cUrxVo*w1}dQ6j8e_l?<*tV;DqD4uqbA%^GXixDaE8QOyeU=fsNA{yH-E zmf$hWA>>-sZGEKtXVE=gvOx)v+;{6PA@7WT@0*npS(e4$Ql3TMYJ48si|pCnO?ZrpazC{1 zEc-lVHxQteias--rmno|WkBC^Dsrjys#1TfstFiH_OcIOP3zaG%LKvy$?s+=HUE|M z6Q(Aoio7tTG5PZGN(#27FV~v8sv31qxHrPZhZ_<6-^$~N8{t#gkE>R!HaTHn>h&)n zEd1?&(azq=0f8( znQ1fW%eA?^jF{b%T&9d+e9wiKIDE(|wi|#4C?pL zJvOJ8?LC9%&LN-wSuZ@{pu+vUTg`A;$QDK2CE13DmEBvK`@V>yw_X1v29bM3d@DoI zLldQF_ey*XGi3aKf{X3HSM3VvLH1NVN^XLySuW-xr;1dtaaeS)M3D!IZyU+g?+OGA z;@R%Z8tV{NibCx|RCM`WyYc9_$nB_2q}E}@r#f?fw2yrdZ-rcioxO3LoBJ311L5bO zjHqPfn9!uj_^9@E>EBwb$0NT!AMFasGrP-o zSt)Ncfq%#zx*DWrf&iD0byaUJ`OrZJdPbB7rSo&7k!$|qw^$-1xFZB!E^j!ksFDEF z;5#<;O6$sjf;Nf)lWx8hw8^^vy{)4c*%Jvg5Ir&lHY;_Nf*4K5H6LaFgi&_FOgS_ik!(T-S*cc#Nv zV}kqBX2ipCQ=pb}oo)$XA~yv#OhmSJF<2P8_V94P=TckaEXWSv_7}G@NVxQ!C4c@A z$)_!Eb8A&)<4ZdUz#Dd(ZTP-VBRmX2(QPnA$rZPSF-kn3{<uwn@6F&BawQM`o8ztqjcjkH@sCm;DahU$Sh{@*xVKN|w?9=8E&>~R_rcGQp4c4J;0P5 zg&Z8sp)HLVF7+VuDpnF}P7C)z%X;eQoNn51-D)fp$hp~*V7OWo`(zU#`5HHrZ&!(p zih@cVB~db~4In9ThlSltSn88_SjJT2UBV`)1I^g>s~X0`be3uX-|*MA0MhfUsl3Tl zJd}^TA>M1OeZ0MtDfNqMT2GfmbkZQGrb>XLko76kIazp2QC8@nNXWoaO+05}Jc zZlQ)`g>(pK$h%or7!t3bNO@9GSNAid!Y=00LRf7&!ns;3G&5ek&;GoT_6fvqB}~R=781_|R7Y!MP}{-+1!ttR}{_7vB4w6kgR6a63m-}`00Gqutc$t%0KtnOhm zc9#HMac_w?N}b#4=jswNJm1tC}2mm-v(aw0Lo0B=v4V7x~x01$}IHYjO#)VADK%QL$_Mx83L{&%hF z86g&Q-I2)^!J<_%*0~fF=prJ_Ht?>VWdx0LsA&&2KCX(&WjzF4IE4U@cs5rx%nn)- zFUF=~FObcmNIqi)9=^ZiYh$zS12A3NC!Tv%mP?#Ub5u7aAZEh0y(s+L2hk|gbo-Ng0%3qK3Eb$JA>g>r5Kv=lXxbGTIE zPE)Q8YAyi_G`fjuHqJh#%Nrq&U_j*EQSOUck<&2{c@L5pmciJ|guULd+E*z>1XrNz1a9d)j78YGy^7 zAy)M3qmmHvFJ$S?c$!cln@!$vyZrySu|*NTAEL`txXD6{d{Y*>LPz#1>N!|;vwZtP z$SBr(@Lk@H(ABcIa3*b?vZCcZp)6}=b-C%e4fcfw)d>5(mkv!t4Y^g}5t-rHyJxM2 zDG&9xcpJv+t_x9HT`~`j=!waNY(M}ZGBoKeuP1gZPz$#x5!S>>l`(brVMS%yGMwK+ zR<=2OCH4E~wvh^gn)^su7onL8;mr%UqCn_0y*x}h-^hVr2z_naA&Wp^-{tt({Ld$i zQ)m@3Es?k%CCIDl0;A!=GISP5PJ`o5Im@k6FS3LgSaW8gWj_jU>TNr^N9xVx9I>8O z5DDi@0P@s>wk%HgKZedUE~)$rgIfzzZc=daNplHhjL2P8R`Fe2&8my!6goW2;?mvQ)kDq>(i5Z% zE^9T2wuD0XCx;J-YA2ZT5jGKkCfKbLzCYKu^s04xzGUur@yZ>+iV2IJUi zgyIWo7$@>%wI|U;Cj41YN-xF(2_6EDF@DGC--CsPid44wI;>_o}iRAo*Z5Ds{z$iMo6 z(uXM^Nh{`A^%ZhWi^ou|znj3{jRa9ru}rW?U9qxtug(49)PBEqjqTgRlr2!+Ce0Vq zl%5t+>dr=hBBxI_B$C4#TN#j|e3h zfkc+~Bg=Ju3Nu;l*{RZ3SSu$eE*0dAlNB1OGPV$G88vn0vAOFB`taWYd}xdeSvt}W z^2csH9H?8nu4=zTYA<46?`x3dgf^Jy$t@TnwvJ$11h)X1N7}u(-(qr?MJqrVTv6k| z6b)IW)~2xZYE{d70666=SH4PwAEcMPkxD7$)y*Gp7;5Eo?uGBHS$|Z7{=Ilj#+9N< zpIJ!x*|<2)Pot|X4ABdu&mi4;Fmye+o}!d~P~#cHJ04SBDFf+S1>h?QsJ?jJb*?*& z45Uk0jr1f#i8P zn~@M>O~K4`q#7q!rivsU3n#uiUn1t`0AEd=ggPiz9fPdf!>jesW`chK#uT5iv8LiE zCZ1MZJ2n!+L3**f$7`7b^DHrM9q}6Byg4Hw!*J1Q8;yflPbvHRBTdvl=7rZP<%KB4 zwY$Vr(6TpUk8}uOw>d{td%QA^w$Axa6#0dup7tbGCIS<}Yc4ErhUHkXy8->ffN*Nj zZB4*92Ow%zMDcEL+pa;No409h30CSvMZ8jS77|c)NPM(0|#f1wfh@&^KH z^v=o4YqtVhQ%=6JSpqdyw_MY3z)+?CTYbX+3)CqB5d@tS$IAtk`_8~EMqXu_@Da`l~!0_x&#{GbY4o1U&p-(e9 zX62xrhJP}xXN-a_R<@vXzZu5znk+xj4TCf_3R(rDn(RLqUA`7US5|7}sTZA2F@#Ul zJoR_QePVzczawFJC?0e5(u6!T%*#Y0r0w7qji}iP$ZEK)R^%sw;$KHq5Cs$D+Tu`C z^NDZxAjg}<9ob3!Ow1$UL=x8xD!z{`tAv9K#eH(iut6JHC+RKB z%fveB{q&O{hJ=VZMj7%dzUVgnLT_)8j#CskM<98GV#`vc?Vcm77;zAn{kjL3?HKB? zP1QL2fR8^_v!FNmod%Wt`_L9}aEZ1IO9JbQOcl2oo5S{maN$oVb^`RQlYUP#T|&fG zhR_{gZIdQC7XaRMH2~p)uR;Z`E}inW5Y~hBg~uuu9PNurzu4c5|05{>V@8Oc8@oHh zySMH%JB8RJI0=b6vUt|~Sky!{#;kU~%#vY(E#IqogUb*j0$ViL)&8M;pV$#6mc%cJ zr6v8K{t$kdKciRs%a}c(Kx)Z0B1VV69JS}=e5t~5MZ^fSsa?Uu1Y%KL>MT{>XJ{UN zbPIRD)$kxqF8*hv!}%LltK|d=Tk+XN3!qg_QKW50gJAtHMusLR|N7f+Ali%=)tca= z#Z~v;&K=hj@2f5xcJQ75Mj___nQ}aTVVkz5p8JBrVCV$bpi0)#5OUs*BHXa82je#^FiGevlnr&liyp6t$EAxu+l6ieq?w;z*P*!oIqP{D;%ovhT70Os zwD437qIPfb@-uB|$>+0k>%So4PMxz+1oLljFNkwh!pwLgKDYI;Q(2uPY>UEb)3SSE z(@kV3vJ?s)7|fE*k-x8WR_$dlf#L{pp%(8=@)$p$dq;*9FbN=_qzV}JZi+n+XJW!Q z8?p!Bfra4_K+jW`Pkj}UlUg~qOER^;*X|BKdk=%sQ0W`?EphbE z)!u5=$8?}mOjV)ol^O4smd||bs;a}&yhq2uj8%_18}3wE>@&njePX5{e^T70?&_na z1P01F1c3#ogSN8ute(4n9S`8mH^FN4!?YFeay-+oIT=%b55k!)j`_m`Y>tQ`)`0Kn z2xwz(UXia)y`0vv2X(MHk&=bI5Ltpe03b!DNmUX@y6QKW)f`<<$V&g16tkPwtt?%g z$dRB!{{137p>tFIqlzS+!n=kEZTp6;toC=j&S6_8opZp8r|g|9-v=3JECe2A?!e`U ztIdc5Hj@xh(iVl^SQmSwx-?XgTkGOhvllib{p1nQ>c0B|!x+kKqc*pEy#PIMDjv$s zf^VKBv;-SFGtx6fus$D4^ zRFq)aLMSqlKpx8VY=fKXP?uQo=AcDsIT8AO={R@q%ocv?>r9jK-tZ0d3d{8v8TJZ~*?T;fBDFxm-3w z8`u^TUpPx&znNwkIw@&0(TBkSF_^>Xe+9PPetMprxM46Yq^tdiCLvLuaVQ&MFz495 zT_jN)caT1T>xw3dDGurPTQ$OBv;nOawi(N<{Qs4s96fHCxtM~8_zZI>#9->0DCsIFtWW=XbzV&qyf18~(o0AeJe z^JPR-=#cLEcB(V zpw;stGGg-+F0g3oOTL2NC5`=})bo6yw!63$#pC+P&$0;vr}P(cX%zk?fx@JI?mr^3 zQ}x^JCd$|;N$Sm_(}Q~*BA=ek@jYkbe@{lY^B9cwrIQq~Ksd{`h_HX?iPu;1zSYjD z(mu?%OSCAdRup<^^7`cDu)F=KQ%}8?=?_hMjcToNu*%*i9_Pp2&`xR<{2Xe#rR@)S z4+G+^;A1}38bD0=|MP$6*r%$A?$}J10@(`jRn?Uado7i{#INKy&``#_AvVl{0q5Oj zG%E+cG>>S$Ud)#?Ct-=y>rED69nc0tVE~R{1!&5! z)loS6t-2T*qyi_cfIq(FQ^fbzb{qIRD45=RimYtsm)Jnn!lsA06?3^9MeML{S zlfsT$4=8l|9jZjJw*?V(wI`bsuzNU_J$ZTN?PFJc#Q-#?ZWgV3-dXd0L^~(3kWMi1 z9Gv!Rn;H;*b@&ti3VIm1>YTg)mHC-1C5qo|GI+iz8)`Nt9{o;Rc7Tg0eEo#Ds2V!l z${0*GOZ8e3S5FN)Uou?&Mav#g8OYq3bh~>OGt2gzA~*NGpWbS!byeQjy3Da2VY{MI zn2P^73=VbM>)SUsvq8dJlHa7KJ!gdlTCV+%P(Hk?zLi0Chfd3mvTxn2M@2o)SNbN| z(kML}i<@sV0*_X8*CS>~liIi+3y`m}$W!OUW%P%)lc!sE%-}#NHRb1BHC>jS>Vt>Q zaibE94?KtN_m5=`jjfxiTKLjnQ3s>YB1`s~e;y6SGZVchVo&7GHuDK^K3@Fz!T!mG z5!)5G_K8-@Ts}lJwF_osa*7*mzSuK3(%1Spuyi2ij>rA2upWLBEandL#R#k8mvVE3 z>WK;iUDS-!L2ZT}iS1Au&e8__eI-~Q>8&|f{>@-&HipaIF8rD0PKVc7g6+7`bYIazuX$Z48_(I!w^c2uT`vd9SFo zQWTw+HPE~<0}pCe)A*C>5|N^FN&-CPyP&tP)C>H|@pMNh7Yb#R$3Zme9~96Nx*p|0 zy(>bw_S~9rqv7k}o+`BY39P9l?SXk_QOW@W8fZmYh`El`Sj!!dsbbF>w#Exj!5AoA z*7iDk5d7u6QePJ&WeM2Y0f|Z8yfyndQ#@mD+rbK6-np|+BQe-52&q^;kFk+>0RQ4F zcSG-yG$XTO)k4Pe#S-iAjE%JYjiJk)(M8UARwHbVgf`Wv8RmY*?Vh3O>SOjDHoe=K zi(e@LpSJNRhQWr9!y`kM5NZ7o(es2N8--=u8m6TB7o&8+S&Yj(UlrAXVO8}mXy{_& zGIEY1lkV=8VXCD(mm0@3o&TZsMf|$_XycSg?Pp}#Slew?sNLr4`7-=m;3k}x$s=2V zOgzpkP#iMq^K~F6ia;?A+SoG|+Hqs(zGI-n1YO&0W6#E|hmR-7twkRd;$h(%%L4EW zBNM96F%{l6zd(OHVWAoG%)K`qn!c*XRsM&VWns z;iICTl1)=;uMK`Q!{aXQF`$q6&2d=!m`o^`sHOb8{`Gmu$O_gutQp?9h4iZJpV7-1 zTx1s5?wveLi5zYF?8+-d#Ex**idbDKwI(%v9rn=%%;dD5?Y>LfmwYQVSPKUa*0R0A ztZm&XaVk0ZHt*PscNBQWiLAH}k3b1TZ%+y}dqgXsCe3?UK|%L&cs<5oU9v z6(zlO*U-~H+@UkiAkN2)h`0~?*C6qh%E6v&3u7TIyZyZ*yG9Q^yrn63wnRB(V;<1l zLp@q%A)W>)Vpq3u(BDGJQ`(6pm%&3d;F)ws$R5+77YSye>{LLjO5KZwzc|UqqcUR= zGe7(H33jgmOrWM{3uqT+3XcBx=nvH})_+j|Q9I9v?(cP~I+B=V~-s zGu{kG3ZP3WOAAJGdo;LY=~ff7u%o7jjj14wgU>8&WxxM!FgDf_AIPLUzD!v#93ne| z!->`1wI;&xf>;Oh2EU+tyeLtpt8cR6G+EWw1M@`oDDH&x0KiICF56k1UV{nw9ep>H zP$cqjR`YP2>&hWPQ&*sv-*jthKKT!%`GpPD-8b1O9Ecc{G|lSoh2^hBo?p>yD&RaNn45^M%Kb?UMIvT;Kw z3r1JfvqXHOhZZ2gloe-QDJ#HP^CT^7ZtI^HEh0AUn3Yzig3|c&e370PpNXTvm!X#^PeeaA zF}K{6Emr0m)?Jo9NqJJa1--!a z74L^qu54BrrkapFlYxjweq z@MiMi{90NAggC)Wa73S-92wh4zy;HA^|+;RxIKLxA)F`{1-f0ZAMtXAKZo$QwsD~R zWgv6iC2hr=%J=tXu1*5@eD4VqDPqa{1q*yKfvD3;J-nr76@>JBxeuw%>U4b-Bw}X8 zhqQ%^^M~P>4)mZSWN>Rw)ZBgx*-90uIYSv#8h_(~IvOlH0sMET@M2Opwc8hcMjnt! za=l_^a!mC&D?E)Jf05umk>^1F2;PvVlP-sc)c?l(?)}BoW|dd|*8k3hy6@9T{Z|Ux zMwax8TJJEuXpm%QceU*o4eC=kkLe+8(Sy(92)n}BXWh!bB~CPVicTJAq^&u1*e*;C zDzs7H2amBenVHvd2PXY1lAF$F_B|&q8dF9BrG{MGQk8>gh`OS_<4Mm~6ryT%d)?I@ z)kcPtHPGEWG7K&+(3|otYlrbba0RAgpPL>Ggt_=xtGR)f7&8W$4f7^mb_fX=bXfwRB;fE(2{`?g;8=65?+b z`y}V}2k_2YDuK)R(BYFY;#+9P;l$sN|M#& z7V~%J+3}&?;EEVo-xbZ%B{(oB%#$<@|dB zCI;x~=Tj{XXFdmVSKS7hu4Y8|!FKQ~$%*|}S3sPg(R*+NP;d`ic1VYvN+Q}B*fM1Y zci))a_v8F)O6C1ltij-}QmxXlksSrrTezgZ>gLC{mhei(G^4~pBF&~%2K+tICVoiP z0a3Avd_?s@-RR;DxDVR|x=i}fYXOlj8;@XoGth50-)R|kQbHp>PV*r#cFvao1^2S* zEJq@`;8OeYx2hfUq;X~v4L3Hp$MEu2Hkhd8)_ZGmbjJGWQ=*#68taoA5uz6$a|ny5 zskg&$t)WDX?N>7IRvE{rPvG{86K|H4UoKC?>l638=O)62o3*$Re9Ic!kQqBMcTXj* z!1fZQVDl(&Cv$iTvJyTatEg6`w#ZU2^?F0!wM#9-MC1cO@*Ja0` zQGFyc?{NA|;Ye|ppeB9L(^x#>iAns#awdi)(F7ggk?O5WVEMNY4z_~20P79VUa??D3 zD!gdkSKM!>!n^#5jDcTn;WL}Ci&S-}C9p7-(d17s!aNnTn z9bre&l{By^DLW&!Iw>_4HM_~{v*%CBevQi9u-QWL1?-S2bk$1le;RCrv$E>D5m-sn z>b9Ypg>%cr$UoT#uSC7_GeR@q>gk~{_MqF^{a$xeVVK;oVV?8sHMpnkzt0=f#C;vY2Fi| zZJ&Uaz3kuP;Ax+a2@Rv1G92U0d#RfCOQ?y+hNfGy(8Y|SRBBd#dvTK4(708siNeXT zpk>d3`Ws+Q;ueLzCsy3)hX{0dquJR1O`uq|m`m^%9+VAsF=5kMiyi3l!zG^-VCIMsRAG9_Xj4mEabdk{V{a#|vlOtd z)4AJsrTLP6gg>qSPN=3+vz9jA6@T08e)$83#k43Of4tHHj@BD*_wt!Z`UuV$I_zo9 zea7BBIU5M}>D;o0C62$__>yB6hKv^8G0CVBaz51EH}6Y%o8zta8?Er*vEk;`u$hfI ziN?HjnqMI+(Cou`fVYf7@_*?%l%H zbY|$t5e<=H_IUenqW`25Zq;R&4h|JZ^kLI#R87h(pL0__G7b;zDCKYPdfhfPe3I`X znI&ob9h!e_u-6I^Ww8vWd4TISyI%J5mc2SHu`{daYld zckn=y6S2K?) zkuO9>?_CQu<1SQq`i)~3@S?k{oW#&~gL{1~3ECA6d)3A`UVzc>J4#P_G6@p@Hl)3$ zwtUxW9_sJ3EnmbF`nu<4jP%dZ^D*=Kt+%(5*{nkIC;(daoJmo;4?o%Ky*bo-`PoK6 z@%XBzf-30gx`h?PPmQhI7GuNf8o*M}SA%>@s(4%YpI&DR$CwLfI~BTNL~jI7x}j>( zvAhxX(O?2OA3^m>J6?ZYN?G`!Jj0{rtlzh;Xz0%A(EdsvbDw?I*nZcZ)kQ5HoWGzF zTY$9zdWbF*hzP#BsH2njI|z%3YeyGXgC@T#N*SCkR{N$2B7Q#2^ z$h%pXJnX$R&4HNVOgH>+%eO^$NiNitf(Ka(s8yEimGixLI_9+m_y}=H4?A z1b8zY!WU6zRpi|C>5sK|%S@dEu0(R=R(*d$XHs+dadph+Kbzni#)H}kfLTM2w83b= zXx39+pW=V!;&qo!Zg!cv&dH{=@X=Eo9z1RyJdTRAUtIkvu(!mN!)i@#)@#cm7XH8< z8$uoi0jxLo6o1(P0c}xD3;MpgBpf(R^1^ym3@dP|!tJ|DcXrxM+&kKQfx}gY>Rlx5 zrjr@QpV*Mn*?pDhb>ok-L;6l23(6LLV= zg}8|pH9txLf5kjJxNIKU)4ZaJvG;7-K7E!WQ$#dfbqS>9kcKWN08`}lUJ&$M07kk; zhn7;538r5xMMhRs`IgG^WB1wfE7Vy6gVF2q>+uHbh=qp!U63U|8K_2MW`&K85ESK^ z)<^c0UNn)}v*Xy<{cwj4B#rp;n zOI1vae}W%8U7RU;sSv2kK8ZLDiJ9?_x1gpuaKh^}U&O}~V{ztWl3=rv;TAoWJGfqqQe-_0KseU+r3DYGPkg5b%gtJv( zxy$(9yPwN?YavTXr;DG|)1kG+VghkR)Gb|*wM13uR%)4{nL{6g7uzClqVG8HF!1!A zt~B{s{k%zj$7SaIy6&^@SR>d$knQ=UZ}S=Ru@}+JHS_W~`=y2pNhKX*Flx`q4xcEoYW2XqJ^q+n&oTu&Uu(0)SMCKj#R?v z=@@=Vn%B(y`nfH=h~(ZB^>U8<=JhG;f22=$ZwLH4))u7=+6Le_)H-6zHgh@}PgOLh z7ekMU0vTihfrHt6wemr*D@cA@`^ zfpKi*l3eaf0f$Z7l~+H<&sG6O)n)A!M0-!eTM#1in=23W!Aw?P>z?)>>12QUvc(gj z{BP(-*p={S&`Icnx)hD=j30#Lyy^{)ADnZAgpHU5u4aAw^1E8b$T4#)!^;o#lweYO zEy+b@oIaOk7P8G6rKv`o?#APT7aZb? z6Vm)9McJ8U)%dK%{u+D3-{{N8;0lK=`+daRk;w^23OE0&Px?Jv^BLv~MMi!`z_q}( zCq6%`)<2J;Mi#fI(uE>yGO&BP;~c9%=X>7sAQY&P79Mx-0aRu`2}IoOishWV3J~~x z+#fyI=}3;&o2|$#Mw$)iljepZoPIsgz=pCN=kgW*84rAYpA=yDxBtEjvydLHf5}+m zaFB;-OV{dlWsBn>YCa%8_g8co|F*-0v{-iP$y|XA!7oRyqlzKMhIgaiLX#1}GL)%deym$(Ce0%7 zl!Xm(ds+d%(?D%;adjdih@i*!*!&%%7{{2MvA=mG?KiotFRWUui<3ZqVsubhprRD@N-W!-Gz?3b^lZH+%| zx~nN|^r;u%?>lUwFEoLUv-M7Jv9p)cfHUA@@Zxv6zM&40XE)37qWEMz|F6&xb0MMm zzGfo(F!b8uyCvrr`gatEsGVCT?As?o0=~J(?{gm-efK#Bxe0qrK_HQ;?Cu@C71xZ4 z!JnfcjUJCS+a|Qv()RCe{RZ<#=-R*-1#Wa|()k z*H?6N3~IoOcv4t8l=JP@{h_`zhpk%MaGogc?;b&;iDRTj)#Y^t;NsW`ma6%Uc}=3R z;1eUd4dx7aL2_@&Uqdfxk@(rr=r8-X0?w9l1_mlwI0wxokJ)u0cPrdvpEPFtme@Z99xi>o7ws&8E2+RVsC{6X*{$ky z*};46+<@+T)=}&Ot;qMUo;LPoj6nC)(UbO70DVu~+QlSFj1tbSO&LRnHK)9P_5~AO zaO@WcVuL-tkx#%Cxe;C@<1^d$*F)glh zTF7G7el4e^4T?+MNPdo-zf?Sg|3$&0l_%XM7n zPdCx8u34~6q&p~ukTpm%H>a_P)rleqely&~+?nlZUPl|s)F(*o;KI&hilV4cm1D zp$!1-k25rrCdGTOE0aqndeM1@WXBN%x&z~2oS}77NzEP8JXp#RqG3<{EPo&K-)_1B z4-{8b2q0ZOQ6lC%2_J8thGGIQ(Q+DYs?SY5?Y@m~HG^vMPkIJm4)UhxLS+j{3SzCY z+Fo#P6xa5*8k3ih^4%lFr1>}`$gyZP^A?nlOdla#2`?dfcVoJVS$=Q&f6J=ZW>FrA zp1dbzFSh)abWpuO=QlV1iGYNsk)V+aj7Ixu24eg*uY-J3z&xvOfY^@K#{F&UExAfw zcXLFT$%4&AO?L_nloqk?=SW>!ik2?$*Phw4-8#ehY@#DwxcdXL2_`&5@|NDED_aCWK}CwD$DFvcP`J@1MQa*4FDZ37}!SrOGcm}C_Lx=xvy$rH1PV+s+(2Z&t z|0^|yeZAgMyi4H05fqj~YIz58GKI`^ej|N*VB)RnG4#<~*D;HqIhpX4o^k`N5xH7o!)AiWN$d`^BE9-J7nn4)&0A` z08IIu!4moMMhsLqzK^6)9sHds29Zvtl`nJzp&isro#1jKaNgwE0#WGPFYwRf4n*<` z?Ke3O*-_fvlIj3G+t)sT^-P^=u{*aWe-q#R$4F>Mu+S`Z4=N{Hx<07>&+m6MoO(e;i_@2-ZU%RDlbM(J zPjy=rp~i->@yZ8{Exohw(_=H~f5#TiVu}V1@>!#ay3rfoQrG}u&4cs(4QIrIKM(ut zVn3&zq_v{?)UT_|9J>z^kz~SN^C)N|?}A{Nosa`VJW0z>&kr7Wf*U%|m+7#hSETz$IK~uXeZnve~>o^rCY5QnzSRm2;DAc3ckadF@)bJO2KPr%zZP z;%M$}Mhl2)8$B>&=fCVwB2VV8U(F+X(l$nhw+O{mNS`sdHOUo2#?leVRue-Gee=O7dpsnU*}frd9glevnJt zF(A_v9KpCeu_<2AKbS~{l@xD%8^_2Nh7kqlgo3Id{L>V<$mk)XWaI>3S@a>gG|(vY zRnW{1=#r2yu*35eY8RlnFj^HIxA_AcxAU03nnfrp?|JSeza!3{IPcuz?_&0S!o89y z4EDSIWp+ONjb-yDveM3ilek2BlLQQOiX}^FLk6ooOjGm!)e6d-gJ>djJyV4+^N;BHn8%(Zu ze??bS!kBdA=74)JyG_r_$PpW)cx?V76eifsDS1hDjgF4n``l*+xl&IgclUj}bP8?( z(ssNACpXP}2o{qz$QTCc%JNqrGmTO#*8LKt&fSq-t!hSJEzZ9N_>m|!%LdLrYRg=C ze{;8NcxD&0m+~vm-|mBf8S_$lK6;E?%8tHk?o`lZkUMMOxE)&C?N_8**AKJrs5%WStd*_^Uv z`f1MZL1|%v2 zNn-3}P0de-+EWtWyE$tV~~9Ldv+5?T}KKf0P(nGN0KvO=x4=V9vw`(?P2%QwHs* ziv~l$sK|u>rr>Pr0m3jK)#D8de)X>DlS@JkRfdOJK$CGza=fx}+{PBfX!3eAAAJ4*9HyA1m;S%Ev_eYxyMeH4{EBJo6cUXn(_h3e-6U-6rCJ>=K%6Tg8QjH_RryN8+Jc ztz14Htt}el!W~ulofH&M)E|_C|H}T&-xb7VCVLKuCgbgwrn*if%ax*Tmc*dYDJc9; zO|D1*RQf5LSl)&S4t=5~OX0PMTj#ODPU+9VJ@{aY424>+-}j;(*{)bJCiULxblrg9 zYh#-`Mgr7Uv?e@kko*GU97ObenHE6}Q!7^LXP-utJurD@S`E=JJOannCUK|IzlrTmfX;QpqmFzk2Xq|1i_L zVIME;pwGGWC5|zx62?^w*{{HOmLNaZMWYLa`{Djm4IFzye#p_a43k<}TqB1j3%!=z z?j`{NMj$jpzsAW2su3YV)0_j(03W?mEw}NoJ*^;&k1#|Uj5k{>f87ldL~pQb3w3G9 zb(Ku^zxPq|Si2PX!d6x8n&`~bKWPgZwFo%|%^afaHF3BSm?ud`N8rZnjO2Ptk)iRi zmw4enq!t3^LYZf>+c_?Y8Nd}Ewr`rW zC$-pxe_J$Fr5bUvAb&$!vQPgFIH>9FavJ;y{Jq$0CT*52%M)^z;FHD}$Oeg|8P^rt zf3_EUoz#ZF3o=J+;QkT}i2IPiqM&psNY3)`|_wB(j}X+8*Jz# zdspF*Etx(dkHuz6eL4+InW(@qdfVQF6hB^R!{%&yrCV%!$OYOreBtW@-_=Y= zOyt8*H1QsBkm6|Lv;mhKbWV;7W}9K&cji#;yuZvGn>&xp0SNLI{8|?waX;N@^^ z^w0}mkfW)5-RJQxrb5$r_h z<8F5lIh4|^`!K)F+f%B`d$qU-;Tk*CIE5&xBkPYI}^hFKO*RD?XoD1;n6dJzW zVPoEYPv0j?1(2E4MBDs_=!Z66Hc5aspIyq}Alr8?eH!?b+PFjGGVLX8wlTI?@{TBJ zV25DdwfhLc2?czA*u(Xk<$lSFzzoLH$_YG)1?8JnFO%9rEvXUxpvjWUm{+wY8h@9h zHr@@H+a8jsq5%@j1>6R zj}w2*QCCE!|D`x0=pR=PP2b6%JCPt9Jf(!<4ok-+=-CJXWmXTV@~ z6a{s>Sy_)=7~p35h5Uu_e`7B5jEpF=T>_@;K z>@K6)N1^&P0p`7j>^N^2{hKpyw%f_{C3WgtEnhT_XT^BTXEyhf`AiV~%!m0Zh_Anbful4y_G zRqggt5+*S%d;EU+Tjy)&Oxoo*ows-QgRc*DI;9cMGvDsx%XUlo;SND^`^_Iiu>KzP z-5+>SM2=_B=V+DQ+7rH`qXmOG0~_>orE)n@=mPU%H1&zyc46>pnt`o3y`~b2{F6mA}A1a zgm8)9%sZ@kK?DG%IPFR<&sM!soav> zVpchEib#&!FC|v)EXHP3D#@*Km}QqDz!H{ve*nP<2&9AtDLn~>6`r7S2A*9WRsyt0k=N}Z6-*7`M$MF zSBzda@$XH?Qe3xx^^l{_#p;H7yKsGiYaa1z=g7rQSY6nJHCEW~CvfXO&MS>_Cs~4k z81F0!%m33ZmN&e1Iu)MPk-XPZukN1^+{ad2LsX7&U{OcH9_>c3O!?u)94_9zdNd^K z{G1H7y4NoCwFeWOaKKn#Abi_aF&7?#G*vEty}hZqX!Pr81tCVStZ7XQiwi}Hn<1Dy z(`R$KVx2{g&ft;NP|Mrl%aI@ZG})#_duCvS4tEzSn()%0l+vq3__a30|4GYKY`^4a zi&IE`WU(+21xw&-F>15~&n-iMw*Zc!$glkS0iR5G2MtT>G?SyU_V_j1NBsKP=`rrM z$37xD5vuHqQ4rViOIkvVUU%eRdid8`Gz~{wOKT{Y=LK23_%=i%#O!VOxz)>(ksvo9 z&W~prOG)KL+&BjMl}=bF?DMdgzKTr@F#eu^h}EMEuYokieqn54!l*Jq+GZF>t|)Y$ zN^mXlo5FWombGfip}5^6J2rNZcYE`|l})46TL7G zxP*2lK(u+_b2}z)N#8xAza>fS0kfCah0SdjI_LPSV<{yL6jw7e0tYlaDkL@-Rf7;$+s>Q5sdi|)!B-SyKN9pdF zmJu%fzD_njP{wg@-Y&T2_TT_VY%V9;@TvMPM%-2uj@PMFX1Q_OTJ2J`&0RknZ23h?ozYv`jm$|)^+Nhb8b8)M75dzE?owb#`ZFIQNApDm@%t|iL zD|azZiOE@zGj8@Qv@(&L3E0UY*qcm5Ma{ioZ$o?BF%O`2KpOj{Jw2`)GY$?k#0P0@ z@7|Qo9f1YSjl?N@-`85(bsAh^4QV(1DK}ZGMB1iE!i#Nd12@HZ`Zf+QQi+(vKkjRg zQZ}Z&o@g3NtBm;f)8A)NE@I*qtsfh5=IZv=asoKZocxPck!(Pbio!#-scfEV}#0s16|gwQbu0P&y4j7>Qo%Fj*?49o7dXc z90R)X&-n7Idp4}F_3V0tsT1`warJ5O`A9#^8FFNf=4_b1F1ry80sk)END6^WdPVyF zD-(3J)ozMGeK51#>)!z;_R8#Z));^;g2X|0*)i0%YljU=j7MLXc4GN!LrT>jG^#HC zQ=iBf2B%!MOx#inkpAJ*0+K|7-n1+omEgW!slBkt_?=r3=qE%V^=cMZA6)mNF(!_Z z;Us3EdXCl`$@+Hxh1JJ#lJ$@5X-$!4B7=VcW9qVOh=UH8$0%sL*}{PB$Mx?uk6JJ8 z;OT#T?Ulb9ZD&lSkQbZdK$cpIOA66Hd>(^-%Rbp3OOjespZ3LX0)FRQPydJ(&FjGnqt5^$P8S|gy#B<{DHgzYDZkDnwZ7X&Atz+X?k=2saGppSfPL} zFmCCu2 zw+|c@bAM<(0+YA=xRd07^w&c*aD1|rqH6XwAOL^eO*ofr((rAUYAS`Nxc|piD*~Z&ZkdQ%2Mmewa+eN-)xIwteh@5SEMLYS4PBp$yG0xCm%kb- z-Q`dSIJ9t79FDfDGv{FVn1v_nb$`zvhys3+=beoyP+hV4!6$6~FGoW4fP>vxkp!XuT%3f$zes!yvQn$(l^=L7g>mnW(Uei0N+sZwlt(Jj|OA|7KX1??({lR{2sTD(Bn3GQ}$Fm!p)JaOnx? zJw_@Uh)}gNd;^FOU7-Y&91~)Q5b~ynp8+yg1I|dGgReincDaeB=A(5u2l12VipaXc5Em z2R*%h`1hpkNAjZ8e8fItB= zGL)lKz;DccC&Y73EU;pq!_xDiLn$-rX7VX?k7)ZvZ&yv3k+VGNPW|ihl?PmSZOrC9m!5s<(aivz&&SKP}qP&i?-rI<50M1}BGiBp=m4b%2O7?;_p6-J|~Km;P@G zv%S*6m(Q=9IT2PB16;80Z0+15K1FAJpk9|;c>clmsYL_NeB)_SO?|G`AC62t%UJ6& zuGXj*ek8<(?0bMYI|BQo*df3rQiC~nP5v44RE}2UH*O_x$f1{;|_tN^|qYjS6#Ws^La*QY?Hk`ZX zWnKWAY%LqVGdAGK-@)APlAh|JoqREf|91+GTb^XW>OWozi$4l+U$2^w?vIpOvGM@J zsr=L3D^4GAkH<|o1v@cR>l}k|$BEhQ^}>~1bTwa|Gzfy0`Im zJ@^-2xem$s%Z|f)GW<}j);*WUi#KNkTj#?F#zcj!F4kM-^n~y9%1PsF{`%Beb`9mr zUf8tmk&v==@*BWs%&a1FIFt_0xf-xT9Zsa(S6)B-$X!0}*usnqH4&ghe&+ats>f?2 zgf5t^QFc@bGi~mvNSqET>wZpKEn_94=9(=lXhaby`|f$VbLPb>wL#Q+8`jLjiA;qR z#}{jjj`NuDTtw7=rY0^Kl>=hP-2%WHP3_ghGpE#exvlysaHwAA3g;lHR^VK$SQ1sz zY9D|-%9A|oa3t=*8jylMg2=Ro@rot%-0;Yy6WbEKqx^#rjH6>|So@&aXRV;dsnEXz`Xp zs8YgV0Yqp;+OmgiQ#NFLtKr6B+VCfpiRkHP7YFZWttdB5_Njkh3Dtew3C&k zYP**1_IO{^=y^y)D=|fO4J&qFI+7pRAE+VO1K#0ep@NFs|A78sKjeY$%>B{B{&t#y z0k9jZ3JX3QozcQ6!k5tyMj<$RKmtxcI3R_p?Y1L_wjj=+S6pwZj5k zqT!^JE%5=HUD}gvOhiiwP>?tjPUw1oG6VF+XMP?2G+^5?wbwdze(U9Gl6+X-a!q6F zJcAwC4SUKik8VRWJypMCthJRq55kTD2|HK1xEYtrgA8JOuD&S521Cz&8-Pp?TOye0 z>mny{0Tq_xu$E{^6j%$LipY9ec0=W8kT(Qq`zD;=@c> z^bJ;-!Y_D`m@JI6y5`J8L`ZbJargbcDo667sh2gNm-3i}+L0HxD7ZT{FYGfRI%P>? zZku9J0Tl>dMY(KANW%2vl*I+2ER4GvHH9zgj!B~YuwIEE(%9>#}W?RUR9cr~`gHvv`pmIXv8--*NC>}4o-?jLAORxc2^(yy3P5fJr zY49R}kk+MizmEOmpg7~HnXuU?j?Qvm4Lw`XCF9xhuBFDWwd#}+#+bR&))-t8K&xAr z;(v}g(v4fx49>>VW+RWAxiGc|a$}}?7s5;5dWn^?wxD~KWfM?r^h(+S<~%-w`xaaN zM22+Ou9V7_z%RI$Gkxk zPwY$82Ae}qA=4K3bNzf7K$reNh4=a6Jl9D{P?wl~SyBMGAqBSF_OMy3LJJ>=36j24 zjUj>QboXN{r}0_FjU<(Tg5vM_3yrzN?zWcJpH&^iCERj!3udsz0T|oifYdU_D3hE+ z-c?unAl0L{Z!s!I11|Vq(jPgY@PYb^pB-4@gG!M~n9I&KM^UaI(c32X&6}&=4$!bm zmUEjwq}+`kXlO&W45(pEsLdg0<#*`(4Q~vVm-i0t3iYN6hJA?ez(|Iw&{5S-ARkm-1tis{HyifHTAwa zN*w5Ws#%z|kK*c_H?$ds@?|;>M|gSKl;G zQf(YXSAQ#xsx52QZ7tDiR)-;=zZcAneaD&{hezI@~cPccZa6p zQrd~bu<2@7swY;7kU0C{P31&maGAEHmv^T>Pn<2R`EV zw-3xL(GNUxVb!F$oud7a_1y0n@DYDAEf?^|&|^Oj#SM&TQb<~n-8%Rju+Gqq^=ypmfGKa4#4j; z@C0s?yM$tt=gcM0;LP)HdPR>9xNH~=25t3>gPwoM6OfH!t~uA_mFFF!jv2qAeO!W_ zn@9jHiMo%-z6dH~pN&0@#x=vU6GmNq1jwYc*~1I1w%0}NTeG$cR2PYkc90F*sby&g zSHbR=hE44cFoWs_lIV)N+}1{m9S{ZNi^+>U;A|Cnk$J}n`6oaoC5w)Ds*tDCxNv{9 zm;PHbR$)TddU8E4Ab_ z7r~LvPJ{E`y)rn0#b?QRD-P}mCfog+^hdRoDdgb1%cr=|TWdmXU9h<_3o!`lo<2Q`WuvN8_4yCk zzgr1l1sv=V&oGj$Mh&SzFh4B$Gdvl<#_XiV?WT~?Kk7`x&e3!2_?_~%F7&;elQ!OW z*|mud=!{R)*o1s@k#9R?&O|WKcXsQ1qE{=h9^vVl^#bsOfB0aKJl_nE^*J@8AYZgE z|C)9N#;M`dXCw2-_Ua1QN^o*cU+hoxK&z=O$T*8q-}rhg7=>FJGQAq`hd>52xZbPT zy-CizJaRX7vE`oj<%ZTactcc)ap1Ybf}6D`w%&y5a|}OYEcBL{b8=U{4BdT9%QTtO zHhI!Q~YNMEvM=yCp$OSix{3YTQ+)`pD zKa{fM+oN}NvLn&F+fwFq{s{0`%XN}3-voxL|Db?Q^k?^hkp4}vj@+Qmb#A?RQe_vs za}NWdg(Q7~MOGmI?&!1CWPZ#Khhe1SqSGQMzNRhdwc7s8_~H!%D@l<yW}OX;hpP`IRpR9(ds-98#?ohG|u%~eZQ2wi{_&cdT=LqL&fpHrkS)k`PSw^OjcmT zw&?E7L^=5B!OB#-;n7>#g{z`BsuR=71wUF|Z+}^HEDlN7Sne_w9z~4~LfPG&?NB3- z@nfO_=D{@97CeI3&Z*G3Zn)D`SKkTkAmGkh4;yCh`~8@|@vv|6=prJ%(Nuxrv)4oppN$Hf*#r#+9D-827q zpy*jydtS;sEdiz(HpKYVg22Rux^RK^w`Uyrlr5BIdB{s?K zPSPSJ=kVpq9`dKXdu&+y%q^{i+|KX)l@8bSfFY!=lqj*iuW4;a{K!RR`7h~^>^D~S zLDYzR4XxAL#b8@1TmmHcXTMRq0~sx!8W(<>rz%p{J1qEM*oQ2&M~;kFvacO2R66Fh zN9aRFni3oKXm@kUc5NkYTKp0scDSIj^j=%pSU1gkuwviRRIo*GA;>Nw!#@$TPHz{# z<(&~Oi>zk$n!KAZgQs-<+n`lq*iyX2b*Fcea#nRMP5r1u0wk1=iaO~HNsJ&iCd(ZYgM?kMVpk6fRD=Rp8paZ zrk>ayU)t#V9wmDIR+0SK`vkk$bXkJAZ%Eg-&8Kw;^0DM3*3aQ`@Exu#?&#bb2P8q& zr-y_dVvSTZr^Zknd#bt`J(|;AcT@$f#|`L_@g<;l^4?lkHB+9Y?u#37FKcPQbH1{XT>!I>S8fkK=Y9K1x zza5%S{ye&CP9%eAYf;?3+(;-kN@2!!1F(+RQ-AmFQSl zV$#S1_(Rdl5e;)VC-i~1G-5E+Tis_NtFJKhwX8WbkHZ3_4V>G=6@fOAy@NJD>uY~A z_cNQw8CK*&$?0Bl009U5u}HV6Nm zfa`RmOh0QnA=H7+Sg%#N1SY)<2qx)#3mb#Pwq{G-gl3w;^ci&~OY#-kuLb7}N>XCJ6#RGbo7!n`@2=a|fPXqA#k$Cw zusqURA*ncGqQj%CrbIO8_rR{;=cC*1{z#hn9NKrpyx|T&mFYHDPUxu4t7y(_fi$Y& zAOD;pis+wbLWmi*C%JmV?1xZ=axr~hy6klDw$uRB>HozyR5#m_e9%~zdApE$oLJ0R z9A1F?&<+}(2VbV1AZLN+45C1{zfYBP*?_NaZ^DTwfZ?Nwy@2`IVR(F(n^}o<>0WRR zt}{+xMKV1Q9zzm^X1zO=oa8_Qrn}dZG{EU8(OBqsC(g6)8rk0oHRU=T_eE&EBO#Z& z5z6ry_8NT_vAY1rf?k^F#r*g7^MrL`Kd#(1tpCPHWPK7lX)=klqM}%4Ol{x(6d`RU zLn51_TfxneiO!3&5dxc)GXNUZOrZ?a+46D34EU42^4`NM?ga_!Q~3-Ru=yHb7>8+h zBc_gKf}xHd%YN}LktRKZ4K6HYH(yP0P}l@p8S9DD*`u9*N}M3K%CbM|60>BX2iJ;o z6DvZRlMoyLMR*99t=(y~N*OM@vmr|n57`j)Vsu!>TR-b4uZusFg_2=O9-)>ni|xT) z1z4*Bx%Z`2ISuZ@J!=HlVb$<_rk^$e@Qr!&(ObQxv<+fV@D#NM6F|S&{$||5=X%Il z^o^U;nD(XaB#*fY66At(b$^xfx%!_lNtD@9u4F5}B1esC)aubEa|BTSU0vEEVixbt zEnvrzR4`6}2)kkf>VJSI%|ZCSZ4A>%z9L@$n-}YLmDEDY45INKJEx=1wImh1re>p!Nk0XB5N?4k!;HBb(_sx!$sD$%aU9i(! zb1(aUjum!C(s~^NI158%1M%g+lifn+EwhZ$AK*U&Oc_7eJV-r65o>uNZ;JV?WyJJK z|5fhKwxgatX3XbXMqrP_{-@w!)O82^ywLk|Z&ka=a+y;2|DM+l9hYV0nY?JH64V_e)Z5Ior3kx#86s`L;BIRX{v?f!wNA=n!|k`K!G(M zq{WzjFx#TH5P(Ko4zkQ6vzqImNv{jSDa(Bw8ebZ??}{KWrbEmmBO|ou>y&|2FOnp` zMEhcB!X~wv^vZY>=LuHt9kzN@R{@%upu3j3gd1C|^P03z5DG9mGhrFSmAGY?FYP0K zRsr_zj3TPk-Ifc7(@LZ%&c5ZcF-eX+IRkfXd#h_J7`jCB4PPr-bj>_c9Rx+fVPScT zUOoGJ_h@$(aPIUkcE;fkt)V&%Lk|iINHbML5F=;MZq-++VKS!GeDS~<2p$m&fg(-+ z+PKM0psc`RJnUFm z_`-H5&0tU^lf2!q1I0S_oqFz<^y9_hc`GEu3c{^FtNO1LQ<(h(mOQJp@T5v%TP!!> z@KZiRS6U#uRrrtmY31VYwXOYZC_D41imRPc)@#waNeUz(YW@J~lX{FGrx&a1Y)=C_ zC&jEdPO=kXNz=Wcr-*!QcNZxuZ&_+>+8D$T*%7s^FUiEq63hH=X@eMv zm5Q8+h9honP0UxXm2)#5g04T*9ik5)P^Oq(_(dG#Ai;UVC22D&EcPx2aJQL^?{Kr0 zSrJaK-lph5RmrLN_<_vesN)bvo3UTCbuIh6iK_<|EY~OixMa!#2V_ctKnKW*S-pCv z5<4FpMglMAJjnW}y>?^%e+WgbB1FPJ|89btw`TY5Eu8}&1yw0`n@Sxl@3k99FH9c{ z`waV(*E48i;hZ}0X`Bq~Md9v^bimbE9x4BEayh#jN?&Au$fql3bkmAdUUh&O-2gj3 zxhrt!Z0WQvTS`ij<|VuZ3Js{+H=ByPt%uTC*4laOUW1U3q{OdjOhj^abL`IEd|r@` z$X-Iy&MbL?e1=!AIto-+=+HH?ZkpB*!!`%);bN5B?|WxzmhCAvTsUYQ_Zs$j9zcTh zNWxbkw2+H{-BO@T{bAJ35cY{l>RyI+?T2hV4&JU%Ts%1@s- zOF+JGUzy?)W@hc>%DztFqglSI#~#{`>->+D4k=Z>k?jCC(0jQfRS)`M3w5_WtP;C2g?xDTbNtEFFNdLa4? z>ysr2)$%|gVWiSLdGyA~oYaQl=NU&i-Zr)kraLiS!UxcmY|18BQq>pMuCoq4iQLN7 zoAX`87Ef1hqu{bRROSSPo*WSOgoL-!zVF1H`gzp{x9Sj>VnZ05+_d5|W4aTJSut)= z3Mp^kcAX|5?(p8dFffM0jMHxCTWRYy-K186%@EeXn)sF=tmBup4R6~H{-4XTClF~y zmJ@FzLcn)N4Xx^4y^q2o+pp9X*eQ_1?iA)`Qa=6%r@WIM=pi=0m^5wM@d{dCRrt8F zokGH^9!2YiqwHXjL@>{zi?B(Ho!+qvZgxAe4aOZzG3DfT8^a~@QucIgh~%brX3|hE zDshHFC|A*?@ZE|;uoJ>{DeLjK~D zX{T$(_(gOG}SH|v4#3Th>hJRk0sO#1b*%AzMxXb-}K9JR>={}|0Hn_|BKd> zve4hsXJ%h%?yo&B2F%!8^nHT+ha|s;-GF3vYkIGK=X%cpsm3;eXU11vJ3cXhd*a#s7LvVT?8_mqkZ)UAQi6tHd=8pHh+G!8(Otb z@poK${baE{9y1zEU@9>~*)BIi52K zE}7#)N~yDMrZraA>6Z@-qytv}ip2QRI;#d!Y#f_^&DZ~>GVsf=Q~yuNM$yVV$&aBo z_6y9^oDQ4l)lAG!514J}LhDR>Pj(M7yow?;Kw1>HbVpX&r=`#4_Kt_vt115&ve1^p zr0wQ%!MuLUaC-aU*gKBsg60zQQB&D68a=kTYc^FMbjf8UG(1oHjqxMUK?lFP@~ZPE zk2H;LEsO_`l5SPLU9(PbLjSXro4&Q`pxisHs}8YRvCqV*90`zvo+=}2t#g~SMM)%{ z8Rl8SvO~J@W1BQv6&Co3W5vk9{h%ThXviAr&6FW);4#&jZef)R@1qW6ey541q5AfN zcd|ZA4>Fg*MyoRD zi-0;%_B(B?-Ys@`^%2fk#Wy@EJjult0c{RS1aeQWZCWh`ZsB{9)z%OSv9gepT0`7J z&9w_*f?_(SNNUPxci4wj%mI@adsJGkFX_@%ypG1l=CW9m#BNt3>tXb@{wmpmrr4aM z3yb5~p5U$4bB`U2i&xhuw{6X8% z_kLglzb`uH7VM_7z4ddg@5Go zW`LHNwWPwjvQz5h>!i<`(1N5gtIBd%S^HfM*Z_9(SnYtG6VP2~7EEz4~n#t86bZ*qVzgZtGe=5Dz-lA_A%A4hWZ);gC~ z%g?LG2N;A3-2B<*XVaVG`p(rl{wpYD&^sQng=g3QEBk5%&&$6DcRkao#h82x z6L#cg1iJvCXHd4_Hxm*IZL0Jq?qsh4IV~wCg1=O4CuJJ{JL`X z+j*>x^e&JrbP_42{)p(-XLWZTMynGt=4bx7P5zZzFubDua>d2+81J8kXANdXnGa~S)b3=|JJg#dhAPirmY@Xfm~Z=}bZU8*N%Vi#fqRXD_Id== z_ZdEF=OD}PItN`e*?gpD*=D_TigzZnX?(lVi21Q!_4O1uXOGT{J?OOuY+4q(3mb8i zR=>TM5L7Gx&4yD_LDUh=ggn%nq<&xe#lbuQm$;Md(AcLSp3xfYtp^^~9@=U68qD9R z?Z)6va#wKOsZ9fD$JOk`vd`U5B*jD?8lspq2awq>u5;OPEd}1j2lYnZW}b)FG#0{I zJ~%H;Qghty>9d^gMoLjG#Bt* zlbBJ<3mZ=e*A}`feP7m}XD$EU|D`4(80tBC9)8yfsF#GX{aKa*}=pJg7$1Qc}?>m$YTy3Vm4tDwuWi{snKDZ^Q-(0MOpEN(Z#3tQ_3};JnOu@ zaD~=3|K2e9c+@bHF@Wo2>Y)b1rVjv;O__TGauWo;pWbT>&}=}Y70n@8Le13Fy;#HX zJ1xUYv8kKCW)~6y7{C!X)L%%klvmaFb|Tey5o|E;=9n|#iIKW=oJ$7FgBMe3|cz4Rwu^0+fJ@p6lkT3 z@8yM*5%OW$^F0bOXH6HaN++ zV{_L|KSBUkCZ(Sp95sRW18^3n=XIJF8IB}t#*S4YpLm|-rwg&pc&B$cbj3j+T$)da z9H^Oo zojWPEmwHS&-krS|RigzE-UMDxqBT*BEl+4o%)IDZVB?(=C+Zzey9nP>tpWerwwm3U zr~Ph67LcLs0o8pi`|3Nfr?lW32-5UIGYjGZm`>|UVodD$lw#lFWFoq8?4sYEtTK%Ltq1@aBFlya2h zeGU89MX@w%n~~M;M^O??%z5asyC56wwv8^&mRR)uOs%IjNBS+uF7WYIp(Nz%YwuE) zGb){*vZA#;UL-4aFDYgrXk@(dliuQn*6iaM9li?R_-#`u!U zG3C&@kdb_v3h^buZ2CB$i2m>?FV;4!Sr#8P?P_dVCP61#A|x`c9T<;Loz0m9Te3j1 z09gF)ENKz=9P_z?1+yavTeg4LQQop~@a-Ipvh2-oGLP_| z!3*xCRP8!_|3jN=VPuIxc@7Hn*WMGSp3xAdGdMp?M-XP7l|0jX)WpT_t#=R&pa;*x)8GA^*!Wmrkh4wU8;l>dd16oN%n1@cM-?iz-3M{!S zp*w<-9@(KvNB7I&G(Pb7YZ9lSG>^3_mixt1rWOWi$7Qd%T#*bWLLpBsDilcom|0O@ z-|q?)+Vq;NdI0CvZ`0Q>4`4!3L-_qaQ31|IBKOZewe3C^mSpD~FDo3gF3uK=OAhIA z7H{dDkhGx8n95sql6qk{+N!af7uHHGqmeYNp^LtZeTmH#cXXB<6pXlUAU>;>FsI@u zBVK&|vJJ#}^IbPC_VbjllksosVi(B6`_)eUOSOwc&Ut`ULH)xnD=lCx((x?FA>#c+ z2VDNffxj6W7KwJ6GcOR@K15quiu0x;cLpv>t{Hz|7v*B0h(1AiWewRjpU+J+iY?bz zpZTWU=@wgHlWP4liOc#V+uhrGA>n1;UH14I_^vCnXA!ShTQOFdw_M_o@|W{D^Xs>1Y$v#tM|KokBq>6DW}te$vpw_c8gthDBMuk5_mUck~)WSP5Y zmx|O9$hfoFT3EKhY%Ql@v{GNBMeXqCR^&1}dqoh#73+J?-)ekZIt7bQtd)fu?U1rz zNk#aKZTB&D1vxQ(hyZ?+{G6H9c}8Ts-a&KyQ{0WW}LO^QtW{r zG8X%h4(ZgpvLJa>8~FBqY@!SK_}J-b&p<|BHgQRq! zwP(#e^#0b{Jk?+2z*L>8J;@sq{2+Rw=6A!uT5^&+-X}VN>;2UW+*!PnP!2pe-Comh z*du=KJ{QAsM(4d)?4>=s5i(|6d6+y}UAh+4$9A1;4PP9O_L4aAr zxeat+_{_gtc>KJbL)KWq0GTvR1|2*wyuU$ z0E)~pchJ~yXIMYcGEKYaaW_euEOI}ucOkaIW_Qe_S7Kt?{WQGnh{l?44K9XJemH z>xXx$ca2r9O#CMWBwio(l-BuRHs>PHjulYn=_|lAc35(h_zF7AE5<24$WumfjZ$kM0jvC-OTL&7WXkOZ1D3Ay z@P*_eZ8(XbPOQnJZ@uc!1Ug~_xTgv+rMH+^Wg{o}w?*>dcM zuR-_j8bG-jPMMUnx8ZP>EXX6ug6CIRe&K6lm^1cwLPGJ>sPWYlZ{~jm+sDWkffqg< z*g*j@@mNOI*N~5^sz2_an?Kw>osyhhN&2fX2j7wPkk!a~)*5w#zz93seZjKquauMd z;Ult8%>o=T#I|3~Ns4h>9mx-Hq_C|o7S9uk?XCM1JK5U>b-l2$_R2~NN6Y40rP`la zMSZQ76wIvr4H%Ir)_ijo6BBav;QkzDGiu2 zD1NPZ@RQNUIX-6xXz$C`fV+-eY6uw(?>T`VSW?v+LlgZV-)+chR^ofl_*7@y~zt; zd5s%MUhs1ZDsN3N&5QJxP@(G%^aoKPiS@>wHm+;jDvoqI5X5xNvNnxm-hoHI6s!!Cd4i29iIY6SFU z_d(2*>w*JqG71_qzYnK1@F<2 zM3JDcFV@C$0&jeyT$i!_c!rdGGB(_lX{yk&dbP;-*6801gpVs5Ii9Ht`si|gM02P( zREHC+1P++a+Im?)^IDRZTYU(6g>nRl1zAZ#_tKG9pa}$oS(8pTI$`YB{2=RDv=Wqn z)^=pbgwdN{5bld$BhflWQ7seOC@i=cVxr4*CiaQj(jWU6IXaypE?MVNrbw}LepbLDoM+5 z15l3orS){S=fJ6?yk3Sq{w}_FO6Ig#KKM{)XiS3@Me~28m9^ug*^@}8mikT%%Sqt+ zS>Gx7lF?f>*KmoJuVW?{V280TTB8U=@(gDd(I`zd3{| z^M-&5o|{=Fwz&=Dxs4`r&s$#!7)XRz{p`|6H7gt&0kF_b9o}BrHsaymE>D!zP*atC zNPMkz?IdPW?L7u(`>Wf9)Ss02$ZcIc%+d1qbdQ z*V_}rv3F@a90!_}MGH5Xy=Gf)Ft<$20X*&`J0&Y&5>>%e#;`Lp(2h(bL z+?8p+!O*Ck#oi@J2I-(&1lGTG|NPR57ozvys5=oIXvYH;-AXiXg}ZXi)$Cc!>klvNxV^K>a9U5yi(LC&sn zB!smb$Y*)c7%w9hLKa^v6FPHuV@?8wz&(HseFW;PMC5ySrm~ZKJJKpyIY&w1L|y$v z|6dAG=z}Ob1yANiLP_`*B590Bji_zaXMJZ+RJUgypQGF=+OINSs68@uX@n3OZj4O_ z-E0qBUHuM(;v3T{9#2(W)vvQPdpE`fFn?F1X^;J7@PK+!l7Kqg0-w(dtIZavYx`{b z=9ywlFVo#*|HZRs_jiJ8->6&r>)KG24L|vpE@j7Y&ovcPmrm3_LDT-z{M)7%YCzpl z3pL^93x4MV9!I^#>|vZ3aImA#5uHHeMWa&JCo%JN!Z4yVaI@P6yzMb|^mba(E7+=u z$)j!NMu)@y8M^mJruRP%;HR%s>J%!cklX19r<7~1v*}6_Dn;%hmiuKfGn-10a;fA# zTcuobw_Jt|nOoSB`)$M6TsMr(?Dq8!e17|UUhmKQ^?E&?xK+^|@mFbIqNVN)flBLt z!zh15(^Qst8AP0<`paf@t5(225W|>~eUz3p?WGf^b+*<7J^Gs37P~Bz#YPUx@WJMO zy}EamTIRl-e?T^znBj?H&U zGQ>X#!QiTCrzbt08DJ+~nQAY-P|TY~2{3eEOCIK3>7B!w_(cmp^xke2QtV#)CDA;f zX>S_-Uqw$*53jKw@GK_{g3f5?+IWtUJ=$)}@{0|ID$3Yi0bzZ2=%hH4QHIj1*vjyR zJ{AW`t&cMicPMm2KV+Hoq9)@@GZNpXr?qrMFp`U6-WE%|)nSic%ey?yb`M&e*@`o4 zIpY*&^;xP~L(S=4gcE5ALJuOZ#dHn1YFKUYmHCs5FIlmhWP#!oF38@jsi0Lr?H{Ye z?yOY{#B1dIkxOKKU{4*aXREeBHJ|Yo`KP=a+L*m#m6UKA1P@bNs{X0?b9h}^zsa_| znv>oXn^BE1*l=Pr7dSg$7|`oQ#VyT*qL?qvI+IP%%+<=dXOF|hZ@6lZ^{(eugiHgh z&le-|TfXI7;t#+R@z{(tG9xUU^rJ^;YQwXb^QqyM);A7D7yDgR4%6k~yb||gyU6)d zPQ4L@t=(b=_ULX^UROiuM-Ohon$unVw%d4nz~L4+?T8@ zxvQb?RkXr4A7GXuFrvv7g%!uSJMrK*AuXAuELk9Krw6qV$~N6`60}TZC`iq9C8xyv zyTjl#IW56TB;19egl+ZHmEQ(mQ-ABx;?W;VHbg)0n@!>qnC3|(9}L+98|NJr=o9l= z686x%WwiN?_?&b-#-+FK*#;j;=9WUQ6os5(9a^m!(HXdWTl^+?OM8+HH#|8gxns{e z9ftXg+k*m;aUF>r9w~-xC8?BbX^ULw1!SVwE^X12Rk~qS;c;R8atooy*NE~GVM(BM zOO~S3(1@7(ebVmUr^IFHP&P@JvrNYrWV(pIC8=Qid#nQ-rxj=+)ij2=Pt1YI_DHA8 z^{SB{;GRiMt6=jsje(gT{=LsscSU+)Il(QNOUk)sy<36JgHsDzUERC_?nt!Lyb*NY z0nN5NU!5Gm$?eSMZ)|Cf;nv~@`!Mn|Y*$27%w1ET#p$=yCnLrN7sl@kvefqV6#h7{_#FZa9CIQXpS;`v+{-OhV})I{os!ZRec7 zrp=u1d<9com^0p6w?~+lx1lno;nPL2L(X@#lotz!6dg^qg^gw9v-;d|_G5KmQKkMi ze&}#fEC<{ZGTRCMZl$;0%zA2`?;b(?wAhQ2+c>o1%XwA&jCh3ebpgE1Wd+;<^}6fK zoF_Ch0_l?*xR@RaCO!Hc@MZZe)z{!dQ7u3N5|^Y0b`)W+`6vlz?tJbDwZJ;t1#jnTW??Juxoe@|sKkkxLRC6+vX{h{Gyni(#Svr+T;(PY1=kbF zOnouBBur&V?!{TyoG1^aTbXEWwwC%CH7L0icoGQjIT*VZNR% z)RLT9X_I92p?^1dvxUX`?M&Ex?58rEQ|5X+i0P=Ry5O!ZUN1r6W%TEkq&A{4?g8u` zBK#cJ0CK<9%}>Xnp5P~a(&8d~vh%Cih9&)B_p<<`R`xyC&MLTEeQ$f#`Ums|W;**& zmmJx4`Pj;fq4)H{oHCt0>*?ggBL zTQk4bB|^gLPE8EIPFVQtPLBnsW#^2#giQSGJJs%6vh*(W+x&ineaaHu9(dQDP_SXu zT+F<7;bw%2cqw2t2_k8bIvq1I(V=osa7}kFh1@FJ;FQUzGkUtoD$OOl0I3=?SH4lz ze*c@ZZOiep6L=lS$r#NvgK?(dnIYtAsJ0bKaJa(B2M|$aaw@p3p}y0<3Q5X}QKucR zrGG`bTukNUe&#;64@>CDHz0Yhij)cpLr}gESLvt9xj5C8W<2Ef@`o)cYfmvlpiM^| zPIz9hJa35+M~C9CHF*PNSqC@40w5tev}MPAtLtu)b8i@HtsSSssUgdwFRK)0u89bA zu0KU5V4dC7hfkER&3b$iHF{SzN98ZvRSOy6;N3Vx=IZsHiv3|Npl0S`zugH8`?K|v zkZIV9Rs0`nF?Hew%}MkD)78-NbVTO*s||ClDaE-L=nKI~K=*#O52e5>H|@Rhft*V2 zI3$6Xp}A`l7=OV2Z|$}J1`ZXHFJP7hCC$=^i-z8k5Fx#E)oLd@{9~#AKXOeN7xE7q zcM6@{KSdDiFfwItCRL1?6x(UAW#@VCRCfdljMy(Ei4b^Pgm%M9G0JgHW++=*&L&ovxMZOQL_lh6hA{+9+7mSR}^W@Bs2#Ef}ny zXnnZ8B6IynG&6s4H1P-efx&@qivGSaSC74Mw0|h9du|c!v>C>nzFFC8ZYAYKH3lSt z=+p9yk6Gg_wRTv-CJy-)g36c`eWl*a*9fWdTt0ux+r+%YW%K7aG~pjmSnVU}*72cf zCk+*&h{R^>khP5miEshQ^-b-Z=wXn?e@$LbGcbfv{K=_}nhf~1R2UM7z8V%baQK)+ z)5NWvW0A~R7Y_rwWCJhYW*|)L^>=Mf#4b#Avx#%0gEXT9ua0=y=Del$Ta!-eSt@Uw zm=db0qrmjp;k2J!t<#HI(MQ$nTOML=cVxM5M98TP=Pv^Cn-o>Twc;cqC+vlws}Ecg#g(CUT!SqTth zH$l7OkLr@-KU$u5v0=`E(%fgQ%DBY;G36Wp_51-tzRrjR>Q1C;;`S${_}IT%d}1vE zgjbn+S8m8884|*b0p`5SLXKTQ%ygv!hddrNor?O;{cK`%>($&IGym@EN)G#722V<=AVkY6L zlos@Xl<1Hhm(h9ky7n*8)(?jcombSs*-pFV=jTQbwtTL*fj&oRS7k$4Q@7O)bQGsEfoY}nxK9y2q2o~S2@s9!9J9wrj?&4 zs|m%o1qPv%wi{7u8-b(mN*4G=7>D*Q@YWsu!JQ%nAWwrGqV8l2%UWw<@l7~fKLq?P zyE6Mb3`+dnOiORp(24qyWk|B;FkME0Hc|dxjn8AQB$EmLJF#H7i%4C4 zO*xR+^UUqi*eLqv4v~53p!xNn&GjO^P(H)SO;NevRQTrZS;~UJczWOY z^YYBOW0(6EDSmuGiS=5>$Z=+8PTN)L!S!^dD!2Nk6SVZ`KEMUBdRjHpH96C@!csaF z%aVS&QclcL0(;BcsHaFkF(`{_DC_vzN^O(2oQ~{X01Cw_CKmx|2-< zLTbl=P4|*m1Kq9tsci1Kfnq}voKuZfpDM=6?_T~HS?o>$j?WW6A3Ex@?mkufN#;pC z;R_v__1@4O-hZkMsFDaxoYJ&V3Dw0J1^BaWaYo=LMZ>1L%u7#DEjRt*oNRq9=nA~a z?X39^S4CBsB^|EbmtM9ffq2e$)AK0<*A*3|RI<) zAvI#XS60`U2rjFU)#S0kAKcL&TyN0lO%%3FeT~uUW8&iR)w018NMORCdij zw8;Ua6&KKil2E6%mQqU#Kty)nkj-5R5TUU#6mxQ3lC00r!KjP&udG&hWGf@Zmo)X4 zqqdLEAEzx93xTXOh4|0G+ob3H5f}?mSbdw(>_JaimYd-5{2v6ICP;>n0f|CpJf4{z zeE;B+^vBF-q6saoIMV!PRMVr7tEs;PtuUSzTYAIfUrcQm2TbNM^8`5FsbueRxj1Gg zTzqa+c#X{S7=mFIqdT#?59Sn5Xg7bpVoR2RCq4)xWqzXBf9(fXi6z9ozz!)cs*Qx>ESe99X3@b#5DJspXILU8ucq%J#CSEHXz>TghxpU5&S(xaCR!&w2#n#H z!4xVU&nMIo2N(hXi6vMt2?6avoS_lQaU(3wv+=ZP z8(nS@Vt1>5yew&Atv4<8U<~$1oG`|11R1-Aet)>=PnA8np!$F5*Mzop2et}+|G9m0L{Hb@4s&@;aBZM;Z@u}eDH(0#dE9h}gAUT`cLdu?BeJcD-$6l6vq&k*=WNAFw z2$`AZw2lnXF`r))JG`vJmSa`d!hxzQ~k_;T-%FuuWcR3#j36PRc`Y5;ul!9QPsG7c*?={~dOQmlVQ z_D&bRWb3C4GEHSHMsQuRi=i-OqbZGWMsYJ96+CDZ`MA_O4vCK(dfif9xu-alW|={hn6>{TaeE2NYU;K z?441?6eUIox9!);zo0X7oo3Z*t-p!Aguctk znO#$UT5iuuW*lEjci}C1wR#L_76@G;(WE;`mjN61^5>SNKA2t%P=>kT@78Gf&DsE_ zJh{`cedd1$SG9DZbJ?RYH->odVSlH9eips;vyG`=>M!Uup*ufY51C(IBdvl_jr|%I zBglNUpA=x0_o&jG;IJ7pl7m2N8miB2JQgMiH}`3>M1Q3DrM4;U%X~Yk0{i8BkN}S2 zegi~jEtLiH?o8Kv}QOh-Z$rNbVYKY<-p1G&U=GZ1*Jd8sde=e>pN$b?~g! zYxnoUWA(DqL^9E)Ku~1(h}Mi1o}6So zTu{!JTXQHabvPW`qqu&Q1YO7{FmS(|DDLH(sxeb}vi%C8}#xcPaj=m*eGOKJ;8 zF7F_C1EA4-QFE#c3Ue(vy+V@+N7$9tU_==5}|)8QcxjhB_SdvpJoFOel4Z zE{e_=)Va4(o@ypogrgZD%`@gpaO0{^V=<-GGy?~Qa6qDSC-z6BIw8L8vlGKSMrNTo zUzmnu_p{VJVk)MrAWyBf?`?9ee2Cx^@ZP3;PD&dr=jtD6MwF7~-iK@ZRED$`bS0nK z$0nwLO(G=Bjw4cP((5vMHgxO18W~X}ZIJfN`!-gFUs7te%TIUHsn>uStxHG$B+LgVz5@PPmD%tQ?hir6 zxGdT;OV(pqlDj_%R^DTPwFI&hN?oO^;wIYKma^IvocXc!7DNviL&?PIRONB<(H$*= zo}t&w`6^91dOQ#OLH;CVm>(EQ;T@=+itbuBNZD0`NJNO!_@+trGGtSPMZ{J0BCtl$ z2E~JoD4q=J-G#r0dc@X=0#e`@B$beD5S)_hHV zx}lZZvg`6Og!c0BG-*>jn{;9#(KOnFV=@J%c~ot)rs?NZWD8bGK61HYw zC#cHG@}S@O{IEaOW#yGe4Qm_`v@uk0GQG4k9^=UylMXE@aPZcW3)^3nz+8` zyL{ry2nXYqTiyZ9UD2Qv?(Z4r>6iXNW^F^vNi0hx6d6eBitWn#&l> z%ePXR}so^d@Q=O%Z#qOF!S!wJ`cdaEO|P(9D3@dbDD zoD17X%uMF$*s^-;XK>V%XYGt;^y>Y>w7ycJW`8cFMG^5o^2SroUtQ7L^6#8}4LXaZ z5HC`Smhy7JakkCrB7NvtH%-(n&ZFLUN8kL;TQIF%Ftu#D862YH;#m`>ux{4oYOV!= z0JGdS&gG;;on+HTE!~vPpm@CDwp^$N}s(7E2n8XSeX?A zhf#8@4p}V$ONZ_)BcsT(&-}~Sv7Y5biD{4RR6`w$#4(5RoZ0)0N*3nmT4(eBq16pq zV>$qVOMR)ZOH!{NOuJZ>VWyunPZEd+89(N=QTrgBPlkD>m6``ss*_nKsL?C2di(X7 z+AsKJ=0YE(LOh=}fMTwbi2Jl(X=hHQ3-`_Z{HwkZer=MGf{uD~Um1B;C18j)mq}yi zv1gCSatEh3md2l-Ef4K@OoNZD?2B700t=PIx-0pN*tmefG*1KL68>G|qtg}g7|isq zKhZ;vmyh7CqFtF}U(@6-1T3B&N?M&7TnK6hj9YXIN~jp6Q`$uEmPknI zvzWVQY5;$u>~<9KyGy{0P%O2Z*OiQS=(rcK&u&>B&Lr6{;Y&lUO+pzOND{_3#Y;!W z<@Am%Y@u&SRXumvYoUC^3GAms#L_AL)tRD8;$js!vSkaW13!;hAmMvaQlDh z$xbnM$LmQ-Sm=l7DGXbC8>EHZCElyZ{9{9Jx;(t2l$`7Fnb39Z z4WqS5Kp3k7!-U1Ur1H=-yp8fQHp1wfC1`_cq_6t=(9E|QxOMZoPv-&Qzg?zm{-BzJfgF(MgRXuT zm=@7qpCSLnZWyzqfVF#qZUwntte3>yx+Nj~3Vf2`i@G0pi6?aN({V&grxK}LiwGUG zteokuC&iheNOV2)0`G~vDl#E{9_^?5iQ8gdeS z8gee;ScK7r&X(Oz^*sD*ix-#;OVGrgo&!PaFEZUt zq;=z>bs!4h{`{&FtEN>vADA5RF!klB!(e?;G{ICW%fx4TU#gAyMm}m3`rdgGoTM=U zQv}9fbrLZ}nL1cf+=3WloP21hiv@hC%x-=7A`70mn9}z$hmj$9%;x!q8Px~nj7c-` zOx~2EeUe9Pvt{4p1G;8}*C%rj|IXK0ioIr%F>DxW$UmZF{OSTex-U9?+{}mICXXps z1Rz5U2jS?p$ReNU(A~&^z6UajIn8MtQm z;}=bVlypGYVv4*sd1`tFP`4LZ71;srB=uckv+f2$pleWHk1d`KlG1X#lK2!su&VW9 z-odKe5)Y33{@Gz{hDqTa#6f5qUyWjecU(nBR%;+jZTz_p`#s_Gtw*=xXwr^|*9*x4 zvghlfn1gNo#7ULaaQ2}xu~hhoMHeG*{g@P}y4~PfyWKRFX|j_wM~XWpUI0zj|1ezjXR7NVz}z7jy}6?0XtTx3M??nS=7n&bws?Ebdmkm5x%HIV_63@^DlKb)L0 z^>XnzE`1{d@nPqJf2@UTVjA$ot` zAx!=8_^kkcV%6fad82H8-;s)KQ>^huEg&wAvD%o?;oBvB@EGKVO>$A~!y0N5b zm%OLb3PH-CgSv4B)3zO*Sc9EOhkDpN!I5@L!EcFO=J( zaB@Bxqo5Y@p_q%={8jOqiGxlAD|-V_-4@+Mj02_==!E(*6E)->z>}L!J82T)-lZ@4 z7-3`#lVgsPojF18HK(nEb-217TY-d-Mfx=BBRRpX0&wSd+M2qOU`Kl0q06y=>2X}L zajS93{M1H?4*tce*^)XTnNNO`HU*#iHlrW&map^4B<=W^pYWViRb=dleOPYw zv<8^^?#-d9aUk0vbDkUb1$%|%{s`MuPqZeW7F3nlvhhHcEz-Otb4I;Ltw|Q z3=~W-kjjCdus}~BrAJ*V?TUqn-TfeZKN=2MIV}%_tk%|xF2w8 zXLU<%&g19k695wtB&#jgTP$Arr4Jn1O8Z?2>8BYzk?R>bkwnEdsreIM_+0?8DM^nRXy_HD^tlcMCv`{ zwrqRLhsWSDr|x8>O*2r_u04FGdvttdOyL~_If?VhN&7RTUZ=}N>#f2Q)YZ{8k+t$* zJh+s=*vecOPT2p?7IR zBJr*0<4)I26>rIc!cYnGN5cuX0^d#?jXPj*p`yxo@3O$pxf+?1Z`wiJOlHSs6JL6( z1yIdZ6&uU`A{iC2aCV;WG)3%t{8^V3wg(K%iNOTHc29Mm4UjDwbCpV)K*oVMX(mBy zK3MMuk&*`XXP}CcPZ7FVVZWu|2TY-*nIPaFs_8P~OSCOF(R3_a#vPeBMQ|-4xuH|# z`BM7->~t}zDL_2}!!**-n3L1z_T4M3;GD)+b)>3FfR&pEPlHZOc851|NB&Up4a0O|$Br;Uz7!2ijx$`v z!5%Zk=@u{8W;@cgQS|e_(?pKH8P}Nlkh0l-jc}t@J-2!vduRl`HLs&;7V#WEw+*E- zcgKyGb}^q3DtyHhDOOS3Hg6D6<((FtCY6_mj2@xo^+ry2=!fOyXr7g+%Gz4)OTOb1 z!~6~nDPW#Eh0Qq}>d7pHgOviLDk4iZuL7VTghuuK<#SuK0VBJe+d;Vm1vqZVA<-sL z{1;Tl;)8SkSl%M7cr7W)`Fs~debhEMKFWr0Zx0_{s7Q(o!=m@{ryr{k%!nZFvyD?o z>Ui=}!I#b%U*c88DQ`|gD&(QXy}*xUGSwErp71r*sTPCw)dD#LFLZ?Z^<9HIJ|mb8r4!p%mJQ4C zhB6;B>0c5D?)6K^FiMp#Iws?qmVsWxIK$!9LB2z~?bizv^4Y6XR)J-9 zwWDxr5*gJ3^QKn1ByO4M#_uWiHz(FaDxA%y?PlYE*b*3d=F8+3FRa$Pcm4pScjg%| zP1ZiZf^6uS&p#K}PWh_3wzp4-JAx_6JcjXB(PL-L#{OPO%GQ&A|6qy|xb!vR!%)Rn z`+`XO^5oohBXs$v@Kuv5W#?Fr36B&()>4g;o=bVU3w+nJU0s^3%=)bVY6Bv(_g_#-s!2bbI1|b!t%2ORAHIZS1YrxGifr6&IUips>_!dRF}iS0Bc;ld5j*HlKm*g=iL1u1KZ zuN+~zQ(ON6dG3B_voQ{geRUr~!4=Kk=0x;BOhaAr>HZ@_$M+bvM=dgWzrQ<$u~KTQ zLv(O5Ve#0%R;`z@6^2U@?Mv0`W`g_Pj|Ai9j7A8FBN?s8`l6i6eh%rMr7Le5;G9U; zu}<%5Q9Z%0tQM|qG|^%C(@X9){TJo`!^-V}=H(U(B=c?hVH$HSkHH>M8 zO*WATM2;i#NGIf)q9$8p0HIQxeO&L#!N)LF)K#($=s!gMtbz_tS7aWYZ%}YRZwJzY z4=A-adfqT)q7CiMRb(#xv^8aq@CSlBL9q>pU1A>Rruq7z2yI2!TcOb!M(+&oPx#&7 zdC+g}u~bdoz12x0F|h7>OW~Sv=PuyM*v8jIS$*S*OucqDC1Q>p=GK}aY+9sDytJhH z1DoSu?cOl;*N$;+fBpOB`!V0*JCMbxQhZ&mSaQoRYT5U1}?00G4Fa z9>#afDYE?S)C_WJ`RQxC5cg^Pqm$zy%B@Bm?NjqzCiZbqL_Yb;h4L{g@NPg+%0Qeo zaKwJG*y+gp>POb{bXzS+-A2`A3m&LKA2QA}I7xW}*eqk}2&LwOfoxP!QDnld9kUp5 zc&Lr9yyV1%tzKr_c9+~d&1>d9oU|v5pk9dhRv2t1YxJs1qLQ(h(cD|l_^Y;d zC#j{GYKBo^2q_Pre%VfA!AFG9G2e!MxLskKHYjK}_dF~7n(TmslTO>FNpk&u%;8#M zDJ_ngeae&0a;Ew7?MdR*jc;VZJF&(3Wzy^0aYp>=bSnI*Q_yW@YQAvf&{R??gYN&M@@^*HphA;%EEmx zQOFRIUYwLnvAPHUtKg=2RVBlY)Ft03xJDy+<@Kc(Rmk@pCA?{{bJY*5C|iJ}(wCTa zCcCWSEF1E2SL5yF z9|xgNm&$3A%iE|gp}g`(A+MLuN@{c48ww;Y4bD-9n{yti0S za(Pk7lnvAZ`(f0;lf!1~&m)IB3*ustaaKDIVVB_Ln1*giqjjV8o{3Ujo*T(}0aR!; zwZ$DU^={HvJun?((O!Dt9u=xnz{#+HhK&9cpUM1(X^@r)qI-YrGLhw|MzQ(^{MGol zGxevX$A~}6uR%fNoK@&tIVwP7_?u;X!<>4RHEGN-!48fGOysPsDh^gk!?juJq}A+0 z?(c-?{t^`Dr1@+z4cU_9{^PJKKUUIp1-tU3^VI+Yv{MpTA)#uL*JtuG+Mk9f^TpCf za;{4%eP(nw(+)|pne+yl&GzX~b^KU9w|b9BYPVBSyycT>XX~`vfwx84sdCK(&+(a# z2G9A>c#J89u8vHf4qUPV2{ zEqyOnrQ))7H{e*$LbjMvKg*Eui9h5zKQ#wdq+EJkCF1P<-f~@oLV+lhonYUV#fFSt@gMkK}cOpY866Jn||N z7<2ha3+KrbZJY_g;xPA8$YyKiUUSE1CJ|X!0=^N)FTa+kpqfCwZ8b)_zM5tDtZDa@ zkX$1s?fepz!mQo@gSoJi+M{Z9X`>aw88u(E1%9f+5k5$5=G778qPaslC8B zhc|1}>WnO5i~duq7}9RFx<aoGha> zOwtSDd+Lr$FSH_kMXRs5N!CuTkX0I@JcR{C!836QGdo)XU*Rf^88p3k)w2kk6-Z;` z+q28;eofrupD506ST~5!88e1IQ!TTp52e>9Jsj~kA!Jh|=}Dc7qJ_OK^OV5CWOBlh zFKPJw3fdHW{l1_QTR6yfJ|cvTC2hI3RRS;o^QYtz)*pae{@?L%?Ln&}D6~t&oOtL{ zOY@^(b68Ydw<73KBwU_j%|PNd*=Zv>b2LK zwhx6Jp6K7oO%H6!*jkZ0e4X2hWKF0ty?xi(^%^y2J`bKhJ=fLeaZ$P@3 zl@bYCRxryjyb#v+QvvIDR~S8gKszec-ILL^6|}CuZ4?yq)$fwB?+%#fh1&y-&0#*A zzOY%-`KzLxJ_)-P+Hr__`4>CN_(#(65+UdZEn;uVefPA_c-UMZa38A4Ab{@iJAxbF zlOLJsVm>FgT{M6+zc~lveT|35&D3wJi|ptpn?KyKs&qFyz_}OipR)W-N?&r6tjYKX zalh4ZbBk2j(8pdEVWX1xv-eTev{>1|vjwiP7fO8Y8ib}5k@mfZ-Y$65@3B9$T$ugL=iH@ zokMOf`l2)B@wqnYz;{ES_uQaDs|wuX97hYwnSat9YD7EeU9n|d=<&dg^*wd-v(?^L z&a*Px%JUKPm&bYU?sda4uRx3W+jc8g*SapBX9n5uhu@?R$qpHj!pXwh^&{jDygnzA z5~tJo0R8vS_gtuP*L#(_UbTJUrZ;20=SjR*>_g?*)B1{9-nbnE6BY0!abD$iMstWA za==t8!?i0@VWWAlgu>s56ogXstIM#rp(5?bHgB`AD!g|2zP@H3-B8a!@BfA8M$U{d zf*_(+@}Fuy*NmvV3~a#pI`n1c2kc0BTQ-ln<>OVpVEKHlBug&+0VDvJfk1W;wX)8q zrH^+9d!038XDK};TL(Q7mS=}`SO}S?EP7r2wL;RRUIOeecgS_oS^O#3eci$3xN--R zj+*jhG{pNQVyCygMU!c^oiwBUg>?{D_4AbTN@UG`FINj=AZiOA)+sqvZ0f%8ogF%w zy)hF6Z3$D1{tW2@f-@ilZCk zkX?OfhzWi^`+pP^I6HJ=dXmQ-mI@woUwO6gpMKnf)xRvW@+#JE(c$0m0271ek=}J0 zN0`HY%{imrHSHm3iRJ?nEe15qf4<~9IjQo^c`f&84?XusmR4Yt3Zm6wbu0ppXoM0r z&z%tc7WH!ur|-QcLDZDT?Aa%4mlsrWJ>S76=j|8nC4-a6)SvfVx7u>px6%V|TsQ|W zIN3&E6tVwhfn%+1y`3-&s(?jVXw|Mfe(*USjL_E_MYSSx6<_)G!Qa#}xYVB0FPwfCEy;B3C-$rXU|)(LGSuE;=nv`p4FUW&W9{L?k6ta6 zwPm#%vE19{d42GnskX(^>J13u5k2IngL8YRo3E;B;I@w2KfF&{#WCLTGF6wwR)BxG z2R)ZjXAF0g6Dzsm1cJ@fX9^{b&Qf~C54cbwbo0**oRPW3ztJhk79FJ84fS@{D4cVw?btibxV;( z+xe^aH=Qbd=WCZ+x7y6HQUAjzGdWrf?V^wf+fJnbM|+6$WK~K@=u3-LC5f?^aw>jk zI6%up5g>8`-anysyk2$evmtblOwl9#)TnIAYWuV-LyslOBBP+x2L6)&g{Uc;??0Bx zzX9dorI*Jw1g|pvFbzdSIQLL{HzvYk)l;4I&F*q}9;_e9nUAi_j<`me-Q2C;0xUs21x^j_`e(F|G4Spa3>FfhuFcf%oMMTtv)s{=Sh7B0R z-ZGLn5&-HmFT?Bo7?6iPLkOL@?0YscM#l;i(iMsx51y;`4}bsmU-e`#sZqb#jH?H}HEMyx?@mQf9F zRrr$j$<%+RZtDxmo>spz>p*x1 zHEYS9Uvgu3A;3)2XQaX_F!M+E0xgwE%E5q}MCM(_Ln0dZhlekx1bUd`0f|pj(-XB`K`q-^WV7<1LY;7c87K z&0!zrt@#F<+Dj|{V3rZaq$d~VC0-puevxhi)o?Jfm8+uW#+N>0CSaH1o~b0mp?2{y zF2J*#+F|($Qg*mc=xGwf=;~?QT`U7x1&j=Qw0(gfSiWV#WMr=eS^U#gquCFQwYrMVmR$|7bC;hty|& zfQZ_+kMu%BLnu2R*PsV##!A7zA2sQh_B2euYi!4$ihTFBuNhOR6JJ~OEh5VcLc(qq zHGpS*y;V1QIpa54?u>-@r=vLY@^Jl?uOjOfZ+j#7U^g#>L)pEjZ$(QKV+8l=A4XVv z4bS74zVqCWRT<#vb9HWtgTf)i3>eOwOq_^*?4E{G-C!XPh$VzaT0eCfDi6YB_PT1} zQ8#5J-WaqZ#Mdld)E4R@d^ftpNrZzUr6_iGge&KmT-@3^dH}L}D|l+q^S9hgV8b!# zeuWWxzUqubzx^YXA(;tx$SV=b^!M0dZwf47Tc^H#E>iD5vRYRq$;CYh8!)`qA3IUM zI@EGs(!FO`99I%A0`L#yFZ=hr8$0|BFRd6`b6tjmRIOt?&+7QS_-)Y2vgv84UCW2G z4%PZuvM4I{fHV|1e|BhU!nmFVoGLQE?)Udwna9mnx7;J*iH138t)egW(HEAIbc~pF zUD?@eEk?lsD6MG-q%?1)yI9jQWvsj66&@ow(_>Dba;UzsX?u~w98e$#F z-7`6R)?T%+aS&J!Ob$}fIRM!)v@%(SmQ zOZs_J)g1QKr4#ksNcXq8Q-SJy$m2wrb)T@maOWT+MG8m9h8LBm_uv)Yf1a53SNU~N zY?R&@_YO&E$s?igU~CDY4;?Xb*n#>X)MSnNpJXcif)Y`U&$Nvh4cV!*eXsS&kq(x?Ycl%tNXY|JejNI6F1pTK*rUwOgH6b;WtbTvou_! z6RDz=_EcF$g=k#rPNiy6i;ZkZFQ)d;s(;cN+a;BKH?1lZ%}4!Z+Rl==wFwUh&Chwi zU9+0L`CYe7%B|fh$yCgA)oR!9qc`D9A+}P0>*!v1Kw0FE13RI?vl=@7YwuUESwkDf zB*s+Yw`2T%Y$fr8_i4D}Bn=(UztZYWsSZs#q>?7!vR@#_O#d!5`jxY9_875@=)y^HygEs)Fkim& z+n~|sxqc8eHSYUJ(ZdyD!U@X4FGqYTmWr`0OGVgK#5yOY2mi@kLpd_ZFJJ4%W>XCV!ij(|xn-drv zi$}36x7KwHo%HDrQlW*pz;pT7SbA9K;l#W#VdPj#0^T}gp*9)hWd25eI7dIR!AGZL zV4^ipDhQq9Ur8fxJ5iv9sglhJF_&mu0ScTUuMy)KEUmZst*d_2>HDd)SvC}*9PU}4 zVx<6dYPIit77$QIj#4I`8Xap@vkPu<+u=#;VNilohtMtK9-@e=V48YLTd!$95p=*FiDJuVzVDooq zQ6~FqvUBj*hO9^Kru9g!=Z>j&FK*-;C82-3ObVejfEv>0fxd^{Uz0P`?rD3~-j=j{ zee2G0eEXs9v)#1tk%jQP#z9l?yww#e1>r=sc$zR)DWR&Rk$L#rRGYF=5vd#0#TmO( zk8!T*wDtm!OI@A>ZzlmH*+p_nET|cn7(1OMJBkjNnK$ld{9C%Wxp-LsswGlSp!{CRuKL#GO+{2htL95fb z@Iw`zK5DpsNZm_)&(u@82u9+tkwU{&dojq=bwf`6&UC7YUS!C8q`n24;H60QRRndo zy_u+;*9ufXw7$B~q+@t;uI%-a_C`bY{fg?0zK8A@YxF+`o|8{hs#6A9leCfm{rsL1 zKrii{Yh3bnac_R*>Pkq(>j?$k>Nl3}g@u30b0R|CvJd?@WUFKoR;Z-Tm{3V9@tH7T z5M(xrOuK$!O7!mO6h|5G{;1xS<$FzUO_O_xZlxk3WM>;b7Kz9yXT$ zR8uAN3YsBS%-J2qZrJS8gwY2N%dM2|aDbwd;W|VH` znAR;gUEDskIhRV$Dwyn7oJi*%S5Vigzp`+~NoCiPa#MbIms+>kE4&@y9p^5vQkv-I0m;gXrW$&XRic!HiY0n>gp>?TR2 zq2@n*Y~(A-aEb1(mA>}3eUYp?1iCOT#yV1ME_0%w=X_g%`|84ytr9Y5)X+zk()>a$ z?N8M@Ra%eXLQ1&zh(cu=4#Vm1hnyfJ>p7q~g$t;V9aq6mT;tRF-g#y+4AVS9mm)FE zGOdB~rf{`pbe|2cDX1q=Oan6w%^1WEQwp_!P<2!tOgm=2>Zwfbc4tgrpD|Zk#Eh{vDqe6N8JI|V{KTOg6W>3Qg9T|oKt60HSmDZAd$o$S{jiq8} z5H37@;ZxP>sD#IdbvKqYF3Cb|P`CkPZ&0`>&IVo~38R=94mUjahN$Mf-zCLqF0@KH4uMc8vtTA#OF% z8|Oe(^la_7^e?&qJoLrLh*c^S7jjMhqS61@S6sixs7}u;4Z;)e|V7QT4MV zVnaYU)4Me7%%B?n+T~%^fO*g=G;Cqupiv|oidJ}nzfa_y=s6-Xh3-BqH zdOb$1QEz~>xicp<&uVmIBQG5^{*A*t_8Z?_v@A9r&rmpC&oLZ0ARM|?5G2* ziKRT~jO4{rI~ov$@uh~`&4}6JW>7NV(CDal%ys=jDIUuafyvPL6oi_Z7HrE)YytIN zvo%S|S)QN>?*w)9-*|D?O%yr=`F8BE-+4(gD0-;Vq+IJ48D8{ND7acv`3%cz#jY-W zm}$=$sb%(M&_`^f-J3fK1-+$(ivssCj?l*6w#tr=lqV zPtkl`m>4xqR@69qtI4==vrR(88|fveAp)EXMh2%lZrSLvlB61iE1ph|HbScp#>WO$ zu(iatV10SjZg;B>$U5{VZYrPH(Z|bcX#8H!y{DHN4D_4l=4_5LR|1nvHOi&&dVc4v zl$d0wl!E!InLl=jgC55x$XfJ7^u3HQ>M;-OAAy|lY@boITbguhJ*uru4uNdn!07vZ z26;hx#U_PXByx%RoseL^RPNo_dhksU9Jk2!jF@Jz=(tDAi=zc zP3YULAPAeIB{dvRUcvUV!!!sB>YZh1Tsty0eb(~I3`fW#Xed^0uaO@u0Cf|I{e$Md z{hTpv9{Jg7zY?&|ZF%x|5EXR0?58R2{Q8xpj)qbW(YdG(OJk0pE-|T|PsHyR{$}}? zpsdy+h~L*8fzD>nhrVQM*MH8QevGtnAY19ql`Xksbej#;jAoPCnZc}k5G%n8QHMjH zf?DVkeN>af09{~FH8UV61aoQ%A6rp3%Cq8fzwz%h{Q*_}MCQ{5rp!T?>kfsp<;mLV ztNe1jO-+frL7A=mUy?spM{Q%KLf{sm!qcqpmiGvT=^B@3yR@yrwyGbVa~AZxZH3eK zQOfb3;0mMCvh?4ho9R}9?~O;u?b!=Yj40ZXNmL^drl|H@`1(8YgYL3tr*0^4j)8D% zJm-3Cx2s!ACrk>4zlHei4fPL1rJWC4TTF7Q@WoaJbH?S;s$dPeIO_@QO!qDAHjj9_ z{;7ZFwI*v6rM0{jJMQ#lAGR8DVwHTV+%DN;gGSSNU)8%uH&qG*|BLhcW-!Wd@ zH!SlH`Uo>b?6q=Goi%*B3!-#%TeXXsQB=1)^V75g>u;&*9)ZBFC>BG1m(7Ud9ZC8? zuHQW#3xkD%p~HO7$UmuBv8ea;H`cCCbqHoCbxSLW3sHr0TR2pG-r}a&dY;L6+?$@q z{F7;vU5OTG(l+k;FCbR;8IR)aN|4RU8-Xg;V|tl2IHLMWMKof&8KOh`?C`n#)OShe z%!J3dnYEx6^_(-#AMiXIQy2D@NM&yQ{zDO=JJcECKf3D|S|!t9U7jDfosq}rgO`>m z$2lS@tO?iRzmuOgWpV~5i-BpDH!T$SA1rT9y~TVK7O3r>BbgjR*<7A73i~Ti&fP{M zXEx#sOE$`01)i7mCF@PGL8uHJPmq`5xy*{Rki=IwjUR(KLy`B~AhFrPNY*L#MkK3T zH5G88Y7v(6=nSlvs@Zt!BmgApY~&C^Dzvk_mul`6uAXzO*dDOQ<1=` z9>Rfz+7&ctp(2hF;ZaNvzp&%0SaA{@slw(G(x7(gO7>nt+jpRWV^`KD0{JcuKfN7Y zjw73x$}F8mCMZzBQNcC^rq-iCez=wLQ^68`#xm99eWz9c#S}FX%b6?@wB^DZ$Ag?Q zo3k=YhvD`1mR)9QqEO@7o2}{FwYp%!ALpH3sjbOjTmq-QtCzpKO+^0qCs@lOQ~Y{_ zxoH$8j-vq;C;K8Ll`TiNbvGfRcs)~VVd?2;ex#@0X}^7}o)q!OIPUH60N=T5;)5=% zD{PopOP5nIWd7q2XXzJ6`iDMcju7eBzNs4?57biGzPXamDybuRWy8K0uP(dQCKPJV zvXnJkLH@f%RLSihQ?AH5_Yp7AfkQ*nSJz*)hqb12BAxx`|E879p?lRgeMFBG^$d?! zn?uRUiwh6%SazO?x_S)dtM}&5h5dsMUuaz1cwu%7LF40^AZyDjev9VHv3jCTJ~g%N zt>HO)^lt>Vo9NCBvZt@Guc#u^vGszyiL<%LfC5n~vj{*F83Se$dft_OUU78vT8-(| zFv#5`yFr%MQEP$w`-(OFeX5Uz4;aXeT-8`mA~j*KSjMTUF45f_>gnI$v-b~vu`Yv> znlreba^qiH44K!a3Ib$drnhuW^|mp-=iy4zp?>E?Q~BVZmRrcrM`tIpATRW~UG9_e z!oM5UzSV!wOPVOYMiM@W9wzl`ek-_7qWi)}fo>eX!8gjmTi&LCz)w4A4}OOnI>TD^ zAbL?#v&yk1Ti53Of*@C&Y2}C`bUOU-bp3SRlz{E3&^&3cpNH3)+)X<={s1D6JJA`4 z!48(AE|Kf7{aH zVWSagC^LNiKd^q|dFu?}A6IH}FCe)eJ$Uvc{0WK3iXNrDq22?4 zp@l~*w<}uS5MzvBKD~R=k)g{}>1AY!v@qu4>Nkkl=VDW|ASHzjcCf!Pj^;R5Ik)^ zzx3B+ZFm2LZm4W1F8oGIFd*sZp%d_J)iazxuT;ZB+S11jMAWr%kN6a6wGUi$=%u*= z>u-pT-{yrHqU0n+h1!(+~HSFT44^D=KOR!4DU{CdhSyoru1c<2p5@}L0}`=i@7 zZ4?^QH?e++R|~+_upwR#=s5=mLSWTVdgUIUlaiF}5KJf@l(m)VVy=R(nl=spzRc}} zQeKzedMyGgJSnWNLi(vqJ!1Xk?`4=% z#@{5_R-JV%l~%*<+kHlgbtf5r0;4(-g&_ESFxM-6Zgo({)T(;wfYd?s{_>*8IW-wM z<)|RCWCiW?6l1m~mIy;L_Z>#RXoyk4i&wiZ?Ukpk`lKXx7L2HLvyib`t2ucL?i~DC zVfn;BJyWy+UPhN73+C@^o6g-1VdSOCu>4@8A%Saocduk1OKo0ZV>fumTr}^@{t;kd zXUDwservjF=f(Ivr;|zf#bf7Zh)SR}fKl;Yp)(e)+4HU)9QV(0W7VbD&V4Go%t3~! zwmx$&g6M?ITZUx+Wn@@m*#_Gk7|6tIOy{2dIger&Sy8 z9a+=i7g*&2qWJv{ms{V*8?0qgT5xPZHhmz0C>?Eo2~w2Y75zzVQFYj^LaVt4AE7fg`e9<+f$~|L)lRF z?S|^`XD+qI{~>k8MOp11*EM-MpgI5D7oO?LH-cv>6K>&4>!wzz=AysUsP%)D;|>D@ zVc3hXwdPxT2Uz~|HD>XznC`o|?RA*`5qzQx#oE>UZS0SpLwTH+gun<6O)h9pdiTve z1iW6RtPUGCuij|gYmIy$$%)?8BHfrtaWoz_3rBI50`hZ zPBi$LcKagM8=?Oo?vA-UCiXU06xpl|-ndjusDvN8q!ASK4gW=Z``eu9xajz+?i`IC zixsC4&G*MtUQ2Q@uM7#bzO+%@_G7BKmcMAYOjYBf8Xg4P@CkL2Nsv0w7stbmdMhc? zW)$!8PHr#@rWyNYG~K5l^;YF-CI6nsC)4<#Tz9HEtiNLVTdvNt znb)AZ9;0XpGM?-X&WhhR`ClR+t1UyQ9P@NRbMZggtt~z-rS(_2w{6Zk<#RV323vk% zKQ_GHY2*7sRGa0SDq&Kspsj^VMqeHhOrhm~+$-6W(SEwCg>k!4Z^K;XD3!^dPW8>t z@EXIdg|w4;Eqy#;L-e{lc39m{Pp|H{Yb2?gy+h8TN4L-AgEm+pdu;?GAC7IVa}|UC zRw0}5-(|UEr_<&}p}=;a>)L5Gui7^H>VnMd2ZxP&h_2JCjkJO5oat|yk{yl6xd>k1 zXk~Dnb%n$YtIZE2{1WcV;A1j<(qeL82F8!=abriRV_GWBS_1dAR!DuS1X zZ+MLvbZdsr9^qaj8Pw{o=LU%=&oxY646NO4pK}^Sx(^icYasFNjrVp2Mvt+(iJ-!R zu(pK0s3HG_>M$li`ZPLt$pHyj{|HYT3?&PHhx_on@uL7cOZ*f6e3Z1x^Xk!hHpR?@ zQy#}Xgnl#ezgYt=pLEGUnlY(S6g%WmDyfw-ADjIm20~Y#>RbWUQXVPQ4Z>JW6a}W_SKWM@K4qy? zcaU#T`-!hwIG0vad*~DFV9K)&9g$x$aqL=K*09HmZAIeCL}*o;I9alTxhsR%g!CNX zUH@{vH9JA+BDL8spf;uDZe(>%o=v7b@Y{XuuPUwuSRpW|*%hBa_No}n`NOhKL9&v* zxCW-$l8zi(W)VkQx|r&-4_00MG)#?29m_mw{lTRf*Gx6m7@4`JVDu5&Zim#TkphA@ zk1q^Gi~nRk94B`ds|A8;xyy1>eP*Rm9VTbhJ9BR#|K4hA%xG5~e*75RGen76Y_7AW zk*!2M_%(8@j$i4Ax+=*ps^9e?my3yK(b+rdm;Q+UjR)-gRd4ZRj_QL$Yo;T?If7Od z(e6XcGvNa31L{=Te{@1l0=O{R$15{-@WG5l1sg~w@KAQ(p!qw@FNV!`$cNj!m*07DUHo`t9WLKJM-(zHlnrIA1mL%yX51=2}6%4hyXn$M!!s4=^|{4 zxnr~1p&a*KF66I48u@v2v3FG6vms)+&cChML@+yaSsR&iiE1v z5GG{1=^F4?+;;N2g{`k-SM)GJkyiDRIM-W=G}%ZB-1w>qtRlKyaoYL(3}Dhrp7dZG zLQ3usF)e6QEAfUUsjoh+Bet}!zx_)E_%3307ur>)cO`W$4EqZl&D8cn_kl2i!bxNJv0YgmcN+G>=E zE^+z3`sh$Ce++j#aX>S%qB1o(8(kjUK+(lN0rHn#YRfZcNhSP2d`cWJc;eO(4Sz2* zeJ|hdDEas*IrX*7tm+-pXH_3GJ~lVXsl61w8cgVHH-Yte2J^LGx=fz`Oa@fnyT*Sj zYQte*b>k9c{*i_7_Q_Y1A}e`N+;LMm-^W{3aThw7%Z>jgq5JKkcb`Px0KV2ouTM5^ zIt$-qL7(0V*DZ`+2ZS_Zwb&oH&oe|auxB}lw-1i92Hcaqdh^QN#>*UYhOs!gf(oxt zi%dbfq^Rncx_m+8a{7h=iWsMY*yp`+Ayf-^Wz2EXrNc8I?(hqjj{~(y+2Y>-F1J8^ zs7Y8S&!d41{NphVJ-v) z6R)AP5!yzGw_$^Me#`Cf>K@p#T7uUt=`ZxPvxvYMaFARBx-dzxu%YgE3(6r{nB>+9 zr}G$`{)l-+En+A_wnukKYb~}maJ`G6B%9CJE13U|yjVB9OuROTQ9WVtg1`C5xj&d< z!25^&-$R$C0(j{D=BZPHhOGJMQQ`euT2A9gMyW=zrG+bn8Zb zj`Y1SemLb#mq@O2E(X1FwI*?z*f>0J6kB@UUvF;zSQ53O zsq;3Ka}IA(JG|_6O})FQB~R`Ac)SXE2~YMk5bHuONs7#88WL>uggH|tWxUycW!_ji zi%gtIFRmQIDO4MFEibM+W*`njV8OiuRK1NCz~8`@l*n1q2gO4ur?d{5q3q5%?xhra zyh>ke*as=E?G`-0f94*11pR{ZppO>3i*difsftZrDS9%H68pnrAomD*oJ^IYuUp1@ zEiFCFp_>qW_Sc~Tw^QiDVXMScTx+Ug4(FA04#~Q8XKqXwod-V6XxrN>Bel`pvm34W z8CBG(h<~@6ym4d$CgjpfTLnhz=>luS;YYiN&Vbi|4I87z40+vIJ2zR!?Sol}>(f7v zDc9MXoT~*hs{bIh=Jd4Gg;u3Ve0)EXD;c-ngTHz*!7}MD=Kzgw&VGab#J*D36uUIR zBYKwpbJF=5t&*OrIpz#KRIdue+qQ_`WXh_X&#~Qo6h`xFT~r3e5cUG^hf4?Snr;TC z;%~B|new&}sW8ujAJAMTvIK zI8r0p0iW3N#0h_TmP*_(wNy)jq)wAgUzghpvM-t?(W~&Atce;ZdSkACZRgTeSuk_pA)rHd z%4qJ~+A8Q@=J40Z59w_0CvFki-nJ3xb7y*n8c&MD14OhWy`3WQZWjF3q65Z52;k-n zy+gPFYG(ady&%KT*us*H$)%bzPV&-1(&>rM|5l-5E1jECG$Iq^weKoKBgCE@Gh%S*BA_ZfQGq6`6 z`R>*%kGPr@BD8J&z8Gw#6Tu_Jz>%Yw$=7t@*bV==i>@^sQsIqI0GFL7*mX8&H5d4k zpjXX&kHt?vl=xgwbhwSbmwo{~EZ&(zeeUruXS@|jZ^t9vzT0lg8dR7vF<;96Qh+w6 z;d44yzv*;^?tb5O_4}>)$o2@~8=>0+!>Zc-)d=5Nk?)u6oiY8&@MNIVdzIfo5`_1q zRdA)+<)N~ZGex^j{%E~=;^<()-K7>|hNGbTF8QtcGAki}pxfl(=V7pZd3dw562vdZ zFb~W+NdiGhTmQCXora0(FJj7D3~)NyA&j%oYeSED z!*`{3`w=3ZnwTE>aRK`mO*_X9>8EjG@FX^w9iMsY$&NQjOq}` zE0XMsZrR)PrsL*dpDg~jQPiR)cpI7RNmN}LQ`}`#w)~u8k8t+l1ckx+Cy-<4F3z1jL@HWsbnaH5jkR*ysdWjTU*VrB*#H;|ES#jgyjQ2AGK?p1%x z+NyRezKb6SJKh@pSwd_(un`mI{ch|H(`5wyS(ATqMlgxc=l1UG+EyMPYL5MV^S7mS zvqR@7_0klx4{~0QF$BECAzqWODK^}$^VzaZ;ds{G4Q&e~j1nfJc|OSQVt9zWZ&JJV zbbqFoarM56ff~*OIrtfVxcqd@D6m^U@6?Q|xd<|G%gXZ&tztS{B-L1{?RdhI88dSA z%ao8CPpW%)|0jw>jpsAA#y?lH^y8fayt@Uv8vs&%2B&Ia=zSxTWysDr+jMSO%%s@Jx#!H;-pRbhG9`&@nW;3;)2p$FQTaNq8{Lri|UCz*DVP(*@t zv-9E__ZWox$GIU;QEXVlHnOw4TE9J-Ibo3FTJWTg9$ye{6L@B*rUgB@sU{jKsy1{G z$IgW>+-;RIF&csH94*!70M}j>;lD5$A!p#t5H6nO77@mNsKR$>eHVH;)ag2KVoeTmlry6s$1Er6F$$lR_5T7#oi_WI|qQn;F& zf_tc_-$U_Ba%gQT?}oj_fMq~?2eVGww~Fc}I2aVSgXur?34X-kxokt(gSeB4kggHD z{IOiOUnhT|Y`|7CQEr*+D{<$^`_96~p0@Dz_8XH)e79};B}Q)t?|xF^DVQm zmqO&Wzjn}}h6?IE1nXg|N{s!~1BX_|ZhA)hKe!YixT=>SwCuakSv^gDS!llTOV4$& z!`HR^|S>4$Xz*$#9Fw}%m0*q9r)lhE4{>?QRzJxRsNwYSYiLcdQ?v{8E#Zo13=kVvbe5vqbm0D>{r}W}LeS_Zt$M7Ll{; z5Wm`_z-#Zrdlbt8DDDTtwWt$QrfV#WB^g^Oq2%4tEBBCjo02v{RdyJhB7E0(ROs{&Ry~ecOU&N*Uz2R~92=>7ivh z{wkK<{0H}F@Mm%LMo+>&BYY!Lf%~tfl2Z-`YOF_0d(B`~jN~aIcx@}=-+CzcpU5O$ z-b-&mvFFlr^__G-v(-&sbCED8~8%0+&9F>BcH-f1^&56bn(ikPl$!Z|3JKu*4*9nIRzFT7W9L0GpLE1I~nZL za9-Dyv?&jrSW^5%fKKyE$s+I7Kuq!n-Xl%U8`Lfh8J{ao zlQ-cFE?vPU0y7!O^mAouYMFb6w040SZb>0BwTqKgq#Pd)3#ks;BfYMDc;v||owJvk z<>vd{R6cR+6skO$M}Y%L)_(UcW6mZaESN=Akqyz19lI-u$RozA(IZDK`j|b3;*4zt zaPIA9h2`!336N`aaH40vc%`eAQ7|eXdEUEHWTCCk9%m1JI_;to^>%|J;rjrf1?93Q zS67&h={jYHo=+yv6t6xTcrD94wvFqB3_wbusk?{Uf0&gIW)iUc53%Tt#F;WS6q2jD z$fffBtL_xTCswj?+d!R0LiXuJKZzvG^~ziUoB5il20|i z;PRP)t*ZEGdR^eowOCMKWhq-6wamqdmoxuTT`BsA&4-$mmDM*W+dta+lhds`3GbnO z%>%DaUKXG61TkkypvUqRaY4htJlQ2rb8EM%$g3_s5u)D0-IM$u?Vxh$lRch-BYzq* z{U`^c)_w|6RS&P~-&DP?K3|rhem~+WMPnk}6nFz>gMNSh&>PwNRW6wC`u_{}G7&Qd zq7MST%%K;R3+-L!9%ho0^ukD7l6TQce)2P1Qk@m`^mydhPzn3dw^lx`6I&BGLwPru zQxj1pzxyA2ZlSFZ_OnpGW~}zExG=>3r_?gXCkWoQoG@;?GQ2i5Vxd>vXzFQcj{6|| zb^R^!I3_c)MS*%zble{_+rT=wCU(FZwv|W_MQ=>VL{I3Jl0qD(QtvRmMjSt99!gbe zHZ+ZrVqKjtJpebn1c%pPoF0VMNOni_lt!v>Ry+q5bI^Rhyqz3Og}!|0E;&G`$dzBx zu3V$-IjIZ@EP`+?I}dKWFa}s18^o_fSN4Jlj(%4*M#{ALd$AHOSa=d%9-ofSe9tfr zIF|;2-hQbuv^`aSJB9M)M4Jbl*w^f&@lG)Ud{mYWtCB`w19wV=J+nm=# z>uYHt_L)n}P2-z&P4#(DqQS`g zXPw(?xaUc4p}{?0-S!sLULp7M8ka*Nma4{2=j3XnI^5HMc4KOQ+6%J=ImcCFW1=Ry z@0Ka0UJQ3ntoW>5-tgaiI%_6=U4BI+1@{9^Q~g&Iv9thLlUA{{#UJM0@kBdl=$pb_ zOQw-wO3#YyP6J18$B2s-UxH8ZGj^kq$IyV5$~!<*grNz8P&3HcVcyVKXW9DTmpt*w-tFG4ddXJn)D z5f`@WQ#g6S;RmA+!NRa(lctEl9dh0mBt1|GH|TQ#_b@OyrMx)Y2X7p4&|KeN7=trd zS%4(TeRg??6pt;tYX+(H9pt%t$ab){qNycv@dWRT0I6K5!V3-8uz5g}(>6wNo*A%<@~u_t_I`XpG8Z`mEQ zz4WX=0~r^=h4rwApOPsL+X( z4Mip9cryN{UojcEdd5+aYX%(92XcFi;~OPvt?_Y7%gx|OK5<=bd8%K8z)lymQ>rza z?O^~%wBRfZ&ux}Pob|#r7drj`u{8>GzP5O1`$66ea=vFjzD;n~xN~dkCGYHxKlglk z9e=3lDKtdXR6Kbxb{~IKy<^$Q2c#AhbXW1QSXj1{72uEtg{Fa9j_xA*Fszjl3y6 zra!&W21&(PulW6dxfE>vSsr>*dd0+Dq&f+h|6;j5EWK0MDm5wSi_dc%k3F+wzu1QE z^&Hb!Gmlsn$fLfw^)>R*Ux_AD?nUS7l>?Q4uD!pEh(6H%r#>H=2NpUyzz;jEriEry zIO_!z(xjspC`$KiLdzNG&4bwE#gkx*T#4d%IQsPX2|y{-xZM^gPS$Kr1*p+>K+jv9 zbmT%y&(plG737<8&G-hw0UG*y(e8m=BXSYMP}4rOK~))LZCSs8kJws%vyVh+RF5a$ zC``az?BD(hC%Nug&p**HZKOrU_hDR)g5WyEL@lP4_@6Hz)VRVtS|o7Snc)Oo?vM88 z8N+-)sUvECOp>txY3O=QWS2c5jl|rdVQ*c% z5@@xibt)LE+^}a&Glurmj%+A1v6A-}?wOPBkmdUtWDCUCaFB>|5$M2Q3vGNjPe+S~ zEY=37r=Si!Mngh3!=pqK=nVTf<1XtiE$eI#!bj3SK_cmYdJurQ<}$o7F+SpsaRQAy z8q_R*Nypj-RG4{u2I+(s#W$LbrAmOZ2$ttNwcwYgO?O>%K^nkZ4ziXP(N%SyMEyoK zO}Y#G+%(YEZqnz?Bwd}F^WV#GRG@OW^2WJFC)i7n4f#-$_gYk>7o={#anP)vdx8Ju zK{98W@to`>Sj7bZk&~e#YDUp;4_=mX(?SB|mhfZ6nu}F%h_}6OBYo#U>={NqN}`@A z*Mn+O*qjLj?x}L@TKb_lzlj{AI8MImop@>qe$>*IxcgkW)A@$# ze{wcy>a7>Cp=qCL)WVbERAJA5MBi~Jihs>F;F@>LE@1#Fp*nfDW0%#yDId~pSXE12 z*dy#m^0p>L_jGiL_? z#hcrK#jNEAUfFx2x3%ij-Np|~>u=MqlFI#k&hLEj(ceCUtsPnTbKYtk{4Ax7=^+Ul6y^$3)z{j32W4uf`*I=w933K{0hxmPv>Y z$T?DJdYc6^wf+y;f7*V00X@iRFV$G%Jf8V{!&^Gnc0}|mkDr0=YYc=K=*S`{!Nzqy zTF-4DfxZat6P}-~Tn=@=9aY>CwRN_g8harE-AvzX(5pO0&Yo1ddeserYuFRvO7aL+ zp1&Sz&H6b6fJZK7s8h9A(3spl{KIj)i?t6v2wjwuF`2(*UoW|Hv4h_F+l{_SjczKJ1`lw_muBt5*bH*L79F(X!! zGMHRgd13TWXx3l_8#EU)?;m$y3C$g5yh(wyeV9 zs7|iGxU{W;`*ftctL+rjl>6(K@>7ueUPbt5`CZz#f)AXs4L$5RY}6*Pr=ed@&40_R zYiUsU2yvdO*zab&?AMI03(gZGG|sX+P%i7=<+K0CLv+&M*<%OHT-d*XF|jQ|?`BIO z^u>{tN;xC-dOexwo}&7|heJT>UjAvKZ?nbnDM@Rb^%x^AI`|ed^Jjcc*7`mg{wW8J zk}+?oTgvh*119wN%@;oCF+nd~bBOGoc8cuf?f2gPo>%gr-P*ya{VA~a&`q^6xPgc} zR%guSq{%%RO6}~r7RrcqQVEovj?K!6$ggrtHgAIu*UcnpJR-TFrS4rG&+B^{jn*GG z_k{Q@+??@XnD~i#i|hy3wOBLmBXH!Ovv#IV9(oPLRSDx7LvPNMZGkulDJm_g8>__PBrVs0XTL*4=++&Sq~f;y=C z?g^e18{`$egK@sG`%O7?)_ps^F9u#SHG`?;pBQ`yZr&c=x>^`E2JZ?UD)ifb zP>{)`&yYn~xgGN!llDPdqoKFx zTVT7xuGY>U_`J3xiTutbVA3`|!XUny*_;2lng0Q$g@iz=cOOSSAD+?B@+5G(EA=>0 zhp`XH?!h=iSOhpvqs_h{kKCA^Pri>ny-~#+x6GY?oXEFVPl4w)-6g3EVvDSMo{3SR z-DMMeGG+?{N>h*QPc$SoVJ6&Na6D66v=`iNp{}iB2Kpt#UFPzV=Ad@%Yujp_Wp_~XjE+K0<0*m;q9U!f(>Jw+FZ9(Cw-_i~$2 z^mHE+$~)ZT5HAEuzPTAvnkL~CZ&Q+rWhpXb#Uc4xSFD~Q_oNPOGix@Np4hv{_(8Z^9VjKE(Y%J0 zdsWXY=H|5&-zns1g25Ly6_)(Q*n`}LaZ8o>4+{ygnIzV<*IA+$}gRFRS+0@IYU5E7hv{U3SGDfin;ASmBFC z8xLK~9#D;sD>3I2r8qMgMxnI; zJgRhGcU*@I3rPUX?&gmE&duxVL*K$@GYeb|TkLB8<4GM|_L0KYQr$8cC?KcC)IBm_ zLONB8=INOhCb&DwYy*TejVgdGAtqQEhVfLfz{Xmv{>Tqcj&{c!Chxke)T3fZt~zu| zKkZxYo}Ce_{OF5p#@Xm|fUM+qgZ)|x{M+pyvOPpcdVdcA;SM+L7bBlRvj-d$W<^x` zR#dDYLU-}D5&Ne_>sMg&Pg(SQ>|zkXSX#a2r{LIKE2r{b(dDQF4Cy?ilTOZmCQ(~J z7V9_VXcQT5kCNgV<7IjARq$IRhR4QX6QV^)dk4_0<2HF|s|3Be8kugU?uV3Q3p2>C zkW<9T0qIk8kXGF5p}2bGj%qvr@X?3Ti3PH&n~Nli{{FY&WF-JOUOv`1dX zu9XmAb~{z{9FOBfG{>!Dq%l2W|_=@3zh*m``I7q6G- zCaJ3LRWcLoBRi?(UOBq}L6Jf&3lM!1!j+=i=4IX!5(Sm%BH;Z+>k-Z&b5`>ka%<;x z%G#F} zC{u(K<&nio(pKSs22vgO6|0C9_0;fkM?@DCU2X-mcv7BDzg87tx0w*!$@N&NOOGIW{14*PPF@WG7=Hq@hJRAg+P<7?vKpAll)q>3}k! zO_#|deN1LFB%5Pa3Pt4=L3R2s6j^drKxhGtxEZu21W6%T%TVV5tBGL6>ebp|EbyHZ+%1AVtO&iFH=v3Dt8JPTVhw zdLuJP3kY+hWu}zwH6Dv1*04nJeL^mI`^u|AL|}SoW}&!G4HZX0`zUNmxOpCA3Mdv! z;0{Kb>7a>T;sMxpG-g~tvuuZx)FE~Le1El-On$y}8ZYYS<^v}Qa~{$UHANs%g~=iU zi}x+l*xqQwzL=4M!k9WP>zUKBl;EyM%XrA1mx-9P=eWTCx`%#zq!sDax;Xtok0y#C zKvmf(=>e?)RV*iS6H(qGvUhdPA4H-ryL~ZYCXqHdn2ts%B9)7}>o8jq4{8)wwe3So zhR$-Jn+HIzp*zcM9g;PsXvqI9-Lo$}LP<2v7eV@u&JGlBQ^*=j`YLKQ7!&EYGnONM ziHVbm)o2a6_c)X=54l9~eh3X$&Drf)~jH7K^{CkC0VI04zGn zdiD7x0ABP{Nn4l-FrMnBn?Bt%Pr5Pzgt zgJj7*hI2S_=~+NTLj%1_qQ|f+qTLgxVCR%jvs}p??^(SbZ36dz^hcf)(!IV42h~56 z`gqTRxtr4WSjjC(7Knp%`Cd}ViP}JbHUub|kX*x~uY`|&1B#01C@%VYXvpID&QMi+ z4nTAPE7%m1MNWoM^tpp*(a_%gB=J%s>pN)8ScktK5>gZK;P?Xx+3ZrY1tT{GZ zq7(c9x| zaAhRyP4qbwDbLwU=Nh`QkXF1}c>r-iqlO7mNUPGqOAE_Oy_UsN4;y-A2*c7g?ke`t z6nd9s&T%JHM#ja%NvzbFHPS$ils?PgJsdI+6#ys3knMV$My#}z51O`(dp4=^rDn#% zbo)*ClC?C6mYfAzg;7YWC1N(z2E8j>ltL~1LVGhghzoi6T6QY%n|xDEgC%3rEihU^CqSR zBC8@A?$5=mqAp1g>2U$n8cMmminSC{6HwzDz1+bDS_SLR<;*H9Y{2bnYoaOU)G#?R zHlk61REJo+^tx|i$_*0NEZ(SI-X3TjcvTvzi#x@8@kN_|qev6}j5BU%oc4e{vo^r5 z0InjW0<*&<&1qe#|W4%Alt5)j<%0fu5YK9%5U5GT>|kVzZo1TuPUKXq-N z<*oSf7$d}OUVZaU!nU_(+y!6A+U2IYYEnHZzQg?o(~SGn`+0C9$A@6fx((8)(ZU7u z{$fEhP_JiX_p}}h6P-?ZVqy7*8n(aDKPsXzebUAvpCvbq_?zCWXDJh14ZE;m#mfM8 zIPFn5)%4XTvD1bu6wwibjYLg$7Ou4)QT^3i^kkEut*gN0C{8C3afu(; zwJ@0zn-;vTZ22XDh-scTGpa>5=Cy-drm)6N0 zbHa!!omP#YynwdQ4=O~8>a(`W6%{o2;gmwriA!M5=FoxYpxMf`0ffe4oSrc6{kSjJ z)3;R~t09dN;u!<(ob)-ca{Hj*Or2je`#Usj2WmS_*WhT;8RYWk_aM z1roi3Qn3rKsFYE$VcI&$HC-`#ge#=4L zqipD)-TnCa(zO_!yp27rnmKa;U?jo+aVEOjKV1_@7sa5MPyes2bB|}b{o{Xfmpg?@ z<-B#mU1B+(=PsQj6oni^tPI1PW;R7gPN5vf?x+xRNRDH39C8?8a~|ewHpdM!e!h?2 z@6X?V*XMkF{`h>Z>w3N4@8_$^GdPdCDskQ;krP-fkXAmmtfaL9H)6~)sD$D}W8otB zqvd4%1wwLK)6kH1FzM-{ViE30=Tqu2{P5(8rn4a=;u(D-68lZAvi?!f@%?6P$VP@% z_*#qE`@}dW-i@H_WEKLH?mAU8xOx9TkKGZx_XE@>rb#L0tn90W#IG?gT@Z`${calg z?X$8#W*`GHq1s)~An$!(1;wJ^8n?VplD{Pkx3c|3{8(L)pL?#W^6H!xh@T^ zVP{D;!Z&eA{_PM};sX2?4?CPPlsuhOVsYV=)6D4aN=uWU!_AFWpCky~7*Bc|XQ9=PSF zvo5K1&B7NJ2#0gn4T*HnQH{mcu`2hk9_l4HMan{cQ!gkivP6bs{7D*>%)f7zLoE ztF_@$;^^`q#$FIallQHZr$_PM<;aLKF#9~};f zb>HX)@ytoNO5g8SL%QWe{F(!459gk+yrD}2O|Pd*W`kyaskp#_0bi%&HJJs7A6@4z z3*&r`VJsle{KtIebsc`EQFm$?5pb{eWOY^&>p+KH^VTQpt-bb@^ZV`EFDFuUTAwr$ zVRYUvv-HoEs2!G<*?T%B>Z3%7-tsNNkox)ZYHS`))@>-(zT+9}5Og`|-J)6A>L(xe zda~&HT0T5-Yu5P}nh6%MvnVqjH(P=lq;@r^_w=*fxx0W4b(3u{+Z@TP4@atL4*Sqi zjJ4w_dRk%vtZEbhxulmtm}|M;NIwsp*S6iBk4*TuaSFTgsN7b2@u3Pt)W9C$sGM9m znD*%4pZ!yg?J`=c#xhb2{^YbMzwyGFkUjs zUAQ8RbGC^RN#4*x5&!QN{S!NTEZMc1jcDPX4|YG+hAjmE7LHSUBE0YA58a=$pJskA zI9;{kKStY6sLUwGZg9+d>@a$l%YJU0%A|>;E*8ndEk5g(l=Lv#48RsWe<6q7C+|X% zHpWNSy`W>;%FOEOrB#RZo%6uuLk`?9OP3H68J6ApZbzL z?5m;SV!08A;f7-ed)&PI6kOcimmRNuWLH7@)0iI^LS6B|4%k5DF(v0|C#k>a&E3&D zF3cvGGY40dvb6;nNg*kfI<=W*vt3`d(^;}QtA+ zG$+=&_u!3B1X?avwW?`T3u@M@~oW>({w$wXz*0{AuTWU zFe^}wspq{#XYP%~Y60f^>rr|&58_G^Z)(b;_OwSb+))|24jcc$%+Vb{eVQa<-7?WW) z&w4I(HKmZ$+O}#YuPb!nLaIAVvL+Hh^K}cXUd^g&;nP@UsC$Q%cXG+UrmoDa&dRk+ zj}#C}y!r9-a~sJUM#Adl{*7aEYxtEmtJlcDRg0UoWyyLpUGe`uPgQj{`fzlV(DQrc zVo}=v?mxLw3JPqr%aPvVBR*~{$u2b5H&s$qCeQmgW<|ZSLrT*bYA%tvv37gD*%jlN z;?O2UVX>2_i*r=)9$RIVo*`y&c|;MZ|dWOSBN;f?hKL;+e;R( zkS~>q2@Mx`-QvCLs2vHw(}8hW^yY?M=j^SXe7>KDg*_!)4}>w8$fZaHA$0P3vKWxb z`a2vsz$2y4>iI9$`GvI*7uZWjjLBQ}b2g@&$Faq*Tf{Fw2G_!Pb>^+e3b`YgISmYn zwVQj}tv|UUsfR(t39^*|s(>Wqz9j+4Z~J@Rla*}Jf|b$*zWTtGAf&D~LOs0nvJszl z;c9|Y=ew?h0aO?4TR((c!(6?4vgB{&m5Nm8MmA=>njq>DRII$|>-EqO~fJz?Wrm{W)vnqZ>LAzwmokT{p-02%;(r*N@ z%&U&Xuf-Q0tN|>i=S&=12_?Y-^nd-0+~0JQ)mePnzhq3-;9YExaBV(Ox_Q~LKC`ZRkeeD}28R}DVPbQy^QO^_ttzJfU#~a@&jXeT)!7DdvTlx3D9i}cpyY25>QIb2XX7VT?JhZzK_(WUa zS*)ptsJ_8Lbv(1&2G?Ak5ce$fjQ(~lteE?uaJHb)igH}Nr^5f{5+~r7Ky*3Br$+;^ zsRJ%?Hl$*{22(9b;Iu0fgBbXMjRdP|k$-qY2Hh0gZqg-8`Fur?DkM_hj9U>c8TR3~ zUcPwTk782=%N~}mD+c$~o@R3U)-$w1=$uH!$F3m}C16^qNagO~q%7qp;W~-Vi zm_YFn4Vp;`yktPn{%zc0v88%3^`4#U4IjOGv6PLh$;NQZXojXoHbkp$-+p_Pv?0&- zWgVuhBH(tU7jwy3Cq%Os>aU_{Yr0Wo@^A_P{Z*zZ8RvPM$sy>WZ;2bm=gN69q5rV|~lZ>M5AbGE$owes9I0{5Qs13Qe; zHjErjp~BEM^%1p>hr`e^h|XIzFXgcDh>9yrlp;QPw?too5DL(5_= zm^r>Cj<#KSNvTR1PzPp@+D0E=Hb3xj?2+Df8jO5S`-&!UG$^df3#TY4b^e=qK)Qq1 zSSx>#yw$~tZ2A&le)q=qV_t>2T1NsvHaMwXICID$(*CI!Hf=3}+`s{>zMJdMz1wdl z(>&2Wstymq#nv8%uXk!l8Fx0EWz?$k-*)C4e4;fR&){0Ql##jr0BS{Ozv>;8am3W! zbDK{ElsR{=fET9@Beg=P9+#0+!6=~p-1;eYV4{HI#^Y|i_<$L4!qP|EtqEt4QU?3j z#?zoCNJZhCE2ksHVd*tH$+|K7uQGguZi6at+Bc}}mFyIshGz#!J4%$yRpLBhTIlER z6PWbC0SB)HR~!x!0)*ywCyOw)&llMY!lO?%+K*=!6o@6%nFgJaB6N25$K;vpWL^&q z3uqnr&aaqQHh0ZxB*>DncCCk$r(X6Qs>CuYb^zy%#@O6bB!gGm3W~jdzV&RXb;nT3 zT@^_rU8}XWNUZ+D?FqwTF^0EJ753q;7Sfd!arE_!e|a++S$%`WC4v-(VRJpt=h zoAUT(Kv73q>O6y}Akz1{w*Z|%Nw2<(Gi{B`rdW7H%9$~BG(HhkQ$8I32p45~m5F64 zFDr)}^uXn@?Ra%Y>K10i0q!cMuZAR0IGaJU&+RJKLovfq)}(wrg?u!H5o*&(S_8c4%{D( zvO*KM#Rg!=2hkbTy}E_#BdO*606K6ZMn?Yaym@#dqNJ)U6k4pRKO1exK$w@M7CfmJ z%1qPx+c9m3Exvycbc!gGwS$Z%IBh8iVNpM`{D;~jNp83jgND<24P;Lr_hMinFgSf1Mme>LWG4)0Iz+bfA4Z9fJ%$xUlMc?!X)?e%DEtAUi z3U_{}!`$lgYx6}NX1X}YNFhh4FUY#uf!xDKt)f?HYzHIiKbt+47q!cW9dh<7hEajP z&Nm|GG^&A=v7p0Qu9QZBOYZroFXM#?^5WgQcY81yW&0t{dcNF=n7AOy{v%zVO7;D5 zSeYD;6)m;0R!L9j@?2rK7{K?q|Awam0H9`|gS%aHe}8AS56s~6mt=3;lq1!@lnu#b zlANSpWVcw0+EqSjt8{@XXcr7XKGN*VXuqWxA>>6bpd%VRC?1u{uUaArSq9WWrluW@ zmk_f~fosKSXYuJH7d>vf@?xtjyYW76#*C{%Dayajf)SK^dds+(-DnZbo6USQtF@hV zFL$E>|2$%QBd^!(iLq$>%I83u9B|L_9`Uy4v3ZRQbHXKExHhQqqbxsFbnPR5qayol0r~7kEPKt{dtJIXFMnOI=|4(Ggw1c&&>cJ4vEIpGf zt>>bqK8Bia%yhXB$dxp@dc&C_WWs#(WSps4%=^b zP#x_YoPXZz>{uXUzZ%c9i~klaz?9V+YTSL_HZZPHP4qsw{e1?{P`r3(OCCdL+aphd zM0`&#@7irPwU`&&O6rH8;!)dU#;BX<-$P3+7L9>+zCA-K(0pCFtj)_%Kpm@o|Ig3^ z+dXw~2d8&#th3@co8AGASxNBe!OnH+hqp*ht(V=68}ll?qtNJA011`R_z@~Ue_cmq zx@yqvE1;poy#z;;pmrB!^o=OhYDLRETs$XkxBk*7)CY758AIUk6o-Jml1 z+wO|vb4h`7mg|FZdg zT@a=T5jbVU8x6=3gsPiJ65QTnC-NEi0t=U=vY zgX?Zgw@QbG;#w1JZ7MX@Em62$nY-MOPn&mj-iMk?sSonuMH(m9{fk>W^XgE<9I_JmT_^-$GI6bMqY@lmXChjb>?;6*2<8Bx?FSz zwnbt+i86uPQG|+1TGyr9@=G|C*7o(%WLVQP>tGwYpniO}I(Z5t%&ciueN_28(d z+pfau4HS6?49R_!JU`OU|0w5h99}`kpP#{;wYA8z=}cBt9T%&K+eABt2JD0?JG9ld z7}9>2ndq@Ca|CwWP}hA{4ha-eS7AFU4C*4jqLH+`9Uenkvb+b*ap3(+gyBx%}itckbeN4x~c7F=S>WNEQ+DsRhNH`u$fFuNfHuDs{4H17 zKL8Estae6%S5^^Q#AKc^v6y<+AC&>)C_{g5_C=@z>}_7gql z?yW`EcRlPDzczm8;2s9bbk9yaV{#LG3l*krCWe39HlZ=C0XLw0DP&p6SCmKUu6ZRW zS53+90>&O{IUtX{<{yyb!2bjFl5()aWf4nHG@$3fBC($Ut04L*ZEEv~jQ^cJ(KPHh zDeFn7j1(l~9cehNf8@I*32|<@-RifZ?7h7BZz)c>Dx(lksvXSzCZL(<@asW~WFgwp z-cl9vmge(48fA*pe8Q5{?R~gwj^lvf@pT(RgXb-xm2rLXrb2dABs;cLnVG3KeYbpF zN3`Tx?TpDToOhZUO+A#J0TkJI>#cOGG2K?3owGo?Bo6-{{ z+@({;coAB7xXpRsSI^5mj~<1=493mCF6H0FZ71{`Nh)*6LxqA~tWbx85N8jJbp>ZeXA&OHk@?8vjgC0I`i4aPfU9Y zAd>B8?yeJhTv!!U^ekC7B((5`K*z1GUVbv5p+q$!N-!4~VFXFxtPLOPd+Ke6p4QG5JVH_MwThkN)H2ESr;?*t=fBNw{R_HMg*g zm!fsF2WByFW9uj%;pfDD)vxS6?MPF-JGMnn+7eq{#CHeWlCs;t`T%FR>5OAO;sbWd zjzwGlhE_UM=ZJ!Iq{8KfE|~tT6N=A$KXUNGwgkAgt^Bg4?_uZ@vw<@65mrS>Vr|iY z$j_bu%nPV0xaEY?@>TnYLo8bBlge7Tt&h>Oe4^&LGPX%tH`nPM67m{^xgEECeJzb3 z=uIv0qYkw~@qv|~r!L^B^NEYU&r7|#b+!km)#;#<3OF&jVH#pAqZ=2RVUsv?X5gH+ zG+NBpv)2TmFde^CKdrauT8g_ZqsP6E@Y+*tN)Oli6}@+HuB`9Sa?M(fSrAq3*yE~R z1}sj$oZee3C~=jRy`0lfaVScQ>#y3_CSi#7Vp3;=IyhKDxXVAk{lJ}M4`E`*^P1~SSW5BWu`bFC#*O#eHO zc-W5M($AVGqh}zTYu7u)Nd92?>t1nV9j4;#;+~>ij#DD#%uhmRWJjatWi@}KJe&DM z-Ty9(x33gI4766}}i9T+@y%EWNaIxqPfIZI%!In0wG(b~6Dn3GO`@Fv^=Zm688Mfk`o} zB(EBbOoO8XPcQ%H`5TjEhs1UM)1YG$m*x_N z!lG{s0B$Uo$}<`#!Zyw+J%X3@Y>Z7KPhSW}`g`zOn`m6CX&gxUS1zm|=Wt1UW0$3K zQ0xGm7Ppf+lbQeXma+ZAt~;N|Vb)jO*Q(=7J!m%Q%|Ecs*WUn#Qib*$lCM? z&g*yydFSffX?aZE_dRX*S<+Et8$VYBb5ng;ue%7X=7Qz{NeYL{2?q_@0xbizpXkNuUTC*!Jd$8hCYo?G5zarW(j{3O0 ztLD?%LLFRwx97oe4i{JsbBXU8ZaJ#| zyz}AEhh48t@i0ys_6W?R?v(y>X$8K7%i1F!+M@bzVlUO-Rg$L0e@MkJL~$0=)ngWf zx$CWsHEpMYECQr_UB7e7o}35rSq7|x3EK8*W=Jb}KUUCN*wb+OoDp@!?0b|hRXiNg zABfj$a|Qf@ZvVbOBIK~oX7F%`dU@=wW8^!Kngc)WnKX!?vHB0#U@7v7s7Gce zDYj{M&Ns0P(nxS|Hxca=cXf1vR6{OlVAwL^Jw6T}KIbw2BJjPe;a+y{8t;6l&X==& zd^hV4FfVxp>xT<^?B4xm{!fs*nTtV_gb)f1c3$le@$P}x+rCcs*OcZH?@;F0-)z%; z0Bn*tgVZUtq)3QPX69>OuKs1H@%!uXAW`YiM-IX}M#Z=Sf9ckZn}qHEWHPTaj6y9q zThB}{=s^_oieMu}X3@j%r?+Fne-$Hr@fnjg)Pa#l%g+K%RQ&C>_HOy`e?YBFHhBds z^YDBLARHe(Jyb1F-J%9*l4O_pmJH?px$?rgEd{quFx}{eOdpQ6U%)auxj43M3prAs z`)mUG+CC9ZaYIBn9+wytK{&+kh8mK}TU0BWPBN<$#tc1K8Sr;ie%*>|_hbl>Vaace zjo|;OpN_zeCqLf*?`L+_&Xvu|>fj(-_h=o?1+J~eb;RlzX$8xpq=K{50h53icOBEw92% zvPTn_DOpvO;4=6&Q9)|1fclMi_TbqK%I!GUoS=UaJc~-7h`NC@WWMGy79`e zrmm8~XzoU^A?1VZ)$i1L)W?p(8x}T;BOU6p8wCPs?DTcJJ{NytV!Xd>@w<^*uP5AX z9ft;Z5w3aD2eKl+dT4x7r|eS@bAQ|!mBKw%7(3ga0MnMO&)7+{47B_N`}OdAeV2k`svtZ;7#WoI?z!qlurL@5^Q zhKW*>wfpwoo=5ij2W+Asm|^GNG0<-(kMCUR=>ICL$a&*c=z6p6BQgqVXFKJ!mon$o zF4JZiPJ8Z_{)+Iu+l3Kq(-b^uFkkkH{Ftt!KdPc7@E76zNaD7N+s@JTvVlsKGNGQ8 zk238c;XBg&7rUI1?|<@>Y#|x<_Yf8rqU(9;#BOT6l@Xse< zHGU=>IV}KI{8`ZME$NfWN9LM`bVtHl#F7oBGA5GdTR?*-z(U(X_Q;6g9No2wst3ne ztffBAZC9V&BKw~zX4xc zgtmo$rW609{Zkx{iM%zR*QU7E(!Okycc%juq%a?OQea5a`;42`r~UR53GSih$ha*h zeOcRPFnVV)KaTbr-K;s<8EQBtyp~!_D-O12UvcN@emDI2;%8+9pLKZ3XGnx%!I<`L zdyo4iL6{uDwwAUpH^m<;@o8HpDBJqne&(XO*2NBkC2K#1l&`4e^Wp*V^J6#v2KkSep_Bu%UY7cN+B{5O z)27Xgt(QrbP|En5o+s~BD!n}TL6NZ*BmU&tUZ_5H>H$H38D=3CS8YF z179!ij}wI162WENL2uJ=I)uoeY*Q6E9Bk*;b$9IL55x0=FV0|c`zmvU#z`?$d}ZYQXQs|*N|=>Vp~63&b=7bq1m|t< zPjlK*67`KvE8CKst0bm8g{`^X%F1b=>Q}T{vJBIe`op1v}zMs7V~1b_b=*5=A?yBHb2tZ zy8M}!XvMu8ziPVayVjg(aPY837pOin9~A+XY%v7Pm}gFdmBLWlPgF*$#hI>IG;E8j z`t!&pT4L^fgCp+#S`_oNx_;@$M9J~q=x{IBK+|>B?nk(|TBs^ejO*ar0Jg;4YCCJU zpx?3jx8}$@JANx@s`S9EN^1o`&-NMop=({4grv(Z_DMNa`Q$h3oq(&nzT4%7ZJl!i7l+D-(dtc+f#jH&Nswy~Pm`e}h5$sr$cw;hF6Lsmpq zB8ZDCcR(-U4%4@7XVq)()y;MJ^S3DW(xT?u=Df3REarENGzy2atdF(j{%Xzs;R@iP zqK%e*QS)&y51hWqm?=XFxydTe54u zSbcWQDz!=%OWIsROoVRU_!lBP9o@mh#FpH=y)Jvg@U2kR=sVQ=iNTTgljp~24H=8? zv@@E61}fN3jiYvjq8LA`vww$f#81yMsNpBikyRg1b*SG-oy%=Cmm{-+|Jj_mTrB(H zWFR_v?#RSn>5Dd5V$a)vKT3=-vK4(}cr&(;zLvg#vR0J4??KbmmcN@7Yn24W3s<8b za}+yVT5t5>yL^048^vB3aeP}WK6 zu{OUKpg#u<+V4LImT!{72mxsK^1DPMnA(qB{0x& zh54*%+vOYEM5Ss_-^{)<>G;sO)u+tP2uxy0POtr5CEa6J^z#IsP3`P9s ze=>?iSTRyq>l>2m5SD~_mpZd_DU-Nq0Yboif87&LvDfcc# ziAe%#xsH}twS8?8*1>nY^ACPx@8CIQZPjTLv+yyi$f^~bLR_Ppx}R};hY=N00&SMM zC}>DP8&YfL1dw?+wg*s-=hP@@WbgoVdLBmmw8tO5eQY|{UehY5w@xXb*d6jD+_iyh z?jyX2z`t-vm28{5HT{pX)xux60>gULrwpnDj^Y ze^b!EP5oEQhHYA2klhvEDni@)(@TH z>IK8P(kTPUa5)q`q(Ny0ZLsb8F1kT{mAw6vAv(4!7-H4N{-AY%6UfXa5ar32Za|35 ziEypJhau(AMq`1`ZGA9O0PGaoHDx`6r&dr?2)FiH!V@fgfD0=fK3{Z{=6Hr5yP^3KVs@pC~@@4_g=cUaue*xgTm+tQdpP@k{Vr zt80OWoES#_Ew-mRRp}V^xmKP;r%r!`^vqYp3!gDN9)F+?Jz&M-_e*dQWV~>=R|Ye@aPf8~2L6i;DT zP_@=i#nxd^buJByA?$4W;I(+nrE&JmCU>QI+>ApVjcVObW-(dCj zUgjo^SV!1djauo}f>cohVK6UR+{Si5NLc209*s9Ov+2zBuCGTS{qdu~&71M2$;S}} z;xOhukL{-S3jZo&{dI!gvqxqXr|tunhv^9kzstjSyJj~uf`-ht&A7vQ+PtdFs>Q{v z)nrz-<4W-atzH+Q_rAt}x6#dpjdEGcs?hOxXjuJbP&=dCCm#j?6NtNhK7qVBx5H|? zpiq!wkG#KuJVz547|2Oj-bt_mR+cZ;g@kS~oeaz~d4Dl46ngP43(KhLfGwmPHchG= zn?^-K9a?$`3szhZ#t|h=US$#kV%AtK`j35QOuII4M@X6crstHlP(UwcH zvOmaKyg-jfoT1PoswdH37zx#N2%?N8r`GPDS)DBKP)_2VAm5r`dn~bbDAXymc<$u^ zH4|UrXdi;yQU=XzvX{+7=;4G~-m-m0B&&+$1qk3^FA#_8>bXAL(d2%EapL#{OS1u{ z#jN6XhU{&lxlRTzE_Fl`V-xg$rw;}z3-QM-8a;{RHDdV(N}*TJqARn!GR<}jGwMP;qSL*{}YBQH1DMdkn7zW3V0 z&(-%L=$?m@pX(i07uZWzLC{l#x9dfawYjUCAn1{+7sT(?Mdh0+f*`AlwujfLUR1eg z|G&GubPYP(ar5v2hudJV;Q#AM5Js`9^TeB*r{7JbUnS&(X(D@n*9mGPtNv;fWEe7< zF6$Y`b~=C~v95d<@9}TGdC+%y;fU|6U$%YG6559-EMFUcF|{d*{hzw~yDx0>zMa)y x*?U#c8X17!@6^A_ODCY5&ItAYe_kE#=j7`b