aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gradle.properties2
-rw-r--r--server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/GithubPermissionConverter.java17
-rw-r--r--server/sonar-alm-client/src/test/java/org/sonar/alm/client/github/GithubPermissionConverterTest.java51
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreatorIT.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderIT.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistIssuesStepIT.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistPushEventsStepIT.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepIT.java4
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/issue/ExportIssuesStepIT.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/rule/ExportAdHocRulesStepIT.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java66
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreator.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueCounter.java10
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRule.java7
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/Rule.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleImpl.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImpl.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactory.java5
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandler.java4
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactory.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitor.java21
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitor.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitor.java4
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewCounter.java4
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitor.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStep.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCache.java4
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/CloseIssuesOnRemovedComponentsVisitorTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComputeLocationHashesVisitorTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/DumbRule.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/EffortAggregatorTest.java6
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java8
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRuleTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewEffortAggregatorTest.java8
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImplTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/UpdateConflictResolverTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandlerTest.java4
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactoryTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java8
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitorTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java8
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitorTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadChangedIssuesStepTest.java2
-rw-r--r--server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCacheTest.java2
-rw-r--r--server/sonar-db-core/build.gradle1
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueDaoIT.java2
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueMapperIT.java2
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/AuthorizationDaoIT.java163
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java35
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoWithPersisterIT.java12
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/UserPermissionDaoIT.java60
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/GroupWithPermissionTemplateDaoIT.java26
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoIT.java32
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoWithPersisterIT.java12
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoIT.java59
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoWithPersisterIT.java12
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/UserWithPermissionTemplateDaoIT.java28
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectExportDaoIT.java2
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/purge/PurgeDaoIT.java72
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/ActiveRuleDaoIT.java2
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QualityProfileExportDaoIT.java6
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/report/RegulatoryReportDaoIT.java2
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/rule/RuleDaoIT.java4
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaDependenciesDaoIT.java248
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesDaoIT.java134
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDaoIT.java109
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDaoIT.java618
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDaoIT.java315
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDependenciesDaoIT.java65
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaVulnerabilityIssuesDaoIT.java141
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/user/RoleDaoIT.java24
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java14
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java49
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java14
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/AuthorizationDao.java17
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/CountPerEntityPermission.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/GlobalPermission.java2
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java9
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDto.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/PermissionQuery.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/ProjectPermission.java77
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDao.java5
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDto.java6
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java21
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateGroupDto.java5
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java2
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/provisioning/DevOpsPermissionsMappingDto.java15
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/ExportRuleDto.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueFindingDto.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDto.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleForIndexingDto.java2
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/DefaultScaIssueIdentity.java50
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfListOfStringsTypeHandler.java57
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfStringsTypeHandler.java62
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/PackageManager.java28
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesDao.java69
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesMapper.java43
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesQuery.java43
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyDto.java234
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyReleaseDto.java83
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueDto.java153
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueIdentity.java49
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDetailsDto.java176
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDto.java128
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueType.java28
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesDao.java49
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesMapper.java34
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDao.java47
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDao.java69
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.java38
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQuery.java183
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesMapper.java32
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseByPackageManagerCountDto.java23
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDependenciesDto.java52
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDto.java193
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDao.java73
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDependenciesDao.java84
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesMapper.java45
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesQuery.java98
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaSeverity.java55
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssueDto.java106
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesDao.java49
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.java33
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/sca/package-info.java23
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/user/RoleDao.java18
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaDependenciesMapper.xml145
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesMapper.xml80
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.xml237
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesMapper.xml69
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaReleasesMapper.xml164
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.xml80
-rw-r--r--server/sonar-db-dao/src/schema/schema-sq.ddl4
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/createdb/PopulateDb.java2
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java2
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDtoTest.java2
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleForIndexingDtoTest.java2
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/DefaultScaIssueIdentityTest.java47
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/PackageManagerTest.java34
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependenciesQueryTest.java40
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyDtoTest.java123
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyReleaseDtoTest.java54
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueDtoTest.java69
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDetailsDtoTest.java126
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDtoTest.java56
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueTypeTest.java34
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQueryTest.java55
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleaseDtoTest.java74
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleasesQueryTest.java33
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaSeverityTest.java57
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaVulnerabilityIssueDtoTest.java45
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/DbTester.java31
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java4
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/PermissionsTestHelper.java6
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/template/PermissionTemplateDbTester.java29
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleDbTester.java4
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleTesting.java4
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaDependenciesDbTester.java118
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesDbTester.java78
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDbTester.java76
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDbTester.java120
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaReleasesDbTester.java74
-rw-r--r--server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java60
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaIT.java22
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaIT.java8
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjectsIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTableIT.java60
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuidIT.java55
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponentsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponentsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponentsIT.java61
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponentsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponentsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponentsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponentsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioningIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledPropertyIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentPropertyIT.java91
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsersIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjectsIT.java154
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfilesIT.java129
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsersIT.java94
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTableIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranchesIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTableIT.java65
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTableIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranchesIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTableIT.java66
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTableIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTableIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTableIT.java56
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokensIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTableIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTableIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTableIT.java55
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokensIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsersIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfoliosIT.java162
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalPropertiesIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivityIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueueIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccountsIT.java183
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokensIT.java112
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedulesIT.java123
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptionsIT.java121
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokensIT.java98
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportPropertiesIT.java81
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInPropertiesIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranchesIT.java105
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRulesIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabledIT.java105
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTableIT.java70
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshotsIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTableIT.java61
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveriesIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivityIT.java48
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueueIT.java48
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRolesIT.java48
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRolesIT.java48
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveriesIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranchesIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshotsIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveriesIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveriesIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTableIT.java60
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriodsIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTableIT.java61
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpactsIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpactsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT.java62
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshotsIT.java57
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT.java62
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveriesIT.java57
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivityIT.java57
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueueIT.java57
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuidIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT.java61
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveriesIT.java56
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveriesIT.java57
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponentsIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshotsIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappingsIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescriptionIT.java65
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivityIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivityIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessagesIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshotsIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRulesIT.java110
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRulesIT.java236
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshotsIT.java72
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshotsIT.java55
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRolesIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshotsIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRolesIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveriesIT.java60
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivityIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueueIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriodsIT.java69
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChangesIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTableIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTableIT.java61
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTableIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTableIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTableIT.java65
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTableIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTableIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTableIT.java109
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTableIT.java75
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMappingIT.java99
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRulesIT.java79
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsersIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTableIT.java62
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTableIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTableIT.java65
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplicationsIT.java157
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRulesIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRulesIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullableIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuidIT.java107
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTableIT.java123
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRulesIT.java96
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetricIT.java83
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTableIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTableIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySetIT.java86
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTableIT.java58
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTableIT.java57
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTableIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTableIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTableIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT.java65
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTableIT.java80
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMappingIT.java72
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabledIT.java104
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTableIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTableIT.java74
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTableIT.java62
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTableIT.java61
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTableIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExistsIT.java85
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTableIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTableIT.java56
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfigurationIT.java284
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevopsPermissionsMappingIT.java112
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTableIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMappingIT.java56
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTableTest.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTableIT.java50
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullableIT.java63
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTableIT.java58
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigratedIT.java53
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigratedIT.java54
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTableIT.java70
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetricsIT.java85
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTableIT.java58
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTableIT.java69
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasuresIT.java106
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssuesIT.java51
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigratedIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigratedIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTableIT.java49
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInPortfoliosTableIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInProjectBranchesTableIT.java52
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrModeIT.java116
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java110
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasuresIT.java435
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasuresIT.java289
-rw-r--r--server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetricsTest.java176
-rw-r--r--server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT/schema.sql9
-rw-r--r--server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT/schema.sql9
-rw-r--r--server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT/schema.sql19
-rw-r--r--server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT/schema.sql5
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java18
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java7
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java457
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java137
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjects.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTable.java44
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuid.java61
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100.java63
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioning.java36
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledProperty.java39
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentProperty.java47
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsers.java47
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjects.java65
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfiles.java78
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsers.java45
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTable.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranches.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTable.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTable.java47
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranches.java45
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTable.java51
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTable.java60
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTable.java59
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.java62
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokens.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTable.java51
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTable.java66
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTable.java70
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101.java73
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokens.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsers.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfolios.java59
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalProperties.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivity.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueue.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccounts.java94
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokens.java58
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedules.java69
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptions.java68
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokens.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportProperties.java52
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInProperties.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranches.java49
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRules.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabled.java90
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTable.java58
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshots.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTable.java50
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivity.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueue.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRoles.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRoles.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranches.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshots.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTable.java46
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriods.java58
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTable.java46
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpacts.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpacts.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102.java116
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRoles.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshots.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRoles.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveries.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivity.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueue.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuid.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveries.java29
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponents.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshots.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappings.java45
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescription.java42
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivity.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivity.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessages.java46
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshots.java39
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRules.java61
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRules.java120
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshots.java72
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshots.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRoles.java35
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshots.java35
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRoles.java34
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveries.java34
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivity.java34
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueue.java34
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods.java81
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTable.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTable.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChanges.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTable.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTable.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTable.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTable.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTable.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTable.java61
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTable.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103.java60
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTable.java50
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullable.java46
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTable.java42
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMapping.java95
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRules.java67
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsers.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTable.java47
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTable.java52
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTable.java51
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104.java58
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplications.java60
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRules.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRules.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullable.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuid.java69
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTable.java143
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRules.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetric.java42
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTable.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTable.java55
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105.java52
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySet.java39
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTable.java61
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTable.java61
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTable.java35
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTable.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTable.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTable.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/DbVersion106.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTable.java46
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTable.java57
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMapping.java60
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.java91
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTable.java50
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTable.java71
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTable.java45
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.java51
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTable.java49
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTable.java66
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107.java62
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExists.java54
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.java36
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTable.java58
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfiguration.java165
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevOpsPermissionsMapping.java96
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTable.java34
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/package-info.java23
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractAddMeasuresMigratedColumnToTable.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractCreateIndexOnMeasuresMigrated.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractMigrateLiveMeasuresToMeasures.java272
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTable.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTable.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTable.java53
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTable.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTable.java31
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTable.java31
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullable.java49
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTable.java57
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigrated.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigrated.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTable.java57
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetrics.java78
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTable.java48
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTable.java58
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java73
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasures.java93
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssues.java32
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigrated.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigrated.java33
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTable.java45
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInPortfoliosTable.java35
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInProjectBranchesTable.java35
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrMode.java78
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MeasureMigration.java62
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java59
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasures.java30
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasures.java30
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetrics.java108
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjects.java56
-rw-r--r--server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/package-info.java23
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100Test.java40
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101Test.java40
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102Test.java40
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103Test.java41
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104Test.java40
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105Test.java41
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107Test.java40
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTableTest.java57
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTableTest.java54
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTableTest.java57
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108Test.java40
-rw-r--r--server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjectsTest.java51
-rw-r--r--server/sonar-server-common/src/it/java/org/sonar/server/issue/notification/NewIssuesNotificationIT.java4
-rw-r--r--server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexIT.java8
-rw-r--r--server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexerIT.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/IssueFieldsSetter.java5
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/TaintChecker.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueDoc.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java4
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/index/PrStatistics.java8
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssueChangesEmailTemplate.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilder.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/RuleGroup.java4
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Function.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/FunctionExecutor.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/HasType.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsHotspot.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsNotHotspot.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IssueWorkflow.java36
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/SetType.java2
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Transition.java9
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/notification/NotificationManager.java10
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionService.java4
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionServiceImpl.java36
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/project/VisibilityService.java14
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java4
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java6
-rw-r--r--server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueFieldsSetterTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueStorageTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/TaintCheckerTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/ChangesOnMyIssuesEmailTemplateTest.java4
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/FpPrAcceptedEmailTemplateTest.java4
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationSerializerTest.java6
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/IssueWorkflowForSecurityHotspotsTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/TransitionTest.java6
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/permission/PermissionServiceImplTest.java12
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoIT.java4
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java4
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java2
-rw-r--r--server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleDocTest.java2
-rw-r--r--server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/IssueDocTesting.java2
-rw-r--r--server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTesting.java10
-rw-r--r--server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/ChangedIssueImpl.java2
-rw-r--r--server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListener.java4
-rw-r--r--server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java2
-rw-r--r--server/sonar-webserver-auth/src/it/java/org/sonar/server/user/ServerUserSessionIT.java198
-rw-r--r--server/sonar-webserver-auth/src/it/java/org/sonar/server/user/TokenUserSessionIT.java16
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/SafeModeUserSession.java7
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java47
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/DoPrivileged.java9
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/GithubWebhookUserSession.java9
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java23
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java31
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/TokenUserSession.java11
-rw-r--r--server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java47
-rw-r--r--server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/SafeModeUserSessionTest.java8
-rw-r--r--server/sonar-webserver-auth/src/test/java/org/sonar/server/user/DoPrivilegedTest.java10
-rw-r--r--server/sonar-webserver-auth/src/test/java/org/sonar/server/user/GithubWebhookUserSessionTest.java13
-rw-r--r--server/sonar-webserver-auth/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java2
-rw-r--r--server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java46
-rw-r--r--server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java39
-rw-r--r--server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/user/TestUserSessionFactory.java7
-rw-r--r--server/sonar-webserver-common/src/it/java/org/sonar/server/common/component/ComponentUpdaterIT.java5
-rw-r--r--server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/GroupPermissionChangerIT.java125
-rw-r--r--server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/PermissionTemplateServiceIT.java52
-rw-r--r--server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/UserPermissionChangerIT.java80
-rw-r--r--server/sonar-webserver-common/src/it/java/org/sonar/server/common/rule/RuleCreatorIT.java5
-rw-r--r--server/sonar-webserver-common/src/it/java/org/sonar/server/common/user/service/UserServiceIT.java10
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreator.java4
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/github/GithubProjectCreator.java6
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/component/ComponentUpdater.java11
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChange.java12
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChanger.java6
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionChange.java3
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionTemplateService.java8
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChange.java6
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChanger.java6
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/RuleCreator.java5
-rw-r--r--server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/service/NewCustomRule.java2
-rw-r--r--server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreatorTest.java4
-rw-r--r--server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/github/GithubProjectCreatorTest.java31
-rw-r--r--server/sonar-webserver-common/src/test/java/org/sonar/server/common/permission/UserPermissionChangeTest.java7
-rw-r--r--server/sonar-webserver-core/src/it/java/org/sonar/server/rule/registration/RulesRegistrantIT.java20
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java22
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyHotspotRuleDescriptionSectionsGenerator.java5
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyIssueRuleDescriptionSectionsGenerator.java11
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/ActiveRulesImpactInitializer.java2
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/NewRuleCreator.java5
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/StartupRuleUpdater.java2
-rw-r--r--server/sonar-webserver-core/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java16
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java19
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionGeneratorTestData.java2
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionSectionsGeneratorsTest.java11
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/NewRuleCreatorTest.java5
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/StartupRuleUpdaterTest.java3
-rw-r--r--server/sonar-webserver-core/src/test/java/org/sonar/server/startup/RegisterPermissionTemplatesTest.java24
-rw-r--r--server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueIndex.java6
-rw-r--r--server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java6
-rw-r--r--server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFacetsTest.java2
-rw-r--r--server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java2
-rw-r--r--server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityCategoriesTest.java2
-rw-r--r--server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityHotspotsTest.java8
-rw-r--r--server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityReportsTest.java2
-rw-r--r--server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java2
-rw-r--r--server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientPermissionsValidator.java4
-rw-r--r--server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/issues/IssueChangeEventServiceImplTest.java4
-rw-r--r--server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java2
-rw-r--r--server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGenerator.java6
-rw-r--r--server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/enums/RuleTypeRestEnum.java2
-rw-r--r--server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/request/RuleCreateRestRequest.java2
-rw-r--r--server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsControllerTest.java2
-rw-r--r--server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/controller/DefaultRuleControllerTest.java4
-rw-r--r--server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGeneratorTest.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/almintegration/ws/github/ImportGithubProjectActionIT.java9
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/GetBindingActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/ListActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/MeasureActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/QualityGateActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenRenewActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/batch/ProjectDataLoaderIT.java16
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/DeleteActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/ListActionIT.java14
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/RenameActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetMainBranchActionIT.java12
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/BranchReportSubmitterIT.java13
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java45
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityStatusActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/AnalysisStatusActionIT.java16
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/CancelActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java18
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/DismissAnalysisWarningActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java22
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ComponentServiceUpdateKeyIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/AppActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SearchProjectsActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java15
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SuggestionsActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java14
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionQualityGateIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/duplication/ws/ShowActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/SearchActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AddCommentActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AssignActionIT.java26
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ChangeStatusActionIT.java46
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/DeleteCommentActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/EditCommentActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ListActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/PullActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ShowActionIT.java58
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java7
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java7
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/WebIssueStorageIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AddCommentActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AssignActionIT.java11
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/BulkChangeActionIT.java19
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ChangelogActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DeleteCommentActionIT.java7
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DoTransitionActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/EditCommentActionIT.java9
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ListActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullTaintActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ReindexActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionFacetsIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java31
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java11
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTagsActionIT.java5
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java17
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionIT.java21
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/live/LiveMeasureTreeUpdaterImplIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentTreeActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchActionIT.java44
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java30
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ListActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/SetActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ShowActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/UnsetActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/ListActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddGroupActionIT.java52
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java30
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/GroupsActionIT.java18
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveGroupActionIT.java121
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveUserActionIT.java68
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java22
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddGroupToTemplateActionIT.java26
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddProjectCreatorToTemplateActionIT.java24
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddUserToTemplateActionIT.java26
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/ApplyTemplateActionIT.java54
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionIT.java62
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/DeleteTemplateActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveGroupFromTemplateActionIT.java45
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveProjectCreatorFromTemplateActionIT.java36
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveUserFromTemplateActionIT.java30
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/SearchTemplatesActionIT.java52
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateGroupsActionIT.java40
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateUsersActionIT.java50
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java14
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/ProjectFinderIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyProjectsActionIT.java42
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyScannableProjectsActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateKeyActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java137
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/CreateEventActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/SearchActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/ExportActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/StatusActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java12
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/DeleteActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/SearchActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/projecttag/ws/SetActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/GetByProjectActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/ProjectStatusActionIT.java30
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SearchActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/QProfileBackuperImplIT.java14
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/AddProjectActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/CompareActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/ProjectsActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/RuleUpdaterIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/CreateActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/RuleQueryFactoryIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/SearchActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/ShowActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/UpdateActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/ClearActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/GetActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ListDefinitionsActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ResetActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/SetActionIT.java6
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ValuesActionIT.java17
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IndexActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IssueSnippetsActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java18
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/RawActionIT.java12
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java18
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/ui/ws/ComponentActionIT.java86
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionHomepageIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionIT.java2
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/DeactivateActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/usergroups/ws/DeleteActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/usertoken/ws/GenerateActionIT.java7
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/CreateActionIT.java8
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/DeleteActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/ListActionIT.java4
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/UpdateActionIT.java14
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionIT.java24
-rw-r--r--server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveryActionIT.java10
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/AlmSettingsSupport.java5
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GetBindingAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/ListAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetMainBranchAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityStatusAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/CancelAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ComponentAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/DismissAnalysisWarningAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/AppAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ShowAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SuggestionsAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/TreeAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/developers/ws/SearchEventsAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/duplication/ws/ShowAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/AddAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/SearchAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AddCommentAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AssignAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ChangeStatusAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/HotspotWsSupport.java12
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ListAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGenerator.java5
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ShowAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/IssueFinder.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetSeverityAction.java7
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetTypeAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/TransitionService.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/AuthorsAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BasePullAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java10
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueUpdater.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/ListAction.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseLoader.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetTypeAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidator.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/IssueCounter.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImpl.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/AddAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/ListAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/PermissionPrivilegeChecker.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/RequestValidator.java7
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/PermissionWsSupport.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java21
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectFinder.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchMyProjectsAction.java5
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteEventAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UpdateEventAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/ProjectDumpWsSupport.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/StatusAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/DeleteAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/TagsWsSupport.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileBackuperImpl.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapper.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/ProjectsAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/RuleUpdater.java10
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/CreateAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleWsSupport.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/scannercache/ws/GetAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ListDefinitionsAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ResetAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SetAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SettingsWsSupport.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ValuesAction.java6
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IndexAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IssueSnippetsAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/LinesAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/RawAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ScmAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ShowAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java8
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java2
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/UserTokenSupport.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java4
-rw-r--r--server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java4
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGeneratorTest.java27
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/ComponentTagsActionTest.java4
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchResponseFormatFormatOperationTest.java4
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidatorTest.java4
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImplTest.java2
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapperTest.java2
-rw-r--r--server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SettingsWsSupportTest.java4
-rw-r--r--sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java7
-rw-r--r--sonar-core/src/main/java/org/sonar/core/rule/RuleType.java77
-rw-r--r--sonar-core/src/main/java/org/sonar/core/rule/RuleTypeMapper.java (renamed from server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMapping.java)34
-rw-r--r--sonar-core/src/test/java/org/sonar/core/rule/RuleTypeMapperTest.java44
-rw-r--r--sonar-core/src/test/java/org/sonar/core/rule/RuleTypeTest.java70
-rw-r--r--sonar-scanner-engine/src/main/java/org/sonar/scm/git/JGitUtils.java14
-rw-r--r--sonar-scanner-engine/src/test/java/org/sonar/scm/git/JGitUtilsTest.java53
947 files changed, 3708 insertions, 31655 deletions
diff --git a/gradle.properties b/gradle.properties
index 16c28233249..850e30b21a7 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,4 +15,4 @@ elasticSearchServerVersion=8.16.3
projectType=application
artifactoryUrl=https://repox.jfrog.io/repox
jre_release_name=jdk-17.0.13+11
-webappVersion=2025.2.0.14491
+webappVersion=2025.3.0.14738
diff --git a/server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/GithubPermissionConverter.java b/server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/GithubPermissionConverter.java
index 0d8a63a0d18..5e1084a95ec 100644
--- a/server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/GithubPermissionConverter.java
+++ b/server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/GithubPermissionConverter.java
@@ -24,15 +24,16 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.auth.github.GsonRepositoryPermissions;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.provisioning.DevOpsPermissionsMappingDto;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.toMap;
-import static org.sonar.server.permission.PermissionServiceImpl.ALL_PROJECT_PERMISSIONS;
public class GithubPermissionConverter {
private static final Logger LOG = LoggerFactory.getLogger(GithubPermissionConverter.class);
@@ -63,12 +64,12 @@ public class GithubPermissionConverter {
new GsonRepositoryPermissions(true, true, true, true, true), ADMIN_GITHUB_ROLE
);
- public Map<String, Boolean> toSonarqubeRolesToHasPermissions(Set<String> sonarqubeRoles) {
- return ALL_PROJECT_PERMISSIONS.stream()
+ public Map<ProjectPermission, Boolean> toSonarqubeRolesToHasPermissions(Set<ProjectPermission> sonarqubeRoles) {
+ return Stream.of(ProjectPermission.values())
.collect(toMap(identity(), sonarqubeRoles::contains));
}
- public Set<String> toSonarqubeRolesWithFallbackOnRepositoryPermissions(Set<DevOpsPermissionsMappingDto> allPermissionsMappings,
+ public Set<ProjectPermission> toSonarqubeRolesWithFallbackOnRepositoryPermissions(Set<DevOpsPermissionsMappingDto> allPermissionsMappings,
String githubRoleOrPermission, GsonRepositoryPermissions repositoryPermissions) {
String roleName = toRoleName(githubRoleOrPermission);
return toSonarqubeRoles(allPermissionsMappings, roleName, repositoryPermissions);
@@ -78,19 +79,19 @@ public class GithubPermissionConverter {
return GITHUB_GROUP_PERMISSION_TO_ROLE_NAME.getOrDefault(permission, permission);
}
- public Set<String> toSonarqubeRolesForDefaultRepositoryPermission(Set<DevOpsPermissionsMappingDto> allPermissionsMappings, String roleName) {
+ public Set<ProjectPermission> toSonarqubeRolesForDefaultRepositoryPermission(Set<DevOpsPermissionsMappingDto> allPermissionsMappings, String roleName) {
return toSonarqubeRoles(allPermissionsMappings, roleName, null);
}
- private static Set<String> toSonarqubeRoles(Set<DevOpsPermissionsMappingDto> allPermissionsMappings, String githubRoleName,
+ private static Set<ProjectPermission> toSonarqubeRoles(Set<DevOpsPermissionsMappingDto> allPermissionsMappings, String githubRoleName,
@Nullable GsonRepositoryPermissions repositoryPermissions) {
Map<String, List<DevOpsPermissionsMappingDto>> permissionMappings = allPermissionsMappings.stream()
.collect(Collectors.groupingBy(DevOpsPermissionsMappingDto::role));
- Set<String> sonarqubePermissions = Optional.ofNullable(permissionMappings.get(githubRoleName))
+ Set<ProjectPermission> sonarqubePermissions = Optional.ofNullable(permissionMappings.get(githubRoleName))
.orElse(GithubPermissionConverter.computeBaseRoleAndGetSqPermissions(permissionMappings, repositoryPermissions))
.stream()
- .map(DevOpsPermissionsMappingDto::sonarqubePermission)
+ .map(DevOpsPermissionsMappingDto::projectPermission)
.collect(Collectors.toSet());
if (sonarqubePermissions.isEmpty()) {
diff --git a/server/sonar-alm-client/src/test/java/org/sonar/alm/client/github/GithubPermissionConverterTest.java b/server/sonar-alm-client/src/test/java/org/sonar/alm/client/github/GithubPermissionConverterTest.java
index 2a236b312cf..8b93d90668c 100644
--- a/server/sonar-alm-client/src/test/java/org/sonar/alm/client/github/GithubPermissionConverterTest.java
+++ b/server/sonar-alm-client/src/test/java/org/sonar/alm/client/github/GithubPermissionConverterTest.java
@@ -26,6 +26,7 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Suite;
import org.sonar.auth.github.GsonRepositoryPermissions;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.provisioning.DevOpsPermissionsMappingDto;
import static org.assertj.core.api.Assertions.assertThat;
@@ -38,11 +39,11 @@ import static org.assertj.core.api.Assertions.assertThat;
public class GithubPermissionConverterTest {
private static final Set<DevOpsPermissionsMappingDto> ALL_PERMISSIONS_MAPPING_FROM_DB = Set.of(
- new DevOpsPermissionsMappingDto("uuid1", "github", "read", "roleRead"),
- new DevOpsPermissionsMappingDto("uuid2", "github", "triage", "roleTriage"),
- new DevOpsPermissionsMappingDto("uuid3", "github", "write", "roleWrite"),
- new DevOpsPermissionsMappingDto("uuid4", "github", "maintain", "roleMaintain"),
- new DevOpsPermissionsMappingDto("uuid5", "github", "admin", "roleAdmin")
+ new DevOpsPermissionsMappingDto("uuid1", "github", "read", ProjectPermission.CODEVIEWER),
+ new DevOpsPermissionsMappingDto("uuid2", "github", "triage", ProjectPermission.SECURITYHOTSPOT_ADMIN),
+ new DevOpsPermissionsMappingDto("uuid3", "github", "write", ProjectPermission.ISSUE_ADMIN),
+ new DevOpsPermissionsMappingDto("uuid4", "github", "maintain", ProjectPermission.SCAN),
+ new DevOpsPermissionsMappingDto("uuid5", "github", "admin", ProjectPermission.ADMIN)
) ;
private static final GsonRepositoryPermissions NO_PERMS = new GsonRepositoryPermissions(false, false, false, false, false);
@@ -63,19 +64,19 @@ public class GithubPermissionConverterTest {
public static Iterable<Object[]> testData() {
return Arrays.asList(new Object[][] {
{"none", NO_PERMS, Set.of()},
- {"read", NO_PERMS, Set.of("roleRead")},
- {"read", READ_PERMS, Set.of("roleRead")},
- {"pull", NO_PERMS, Set.of("roleRead")},
- {"triage", NO_PERMS, Set.of("roleTriage")},
- {"write", NO_PERMS, Set.of("roleWrite")},
- {"push", NO_PERMS, Set.of("roleWrite")},
- {"maintain", NO_PERMS, Set.of("roleMaintain")},
- {"admin", NO_PERMS, Set.of("roleAdmin")},
- {"custom_role_extending_read", READ_PERMS, Set.of("roleRead")},
- {"custom_role_extending_triage", TRIAGE_PERMS, Set.of("roleTriage")},
- {"custom_role_extending_write", WRITE_PERMS, Set.of("roleWrite")},
- {"custom_role_extending_maintain", MAINTAIN_PERMS, Set.of("roleMaintain")},
- {"custom_role_extending_admin", ADMIN_PERMS, Set.of("roleAdmin")},
+ {"read", NO_PERMS, Set.of(ProjectPermission.CODEVIEWER)},
+ {"read", READ_PERMS, Set.of(ProjectPermission.CODEVIEWER)},
+ {"pull", NO_PERMS, Set.of(ProjectPermission.CODEVIEWER)},
+ {"triage", NO_PERMS, Set.of(ProjectPermission.SECURITYHOTSPOT_ADMIN)},
+ {"write", NO_PERMS, Set.of(ProjectPermission.ISSUE_ADMIN)},
+ {"push", NO_PERMS, Set.of(ProjectPermission.ISSUE_ADMIN)},
+ {"maintain", NO_PERMS, Set.of(ProjectPermission.SCAN)},
+ {"admin", NO_PERMS, Set.of(ProjectPermission.ADMIN)},
+ {"custom_role_extending_read", READ_PERMS, Set.of(ProjectPermission.CODEVIEWER)},
+ {"custom_role_extending_triage", TRIAGE_PERMS, Set.of(ProjectPermission.SECURITYHOTSPOT_ADMIN)},
+ {"custom_role_extending_write", WRITE_PERMS, Set.of(ProjectPermission.ISSUE_ADMIN)},
+ {"custom_role_extending_maintain", MAINTAIN_PERMS, Set.of(ProjectPermission.SCAN)},
+ {"custom_role_extending_admin", ADMIN_PERMS, Set.of(ProjectPermission.ADMIN)},
});
}
@@ -87,7 +88,7 @@ public class GithubPermissionConverterTest {
@Test
public void toGithubRepositoryPermissions_convertsCorrectly() {
- Set<String> actualPermissions = githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(ALL_PERMISSIONS_MAPPING_FROM_DB, role, repositoryPermissions);
+ Set<ProjectPermission> actualPermissions = githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(ALL_PERMISSIONS_MAPPING_FROM_DB, role, repositoryPermissions);
assertThat(actualPermissions).isEqualTo(expectedSqPermissions);
}
}
@@ -102,11 +103,11 @@ public class GithubPermissionConverterTest {
public static Iterable<Object[]> testData() {
return Arrays.asList(new Object[][] {
{"none", Set.of()},
- {"read", Set.of("roleRead")},
- {"triage", Set.of("roleTriage")},
- {"write", Set.of("roleWrite")},
- {"maintain", Set.of("roleMaintain")},
- {"admin", Set.of("roleAdmin")}
+ {"read", Set.of(ProjectPermission.CODEVIEWER)},
+ {"triage", Set.of(ProjectPermission.SECURITYHOTSPOT_ADMIN)},
+ {"write", Set.of(ProjectPermission.ISSUE_ADMIN)},
+ {"maintain", Set.of(ProjectPermission.SCAN)},
+ {"admin", Set.of(ProjectPermission.ADMIN)}
});
}
@@ -117,7 +118,7 @@ public class GithubPermissionConverterTest {
@Test
public void toGithubRepositoryPermissions_convertsCorrectly() {
- Set<String> actualPermissions = githubPermissionConverter.toSonarqubeRolesForDefaultRepositoryPermission(ALL_PERMISSIONS_MAPPING_FROM_DB, role);
+ Set<ProjectPermission> actualPermissions = githubPermissionConverter.toSonarqubeRolesForDefaultRepositoryPermission(ALL_PERMISSIONS_MAPPING_FROM_DB, role);
assertThat(actualPermissions).isEqualTo(expectedSqPermissions);
}
}
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreatorIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreatorIT.java
index c36e72cebfc..78ccfbf78c9 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreatorIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreatorIT.java
@@ -25,7 +25,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbSession;
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderIT.java
index cf864d6b323..936edf1c2b6 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderIT.java
@@ -58,7 +58,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.api.issue.Issue.STATUS_CLOSED;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.api.utils.DateUtils.addDays;
import static org.sonar.api.utils.DateUtils.parseDateTime;
import static org.sonar.ce.task.projectanalysis.issue.ComponentIssuesLoader.NUMBER_STATUS_AND_BRANCH_CHANGES_TO_KEEP;
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistIssuesStepIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistIssuesStepIT.java
index 9a30c9b4a14..33a0e39aa2a 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistIssuesStepIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistIssuesStepIT.java
@@ -33,7 +33,7 @@ import org.mockito.ArgumentCaptor;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.ce.common.scanner.ScannerReportReaderRule;
import org.sonar.ce.task.projectanalysis.issue.AdHocRuleCreator;
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistPushEventsStepIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistPushEventsStepIT.java
index 13760b56081..9b8cd500d04 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistPushEventsStepIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/PersistPushEventsStepIT.java
@@ -29,7 +29,7 @@ import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.impl.utils.TestSystem2;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.MutableTreeRootHolderRule;
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepIT.java
index 72408231158..caa5936c8d2 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStepIT.java
@@ -43,7 +43,7 @@ import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.sonar.api.notifications.Notification;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.api.utils.System2;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
@@ -92,7 +92,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.ce.task.projectanalysis.component.Component.Type;
import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder;
import static org.sonar.ce.task.projectanalysis.step.SendIssueNotificationsStep.NOTIF_TYPES;
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/issue/ExportIssuesStepIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/issue/ExportIssuesStepIT.java
index 3d109ce34eb..ca009b80c80 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/issue/ExportIssuesStepIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/issue/ExportIssuesStepIT.java
@@ -40,7 +40,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
import org.sonar.ce.task.projectexport.component.ComponentRepositoryImpl;
diff --git a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/rule/ExportAdHocRulesStepIT.java b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/rule/ExportAdHocRulesStepIT.java
index 0652740fa22..7851cb40446 100644
--- a/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/rule/ExportAdHocRulesStepIT.java
+++ b/server/sonar-ce-task-projectanalysis/src/it/java/org/sonar/ce/task/projectexport/rule/ExportAdHocRulesStepIT.java
@@ -36,7 +36,7 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
import org.sonar.ce.task.projectexport.steps.DumpElement;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java
index 2161e7732eb..c129ba8087e 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java
@@ -21,6 +21,7 @@ package org.sonar.ce.task.projectanalysis.api.measurecomputer;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -34,12 +35,19 @@ import org.sonar.api.ce.measure.Measure;
import org.sonar.api.ce.measure.MeasureComputer.MeasureComputerContext;
import org.sonar.api.ce.measure.MeasureComputer.MeasureComputerDefinition;
import org.sonar.api.ce.measure.Settings;
+import org.sonar.api.issue.IssueStatus;
+import org.sonar.api.issue.impact.Severity;
+import org.sonar.api.issue.impact.SoftwareQuality;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rules.RuleType;
+import org.sonar.api.utils.Duration;
import org.sonar.ce.task.projectanalysis.component.ConfigurationRepository;
import org.sonar.ce.task.projectanalysis.issue.ComponentIssuesRepository;
import org.sonar.ce.task.projectanalysis.measure.MeasureRepository;
import org.sonar.ce.task.projectanalysis.metric.Metric;
import org.sonar.ce.task.projectanalysis.metric.MetricRepository;
import org.sonar.core.issue.DefaultIssue;
+import org.sonar.core.rule.RuleTypeMapper;
import static com.google.common.base.Preconditions.checkArgument;
import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder;
@@ -175,7 +183,9 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
@Override
public List<? extends Issue> getIssues() {
- return componentIssues;
+ return componentIssues.stream()
+ .map(CeApiIssueAdapter::new)
+ .toList();
}
private static Component newComponent(org.sonar.ce.task.projectanalysis.component.Component component) {
@@ -212,4 +222,58 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
}
}
+ static class CeApiIssueAdapter implements Issue {
+
+ DefaultIssue defaultIssue;
+
+ public CeApiIssueAdapter(DefaultIssue defaultIssue) {
+ this.defaultIssue = defaultIssue;
+ }
+
+ @Override
+ public String key() {
+ return defaultIssue.key();
+ }
+
+ @Override
+ public RuleKey ruleKey() {
+ return defaultIssue.ruleKey();
+ }
+
+ @Override
+ public String status() {
+ return defaultIssue.status();
+ }
+
+ @Override
+ public String resolution() {
+ return defaultIssue.resolution();
+ }
+
+ @Override
+ public IssueStatus issueStatus() {
+ return defaultIssue.issueStatus();
+ }
+
+ @Override
+ public String severity() {
+ return defaultIssue.severity();
+ }
+
+ @Override
+ public Duration effort() {
+ return defaultIssue.effort();
+ }
+
+ @Override
+ public RuleType type() {
+ return RuleTypeMapper.toApiRuleType(defaultIssue.type());
+ }
+
+ @Override
+ public Map<SoftwareQuality, Severity> impacts() {
+ return defaultIssue.impacts();
+ }
+ }
+
}
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreator.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreator.java
index d42cf733b31..334c1b0c1bc 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreator.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/AdHocRuleCreator.java
@@ -27,7 +27,7 @@ import java.util.stream.Collectors;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueCounter.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueCounter.java
index 483767d7ec9..8db05a91639 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueCounter.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueCounter.java
@@ -29,7 +29,7 @@ import javax.annotation.Nullable;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.measure.Measure;
import org.sonar.ce.task.projectanalysis.measure.MeasureRepository;
@@ -80,10 +80,10 @@ import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.INFO;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
/**
* For each component, computes the measures related to number of issues:
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java
index 81078898798..432ad9a3657 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java
@@ -27,7 +27,7 @@ import jakarta.inject.Inject;
import org.jetbrains.annotations.NotNull;
import org.sonar.api.issue.Issue;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.core.issue.DefaultImpact;
import org.sonar.core.issue.DefaultIssue;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRule.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRule.java
index e5da858fabe..faa4684e8c9 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRule.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRule.java
@@ -33,8 +33,9 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.internal.ImpactMapper;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.scanner.protocol.Constants;
import org.sonar.scanner.protocol.output.ScannerReport;
@@ -100,7 +101,7 @@ public class NewAdHocRule {
}
Map<SoftwareQuality, Severity> impacts = mapImpacts(ruleFromScannerReport.getDefaultImpactsList());
if (impacts.isEmpty()) {
- return Map.of(ImpactMapper.convertToSoftwareQuality(this.ruleType),
+ return Map.of(ImpactMapper.convertToSoftwareQuality(RuleTypeMapper.toApiRuleType(this.ruleType)),
ImpactMapper.convertToImpactSeverity(this.severity));
} else {
return impacts;
@@ -113,7 +114,7 @@ public class NewAdHocRule {
}
Map<SoftwareQuality, Severity> impacts = mapImpacts(ruleFromScannerReport.getDefaultImpactsList());
Map.Entry<SoftwareQuality, Severity> bestImpactForBackMapping = ImpactMapper.getBestImpactForBackmapping(impacts);
- return ImpactMapper.convertToRuleType(bestImpactForBackMapping.getKey());
+ return RuleTypeMapper.toRuleType(ImpactMapper.convertToRuleType(bestImpactForBackMapping.getKey()));
}
private static String determineSeverity(ScannerReport.AdHocRule ruleFromScannerReport) {
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/Rule.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/Rule.java
index 8eb992ece8e..a612d45418f 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/Rule.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/Rule.java
@@ -27,7 +27,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
public interface Rule {
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleImpl.java
index 2fc108e2dc9..9d40ee1faf7 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleImpl.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleImpl.java
@@ -32,7 +32,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
import org.sonar.db.issue.ImpactDto;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImpl.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImpl.java
index 68b1847efd5..d37b4a970fb 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImpl.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImpl.java
@@ -32,7 +32,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.core.util.stream.MoreCollectors;
import org.sonar.db.DbClient;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactory.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactory.java
index a3f10efba3f..dc006242431 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactory.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactory.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.internal.ImpactMapper;
import org.sonar.api.utils.Duration;
import org.sonar.ce.common.scanner.ScannerReportReader;
@@ -47,6 +47,7 @@ import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.tracking.Input;
import org.sonar.core.issue.tracking.LazyInput;
import org.sonar.core.issue.tracking.LineHashSequence;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.CloseableIterator;
import org.sonar.db.protobuf.DbCommons;
import org.sonar.db.protobuf.DbIssues;
@@ -380,7 +381,7 @@ public class TrackerRawInputFactory {
return rule.getType();
} else if (!rule.getDefaultImpacts().isEmpty()) {
SoftwareQuality impactSoftwareQuality = ImpactMapper.getBestImpactForBackmapping(rule.getDefaultImpacts()).getKey();
- return ImpactMapper.convertToRuleType(impactSoftwareQuality);
+ return RuleTypeMapper.toRuleType(ImpactMapper.convertToRuleType(impactSoftwareQuality));
} else {
throw new IllegalArgumentException("Cannot determine the type for issue of rule %s".formatted(reportExternalIssue.getRuleId()));
}
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandler.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandler.java
index 1c4fc74c64c..ae9276ec2ba 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandler.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandler.java
@@ -25,7 +25,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.notification.EmailNotificationHandler;
import org.sonar.server.notification.NotificationDispatcherMetadata;
import org.sonar.server.notification.NotificationManager;
@@ -41,7 +41,7 @@ public class ReportAnalysisFailureNotificationHandler extends EmailNotificationH
private static final NotificationDispatcherMetadata METADATA = NotificationDispatcherMetadata.create(KEY)
.setProperty(NotificationDispatcherMetadata.GLOBAL_NOTIFICATION, String.valueOf(true))
.setProperty(NotificationDispatcherMetadata.PER_PROJECT_NOTIFICATION, String.valueOf(true));
- private static final SubscriberPermissionsOnProject REQUIRED_SUBSCRIBER_PERMISSIONS = new SubscriberPermissionsOnProject(UserRole.ADMIN, UserRole.USER);
+ private static final SubscriberPermissionsOnProject REQUIRED_SUBSCRIBER_PERMISSIONS = new SubscriberPermissionsOnProject(ProjectPermission.ADMIN, ProjectPermission.USER);
private final NotificationManager notificationManager;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactory.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactory.java
index ed179c45a85..0cc4a404408 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactory.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactory.java
@@ -31,7 +31,7 @@ import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.TreeRootHolder;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitor.java
index f3896d48d7b..2fe03272eba 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitor.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitor.java
@@ -20,7 +20,6 @@
package org.sonar.ce.task.projectanalysis.qualitymodel;
import java.util.Map;
-import org.sonar.api.ce.measure.Issue;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.measures.CoreMetrics;
@@ -33,8 +32,8 @@ import org.sonar.ce.task.projectanalysis.measure.MeasureRepository;
import org.sonar.ce.task.projectanalysis.metric.Metric;
import org.sonar.ce.task.projectanalysis.metric.MetricRepository;
import org.sonar.core.issue.DefaultIssue;
-import org.sonar.server.measure.Rating;
import org.sonar.core.metric.SoftwareQualitiesMetrics;
+import org.sonar.server.measure.Rating;
import static org.sonar.api.measures.CoreMetrics.NEW_RELIABILITY_RATING_KEY;
import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_RATING_KEY;
@@ -43,18 +42,18 @@ import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.INFO;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;
import static org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit.LEAVES;
import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder;
+import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_RATING_KEY;
+import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_SECURITY_RATING_KEY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.server.measure.Rating.A;
import static org.sonar.server.measure.Rating.B;
import static org.sonar.server.measure.Rating.C;
import static org.sonar.server.measure.Rating.D;
import static org.sonar.server.measure.Rating.E;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_RATING_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_SECURITY_RATING_KEY;
/**
* Compute following measures :
@@ -168,8 +167,8 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitor extends PathAwareVis
newRatingValueByMetric.forEach((metric, rating) -> rating.increment(otherCounter.newRatingValueByMetric.get(metric)));
}
- void processIssue(Issue issue) {
- if (newIssueClassifier.isNew(component, (DefaultIssue) issue)) {
+ void processIssue(DefaultIssue issue) {
+ if (newIssueClassifier.isNew(component, issue)) {
Rating rating = RATING_BY_SEVERITY.get(issue.severity());
if (issue.type().equals(BUG)) {
newRatingValueByMetric.get(NEW_RELIABILITY_RATING_KEY).increment(rating);
@@ -179,14 +178,14 @@ public class NewReliabilityAndSecurityRatingMeasuresVisitor extends PathAwareVis
}
}
- void processIssueForSoftwareQuality(Issue issue) {
- if (newIssueClassifier.isNew(component, (DefaultIssue) issue)) {
+ void processIssueForSoftwareQuality(DefaultIssue issue) {
+ if (newIssueClassifier.isNew(component, issue)) {
processSoftwareQualityRating(issue, SoftwareQuality.RELIABILITY, NEW_SOFTWARE_QUALITY_RELIABILITY_RATING_KEY);
processSoftwareQualityRating(issue, SoftwareQuality.SECURITY, NEW_SOFTWARE_QUALITY_SECURITY_RATING_KEY);
}
}
- private void processSoftwareQualityRating(Issue issue, SoftwareQuality softwareQuality, String metricKey) {
+ private void processSoftwareQualityRating(DefaultIssue issue, SoftwareQuality softwareQuality, String metricKey) {
Severity severity = issue.impacts().get(softwareQuality);
if (severity != null) {
Rating rating = Rating.RATING_BY_SOFTWARE_QUALITY_SEVERITY.get(severity);
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitor.java
index 4df9b7a3e8e..434e7f7ddc2 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitor.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitor.java
@@ -33,7 +33,7 @@ import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_HOTSPOTS_REVIEWED_
import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_HOTSPOTS_REVIEWED_STATUS_KEY;
import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_HOTSPOTS_TO_REVIEW_STATUS_KEY;
import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_REVIEW_RATING_KEY;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;
import static org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit.FILE;
import static org.sonar.server.security.SecurityReviewRating.computePercent;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitor.java
index ec5a481b83f..b7d75b21186 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitor.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitor.java
@@ -37,8 +37,8 @@ import org.sonar.server.measure.Rating;
import static org.sonar.api.measures.CoreMetrics.RELIABILITY_RATING_KEY;
import static org.sonar.api.measures.CoreMetrics.SECURITY_RATING_KEY;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit.FILE;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_RELIABILITY_RATING_KEY;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_SECURITY_RATING_KEY;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewCounter.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewCounter.java
index b5ada4fca56..5c2d33d858c 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewCounter.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewCounter.java
@@ -19,7 +19,7 @@
*/
package org.sonar.ce.task.projectanalysis.qualitymodel;
-import org.sonar.api.ce.measure.Issue;
+import org.sonar.core.issue.DefaultIssue;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
@@ -32,7 +32,7 @@ final class SecurityReviewCounter {
// prevents instantiation
}
- void processHotspot(Issue issue) {
+ void processHotspot(DefaultIssue issue) {
if (issue.status().equals(STATUS_REVIEWED)) {
hotspotsReviewed++;
} else if (issue.status().equals(STATUS_TO_REVIEW)) {
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitor.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitor.java
index 8106bc69b27..543d69ac66c 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitor.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitor.java
@@ -33,7 +33,7 @@ import static org.sonar.api.measures.CoreMetrics.SECURITY_HOTSPOTS_REVIEWED_KEY;
import static org.sonar.api.measures.CoreMetrics.SECURITY_HOTSPOTS_REVIEWED_STATUS_KEY;
import static org.sonar.api.measures.CoreMetrics.SECURITY_HOTSPOTS_TO_REVIEW_STATUS_KEY;
import static org.sonar.api.measures.CoreMetrics.SECURITY_REVIEW_RATING_KEY;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.ce.task.projectanalysis.component.ComponentVisitor.Order.POST_ORDER;
import static org.sonar.ce.task.projectanalysis.component.CrawlerDepthLimit.FILE;
import static org.sonar.ce.task.projectanalysis.measure.Measure.newMeasureBuilder;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStep.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStep.java
index d109134682e..4ddef0ac9cf 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStep.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/step/SendIssueNotificationsStep.java
@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
import javax.annotation.CheckForNull;
import org.sonar.api.issue.Issue;
import org.sonar.api.notifications.Notification;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolder;
import org.sonar.ce.task.projectanalysis.analysis.Branch;
import org.sonar.ce.task.projectanalysis.component.Component;
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCache.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCache.java
index ab722505890..f5aedd11ec5 100644
--- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCache.java
+++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCache.java
@@ -36,7 +36,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.api.utils.System2;
import org.sonar.core.issue.DefaultImpact;
@@ -99,7 +99,7 @@ public class ProtobufIssueDiskCache implements DiskCache<DefaultIssue> {
static DefaultIssue toDefaultIssue(IssueCache.Issue next) {
DefaultIssue defaultIssue = new DefaultIssue();
defaultIssue.setKey(next.getKey());
- defaultIssue.setType(RuleType.valueOf(next.getRuleType()));
+ defaultIssue.setType(RuleType.fromDbConstant(next.getRuleType()));
defaultIssue.setComponentUuid(next.hasComponentUuid() ? next.getComponentUuid() : null);
defaultIssue.setComponentKey(next.getComponentKey());
defaultIssue.setProjectUuid(next.getProjectUuid());
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/CloseIssuesOnRemovedComponentsVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/CloseIssuesOnRemovedComponentsVisitorTest.java
index 76c7c4d45b3..49a4460977c 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/CloseIssuesOnRemovedComponentsVisitorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/CloseIssuesOnRemovedComponentsVisitorTest.java
@@ -27,7 +27,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.ce.task.projectanalysis.component.ReportComponent;
import org.sonar.ce.task.projectanalysis.component.VisitorsCrawler;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComputeLocationHashesVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComputeLocationHashesVisitorTest.java
index 04654aafe7b..acd49560c71 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComputeLocationHashesVisitorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComputeLocationHashesVisitorTest.java
@@ -32,7 +32,7 @@ import org.junit.Test;
import org.slf4j.event.Level;
import org.sonar.api.config.Configuration;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.ReportComponent;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/DumbRule.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/DumbRule.java
index 072ef44aba9..1868fe136df 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/DumbRule.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/DumbRule.java
@@ -30,7 +30,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import static java.util.Objects.requireNonNull;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/EffortAggregatorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/EffortAggregatorTest.java
index 61a34c46a53..55bd469bd97 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/EffortAggregatorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/EffortAggregatorTest.java
@@ -43,9 +43,9 @@ import static org.sonar.api.measures.CoreMetrics.SECURITY_REMEDIATION_EFFORT;
import static org.sonar.api.measures.CoreMetrics.SECURITY_REMEDIATION_EFFORT_KEY;
import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT;
import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT_KEY;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_REMEDIATION_EFFORT;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_REMEDIATION_EFFORT_KEY;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_RELIABILITY_REMEDIATION_EFFORT;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java
index ab0975defd9..d325f2ab342 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueCounterTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.common.scanner.ScannerReportReaderRule;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
@@ -123,9 +123,9 @@ import static org.sonar.api.measures.CoreMetrics.VULNERABILITIES;
import static org.sonar.api.measures.CoreMetrics.VULNERABILITIES_KEY;
import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.MAJOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.ce.task.projectanalysis.component.ReportComponent.builder;
import static org.sonar.ce.task.projectanalysis.issue.IssueCounter.IMPACT_TO_JSON_METRIC_KEY;
import static org.sonar.ce.task.projectanalysis.issue.IssueCounter.IMPACT_TO_NEW_JSON_METRIC_KEY;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java
index 5963b144843..67baa875b97 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java
@@ -26,7 +26,7 @@ import org.junit.Test;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.ce.task.projectanalysis.analysis.Branch;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRuleTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRuleTest.java
index 305e43ab4aa..83d58f29980 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRuleTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewAdHocRuleTest.java
@@ -23,7 +23,7 @@ import java.util.Map;
import org.junit.Test;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.scanner.protocol.Constants;
import org.sonar.scanner.protocol.output.ScannerReport;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewEffortAggregatorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewEffortAggregatorTest.java
index 4e6957756a9..72a547a8671 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewEffortAggregatorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/NewEffortAggregatorTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.ce.task.projectanalysis.analysis.Branch;
import org.sonar.ce.task.projectanalysis.component.Component;
@@ -55,9 +55,9 @@ import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_REMEDIATION_EFFORT
import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_REMEDIATION_EFFORT_KEY;
import static org.sonar.api.measures.CoreMetrics.NEW_TECHNICAL_DEBT;
import static org.sonar.api.measures.CoreMetrics.NEW_TECHNICAL_DEBT_KEY;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_REMEDIATION_EFFORT;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_REMEDIATION_EFFORT_KEY;
import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_REMEDIATION_EFFORT;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImplTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImplTest.java
index af1cbb8d1d9..3e9301562e2 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImplTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/RuleRepositoryImplTest.java
@@ -31,7 +31,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbClient;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java
index bd2f05eb6f9..c044e2d0e08 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/TrackerRawInputFactoryTest.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.ce.common.scanner.ScannerReportReaderRule;
import org.sonar.ce.task.projectanalysis.component.Component;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/UpdateConflictResolverTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/UpdateConflictResolverTest.java
index e5affec4f15..2b988c6fe49 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/UpdateConflictResolverTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/UpdateConflictResolverTest.java
@@ -32,7 +32,7 @@ import org.sonar.db.issue.IssueDto;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.api.issue.Issue.STATUS_OPEN;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
public class UpdateConflictResolverTest {
private final UpdateConflictResolver underTest = new UpdateConflictResolver();
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandlerTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandlerTest.java
index 02cb59c7981..e53eeb6de94 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandlerTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/notification/ReportAnalysisFailureNotificationHandlerTest.java
@@ -28,7 +28,7 @@ import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.junit.Test;
import org.mockito.Mockito;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.notification.NotificationDispatcherMetadata;
import org.sonar.server.notification.NotificationManager;
import org.sonar.server.notification.NotificationManager.EmailRecipient;
@@ -50,7 +50,7 @@ import static org.sonar.server.notification.NotificationDispatcherMetadata.PER_P
public class ReportAnalysisFailureNotificationHandlerTest {
private static final String REPORT_FAILURE_DISPATCHER_KEY = "CeReportTaskFailure";
- private static final SubscriberPermissionsOnProject REQUIRED_SUBSCRIBER_PERMISSIONS = new SubscriberPermissionsOnProject(UserRole.ADMIN, UserRole.USER);
+ private static final SubscriberPermissionsOnProject REQUIRED_SUBSCRIBER_PERMISSIONS = new SubscriberPermissionsOnProject(ProjectPermission.ADMIN, ProjectPermission.USER);
private NotificationManager notificationManager = mock(NotificationManager.class);
private EmailNotificationChannel emailNotificationChannel = mock(EmailNotificationChannel.class);
private ReportAnalysisFailureNotificationHandler underTest = new ReportAnalysisFailureNotificationHandler(notificationManager, emailNotificationChannel);
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactoryTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactoryTest.java
index 432324185e8..801d7c2c6cb 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactoryTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/pushevent/PushEventFactoryTest.java
@@ -32,7 +32,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.DateUtils;
import org.sonar.ce.task.projectanalysis.analysis.AnalysisMetadataHolderRule;
import org.sonar.ce.task.projectanalysis.analysis.TestBranch;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java
index 39ac16e19f3..8898f645265 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewReliabilityAndSecurityRatingMeasuresVisitorTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.FileAttributes;
@@ -59,9 +59,9 @@ import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.INFO;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.ce.task.projectanalysis.component.Component.Type.DIRECTORY;
import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE;
import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitorTest.java
index 115ba9a347d..9c5526c7ec6 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/NewSecurityReviewMeasuresVisitorTest.java
@@ -26,7 +26,7 @@ import org.assertj.core.data.Offset;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.FileAttributes;
import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java
index edb0cce4e8b..b5ae767e49d 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/ReliabilityAndSecurityRatingMeasuresVisitorTest.java
@@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.FileAttributes;
@@ -52,9 +52,9 @@ import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.INFO;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.ce.task.projectanalysis.component.Component.Type.DIRECTORY;
import static org.sonar.ce.task.projectanalysis.component.Component.Type.FILE;
import static org.sonar.ce.task.projectanalysis.component.Component.Type.PROJECT;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitorTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitorTest.java
index a039b5ad9e4..68bbdd61fe1 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitorTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/qualitymodel/SecurityReviewMeasuresVisitorTest.java
@@ -22,7 +22,7 @@ package org.sonar.ce.task.projectanalysis.qualitymodel;
import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.component.TreeRootHolderRule;
import org.sonar.ce.task.projectanalysis.component.VisitorsCrawler;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadChangedIssuesStepTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadChangedIssuesStepTest.java
index 224eeccba67..eae8971c907 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadChangedIssuesStepTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/step/LoadChangedIssuesStepTest.java
@@ -28,7 +28,7 @@ import org.junit.rules.TemporaryFolder;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.ce.task.projectanalysis.issue.ChangedIssuesRepository;
import org.sonar.ce.task.projectanalysis.issue.ProtoIssueCache;
diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCacheTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCacheTest.java
index 1a3197a94f8..5793dbe9f7d 100644
--- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCacheTest.java
+++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/util/cache/ProtobufIssueDiskCacheTest.java
@@ -25,7 +25,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultImpact;
import org.sonar.core.issue.DefaultIssue;
diff --git a/server/sonar-db-core/build.gradle b/server/sonar-db-core/build.gradle
index 9353704a08e..af766e406c0 100644
--- a/server/sonar-db-core/build.gradle
+++ b/server/sonar-db-core/build.gradle
@@ -15,7 +15,6 @@ dependencies {
api 'com.zaxxer:HikariCP'
api 'org.mybatis:mybatis'
api 'org.slf4j:slf4j-api'
- api 'org.sonarsource.api.plugin:sonar-plugin-api'
api project(':server:sonar-process')
api project(':sonar-plugin-api-impl')
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueDaoIT.java
index df3414b2cfc..a7b9260ba8a 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueDaoIT.java
@@ -42,7 +42,7 @@ import org.sonar.api.issue.Issue;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueMapperIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueMapperIT.java
index 31bdb45c3af..2d85056e0c2 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueMapperIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueMapperIT.java
@@ -38,7 +38,7 @@ import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
import org.sonar.core.issue.FieldDiffs;
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/AuthorizationDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/AuthorizationDaoIT.java
index e7816a9c29f..1e322841762 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/AuthorizationDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/AuthorizationDaoIT.java
@@ -31,7 +31,6 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -218,13 +217,13 @@ class AuthorizationDaoIT {
@Test
void keepAuthorizedEntityUuids_returns_empty_for_group_AnyOne_if_project_set_is_empty_on__project() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), null, ProjectPermission.USER))
.isEmpty();
}
@Test
void keepAuthorizedEntityUuids_returns_empty_for_user_if_project_set_is_empty_on__project() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), user.getUuid(), ProjectPermission.USER))
.isEmpty();
}
@@ -234,7 +233,7 @@ class AuthorizationDaoIT {
.mapToObj(i -> Integer.toString(3_562 + i))
.collect(Collectors.toSet());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomNonProjectsSet, null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomNonProjectsSet, null, ProjectPermission.USER))
.isEmpty();
}
@@ -244,31 +243,31 @@ class AuthorizationDaoIT {
.mapToObj(i -> Integer.toString(9_666 + i))
.collect(Collectors.toSet());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomNonProjectsSet, user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomNonProjectsSet, user.getUuid(), ProjectPermission.USER))
.isEmpty();
}
@Test
void keepAuthorizedEntityUuids_returns_any__project_for_group_AnyOne_without_any_permission_in_DB_and_permission_USER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, null, ProjectPermission.USER))
.containsAll(randomPublicEntityUuids);
}
@Test
void keepAuthorizedEntityUuids_returns_any__project_for_user_without_any_permission_in_DB_and_permission_USER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, user.getUuid(), ProjectPermission.USER))
.containsAll(randomPublicEntityUuids);
}
@Test
void keepAuthorizedEntityUuids_returns_any__project_for_group_AnyOne_without_any_permission_in_DB_and_permission_CODEVIEWER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, null, UserRole.CODEVIEWER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, null, ProjectPermission.CODEVIEWER))
.containsAll(randomPublicEntityUuids);
}
@Test
void keepAuthorizedEntityUuids_returns_any__project_for_user_without_any_permission_in_DB_and_permission_CODEVIEWER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, user.getUuid(), UserRole.CODEVIEWER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPublicEntityUuids, user.getUuid(), ProjectPermission.CODEVIEWER))
.containsAll(randomPublicEntityUuids);
}
@@ -335,25 +334,25 @@ class AuthorizationDaoIT {
@Test
void keepAuthorizedEntityUuids_returns_empty_for_user_on_private_project_without_any_permission_in_DB_and_permission_USER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, user.getUuid(), ProjectPermission.USER))
.isEmpty();
}
@Test
void keepAuthorizedEntityUuids_returns_empty_for_group_AnyOne_on_private_project_without_any_permission_in_DB_and_permission_USER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, null, ProjectPermission.USER))
.isEmpty();
}
@Test
void keepAuthorizedEntityUuids_returns_empty_for_user_on_private_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, user.getUuid(), UserRole.CODEVIEWER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, user.getUuid(), ProjectPermission.CODEVIEWER))
.isEmpty();
}
@Test
void keepAuthorizedEntityUuids_returns_empty_for_group_AnyOne_on_private_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, null, UserRole.CODEVIEWER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, randomPrivateEntityUuids, null, ProjectPermission.CODEVIEWER))
.isEmpty();
}
@@ -421,20 +420,20 @@ class AuthorizationDaoIT {
ProjectDto project3 = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser("u1");
GroupDto group = db.users().insertGroup();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project2);
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project3);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project2);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project3);
db.users().insertMember(group, user);
- db.users().insertEntityPermissionOnGroup(group, UserRole.USER, project1);
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.USER, project1);
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project2.getUuid(), project3.getUuid()), user.getUuid(),
- UserRole.USER))
+ ProjectPermission.USER))
.containsOnly(project2.getUuid(), project3.getUuid());
// user does not have the role "admin"
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project2.getUuid()), user.getUuid(), UserRole.ADMIN))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project2.getUuid()), user.getUuid(), ProjectPermission.ADMIN))
.isEmpty();
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), user.getUuid(), UserRole.ADMIN))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), user.getUuid(), ProjectPermission.ADMIN))
.isEmpty();
}
@@ -446,17 +445,17 @@ class AuthorizationDaoIT {
UserDto user1 = db.users().insertUser("u1");
GroupDto group = db.users().insertGroup();
db.users().insertMembers(group, user1);
- db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project1);
- db.users().insertEntityPermissionOnGroup(group, UserRole.USER, project2);
- db.users().insertEntityPermissionOnGroup(group, UserRole.USER, project3);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.USER, project1);
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.USER, project2);
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.USER, project3);
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project2.getUuid(), project3.getUuid()), user1.getUuid(),
- UserRole.USER))
+ ProjectPermission.USER))
.containsOnly(project2.getUuid(), project3.getUuid());
// group does not have the role "admin"
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project2.getUuid(), project3.getUuid()), user1.getUuid(),
- UserRole.ADMIN))
+ ProjectPermission.ADMIN))
.isEmpty();
}
@@ -468,7 +467,7 @@ class AuthorizationDaoIT {
GroupDto group = db.users().insertGroup();
db.users().insertMembers(group, user1);
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project1.getUuid(), project2.getUuid()), null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(project1.getUuid(), project2.getUuid()), null, ProjectPermission.USER))
.containsOnly(project1.getUuid(), project2.getUuid());
// group does not have the role "admin"
@@ -481,7 +480,7 @@ class AuthorizationDaoIT {
List<ProjectDto> projects = IntStream.range(0, 2000).mapToObj(i -> db.components().insertPublicProject().getProjectDto()).toList();
Collection<String> uuids = projects.stream().map(ProjectDto::getUuid).collect(Collectors.toSet());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, uuids, null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, uuids, null, ProjectPermission.USER))
.containsOnly(uuids.toArray(new String[0]));
}
@@ -489,7 +488,7 @@ class AuthorizationDaoIT {
void keepAuthorizedUsersForRoleAndEntity_returns_empty_if_user_set_is_empty_on__project() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, Collections.emptySet(), UserRole.USER, project.getUuid()))
+ assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, Collections.emptySet(), ProjectPermission.USER, project.getUuid()))
.isEmpty();
}
@@ -501,7 +500,7 @@ class AuthorizationDaoIT {
.mapToObj(i -> Uuids.createFast())
.collect(Collectors.toSet());
- assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomNonExistingUserUuidsSet, UserRole.USER, project.getUuid()))
+ assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomNonExistingUserUuidsSet, ProjectPermission.USER, project.getUuid()))
.isEmpty();
}
@@ -509,7 +508,7 @@ class AuthorizationDaoIT {
void keepAuthorizedUsersForRoleAndEntity_returns_any_users_for__project_without_any_permission_in_DB_and_permission_USER() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, UserRole.USER, project.getUuid()))
+ assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, ProjectPermission.USER, project.getUuid()))
.containsAll(randomExistingUserUuids);
}
@@ -517,7 +516,7 @@ class AuthorizationDaoIT {
void keepAuthorizedUsersForRoleAndEntity_returns_any_users_for__project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, UserRole.CODEVIEWER, project.getUuid()))
+ assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, ProjectPermission.CODEVIEWER, project.getUuid()))
.containsAll(randomExistingUserUuids);
}
@@ -591,7 +590,7 @@ class AuthorizationDaoIT {
void keepAuthorizedUsersForRoleAndEntity_returns_empty_for_any_user_on_private_project_without_any_permission_in_DB_and_permission_USER() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, UserRole.USER, project.getUuid()))
+ assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, ProjectPermission.USER, project.getUuid()))
.isEmpty();
}
@@ -599,7 +598,7 @@ class AuthorizationDaoIT {
void keepAuthorizedUsersForRoleAndEntity_returns_empty_for_any_user_on_private_project_without_any_permission_in_DB_and_permission_CODEVIEWER() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, UserRole.CODEVIEWER, project.getUuid()))
+ assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession, randomExistingUserUuids, ProjectPermission.CODEVIEWER, project.getUuid()))
.isEmpty();
}
@@ -667,10 +666,10 @@ class AuthorizationDaoIT {
GroupDto group2 = db.users().insertGroup();
db.users().insertMembers(group1, user1, user2);
db.users().insertMembers(group2, user3);
- db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project1);
- db.users().insertProjectPermissionOnUser(user2, UserRole.USER, project1);
- db.users().insertProjectPermissionOnUser(user3, UserRole.USER, project1);
- db.users().insertEntityPermissionOnGroup(group2, UserRole.USER, project3);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.USER, project1);
+ db.users().insertProjectPermissionOnUser(user2, ProjectPermission.USER, project1);
+ db.users().insertProjectPermissionOnUser(user3, ProjectPermission.USER, project1);
+ db.users().insertEntityPermissionOnGroup(group2, ProjectPermission.USER, project3);
assertThat(underTest.keepAuthorizedUsersForRoleAndEntity(dbSession,
// Only 100 and 101 has 'user' role on project
@@ -769,31 +768,31 @@ class AuthorizationDaoIT {
@Test
void selectEntityPermissions_returns_permissions_of_logged_in_user_on_specified_project() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
- db.users().insertProjectPermissionOnUser(db.users().insertUser(), UserRole.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(db.users().insertUser(), ProjectPermission.ISSUE_ADMIN, project);
- assertThat(underTest.selectEntityPermissions(dbSession, project.getUuid(), user.getUuid())).containsOnly(UserRole.CODEVIEWER);
+ assertThat(underTest.selectEntityPermissions(dbSession, project.getUuid(), user.getUuid())).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
void selectEntityPermissions_returns_permissions_of_logged_in_user_on_specified_project_through_group_membership() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertEntityPermissionOnGroup(group1, UserRole.CODEVIEWER, project);
- db.users().insertEntityPermissionOnGroup(group2, UserRole.ISSUE_ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.CODEVIEWER, project);
+ db.users().insertEntityPermissionOnGroup(group2, ProjectPermission.ISSUE_ADMIN, project);
db.users().insertMember(group1, user);
- assertThat(underTest.selectEntityPermissions(dbSession, project.getUuid(), user.getUuid())).containsOnly(UserRole.CODEVIEWER);
+ assertThat(underTest.selectEntityPermissions(dbSession, project.getUuid(), user.getUuid())).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
void selectEntityPermissions_returns_permissions_of_logged_in_user_on_specified_private_project_through_all_possible_configurations() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
- db.users().insertEntityPermissionOnGroup(group1, UserRole.USER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.USER, project);
db.users().insertMember(group1, user);
- assertThat(underTest.selectEntityPermissions(dbSession, project.getUuid(), user.getUuid())).containsOnly(UserRole.CODEVIEWER,
- UserRole.USER);
+ assertThat(underTest.selectEntityPermissions(dbSession, project.getUuid(), user.getUuid())).containsOnly(ProjectPermission.CODEVIEWER.getKey(),
+ ProjectPermission.USER.getKey());
}
@Test
@@ -918,14 +917,14 @@ class AuthorizationDaoIT {
ProjectDto privateProject = db.components().insertPrivateProject().getProjectDto();
ProjectDto Project = db.components().insertPublicProject().getProjectDto();
UserDto user = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, privateProject);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, privateProject);
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(privateProject.getUuid(), Project.getUuid()), user.getUuid(),
- UserRole.ADMIN))
+ ProjectPermission.ADMIN))
.containsOnly(privateProject.getUuid());
// user does not have the permission "issueadmin"
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(privateProject.getUuid(), Project.getUuid()), user.getUuid(),
- UserRole.ISSUE_ADMIN))
+ ProjectPermission.ISSUE_ADMIN))
.isEmpty();
}
@@ -936,14 +935,14 @@ class AuthorizationDaoIT {
UserDto user = db.users().insertUser();
GroupDto group = db.users().insertGroup();
db.users().insertMember(group, user);
- db.users().insertEntityPermissionOnGroup(group, UserRole.ADMIN, privateProject);
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.ADMIN, privateProject);
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(privateProject.getUuid(), Project.getUuid()), user.getUuid(),
- UserRole.ADMIN))
+ ProjectPermission.ADMIN))
.containsOnly(privateProject.getUuid());
// user does not have the permission "issueadmin"
assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(privateProject.getUuid(), Project.getUuid()), user.getUuid(),
- UserRole.ISSUE_ADMIN))
+ ProjectPermission.ISSUE_ADMIN))
.isEmpty();
}
@@ -952,11 +951,11 @@ class AuthorizationDaoIT {
ProjectDto Project = db.components().insertPublicProject().getProjectDto();
UserDto user = db.users().insertUser();
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, Collections.emptySet(), user.getUuid(), ProjectPermission.USER))
.isEmpty();
// projects do not exist
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet("does_not_exist"), user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet("does_not_exist"), user.getUuid(), ProjectPermission.USER))
.isEmpty();
}
@@ -965,7 +964,7 @@ class AuthorizationDaoIT {
ProjectDto Project = db.components().insertPublicProject().getProjectDto();
UserDto user = db.users().insertUser();
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet("does_not_exist"), user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet("does_not_exist"), user.getUuid(), ProjectPermission.USER))
.isEmpty();
}
@@ -975,19 +974,19 @@ class AuthorizationDaoIT {
UserDto user = db.users().insertUser();
// logged-in user
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), user.getUuid(), UserRole.CODEVIEWER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), user.getUuid(), ProjectPermission.CODEVIEWER))
.containsOnly(Project.getUuid());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), user.getUuid(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), user.getUuid(), ProjectPermission.USER))
.containsOnly(Project.getUuid());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), user.getUuid(), UserRole.ADMIN))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), user.getUuid(), ProjectPermission.ADMIN))
.isEmpty();
// anonymous
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), null, UserRole.CODEVIEWER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), null, ProjectPermission.CODEVIEWER))
.containsOnly(Project.getUuid());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), null, UserRole.USER))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), null, ProjectPermission.USER))
.containsOnly(Project.getUuid());
- assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), null, UserRole.ADMIN))
+ assertThat(underTest.keepAuthorizedEntityUuids(dbSession, newHashSet(Project.getUuid()), null, ProjectPermission.ADMIN))
.isEmpty();
}
@@ -1148,21 +1147,21 @@ class AuthorizationDaoIT {
// admin with "direct" ADMIN role
UserDto admin1 = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(admin1, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(admin1, ProjectPermission.ADMIN, project);
// admin2 with ADMIN role through group
UserDto admin2 = db.users().insertUser();
GroupDto adminGroup = db.users().insertGroup("ADMIN");
db.users().insertMember(adminGroup, admin2);
- db.users().insertEntityPermissionOnGroup(adminGroup, UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(adminGroup, ProjectPermission.ADMIN, project);
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin()), project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin()), project.getKey(), ProjectPermission.USER))
.containsOnly(user1.getLogin());
assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin(), admin1.getLogin(), admin2.getLogin()),
- project.getKey(), UserRole.USER))
+ project.getKey(), ProjectPermission.USER))
.containsOnly(user1.getLogin(), admin1.getLogin(), admin2.getLogin());
assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin(), admin1.getLogin(), admin2.getLogin()),
- project.getKey(), UserRole.ADMIN))
+ project.getKey(), ProjectPermission.ADMIN))
.containsOnly(admin1.getLogin(), admin2.getLogin());
}
@@ -1172,12 +1171,12 @@ class AuthorizationDaoIT {
GroupDto userGroup = db.users().insertGroup("USERS");
GroupDto adminGroup = db.users().insertGroup("ADMIN");
- db.users().insertEntityPermissionOnGroup(userGroup, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(adminGroup, UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(userGroup, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(adminGroup, ProjectPermission.ADMIN, project);
// admin with "direct" ADMIN role
UserDto admin1 = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(admin1, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(admin1, ProjectPermission.ADMIN, project);
// admin2 with ADMIN role through group
UserDto admin2 = db.users().insertUser();
@@ -1185,7 +1184,7 @@ class AuthorizationDaoIT {
// user1 with "direct" USER role
UserDto user1 = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.USER, project);
// user2 with USER role through group
UserDto user2 = db.users().insertUser();
@@ -1194,17 +1193,17 @@ class AuthorizationDaoIT {
// user without role
UserDto userWithNoRole = db.users().insertUser();
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(userWithNoRole.getLogin()), project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(userWithNoRole.getLogin()), project.getKey(), ProjectPermission.USER))
.isEmpty();
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin()), project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin()), project.getKey(), ProjectPermission.USER))
.containsOnly(user1.getLogin());
Set<String> allLogins = newHashSet(admin1.getLogin(), admin2.getLogin(), user1.getLogin(), user2.getLogin(), userWithNoRole.getLogin());
// Admin does not have the USER permission set
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), ProjectPermission.USER))
.containsOnly(user1.getLogin(), user2.getLogin());
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), UserRole.ADMIN))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), ProjectPermission.ADMIN))
.containsOnly(admin1.getLogin(), admin2.getLogin());
}
@@ -1215,12 +1214,12 @@ class AuthorizationDaoIT {
GroupDto userGroup = db.users().insertGroup("USERS");
GroupDto adminGroup = db.users().insertGroup("ADMIN");
- db.users().insertEntityPermissionOnGroup(userGroup, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(adminGroup, UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(userGroup, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(adminGroup, ProjectPermission.ADMIN, project);
// admin with "direct" ADMIN role
UserDto admin1 = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(admin1, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(admin1, ProjectPermission.ADMIN, project);
// admin2 with ADMIN role through group
UserDto admin2 = db.users().insertUser();
@@ -1228,7 +1227,7 @@ class AuthorizationDaoIT {
// user1 with "direct" USER role
UserDto user1 = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(user1, UserRole.USER, project);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.USER, project);
// user2 with USER role through group
UserDto user2 = db.users().insertUser();
@@ -1237,17 +1236,17 @@ class AuthorizationDaoIT {
// user without role
UserDto userWithNoRole = db.users().insertUser();
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(userWithNoRole.getLogin()), project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(userWithNoRole.getLogin()), project.getKey(), ProjectPermission.USER))
.isEmpty();
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin()), project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, newHashSet(user1.getLogin()), project.getKey(), ProjectPermission.USER))
.containsOnly(user1.getLogin());
Set<String> allLogins = newHashSet(admin1.getLogin(), admin2.getLogin(), user1.getLogin(), user2.getLogin(), userWithNoRole.getLogin());
// Admin does not have the USER permission set
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), UserRole.USER))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), ProjectPermission.USER))
.containsOnly(user1.getLogin(), user2.getLogin());
- assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), UserRole.ADMIN))
+ assertThat(underTest.keepAuthorizedLoginsOnEntity(dbSession, allLogins, project.getKey(), ProjectPermission.ADMIN))
.containsOnly(admin1.getLogin(), admin2.getLogin());
}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java
index 9f640b326a0..04563dc062a 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoIT.java
@@ -31,7 +31,6 @@ import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.audit.NoOpAuditPersister;
@@ -70,19 +69,19 @@ class GroupPermissionDaoIT {
ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
ProjectDto project3 = db.components().insertPrivateProject().getProjectDto();
- db.users().insertEntityPermissionOnGroup(group1, UserRole.ISSUE_ADMIN, project1);
- db.users().insertEntityPermissionOnGroup(group1, UserRole.ADMIN, project2);
- db.users().insertEntityPermissionOnGroup(group2, UserRole.ADMIN, project2);
- db.users().insertEntityPermissionOnGroup(group3, UserRole.ADMIN, project2);
- db.users().insertEntityPermissionOnGroup(group1, UserRole.USER, project2);
- db.users().insertEntityPermissionOnGroup(group1, UserRole.USER, project3);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.ISSUE_ADMIN, project1);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.ADMIN, project2);
+ db.users().insertEntityPermissionOnGroup(group2, ProjectPermission.ADMIN, project2);
+ db.users().insertEntityPermissionOnGroup(group3, ProjectPermission.ADMIN, project2);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.USER, project2);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.USER, project3);
final List<CountPerEntityPermission> result = new ArrayList<>();
underTest.groupsCountByComponentUuidAndPermission(dbSession, asList(project2.getUuid(), project3.getUuid(), "789"),
context -> result.add(context.getResultObject()));
assertThat(result).hasSize(3);
- assertThat(result).extracting("permission").containsOnly(UserRole.ADMIN, UserRole.USER);
+ assertThat(result).extracting("permission").containsOnly(ProjectPermission.ADMIN.getKey(), ProjectPermission.USER.getKey());
assertThat(result).extracting("entityUuid").containsOnly(project2.getUuid(), project3.getUuid());
assertThat(result).extracting("count").containsOnly(3, 1);
}
@@ -195,7 +194,7 @@ class GroupPermissionDaoIT {
db.users().insertPermissionOnAnyone(GlobalPermission.PROVISION_PROJECTS);
db.users().insertPermissionOnGroup(group1, GlobalPermission.SCAN);
db.users().insertPermissionOnGroup(group3, GlobalPermission.ADMINISTER);
- db.users().insertEntityPermissionOnGroup(group2, UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(group2, ProjectPermission.ADMIN, project);
assertThat(underTest.selectGroupNamesByQuery(dbSession,
newQuery().setPermission(GlobalPermission.SCAN.getKey()).build())).containsExactly(ANYONE, group1.getName());
@@ -247,8 +246,8 @@ class GroupPermissionDaoIT {
db.users().insertEntityPermissionOnGroup(group1, GlobalPermission.SCAN.getKey(), project);
db.users().insertEntityPermissionOnGroup(group1, GlobalPermission.PROVISION_PROJECTS.getKey(), project);
- db.users().insertEntityPermissionOnGroup(group1, UserRole.ADMIN, anotherProject);
- db.users().insertEntityPermissionOnGroup(group3, UserRole.SCAN, anotherProject);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.ADMIN, anotherProject);
+ db.users().insertEntityPermissionOnGroup(group3, ProjectPermission.SCAN, anotherProject);
db.users().insertPermissionOnGroup(group2, GlobalPermission.SCAN);
PermissionQuery.Builder builderOnComponent = newQuery()
@@ -258,7 +257,7 @@ class GroupPermissionDaoIT {
assertThat(underTest.selectGroupNamesByQuery(dbSession,
builderOnComponent.setPermission(GlobalPermission.SCAN.getKey()).build())).containsOnlyOnce(group1.getName());
assertThat(underTest.selectGroupNamesByQuery(dbSession,
- builderOnComponent.setPermission(UserRole.USER).build())).isEmpty();
+ builderOnComponent.setPermission(ProjectPermission.USER).build())).isEmpty();
}
@Test
@@ -297,7 +296,7 @@ class GroupPermissionDaoIT {
GroupDto group2 = db.users().insertGroup("Group-2");
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertEntityPermissionOnGroup(group2, UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(group2, ProjectPermission.ADMIN, project);
GroupDto group3 = db.users().insertGroup("Group-3");
db.users().insertPermissionOnGroup(group3, GlobalPermission.ADMINISTER);
@@ -370,10 +369,10 @@ class GroupPermissionDaoIT {
GroupDto group2 = db.users().insertGroup("Group-2");
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- db.users().insertProjectPermissionOnGroup(group2, UserRole.USER, project);
+ db.users().insertProjectPermissionOnGroup(group2, ProjectPermission.USER, project);
GroupDto group3 = db.users().insertGroup("Group-3");
- db.users().insertProjectPermissionOnGroup(group3, UserRole.USER, project);
+ db.users().insertProjectPermissionOnGroup(group3, ProjectPermission.USER, project);
// Anyone group
db.users().insertPermissionOnAnyone(GlobalPermission.SCAN);
@@ -382,11 +381,11 @@ class GroupPermissionDaoIT {
assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group2.getUuid()), project.uuid()))
.extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getEntityUuid)
- .containsOnly(tuple(group2.getUuid(), UserRole.USER, project.uuid()));
+ .containsOnly(tuple(group2.getUuid(), ProjectPermission.USER.getKey(), project.uuid()));
assertThat(underTest.selectByGroupUuids(dbSession, singletonList(group3.getUuid()), project.uuid()))
.extracting(GroupPermissionDto::getGroupUuid, GroupPermissionDto::getRole, GroupPermissionDto::getEntityUuid)
- .containsOnly(tuple(group3.getUuid(), UserRole.USER, project.uuid()));
+ .containsOnly(tuple(group3.getUuid(), ProjectPermission.USER.getKey(), project.uuid()));
assertThat(underTest.selectByGroupUuids(dbSession, singletonList(ANYONE_UUID), project.uuid()))
.isEmpty();
@@ -527,7 +526,7 @@ class GroupPermissionDaoIT {
GroupDto group = db.users().insertGroup();
db.users().insertProjectPermissionOnGroup(group, "foo", project.getMainBranchComponent());
- assertThat(underTest.selectGroupUuidsWithPermissionOnEntityBut(dbSession, "1234", UserRole.USER))
+ assertThat(underTest.selectGroupUuidsWithPermissionOnEntityBut(dbSession, "1234", ProjectPermission.USER))
.isEmpty();
}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoWithPersisterIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoWithPersisterIT.java
index e81f33a54de..51c7d24aa3d 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoWithPersisterIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/GroupPermissionDaoWithPersisterIT.java
@@ -38,8 +38,8 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
-import static org.sonar.api.web.UserRole.ADMIN;
import static org.sonar.core.util.SequenceUuidFactory.UUID_1;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
class GroupPermissionDaoWithPersisterIT {
private final AuditPersister auditPersister = mock(AuditPersister.class);
@@ -100,7 +100,7 @@ class GroupPermissionDaoWithPersisterIT {
verify(auditPersister).deleteGroupPermission(eq(dbSession), newValueCaptor.capture());
newValue = newValueCaptor.getValue();
- assertNewValue(newValue, null, null, null, project.projectUuid(), null, project.projectKey(), project.getProjectDto().getName(), "TRK");
+ assertNewValue(newValue, null, null, null, project.projectUuid(), (String) null, project.projectKey(), project.getProjectDto().getName(), "TRK");
assertThat(newValue).hasToString("{\"componentUuid\": \"projectUuid\", \"componentKey\": \"cKey\", \"componentName\": \"cname\", " +
"\"qualifier\": \"project\" }");
}
@@ -132,7 +132,7 @@ class GroupPermissionDaoWithPersisterIT {
verify(auditPersister).deleteGroupPermission(eq(dbSession), newValueCaptor.capture());
newValue = newValueCaptor.getValue();
- assertNewValue(newValue, null, null, null, project.projectUuid(), null, project.projectKey(), project.getProjectDto().getName(), "TRK");
+ assertNewValue(newValue, null, null, null, project.projectUuid(), (String) null, project.projectKey(), project.getProjectDto().getName(), "TRK");
assertThat(newValue).hasToString("{\"componentUuid\": \"projectUuid\", \"componentKey\": \"cKey\", " +
"\"componentName\": \"cname\", \"qualifier\": \"project\" }");
}
@@ -181,6 +181,12 @@ class GroupPermissionDaoWithPersisterIT {
}
private void assertNewValue(GroupPermissionNewValue newValue, String uuid, String groupUuid, String groupName, String cUuid,
+ ProjectPermission permission,
+ String componentKey, String cName, String qualifier) {
+ assertNewValue(newValue, uuid, groupUuid, groupName, cUuid, permission.getKey(), componentKey, cName, qualifier);
+ }
+
+ private void assertNewValue(GroupPermissionNewValue newValue, String uuid, String groupUuid, String groupName, String cUuid,
String permission,
String componentKey, String cName, String qualifier) {
assertThat(newValue)
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/UserPermissionDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/UserPermissionDaoIT.java
index 1162a9e3778..34a7122ab06 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/UserPermissionDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/UserPermissionDaoIT.java
@@ -30,7 +30,6 @@ import org.assertj.core.groups.Tuple;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -68,7 +67,7 @@ class UserPermissionDaoIT {
UserPermissionDto global1 = addGlobalPermission(GlobalPermission.ADMINISTER.getKey(), user1);
UserPermissionDto global2 = addGlobalPermission(GlobalPermission.ADMINISTER.getKey(), user2);
UserPermissionDto global3 = addGlobalPermission(GlobalPermission.PROVISION_PROJECTS.getKey(), user2);
- UserPermissionDto project1Perm = addProjectPermission(UserRole.USER, user3, project);
+ UserPermissionDto project1Perm = addProjectPermission(ProjectPermission.USER, user3, project);
// global permissions of users who has at least one global permission, ordered by user name then permission
PermissionQuery query = PermissionQuery.builder().withAtLeastOnePermission().build();
@@ -117,10 +116,10 @@ class UserPermissionDaoIT {
addGlobalPermission(GlobalPermission.ADMINISTER.getKey(), user1);
ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
- UserPermissionDto perm1 = addProjectPermission(UserRole.USER, user1, project1);
- UserPermissionDto perm2 = addProjectPermission(UserRole.ISSUE_ADMIN, user1, project1);
- UserPermissionDto perm3 = addProjectPermission(UserRole.ISSUE_ADMIN, user2, project1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user3, project2);
+ UserPermissionDto perm1 = addProjectPermission(ProjectPermission.USER, user1, project1);
+ UserPermissionDto perm2 = addProjectPermission(ProjectPermission.ISSUE_ADMIN, user1, project1);
+ UserPermissionDto perm3 = addProjectPermission(ProjectPermission.ISSUE_ADMIN, user2, project1);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user3, project2);
// project permissions of users who has at least one permission on this project
PermissionQuery query = PermissionQuery.builder().withAtLeastOnePermission().setEntity(project1).build();
@@ -135,7 +134,7 @@ class UserPermissionDaoIT {
expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), perm3, perm2, perm1);
// search by user name (matches 2 users) and project permission
- query = PermissionQuery.builder().setSearchQuery("Mari").setPermission(UserRole.ISSUE_ADMIN).setEntity(project1).build();
+ query = PermissionQuery.builder().setSearchQuery("Mari").setPermission(ProjectPermission.ISSUE_ADMIN).setEntity(project1).build();
expectPermissions(query, asList(user2.getUuid(), user1.getUuid()), perm3, perm2);
// search by user name (no match)
@@ -208,9 +207,9 @@ class UserPermissionDaoIT {
UserDto user2 = insertUser(u -> u.setLogin("login2").setName("A").setEmail("email2@email.com"));
addGlobalPermission(GlobalPermission.ADMINISTER.getKey(), user1);
ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
- addProjectPermission(UserRole.USER, user2, project1);
- addProjectPermission(UserRole.USER, user1, project1);
- addProjectPermission(UserRole.ADMIN, user1, project1);
+ addProjectPermission(ProjectPermission.USER, user2, project1);
+ addProjectPermission(ProjectPermission.USER, user1, project1);
+ addProjectPermission(ProjectPermission.ADMIN, user1, project1);
PermissionQuery query = PermissionQuery.builder().build();
@@ -226,24 +225,24 @@ class UserPermissionDaoIT {
ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
addGlobalPermission(GlobalPermission.ADMINISTER.getKey(), user1);
- addProjectPermission(UserRole.USER, user1, project1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user1, project1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user2, project1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user2, project2);
+ addProjectPermission(ProjectPermission.USER, user1, project1);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user1, project1);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user2, project1);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user2, project2);
// no projects -> return empty list
assertThat(underTest.countUsersByEntityPermission(dbSession, emptyList())).isEmpty();
// one project
expectCount(singletonList(project1.getUuid()),
- new CountPerEntityPermission(project1.getUuid(), UserRole.USER, 1),
- new CountPerEntityPermission(project1.getUuid(), UserRole.ISSUE_ADMIN, 2));
+ new CountPerEntityPermission(project1.getUuid(), ProjectPermission.USER, 1),
+ new CountPerEntityPermission(project1.getUuid(), ProjectPermission.ISSUE_ADMIN, 2));
// multiple projects
expectCount(asList(project1.getUuid(), project2.getUuid(), "invalid"),
- new CountPerEntityPermission(project1.getUuid(), UserRole.USER, 1),
- new CountPerEntityPermission(project1.getUuid(), UserRole.ISSUE_ADMIN, 2),
- new CountPerEntityPermission(project2.getUuid(), UserRole.ISSUE_ADMIN, 1));
+ new CountPerEntityPermission(project1.getUuid(), ProjectPermission.USER, 1),
+ new CountPerEntityPermission(project1.getUuid(), ProjectPermission.ISSUE_ADMIN, 2),
+ new CountPerEntityPermission(project2.getUuid(), ProjectPermission.ISSUE_ADMIN, 1));
}
@Test
@@ -252,9 +251,9 @@ class UserPermissionDaoIT {
UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
- addProjectPermission(UserRole.USER, user1, project1);
- addProjectPermission(UserRole.USER, user2, project1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user2, project1);
+ addProjectPermission(ProjectPermission.USER, user1, project1);
+ addProjectPermission(ProjectPermission.USER, user2, project1);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user2, project1);
// logins are ordered by user name: user2 ("Marie") then user1 ("Marius")
PermissionQuery query = PermissionQuery.builder().setEntity(project1).withAtLeastOnePermission().build();
@@ -285,9 +284,9 @@ class UserPermissionDaoIT {
UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
- addProjectPermission(UserRole.USER, user1, project1);
+ addProjectPermission(ProjectPermission.USER, user1, project1);
addGlobalPermission(GlobalPermission.PROVISION_PROJECTS.getKey(), user1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user2, project2);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user2, project2);
PermissionQuery query = PermissionQuery.builder().build();
List<String> result = underTest.selectUserUuidsByQueryAndScope(dbSession, query);
@@ -302,9 +301,9 @@ class UserPermissionDaoIT {
UserDto user2 = insertUser(u -> u.setLogin("login2").setName("Marie").setEmail("email2@email.com"));
ProjectDto project1 = db.components().insertPrivateProject().getProjectDto();
ProjectDto project2 = db.components().insertPrivateProject().getProjectDto();
- addProjectPermission(UserRole.USER, user1, project1);
+ addProjectPermission(ProjectPermission.USER, user1, project1);
addGlobalPermission(GlobalPermission.PROVISION_PROJECTS.getKey(), user1);
- addProjectPermission(UserRole.ISSUE_ADMIN, user2, project2);
+ addProjectPermission(ProjectPermission.ISSUE_ADMIN, user2, project2);
PermissionQuery query = PermissionQuery.builder()
.setEntity(project1)
.build();
@@ -459,7 +458,7 @@ class UserPermissionDaoIT {
UserDto user = insertUser();
db.users().insertProjectPermissionOnUser(user, "foo", project.getMainBranchComponent());
- assertThat(underTest.selectUserIdsWithPermissionOnEntityBut(dbSession, "1234", UserRole.USER))
+ assertThat(underTest.selectUserIdsWithPermissionOnEntityBut(dbSession, "1234", ProjectPermission.USER.getKey()))
.isEmpty();
}
@@ -579,7 +578,8 @@ class UserPermissionDaoIT {
assertThat(underTest.selectEntityPermissionsOfUser(dbSession, user1.getUuid(), project1.projectUuid())).isEmpty();
assertThat(underTest.selectEntityPermissionsOfUser(dbSession, user2.getUuid(), project1.projectUuid())).isEmpty();
assertThat(underTest.selectEntityPermissionsOfUser(dbSession, user1.getUuid(), project2.projectUuid())).containsOnly(GlobalPermission.SCAN.getKey());
- assertThat(underTest.selectEntityPermissionsOfUser(dbSession, user2.getUuid(), project2.projectUuid())).containsOnly(GlobalPermission.SCAN.getKey(), GlobalPermission.PROVISION_PROJECTS.getKey());
+ assertThat(underTest.selectEntityPermissionsOfUser(dbSession, user2.getUuid(), project2.projectUuid())).containsOnly(GlobalPermission.SCAN.getKey(),
+ GlobalPermission.PROVISION_PROJECTS.getKey());
deletedCount = underTest.deleteEntityPermissionOfAnyUser(dbSession, GlobalPermission.SCAN.getKey(), project2.getProjectDto());
@@ -639,6 +639,10 @@ class UserPermissionDaoIT {
return dto;
}
+ private UserPermissionDto addProjectPermission(ProjectPermission permission, UserDto user, EntityDto project) {
+ return addProjectPermission(permission.getKey(), user, project);
+ }
+
private UserPermissionDto addProjectPermission(String permission, UserDto user, EntityDto project) {
UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), project.getUuid());
underTest.insert(dbSession, dto, project, user, null);
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/GroupWithPermissionTemplateDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/GroupWithPermissionTemplateDaoIT.java
index 382fbc885b6..4367f147b0c 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/GroupWithPermissionTemplateDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/GroupWithPermissionTemplateDaoIT.java
@@ -25,7 +25,7 @@ import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.permission.PermissionQuery;
@@ -34,8 +34,8 @@ import org.sonar.db.user.GroupDto;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
import static org.sonar.db.permission.PermissionQuery.builder;
@@ -95,7 +95,7 @@ class GroupWithPermissionTemplateDaoIT {
GroupDto group2 = db.users().insertGroup("B");
GroupDto group3 = db.users().insertGroup("C");
- permissionTemplateDbTester.addGroupToTemplate(template, group3, UserRole.USER);
+ permissionTemplateDbTester.addGroupToTemplate(template, group3, ProjectPermission.USER);
PermissionQuery query = PermissionQuery.builder().build();
assertThat(underTest.selectGroupNamesByQueryAndTemplate(db.getSession(), query, template.getUuid()))
@@ -108,7 +108,7 @@ class GroupWithPermissionTemplateDaoIT {
IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> db.users().insertGroup("Group-" + i));
String lastGroupName = "Group-" + (DEFAULT_PAGE_SIZE + 1);
- permissionTemplateDbTester.addGroupToTemplate(template, db.users().selectGroup(lastGroupName).get(), UserRole.USER);
+ permissionTemplateDbTester.addGroupToTemplate(template, db.users().selectGroup(lastGroupName).get(), ProjectPermission.USER);
PermissionQuery query = PermissionQuery.builder().build();
assertThat(underTest.selectGroupNamesByQueryAndTemplate(db.getSession(), query, template.getUuid()))
@@ -122,11 +122,11 @@ class GroupWithPermissionTemplateDaoIT {
PermissionTemplateDto otherTemplate = permissionTemplateDbTester.insertTemplate();
IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
GroupDto group = db.users().insertGroup("Group-" + i);
- permissionTemplateDbTester.addGroupToTemplate(otherTemplate, group, UserRole.USER);
+ permissionTemplateDbTester.addGroupToTemplate(otherTemplate, group, ProjectPermission.USER);
});
String lastGroupName = "Group-" + (DEFAULT_PAGE_SIZE + 1);
- permissionTemplateDbTester.addGroupToTemplate(template, db.users().selectGroup(lastGroupName).get(), UserRole.USER);
+ permissionTemplateDbTester.addGroupToTemplate(template, db.users().selectGroup(lastGroupName).get(), ProjectPermission.USER);
PermissionQuery query = PermissionQuery.builder().build();
assertThat(underTest.selectGroupNamesByQueryAndTemplate(db.getSession(), query, template.getUuid()))
@@ -216,8 +216,8 @@ class GroupWithPermissionTemplateDaoIT {
.extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getGroupName,
PermissionTemplateGroupDto::getPermission)
.containsOnly(
- tuple(group1.getUuid(), "Group-1", USER),
- tuple(group1.getUuid(), "Group-1", ADMIN));
+ tuple(group1.getUuid(), "Group-1", USER.getKey()),
+ tuple(group1.getUuid(), "Group-1", ADMIN.getKey()));
assertThat(underTest.selectGroupPermissionsByTemplateIdAndGroupNames(session, anotherTemplate.getUuid(), asList("Group-1")))
.extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getGroupName,
@@ -229,7 +229,7 @@ class GroupWithPermissionTemplateDaoIT {
.extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getGroupName,
PermissionTemplateGroupDto::getPermission)
.containsOnly(
- tuple("Anyone", "Anyone", USER));
+ tuple("Anyone", "Anyone", USER.getKey()));
assertThat(underTest.selectGroupPermissionsByTemplateIdAndGroupNames(session, template.getUuid(), asList("Group-1", "Group-2",
"Anyone"))).hasSize(3);
@@ -258,15 +258,15 @@ class GroupWithPermissionTemplateDaoIT {
.extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getGroupName,
PermissionTemplateGroupDto::getPermission)
.containsOnly(
- tuple(group1.getUuid(), "Group-1", USER),
- tuple(group1.getUuid(), "Group-1", ADMIN),
+ tuple(group1.getUuid(), "Group-1", USER.getKey()),
+ tuple(group1.getUuid(), "Group-1", ADMIN.getKey()),
tuple(group2.getUuid(), "Group-2", PROVISION_PROJECTS.getKey()));
assertThat(underTest.selectGroupPermissionsByTemplateUuid(session, anotherTemplate.getUuid()))
.extracting(PermissionTemplateGroupDto::getGroupUuid, PermissionTemplateGroupDto::getGroupName,
PermissionTemplateGroupDto::getPermission)
.containsOnly(
tuple(group1.getUuid(), "Group-1", PROVISION_PROJECTS.getKey()),
- tuple("Anyone", "Anyone", USER));
+ tuple("Anyone", "Anyone", USER.getKey()));
assertThat(underTest.selectGroupPermissionsByTemplateUuid(session, "321")).isEmpty();
}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoIT.java
index ed49ce3fd1c..d275eb56563 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoIT.java
@@ -24,7 +24,7 @@ import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.audit.NoOpAuditPersister;
@@ -46,7 +46,7 @@ class PermissionTemplateCharacteristicDaoIT {
void selectByTemplateId_filter_by_template_uuid() {
PermissionTemplateCharacteristicDto templatePermission1 = underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid1")
- .setPermission(UserRole.ADMIN)
+ .setPermission(ProjectPermission.ADMIN)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(1_000_000_000L)
@@ -54,7 +54,7 @@ class PermissionTemplateCharacteristicDaoIT {
"template");
PermissionTemplateCharacteristicDto templatePermission2 = underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid2")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("2")
.setWithProjectCreator(false)
.setCreatedAt(1_000_000_000L)
@@ -62,7 +62,7 @@ class PermissionTemplateCharacteristicDaoIT {
"template");
PermissionTemplateCharacteristicDto templatePermission3 = underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid3")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("3")
.setWithProjectCreator(false)
.setCreatedAt(1_000_000_001L)
@@ -71,7 +71,7 @@ class PermissionTemplateCharacteristicDaoIT {
PermissionTemplateCharacteristicDto templatePermissionForAnotherTemplate = underTest.insert(dbSession,
new PermissionTemplateCharacteristicDto()
.setUuid("uuid4")
- .setPermission(UserRole.ADMIN)
+ .setPermission(ProjectPermission.ADMIN)
.setTemplateUuid("42")
.setWithProjectCreator(true)
.setCreatedAt(1_000_000_000L)
@@ -99,7 +99,7 @@ class PermissionTemplateCharacteristicDaoIT {
void selectByPermissionAndTemplateId() {
PermissionTemplateCharacteristicDto templatePermission1 = underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid1")
- .setPermission(UserRole.ADMIN)
+ .setPermission(ProjectPermission.ADMIN)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(1_000_000_000L)
@@ -107,7 +107,7 @@ class PermissionTemplateCharacteristicDaoIT {
"template");
underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid2")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(false)
.setCreatedAt(1_000_000_000L)
@@ -115,14 +115,14 @@ class PermissionTemplateCharacteristicDaoIT {
"template");
underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid3")
- .setPermission(UserRole.ADMIN)
+ .setPermission(ProjectPermission.ADMIN)
.setTemplateUuid("42")
.setWithProjectCreator(true)
.setCreatedAt(1_000_000_000L)
.setUpdatedAt(2_000_000_000L),
"template");
- Optional<PermissionTemplateCharacteristicDto> result = underTest.selectByPermissionAndTemplateId(dbSession, UserRole.ADMIN, "1");
+ Optional<PermissionTemplateCharacteristicDto> result = underTest.selectByPermissionAndTemplateId(dbSession, ProjectPermission.ADMIN, "1");
assertThat(result).isPresent();
assertThat(result.get()).isEqualToComparingFieldByField(templatePermission1);
@@ -132,7 +132,7 @@ class PermissionTemplateCharacteristicDaoIT {
void insert() {
PermissionTemplateCharacteristicDto expectedResult = underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(123_456_789L)
@@ -149,7 +149,7 @@ class PermissionTemplateCharacteristicDaoIT {
void update_only_change_with_project_creator_and_updated_at() {
PermissionTemplateCharacteristicDto insertedDto = underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(123_456_789L)
@@ -177,7 +177,7 @@ class PermissionTemplateCharacteristicDaoIT {
void fail_insert_if_created_at_is_equal_to_0() {
PermissionTemplateCharacteristicDto characteristicDto = new PermissionTemplateCharacteristicDto()
.setUuid("uuid")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setUpdatedAt(2_000_000_000L);
@@ -189,7 +189,7 @@ class PermissionTemplateCharacteristicDaoIT {
void fail_insert_if_updated_at_is_equal_to_0() {
PermissionTemplateCharacteristicDto characteristicDto = new PermissionTemplateCharacteristicDto()
.setUuid("uuid")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(2_000_000_000L);
@@ -201,7 +201,7 @@ class PermissionTemplateCharacteristicDaoIT {
@Test
void fail_update_if_uuid_is_null() {
PermissionTemplateCharacteristicDto characteristicDto = new PermissionTemplateCharacteristicDto()
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(123_456_789L)
@@ -214,7 +214,7 @@ class PermissionTemplateCharacteristicDaoIT {
void delete_by_permission_template_uuid() {
underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid1")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(123_456_789L)
@@ -222,7 +222,7 @@ class PermissionTemplateCharacteristicDaoIT {
"template");
underTest.insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid("uuid2")
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setTemplateUuid("2")
.setWithProjectCreator(true)
.setCreatedAt(123_456_789L)
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoWithPersisterIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoWithPersisterIT.java
index 0d35817630b..e7890b25e6c 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoWithPersisterIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDaoWithPersisterIT.java
@@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.mockito.ArgumentCaptor;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.audit.AuditPersister;
@@ -45,7 +45,7 @@ class PermissionTemplateCharacteristicDaoWithPersisterIT {
@Test
void insertPermissionTemplateCharacteristicIsPersisted() {
- PermissionTemplateCharacteristicDto dto = getPermissionTemplateCharacteristic(UserRole.USER);
+ PermissionTemplateCharacteristicDto dto = getPermissionTemplateCharacteristic(ProjectPermission.USER);
underTest.insert(session, dto, "template");
verify(auditPersister).addCharacteristicToPermissionTemplate(eq(session), newValueCaptor.capture());
@@ -59,9 +59,9 @@ class PermissionTemplateCharacteristicDaoWithPersisterIT {
@Test
void updatePermissionTemplateCharacteristicIsPersisted() {
- underTest.insert(session, getPermissionTemplateCharacteristic(UserRole.USER),
+ underTest.insert(session, getPermissionTemplateCharacteristic(ProjectPermission.USER),
"template");
- PermissionTemplateCharacteristicDto updated = getPermissionTemplateCharacteristic(UserRole.ADMIN);
+ PermissionTemplateCharacteristicDto updated = getPermissionTemplateCharacteristic(ProjectPermission.ADMIN);
underTest.update(session, updated, "template");
verify(auditPersister).updateCharacteristicInPermissionTemplate(eq(session), newValueCaptor.capture());
@@ -73,10 +73,10 @@ class PermissionTemplateCharacteristicDaoWithPersisterIT {
assertThat(newValue.toString()).contains("withProjectCreator");
}
- private PermissionTemplateCharacteristicDto getPermissionTemplateCharacteristic(String role) {
+ private PermissionTemplateCharacteristicDto getPermissionTemplateCharacteristic(ProjectPermission role) {
return new PermissionTemplateCharacteristicDto()
.setUuid("uuid")
- .setPermission(role)
+ .setPermission(role.getKey())
.setTemplateUuid("1")
.setWithProjectCreator(true)
.setCreatedAt(123_456_789L)
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoIT.java
index 4e5edc3d579..24dcf253be2 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoIT.java
@@ -26,13 +26,13 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.audit.NoOpAuditPersister;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
@@ -284,22 +284,22 @@ class PermissionTemplateDaoIT {
GroupDto group1 = db.users().insertGroup(newGroupDto());
GroupDto group2 = db.users().insertGroup(newGroupDto());
GroupDto group3 = db.users().insertGroup(newGroupDto());
- templateDb.addGroupToTemplate(template1.getUuid(), group1.getUuid(), UserRole.CODEVIEWER, template1.getName(), group1.getName());
- templateDb.addGroupToTemplate(template1.getUuid(), group2.getUuid(), UserRole.CODEVIEWER, template1.getName(), group2.getName());
- templateDb.addGroupToTemplate(template1.getUuid(), group3.getUuid(), UserRole.CODEVIEWER, template1.getName(), group3.getName());
- templateDb.addGroupToTemplate(template1.getUuid(), null, UserRole.CODEVIEWER, template1.getName(), null);
- templateDb.addGroupToTemplate(template1.getUuid(), group1.getUuid(), UserRole.ADMIN, template1.getName(), group1.getName());
- templateDb.addGroupToTemplate(template2.getUuid(), group1.getUuid(), UserRole.ADMIN, template2.getName(), group1.getName());
- templateDb.addGroupToTemplate(template4.getUuid(), group1.getUuid(), UserRole.ISSUE_ADMIN, template4.getName(), group1.getName());
+ templateDb.addGroupToTemplate(template1.getUuid(), group1.getUuid(), ProjectPermission.CODEVIEWER, template1.getName(), group1.getName());
+ templateDb.addGroupToTemplate(template1.getUuid(), group2.getUuid(), ProjectPermission.CODEVIEWER, template1.getName(), group2.getName());
+ templateDb.addGroupToTemplate(template1.getUuid(), group3.getUuid(), ProjectPermission.CODEVIEWER, template1.getName(), group3.getName());
+ templateDb.addGroupToTemplate(template1.getUuid(), null, ProjectPermission.CODEVIEWER, template1.getName(), null);
+ templateDb.addGroupToTemplate(template1.getUuid(), group1.getUuid(), ProjectPermission.ADMIN, template1.getName(), group1.getName());
+ templateDb.addGroupToTemplate(template2.getUuid(), group1.getUuid(), ProjectPermission.ADMIN, template2.getName(), group1.getName());
+ templateDb.addGroupToTemplate(template4.getUuid(), group1.getUuid(), ProjectPermission.ISSUE_ADMIN, template4.getName(), group1.getName());
final List<CountByTemplateAndPermissionDto> result = new ArrayList<>();
underTest.groupsCountByTemplateUuidAndPermission(dbSession, asList(template1.getUuid(), template2.getUuid(), template3.getUuid()),
context -> result.add(context.getResultObject()));
assertThat(result).extracting(CountByTemplateAndPermissionDto::getPermission, CountByTemplateAndPermissionDto::getTemplateUuid,
- CountByTemplateAndPermissionDto::getCount)
- .containsOnly(tuple(UserRole.ADMIN, template1.getUuid(), 1), tuple(UserRole.CODEVIEWER, template1.getUuid(), 4),
- tuple(UserRole.ADMIN, template2.getUuid(), 1));
+ CountByTemplateAndPermissionDto::getCount)
+ .containsOnly(tuple(ProjectPermission.ADMIN.getKey(), template1.getUuid(), 1), tuple(ProjectPermission.CODEVIEWER.getKey(), template1.getUuid(), 4),
+ tuple(ProjectPermission.ADMIN.getKey(), template2.getUuid(), 1));
}
@Test
@@ -313,12 +313,12 @@ class PermissionTemplateDaoIT {
UserDto user2 = db.users().insertUser();
UserDto user3 = db.users().insertUser();
- templateDb.addUserToTemplate(template1.getUuid(), user1.getUuid(), UserRole.ADMIN, template1.getName(), user1.getLogin());
- templateDb.addUserToTemplate(template1.getUuid(), user2.getUuid(), UserRole.ADMIN, template1.getName(), user2.getLogin());
- templateDb.addUserToTemplate(template1.getUuid(), user3.getUuid(), UserRole.ADMIN, template1.getName(), user3.getLogin());
- templateDb.addUserToTemplate(template1.getUuid(), user1.getUuid(), UserRole.USER, template1.getName(), user1.getLogin());
- templateDb.addUserToTemplate(template2.getUuid(), user1.getUuid(), UserRole.USER, template2.getName(), user1.getLogin());
- templateDb.addUserToTemplate(anotherTemplate.getUuid(), user1.getUuid(), UserRole.ISSUE_ADMIN, anotherTemplate.getName(),
+ templateDb.addUserToTemplate(template1.getUuid(), user1.getUuid(), ProjectPermission.ADMIN, template1.getName(), user1.getLogin());
+ templateDb.addUserToTemplate(template1.getUuid(), user2.getUuid(), ProjectPermission.ADMIN, template1.getName(), user2.getLogin());
+ templateDb.addUserToTemplate(template1.getUuid(), user3.getUuid(), ProjectPermission.ADMIN, template1.getName(), user3.getLogin());
+ templateDb.addUserToTemplate(template1.getUuid(), user1.getUuid(), ProjectPermission.USER, template1.getName(), user1.getLogin());
+ templateDb.addUserToTemplate(template2.getUuid(), user1.getUuid(), ProjectPermission.USER, template2.getName(), user1.getLogin());
+ templateDb.addUserToTemplate(anotherTemplate.getUuid(), user1.getUuid(), ProjectPermission.ISSUE_ADMIN, anotherTemplate.getName(),
user1.getLogin());
final List<CountByTemplateAndPermissionDto> result = new ArrayList<>();
@@ -328,9 +328,9 @@ class PermissionTemplateDaoIT {
.extracting(CountByTemplateAndPermissionDto::getPermission, CountByTemplateAndPermissionDto::getTemplateUuid,
CountByTemplateAndPermissionDto::getCount)
.containsExactlyInAnyOrder(
- tuple(UserRole.ADMIN, template1.getUuid(), 3),
- tuple(UserRole.USER, template1.getUuid(), 1),
- tuple(UserRole.USER, template2.getUuid(), 1));
+ tuple(ProjectPermission.ADMIN.getKey(), template1.getUuid(), 3),
+ tuple(ProjectPermission.USER.getKey(), template1.getUuid(), 1),
+ tuple(ProjectPermission.USER.getKey(), template2.getUuid(), 1));
}
@Test
@@ -357,21 +357,22 @@ class PermissionTemplateDaoIT {
db.users().insertMember(group, user);
PermissionTemplateDto template = templateDb.insertTemplate();
templateDb.addProjectCreatorToTemplate(template.getUuid(), GlobalPermission.SCAN.getKey(), template.getName());
- templateDb.addProjectCreatorToTemplate(template.getUuid(), UserRole.ADMIN, template.getName());
- templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.USER, template.getName(), user.getLogin());
- templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.ADMIN, template.getName(), user.getLogin());
- templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), UserRole.CODEVIEWER, template.getName(), group.getName());
- templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), UserRole.ADMIN, template.getName(), group.getName());
- templateDb.addGroupToTemplate(template.getUuid(), null, UserRole.ISSUE_ADMIN, template.getName(), null);
+ templateDb.addProjectCreatorToTemplate(template.getUuid(), ProjectPermission.ADMIN, template.getName());
+ templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), ProjectPermission.USER, template.getName(), user.getLogin());
+ templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), ProjectPermission.ADMIN, template.getName(), user.getLogin());
+ templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), ProjectPermission.CODEVIEWER, template.getName(), group.getName());
+ templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), ProjectPermission.ADMIN, template.getName(), group.getName());
+ templateDb.addGroupToTemplate(template.getUuid(), null, ProjectPermission.ISSUE_ADMIN, template.getName(), null);
List<String> resultWithUser = underTest.selectPotentialPermissionsByUserUuidAndTemplateUuid(dbSession, user.getUuid(),
template.getUuid());
List<String> resultWithoutUser = underTest.selectPotentialPermissionsByUserUuidAndTemplateUuid(dbSession, null, template.getUuid());
- assertThat(resultWithUser).containsOnlyOnce(GlobalPermission.SCAN.getKey(), UserRole.ADMIN, UserRole.USER, UserRole.CODEVIEWER,
- UserRole.ISSUE_ADMIN);
+ assertThat(resultWithUser).containsOnlyOnce(ProjectPermission.SCAN.getKey(), ProjectPermission.ADMIN.getKey(), ProjectPermission.USER.getKey(),
+ ProjectPermission.CODEVIEWER.getKey(),
+ ProjectPermission.ISSUE_ADMIN.getKey());
// only permission from anyone group
- assertThat(resultWithoutUser).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(resultWithoutUser).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoWithPersisterIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoWithPersisterIT.java
index b9126a5953f..6a12c5222b9 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoWithPersisterIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/PermissionTemplateDaoWithPersisterIT.java
@@ -36,7 +36,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
import static org.sonar.db.permission.template.PermissionTemplateTesting.newPermissionTemplateDto;
import static org.sonar.db.user.GroupTesting.newGroupDto;
@@ -110,7 +110,7 @@ class PermissionTemplateDaoWithPersisterIT {
assertThat(newValue)
.extracting(PermissionTemplateNewValue::getTemplateUuid, PermissionTemplateNewValue::getName,
PermissionTemplateNewValue::getPermission, PermissionTemplateNewValue::getUserUuid, PermissionTemplateNewValue::getUserLogin)
- .containsExactly(dto.getUuid(), dto.getName(), ADMIN, user.getUuid(), user.getLogin());
+ .containsExactly(dto.getUuid(), dto.getName(), ADMIN.getKey(), user.getUuid(), user.getLogin());
assertThat(newValue.toString()).doesNotContain("groupUuid");
underTest.deleteUserPermission(session, dto.getUuid(), user.getUuid(), ADMIN, dto.getName(), user.getLogin());
@@ -120,7 +120,7 @@ class PermissionTemplateDaoWithPersisterIT {
assertThat(newValue)
.extracting(PermissionTemplateNewValue::getTemplateUuid, PermissionTemplateNewValue::getName,
PermissionTemplateNewValue::getPermission, PermissionTemplateNewValue::getUserUuid, PermissionTemplateNewValue::getUserLogin)
- .containsExactly(dto.getUuid(), dto.getName(), ADMIN, user.getUuid(), user.getLogin());
+ .containsExactly(dto.getUuid(), dto.getName(), ADMIN.getKey(), user.getUuid(), user.getLogin());
assertThat(newValue.toString()).doesNotContain("groupUuid");
}
@@ -166,7 +166,7 @@ class PermissionTemplateDaoWithPersisterIT {
assertThat(newValue)
.extracting(PermissionTemplateNewValue::getTemplateUuid, PermissionTemplateNewValue::getName,
PermissionTemplateNewValue::getPermission, PermissionTemplateNewValue::getGroupUuid, PermissionTemplateNewValue::getGroupName)
- .containsExactly(dto.getUuid(), dto.getName(), ADMIN, group.getUuid(), group.getName());
+ .containsExactly(dto.getUuid(), dto.getName(), ADMIN.getKey(), group.getUuid(), group.getName());
assertThat(newValue.toString()).contains("groupUuid");
underTest.deleteGroupPermission(session, dto.getUuid(), group.getUuid(), ADMIN, dto.getName(), group.getName());
@@ -176,7 +176,7 @@ class PermissionTemplateDaoWithPersisterIT {
assertThat(newValue)
.extracting(PermissionTemplateNewValue::getTemplateUuid, PermissionTemplateNewValue::getName,
PermissionTemplateNewValue::getPermission, PermissionTemplateNewValue::getGroupUuid, PermissionTemplateNewValue::getGroupName)
- .containsExactly(dto.getUuid(), dto.getName(), ADMIN, group.getUuid(), group.getName());
+ .containsExactly(dto.getUuid(), dto.getName(), ADMIN.getKey(), group.getUuid(), group.getName());
assertThat(newValue.toString()).contains("groupUuid");
}
@@ -206,7 +206,7 @@ class PermissionTemplateDaoWithPersisterIT {
assertThat(newValue)
.extracting(PermissionTemplateNewValue::getTemplateUuid, PermissionTemplateNewValue::getName,
PermissionTemplateNewValue::getPermission, PermissionTemplateNewValue::getGroupUuid, PermissionTemplateNewValue::getGroupName)
- .containsExactly(templateDto.getUuid(), templateDto.getName(), ADMIN, templateGroupDto.getGroupUuid(),
+ .containsExactly(templateDto.getUuid(), templateDto.getName(), ADMIN.getKey(), templateGroupDto.getGroupUuid(),
templateGroupDto.getGroupName());
assertThat(newValue.toString()).doesNotContain("userUuid");
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/UserWithPermissionTemplateDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/UserWithPermissionTemplateDaoIT.java
index 3916abc3e51..e85669305e0 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/UserWithPermissionTemplateDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/permission/template/UserWithPermissionTemplateDaoIT.java
@@ -24,7 +24,7 @@ import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.permission.PermissionQuery;
@@ -34,9 +34,9 @@ import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
import static org.sonar.db.permission.PermissionQuery.builder;
@@ -140,7 +140,7 @@ class UserWithPermissionTemplateDaoIT {
UserDto user1 = db.users().insertUser(u -> u.setName("A"));
UserDto user2 = db.users().insertUser(u -> u.setName("B"));
UserDto user3 = db.users().insertUser(u -> u.setName("C"));
- db.permissionTemplates().addUserToTemplate(template.getUuid(), user3.getUuid(), UserRole.USER, template.getName(), user3.getLogin());
+ db.permissionTemplates().addUserToTemplate(template.getUuid(), user3.getUuid(), ProjectPermission.USER, template.getName(), user3.getLogin());
PermissionQuery query = PermissionQuery.builder().build();
assertThat(underTest.selectUserLoginsByQueryAndTemplate(db.getSession(), query, template.getUuid()))
@@ -154,10 +154,10 @@ class UserWithPermissionTemplateDaoIT {
PermissionTemplateDto otherTemplate = db.permissionTemplates().insertTemplate();
IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
UserDto user = db.users().insertUser("User-" + i);
- db.permissionTemplates().addUserToTemplate(otherTemplate, user, UserRole.USER);
+ db.permissionTemplates().addUserToTemplate(otherTemplate, user, ProjectPermission.USER);
});
String lastLogin = "User-" + (DEFAULT_PAGE_SIZE + 1);
- db.permissionTemplates().addUserToTemplate(template, db.users().selectUserByLogin(lastLogin).get(), UserRole.USER);
+ db.permissionTemplates().addUserToTemplate(template, db.users().selectUserByLogin(lastLogin).get(), ProjectPermission.USER);
PermissionQuery query = PermissionQuery.builder().build();
assertThat(underTest.selectUserLoginsByQueryAndTemplate(db.getSession(), query, template.getUuid()))
@@ -219,18 +219,18 @@ class UserWithPermissionTemplateDaoIT {
singletonList(user1.getLogin())))
.extracting(PermissionTemplateUserDto::getUserLogin, PermissionTemplateUserDto::getPermission)
.containsExactlyInAnyOrder(
- tuple(user1.getLogin(), USER),
- tuple(user1.getLogin(), ADMIN),
- tuple(user1.getLogin(), CODEVIEWER));
+ tuple(user1.getLogin(), USER.getKey()),
+ tuple(user1.getLogin(), ADMIN.getKey()),
+ tuple(user1.getLogin(), CODEVIEWER.getKey()));
assertThat(underTest.selectUserPermissionsByTemplateIdAndUserLogins(dbSession, permissionTemplate.getUuid(), asList(user1.getLogin(),
user2.getLogin(), user2.getLogin())))
.extracting(PermissionTemplateUserDto::getUserLogin, PermissionTemplateUserDto::getPermission)
.containsExactlyInAnyOrder(
- tuple(user1.getLogin(), USER),
- tuple(user1.getLogin(), ADMIN),
- tuple(user1.getLogin(), CODEVIEWER),
- tuple(user2.getLogin(), USER));
+ tuple(user1.getLogin(), USER.getKey()),
+ tuple(user1.getLogin(), ADMIN.getKey()),
+ tuple(user1.getLogin(), CODEVIEWER.getKey()),
+ tuple(user2.getLogin(), USER.getKey()));
assertThat(underTest.selectUserPermissionsByTemplateIdAndUserLogins(dbSession, permissionTemplate.getUuid(),
singletonList("unknown"))).isEmpty();
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectExportDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectExportDaoIT.java
index f6b00f3c515..4bf4c263fef 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectExportDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectExportDaoIT.java
@@ -34,7 +34,7 @@ import org.sonar.api.issue.Issue;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/purge/PurgeDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/purge/PurgeDaoIT.java
index 7f3905764e1..589145c220f 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/purge/PurgeDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/purge/PurgeDaoIT.java
@@ -29,7 +29,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
@@ -89,10 +91,6 @@ import org.sonar.db.property.PropertyDto;
import org.sonar.db.report.ReportScheduleDto;
import org.sonar.db.report.ReportSubscriptionDto;
import org.sonar.db.rule.RuleDto;
-import org.sonar.db.sca.ScaDependenciesDbTester;
-import org.sonar.db.sca.ScaIssueReleaseDto;
-import org.sonar.db.sca.ScaReleasesDbTester;
-import org.sonar.db.sca.ScaSeverity;
import org.sonar.db.source.FileSourceDto;
import org.sonar.db.user.UserDismissedMessageDto;
import org.sonar.db.user.UserDto;
@@ -140,6 +138,7 @@ class PurgeDaoIT {
private final LogTesterJUnit5 logTester = new LogTesterJUnit5();
private final DbClient dbClient = db.getDbClient();
private final DbSession dbSession = db.getSession();
+
private final PurgeDao underTest = db.getDbClient().purgeDao();
@Test
@@ -1964,38 +1963,57 @@ oldCreationDate));
}
+ private <K, V> Map<K, V> merge(Map<? extends K, ? extends V> map1, Map<? extends K, ? extends V> map2) {
+ Map<K, V> result = new HashMap<>(map1);
+ result.putAll(map2);
+ return result;
+ }
+
+ // the SCA mappers are in an extension, so we have to use direct sql here.
+ // A cleaner approach would be to allow extensions to add purge logic on branch
+ // deletion and remove SCA knowledge from the core PurgeMapper.
+ private void insertScaData(String branch1Uuid, String branch2Uuid) {
+ var releaseBase = Map.of("package_url", "purl1",
+ "package_manager", "MAVEN",
+ "package_name", "whatever",
+ "version", "1.0",
+ "license_expression", "MIT",
+ "known", true,
+ "created_at", 0L, "updated_at", 0L);
+ db.executeInsert("sca_releases", merge(releaseBase, Map.of("uuid", "release-uuid1", "component_uuid", branch1Uuid)));
+ db.executeInsert("sca_releases", merge(releaseBase, Map.of("uuid", "release-uuid2", "component_uuid", branch2Uuid)));
+ assertThat(db.countRowsOfTable(dbSession, "sca_releases")).isEqualTo(2);
+
+ var dependencyBase = Map.of("created_at", 0L, "updated_at", 0L,
+ "direct", true, "scope", "compile", "new_in_pull_request", true);
+ db.executeInsert("sca_dependencies", merge(dependencyBase, Map.of("uuid", "dependency-uuid1", "sca_release_uuid", "release-uuid1")));
+ db.executeInsert("sca_dependencies", merge(dependencyBase, Map.of("uuid", "dependency-uuid2", "sca_release_uuid", "release-uuid2")));
+ assertThat(db.countRowsOfTable(dbSession, "sca_dependencies")).isEqualTo(2);
+
+ // the issue uuids here don't even exist but doesn't matter, we don't delete issues so not testing that
+ var issueReleaseBase = Map.of("created_at", 0L, "updated_at", 0L,
+ "severity", "INFO", "severity_sort_key", 42);
+ db.executeInsert("sca_issues_releases", merge(issueReleaseBase, Map.of("uuid", "issue-release-uuid1",
+ "sca_issue_uuid", "issue-uuid1", "sca_release_uuid", "release-uuid1")));
+ db.executeInsert("sca_issues_releases", merge(issueReleaseBase, Map.of("uuid", "issue-release-uuid2",
+ "sca_issue_uuid", "issue-uuid2", "sca_release_uuid", "release-uuid2")));
+
+ assertThat(db.countRowsOfTable(dbSession, "sca_issues_releases")).isEqualTo(2);
+ }
+
@Test
void deleteBranch_purgesScaActivity() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
BranchDto branch1 = db.components().insertProjectBranch(project);
BranchDto branch2 = db.components().insertProjectBranch(project);
- ScaReleasesDbTester scaReleasesDbTester = new ScaReleasesDbTester(db);
- var release1 = scaReleasesDbTester.insertScaRelease(branch1.getUuid(), "1");
- var release2 = scaReleasesDbTester.insertScaRelease(branch2.getUuid(), "2");
-
- ScaDependenciesDbTester scaDependenciesDbTester = new ScaDependenciesDbTester(db);
- scaDependenciesDbTester.insertScaDependency(release1.uuid(), "1");
- scaDependenciesDbTester.insertScaDependency(release2.uuid(), "2");
-
- ScaIssueReleaseDto issueRelease1 = new ScaIssueReleaseDto.Builder().setUuid("foo1").setScaIssueUuid("baz").setSeverity(ScaSeverity.LOW).setScaReleaseUuid(release1.uuid()).build();
- ScaIssueReleaseDto issueRelease2 = new ScaIssueReleaseDto.Builder().setUuid("foo2").setScaIssueUuid("baz").setSeverity(ScaSeverity.LOW).setScaReleaseUuid(release2.uuid()).build();
- dbClient.scaIssuesReleasesDao().insert(dbSession, issueRelease1);
- dbClient.scaIssuesReleasesDao().insert(dbSession, issueRelease2);
-
- assertThat(dbClient.scaReleasesDao().selectByBranchUuid(dbSession, branch1.getUuid())).isNotEmpty();
- assertThat(dbClient.scaDependenciesDao().selectByBranchUuid(dbSession, branch1.getUuid())).isNotEmpty();
- assertThat(dbClient.scaIssuesReleasesDao().selectByBranchUuid(dbSession, branch1.getUuid())).isNotEmpty();
+ insertScaData(branch1.getUuid(), branch2.getUuid());
underTest.deleteBranch(dbSession, branch1.getUuid());
- assertThat(dbClient.scaReleasesDao().selectByBranchUuid(dbSession, branch1.getUuid())).isEmpty();
- assertThat(dbClient.scaDependenciesDao().selectByBranchUuid(dbSession, branch1.getUuid())).isEmpty();
- assertThat(dbClient.scaIssuesReleasesDao().selectByBranchUuid(dbSession, branch1.getUuid())).isEmpty();
-
- assertThat(dbClient.scaReleasesDao().selectByBranchUuid(dbSession, branch2.getUuid())).isNotEmpty();
- assertThat(dbClient.scaDependenciesDao().selectByBranchUuid(dbSession, branch2.getUuid())).isNotEmpty();
- assertThat(dbClient.scaIssuesReleasesDao().selectByBranchUuid(dbSession, branch2.getUuid())).isNotEmpty();
+ assertThat(db.countRowsOfTable(dbSession, "sca_releases")).isEqualTo(1);
+ assertThat(db.countRowsOfTable(dbSession, "sca_dependencies")).isEqualTo(1);
+ assertThat(db.countRowsOfTable(dbSession, "sca_issues_releases")).isEqualTo(1);
}
private AnticipatedTransitionDto getAnticipatedTransitionsDto(String uuid, String projectUuid, Date creationDate) {
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/ActiveRuleDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/ActiveRuleDaoIT.java
index 033ba5daa9f..f15bbf5cc1c 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/ActiveRuleDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/ActiveRuleDaoIT.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.impl.utils.TestSystem2;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RuleParamType;
import org.sonar.api.utils.System2;
import org.sonar.db.DbSession;
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QualityProfileExportDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QualityProfileExportDaoIT.java
index 3b7f50942fa..be6d177fb98 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QualityProfileExportDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/qualityprofile/QualityProfileExportDaoIT.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.rule.RuleDto;
@@ -97,7 +97,7 @@ class QualityProfileExportDaoIT {
assertThat(exportCustomRuleDto.getExtendedDescription()).isEqualTo(customRule.getNoteData());
assertThat(exportCustomRuleDto.getName()).isEqualTo(customRule.getName());
assertThat(exportCustomRuleDto.getRuleKey()).isEqualTo(customRule.getKey());
- assertThat(exportCustomRuleDto.getRuleType()).isEqualTo(RuleType.valueOf(customRule.getType()));
+ assertThat(exportCustomRuleDto.getRuleType()).isEqualTo(RuleType.fromDbConstant(customRule.getType()));
assertThat(exportCustomRuleDto.getTags()).isEqualTo(customRule.getTags());
assertThat(exportCustomRuleDto.getTemplateRuleKey()).isEqualTo(ruleTemplate.getKey());
@@ -115,7 +115,7 @@ class QualityProfileExportDaoIT {
assertThat(exportRuleDto.getExtendedDescription()).isEqualTo(rule.getNoteData());
assertThat(exportRuleDto.getName()).isEqualTo(rule.getName());
assertThat(exportRuleDto.getRuleKey()).isEqualTo(rule.getKey());
- assertThat(exportRuleDto.getRuleType()).isEqualTo(RuleType.valueOf(rule.getType()));
+ assertThat(exportRuleDto.getRuleType()).isEqualTo(RuleType.fromDbConstant(rule.getType()));
ActiveRuleDto activeRule =
activeRules.stream().filter(activeRuleDto -> activeRuleDto.getRuleKey().equals(rule.getKey())).findFirst().get();
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/report/RegulatoryReportDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/report/RegulatoryReportDaoIT.java
index 7eb2bc34250..3b3d9ca49cc 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/report/RegulatoryReportDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/report/RegulatoryReportDaoIT.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/rule/RuleDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/rule/RuleDaoIT.java
index 26f799fa610..cb66d99fc6b 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/rule/RuleDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/rule/RuleDaoIT.java
@@ -41,7 +41,7 @@ import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
import org.sonar.api.rules.RuleQuery;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
@@ -1157,7 +1157,7 @@ class RuleDaoIT {
assertThat(ruleForIndexing.getInternalKey()).isEqualTo(r1.getConfigKey());
assertThat(ruleForIndexing.getLanguage()).isEqualTo(r1.getLanguage());
assertThat(ruleForIndexing.getType()).isEqualTo(r1.getType());
- assertThat(ruleForIndexing.getTypeAsRuleType()).isEqualTo(RuleType.valueOf(r1.getType()));
+ assertThat(ruleForIndexing.getTypeAsRuleType()).isEqualTo(RuleType.fromDbConstant(r1.getType()));
assertThat(ruleForIndexing.getCreatedAt()).isEqualTo(r1.getCreatedAt());
assertThat(ruleForIndexing.getUpdatedAt()).isEqualTo(r1.getUpdatedAt());
}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaDependenciesDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaDependenciesDaoIT.java
deleted file mode 100644
index 99c028718ef..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaDependenciesDaoIT.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.Pagination;
-import org.sonar.db.component.ComponentDto;
-import org.sonar.db.component.ProjectData;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaDependenciesDaoIT {
-
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaDependenciesDao scaDependenciesDao = db.getDbClient().scaDependenciesDao();
-
- @Test
- void insert_shouldPersistScaDependencies() {
- ScaDependencyDto scaDependencyDto = db.getScaDependenciesDbTester().insertScaDependency("scaReleaseUuid", "1");
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_dependencies");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsExactlyInAnyOrderEntriesOf(
- Map.ofEntries(
- Map.entry("uuid", scaDependencyDto.uuid()),
- Map.entry("sca_release_uuid", scaDependencyDto.scaReleaseUuid()),
- Map.entry("direct", scaDependencyDto.direct()),
- Map.entry("scope", scaDependencyDto.scope()),
- Map.entry("user_dependency_file_path", scaDependencyDto.userDependencyFilePath()),
- Map.entry("lockfile_dependency_file_path", scaDependencyDto.lockfileDependencyFilePath()),
- Map.entry("chains", scaDependencyDto.getChainsJson()),
- Map.entry("new_in_pull_request", scaDependencyDto.newInPullRequest()),
- Map.entry("production_scope", scaDependencyDto.productionScope()),
- Map.entry("created_at", scaDependencyDto.createdAt()),
- Map.entry("updated_at", scaDependencyDto.updatedAt())));
- }
-
- @Test
- void deleteByUuid_shouldDeleteScaDependencies() {
- ScaDependencyDto scaDependencyDto = db.getScaDependenciesDbTester().insertScaDependency("scaReleaseUuid", "1");
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_dependencies");
- assertThat(select).isNotEmpty();
-
- scaDependenciesDao.deleteByUuid(db.getSession(), scaDependencyDto.uuid());
-
- select = db.select(db.getSession(), "select * from sca_dependencies");
- assertThat(select).isEmpty();
- }
-
- @Test
- void selectByUuid_shouldLoadScaDependency() {
- ScaDependencyDto scaDependencyDto = db.getScaDependenciesDbTester().insertScaDependency("scaReleaseUuid", "1");
-
- var loadedOptional = scaDependenciesDao.selectByUuid(db.getSession(), scaDependencyDto.uuid());
-
- assertThat(loadedOptional).contains(scaDependencyDto);
- }
-
- @Test
- void selectByReleaseUuids_shouldReturnScaDependencies() {
- ComponentDto componentDto = prepareComponentDto();
- ScaDependencyDto scaDependencyDto1a = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1a", true, PackageManager.MAVEN, "foo.bar1");
- // same release, different dependency
- ScaDependencyDto scaDependencyDto1b = db.getScaDependenciesDbTester().insertScaDependency(scaDependencyDto1a.scaReleaseUuid(), "1b", false);
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "2", true, PackageManager.MAVEN, "foo.bar2");
- ScaDependencyDto scaDependencyDto3 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "3", true, PackageManager.MAVEN, "foo.bar3");
-
- List<ScaDependencyDto> results = scaDependenciesDao.selectByReleaseUuids(db.getSession(), List.of(scaDependencyDto1a.scaReleaseUuid(), scaDependencyDto2.scaReleaseUuid()));
-
- assertThat(results)
- .containsExactlyInAnyOrder(scaDependencyDto1a, scaDependencyDto1b, scaDependencyDto2)
- .doesNotContain(scaDependencyDto3);
- }
-
- @Test
- void selectByQuery_shouldReturnScaDependencies_whenQueryByBranchUuid() {
- ComponentDto componentDto = prepareComponentDto();
- ScaDependencyDto scaDependencyDto1 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1", true, PackageManager.MAVEN, "foo.bar");
- // same release, different dependency
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependency(scaDependencyDto1.scaReleaseUuid(), "2", false);
-
- ScaDependenciesQuery scaDependenciesQuery = new ScaDependenciesQuery(componentDto.branchUuid(), null, null, null);
- List<ScaDependencyDto> results = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesQuery, Pagination.all());
-
- assertThat(results).containsExactlyInAnyOrder(scaDependencyDto1, scaDependencyDto2);
- }
-
- @Test
- void selectByQuery_shouldReturnPaginatedScaDependencies() {
- ComponentDto componentDto = prepareComponentDto();
- ScaDependencyDto scaDependencyDto1 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1", true, PackageManager.MAVEN, "foo.bar");
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "2", true, PackageManager.MAVEN, "foo.bar");
- ScaDependencyDto scaDependencyDto3 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "3", true, PackageManager.MAVEN, "something");
- ScaDependencyDto scaDependencyDto4 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "4", true, PackageManager.MAVEN, "something-else");
-
- ScaDependenciesQuery scaDependenciesQuery = new ScaDependenciesQuery(componentDto.branchUuid(), null, null, null);
- List<ScaDependencyDto> page1Results = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesQuery, Pagination.forPage(1).andSize(2));
- List<ScaDependencyDto> page2Results = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesQuery, Pagination.forPage(2).andSize(2));
-
- // we order by uuid, so order is not meaningful here
- var allResults = new ArrayList<>(page1Results);
- allResults.addAll(page2Results);
- assertThat(allResults).containsExactlyInAnyOrder(scaDependencyDto1, scaDependencyDto2, scaDependencyDto3, scaDependencyDto4);
- assertThat(List.of(page1Results.size(), page2Results.size())).containsExactly(2, 2);
- }
-
- @Test
- void selectByQuery_shouldPartiallyMatchPackageName_whenQueriedByText() {
- ComponentDto componentDto = prepareComponentDto();
- ScaDependencyDto scaDependencyDto1 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1", true, PackageManager.MAVEN, "foo.bar");
- @SuppressWarnings("unused")
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "2", true, PackageManager.MAVEN, "bar.mee");
- ScaDependencyDto scaDependencyDto3 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "3", true, PackageManager.MAVEN, "foo.bar.me");
- @SuppressWarnings("unused")
- ScaDependencyDto scaDependencyDto4 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "4", true, PackageManager.MAVEN, "some.foo.bar");
-
- ScaDependenciesQuery scaDependenciesQuery = new ScaDependenciesQuery(componentDto.branchUuid(), null, null, "foo.bar");
- List<ScaDependencyDto> results = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesQuery, Pagination.all());
-
- assertThat(results).hasSize(2);
- assertThat(results.get(0)).usingRecursiveComparison().isEqualTo(scaDependencyDto1);
- assertThat(results.get(1)).usingRecursiveComparison().isEqualTo(scaDependencyDto3);
-
- ScaDependenciesQuery scaDependenciesCaseInsensitiveQuery = new ScaDependenciesQuery(componentDto.branchUuid(), null, null, "Foo.Bar");
- List<ScaDependencyDto> resultsCaseInsensitive = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesCaseInsensitiveQuery, Pagination.all());
-
- assertThat(resultsCaseInsensitive).hasSize(2);
- assertThat(resultsCaseInsensitive.get(0)).usingRecursiveComparison().isEqualTo(scaDependencyDto1);
- assertThat(resultsCaseInsensitive.get(1)).usingRecursiveComparison().isEqualTo(scaDependencyDto3);
- }
-
- @Test
- void selectByQuery_shouldReturnScaDependencies_whenQueryByDirect() {
- ComponentDto componentDto = prepareComponentDto();
- ScaDependencyDto scaDependencyDto1 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1", true, PackageManager.MAVEN, "foo.bar");
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "2", false, PackageManager.MAVEN, "foo.bar");
-
- ScaDependenciesQuery scaDependenciesDirectQuery = new ScaDependenciesQuery(componentDto.branchUuid(), true, null, null);
- List<ScaDependencyDto> resultsDirect = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesDirectQuery, Pagination.all());
-
- assertThat(resultsDirect).hasSize(1);
- assertThat(resultsDirect.get(0)).usingRecursiveComparison().isEqualTo(scaDependencyDto1);
-
- ScaDependenciesQuery scaDependenciesNoDirectQuery = new ScaDependenciesQuery(componentDto.branchUuid(), false, null, null);
- List<ScaDependencyDto> resultsNoDirect = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesNoDirectQuery, Pagination.all());
-
- assertThat(resultsNoDirect).hasSize(1);
- assertThat(resultsNoDirect.get(0)).usingRecursiveComparison().isEqualTo(scaDependencyDto2);
- }
-
- @Test
- void selectByQuery_shouldReturnScaDependencies_whenQueryByPackageManager() {
- ComponentDto componentDto = prepareComponentDto();
- ScaDependencyDto scaDependencyDto1 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1", true, PackageManager.MAVEN, "foo.bar");
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "2", true, PackageManager.NPM, "foo.bar");
- ScaDependencyDto scaDependencyDto3 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "3", true, PackageManager.CARGO, "foo.bar");
-
- ScaDependenciesQuery scaDependenciesMavenQuery = new ScaDependenciesQuery(componentDto.branchUuid(), null, List.of(PackageManager.MAVEN.name()), null);
- List<ScaDependencyDto> resultsMaven = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesMavenQuery, Pagination.all());
-
- assertThat(resultsMaven).hasSize(1);
- assertThat(resultsMaven.get(0)).usingRecursiveComparison().isEqualTo(scaDependencyDto1);
-
- ScaDependenciesQuery scaDependenciesNpmAndCargoQuery = new ScaDependenciesQuery(componentDto.branchUuid(), null,
- List.of(PackageManager.NPM.name(), PackageManager.CARGO.name()), null);
- List<ScaDependencyDto> resultsNpm = scaDependenciesDao.selectByQuery(db.getSession(), scaDependenciesNpmAndCargoQuery, Pagination.all());
-
- assertThat(resultsNpm).hasSize(2);
- assertThat(resultsNpm.get(0)).usingRecursiveComparison().isEqualTo(scaDependencyDto2);
- assertThat(resultsNpm.get(1)).usingRecursiveComparison().isEqualTo(scaDependencyDto3);
- }
-
- @Test
- void update_shouldUpdateScaDependency() {
- ScaDependencyDto scaDependencyDto = db.getScaDependenciesDbTester().insertScaDependency("scaReleaseUuid", "1", true);
- ScaDependencyDto updatedScaDependency = scaDependencyDto.toBuilder()
- .setUpdatedAt(scaDependencyDto.updatedAt() + 1)
- .setDirect(!scaDependencyDto.direct())
- .setLockfileDependencyFilePath("lockfile2")
- .setProductionScope(!scaDependencyDto.productionScope())
- .build();
-
- scaDependenciesDao.update(db.getSession(), updatedScaDependency);
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_dependencies");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsExactlyInAnyOrderEntriesOf(
- Map.ofEntries(
- Map.entry("uuid", updatedScaDependency.uuid()),
- Map.entry("sca_release_uuid", updatedScaDependency.scaReleaseUuid()),
- Map.entry("direct", updatedScaDependency.direct()),
- Map.entry("scope", updatedScaDependency.scope()),
- Map.entry("user_dependency_file_path", updatedScaDependency.userDependencyFilePath()),
- Map.entry("lockfile_dependency_file_path", updatedScaDependency.lockfileDependencyFilePath()),
- Map.entry("chains", updatedScaDependency.getChainsJson()),
- Map.entry("new_in_pull_request", updatedScaDependency.newInPullRequest()),
- Map.entry("production_scope", updatedScaDependency.productionScope()),
- Map.entry("created_at", updatedScaDependency.createdAt()),
- Map.entry("updated_at", updatedScaDependency.updatedAt())));
- }
-
- @Test
- void countByQuery_shouldReturnTheTotalOfDependencies() {
- ComponentDto componentDto1 = prepareComponentDto();
- db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto1.uuid(), "1", true, PackageManager.MAVEN, "foo.bar");
- db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto1.uuid(), "2", true, PackageManager.MAVEN, "foo.bar.mee");
- db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto1.uuid(), "3", true, PackageManager.MAVEN, "bar.foo");
-
- ScaDependenciesQuery scaDependenciesQuery = new ScaDependenciesQuery(componentDto1.branchUuid(), null, null, "foo");
-
- assertThat(scaDependenciesDao.countByQuery(db.getSession(), scaDependenciesQuery)).isEqualTo(2);
- assertThat(scaDependenciesDao.countByQuery(db.getSession(), new ScaDependenciesQuery(componentDto1.branchUuid(), null, null, null))).isEqualTo(3);
- assertThat(scaDependenciesDao.countByQuery(db.getSession(), new ScaDependenciesQuery("another_branch_uuid", null, null, null))).isZero();
- }
-
- private ComponentDto prepareComponentDto() {
- ProjectData projectData = db.components().insertPublicProject();
- return projectData.getMainBranchComponent();
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesDaoIT.java
deleted file mode 100644
index a13fa082603..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesDaoIT.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.Map;
-import org.apache.ibatis.exceptions.PersistenceException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class ScaIssuesDaoIT {
-
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaIssuesDao scaIssuesDao = db.getDbClient().scaIssuesDao();
-
- private static final ScaIssueDto newScaIssueDto(String suffix) {
- return new ScaIssueDto("uuid" + suffix, ScaIssueType.PROHIBITED_LICENSE, "fakePackageUrl" + suffix, "fakeVulnerabilityId" + suffix, "fakeSpdxId" + suffix, 1L, 2L);
- }
-
- @Test
- void insert_shouldPersistScaIssues() {
- ScaIssueDto issueDto = newScaIssueDto("1");
- scaIssuesDao.insert(db.getSession(), issueDto);
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_issues");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsExactlyInAnyOrderEntriesOf(
- Map.ofEntries(
- Map.entry("uuid", issueDto.uuid()),
- Map.entry("sca_issue_type", issueDto.scaIssueType().name()),
- Map.entry("package_url", issueDto.packageUrl()),
- Map.entry("vulnerability_id", issueDto.vulnerabilityId()),
- Map.entry("spdx_license_id", issueDto.spdxLicenseId()),
- Map.entry("created_at", issueDto.createdAt()),
- Map.entry("updated_at", issueDto.updatedAt())));
- }
-
- // Postgresql apparently doesn't support doing anything else in the session
- // after a statement with an error (constraint violation), while other
- // databases do. So we use a dedicated session here.
- private void insertAndCommit(ScaIssueDto issueDto) {
- try (var dbSession = db.getDbClient().openSession(false)) {
- scaIssuesDao.insert(dbSession, issueDto);
- dbSession.commit(true);
- }
- }
-
- @Test
- void insert_shouldFailOnDuplicateInsert() {
- // we are avoiding db.getSession() in here because the constraint violation
- // can invalidate the session and there's some chance of deadlock problems
- // with multiple sessions so let's just juggle dedicated sessions manually
- // for each query and not use the global session from DbTester
-
- ScaIssueDto issueDto = newScaIssueDto("1");
- try (var dbSession = db.getDbClient().openSession(false)) {
- scaIssuesDao.insert(dbSession, issueDto);
- dbSession.commit();
- }
-
- ScaIssueDto issueDtoDifferentUuid = new ScaIssueDto("uuid-different", issueDto.scaIssueType(), issueDto.packageUrl(),
- issueDto.vulnerabilityId(), issueDto.spdxLicenseId(), 10L, 11L);
-
- assertThrows(PersistenceException.class, () -> insertAndCommit(issueDtoDifferentUuid));
-
- try (var dbSession = db.getDbClient().openSession(false)) {
- List<Map<String, Object>> select = db.select(dbSession, "select * from sca_issues");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsEntry("uuid", issueDto.uuid());
- }
- }
-
- @Test
- void selectByUuid_shouldLoadScaIssue() {
- ScaIssueDto issueDto = newScaIssueDto("1");
- scaIssuesDao.insert(db.getSession(), issueDto);
-
- var loadedOptional = scaIssuesDao.selectByUuid(db.getSession(), issueDto.uuid());
-
- assertThat(loadedOptional).contains(issueDto);
- }
-
- @Test
- void selectByUuids_shouldLoadScaIssues() {
- List<ScaIssueDto> issueDtos = List.of(newScaIssueDto("1"), newScaIssueDto("2"), newScaIssueDto("3"));
- for (var issueDto : issueDtos) {
- scaIssuesDao.insert(db.getSession(), issueDto);
- }
-
- List<String> uuidsToLoad = List.of(issueDtos.get(0).uuid(), issueDtos.get(2).uuid());
- var loaded = scaIssuesDao.selectByUuids(db.getSession(), uuidsToLoad);
-
- assertThat(loaded).containsExactlyInAnyOrder(issueDtos.get(0), issueDtos.get(2));
- }
-
- @Test
- void selectUuidByValue_shouldLoadScaIssue() {
- List<ScaIssueDto> issueDtos = List.of(newScaIssueDto("1"), newScaIssueDto("2"), newScaIssueDto("3"));
- for (var issueDto : issueDtos) {
- scaIssuesDao.insert(db.getSession(), issueDto);
- }
-
- ScaIssueDto toLoad = issueDtos.get(1);
- var loadedOptionalUuid = scaIssuesDao.selectUuidByValue(db.getSession(), toLoad);
-
- assertThat(loadedOptionalUuid).contains(toLoad.uuid());
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDaoIT.java
deleted file mode 100644
index 8a4f5d4bec7..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDaoIT.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.Map;
-import org.apache.ibatis.exceptions.PersistenceException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class ScaIssuesReleasesDaoIT {
-
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaIssuesReleasesDao scaIssuesReleasesDao = db.getDbClient().scaIssuesReleasesDao();
-
- private static ScaIssueReleaseDto newScaIssueReleaseDto(String suffix) {
- return new ScaIssueReleaseDto("uuid" + suffix, "sca-issue-uuid" + suffix, "sca-release-uuid" + suffix, ScaSeverity.INFO, 1L, 2L);
- }
-
- @Test
- void insert_shouldPersistScaIssuesReleases() {
- ScaIssueReleaseDto issueReleaseDto = newScaIssueReleaseDto("1");
-
- scaIssuesReleasesDao.insert(db.getSession(), issueReleaseDto);
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_issues_releases");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).usingRecursiveComparison().isEqualTo(
- Map.ofEntries(
- Map.entry("uuid", issueReleaseDto.uuid()),
- Map.entry("sca_issue_uuid", issueReleaseDto.scaIssueUuid()),
- Map.entry("sca_release_uuid", issueReleaseDto.scaReleaseUuid()),
- Map.entry("severity", issueReleaseDto.severity().name()),
- Map.entry("severity_sort_key", (long) issueReleaseDto.severitySortKey()),
- Map.entry("created_at", issueReleaseDto.createdAt()),
- Map.entry("updated_at", issueReleaseDto.updatedAt())));
- }
-
- // Postgresql apparently doesn't support doing anything else in the session
- // after a statement with an error (constraint violation), while other
- // databases do. So we use a dedicated session here.
- private void insertAndCommit(ScaIssueReleaseDto issueReleaseDto) {
- try (var dbSession = db.getDbClient().openSession(false)) {
- scaIssuesReleasesDao.insert(dbSession, issueReleaseDto);
- dbSession.commit(true);
- }
- }
-
- @Test
- void insert_shouldFailOnDuplicateInsert() {
- ScaIssueReleaseDto issueReleaseDto = newScaIssueReleaseDto("1");
- try (var dbSession = db.getDbClient().openSession(false)) {
- scaIssuesReleasesDao.insert(dbSession, issueReleaseDto);
- dbSession.commit();
- }
-
- ScaIssueReleaseDto issueReleaseDtoDifferentUuid = new ScaIssueReleaseDto("uuid-different",
- issueReleaseDto.scaIssueUuid(), issueReleaseDto.scaReleaseUuid(), ScaSeverity.INFO,
- 10L, 11L);
-
- assertThrows(PersistenceException.class, () -> insertAndCommit(issueReleaseDtoDifferentUuid));
-
- try (var dbSession = db.getDbClient().openSession(false)) {
- List<Map<String, Object>> select = db.select(dbSession, "select * from sca_issues_releases");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsEntry("uuid", issueReleaseDto.uuid());
- }
- }
-
- @Test
- void deleteByUuid_shouldDelete() {
- var dbSession = db.getSession();
- ScaIssueReleaseDto issueReleaseDto = newScaIssueReleaseDto("1");
- scaIssuesReleasesDao.insert(dbSession, issueReleaseDto);
- dbSession.commit();
-
- assertThat(db.countRowsOfTable(dbSession, "sca_issues_releases")).isOne();
-
- scaIssuesReleasesDao.deleteByUuid(dbSession, issueReleaseDto.uuid());
-
- assertThat(db.countRowsOfTable(dbSession, "sca_issues_releases")).isZero();
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDaoIT.java
deleted file mode 100644
index 4db2590aed3..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDaoIT.java
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import com.google.common.collect.Lists;
-import java.math.BigDecimal;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.function.Function;
-import java.util.stream.Stream;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.Pagination;
-import org.sonar.db.component.ComponentDto;
-import org.sonar.db.component.ProjectData;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaIssuesReleasesDetailsDaoIT {
-
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaIssuesReleasesDetailsDao scaIssuesReleasesDetailsDao = db.getDbClient().scaIssuesReleasesDetailsDao();
-
- private static Comparator<ScaIssueReleaseDetailsDto> identityComparator() {
- Function<ScaIssueReleaseDetailsDto, String> typeString = dto -> dto.scaIssueType().name();
- return Comparator.comparing(typeString)
- .thenComparing(ScaIssueReleaseDetailsDto::vulnerabilityId)
- .thenComparing(ScaIssueReleaseDetailsDto::issuePackageUrl)
- .thenComparing(ScaIssueReleaseDetailsDto::spdxLicenseId)
- .thenComparing(ScaIssueReleaseDetailsDto::issueReleaseUuid);
- }
-
- private static Comparator<ScaIssueReleaseDetailsDto> severityComparator() {
- return Comparator.comparing(dto -> dto.severity().databaseSortKey());
- }
-
- private static Comparator<ScaIssueReleaseDetailsDto> cvssScoreComparator() {
- return Comparator.comparing(ScaIssueReleaseDetailsDto::cvssScore,
- // we treat null cvss as a score of 0.0
- Comparator.nullsFirst(Comparator.naturalOrder()));
- }
-
- private static Comparator<ScaIssueReleaseDetailsDto> comparator(ScaIssuesReleasesDetailsQuery.Sort sort) {
- return switch (sort) {
- case IDENTITY_ASC -> identityComparator();
- case IDENTITY_DESC -> identityComparator().reversed();
- case SEVERITY_ASC -> severityComparator()
- .thenComparing(cvssScoreComparator())
- .thenComparing(identityComparator());
- case SEVERITY_DESC -> severityComparator().reversed()
- .thenComparing(cvssScoreComparator().reversed())
- .thenComparing(identityComparator());
- case CVSS_SCORE_ASC -> cvssScoreComparator()
- .thenComparing(ScaIssueReleaseDetailsDto::severity)
- .thenComparing(identityComparator());
- case CVSS_SCORE_DESC -> cvssScoreComparator().reversed()
- .thenComparing(Comparator.comparing(ScaIssueReleaseDetailsDto::severity).reversed())
- .thenComparing(identityComparator());
- };
- }
-
- @Test
- void selectByBranchUuid_shouldReturnIssues() {
- var projectData = db.components().insertPrivateProject();
- var componentDto = projectData.getMainBranchComponent();
- var issue1 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "1", componentDto.uuid());
- var issue2 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.PROHIBITED_LICENSE, "2", componentDto.uuid());
-
- var foundPage = scaIssuesReleasesDetailsDao.selectByBranchUuid(db.getSession(), componentDto.branchUuid(), Pagination.forPage(1).andSize(1));
-
- assertThat(foundPage).hasSize(1).isSubsetOf(issue1, issue2);
- var foundAllIssues = scaIssuesReleasesDetailsDao.selectByBranchUuid(db.getSession(), componentDto.branchUuid(), Pagination.forPage(1).andSize(10));
- assertThat(foundAllIssues).hasSize(2).containsExactlyElementsOf(Stream.of(issue1, issue2).sorted(comparator(ScaIssuesReleasesDetailsQuery.Sort.SEVERITY_DESC)).toList());
- }
-
- @Test
- void countByBranchUuid_shouldCountIssues() {
- var componentDto = db.components().insertPrivateProject().getMainBranchComponent();
- db.getScaIssuesReleasesDetailsDbTester().insertVulnerabilityIssue("1", componentDto.uuid());
- db.getScaIssuesReleasesDetailsDbTester().insertVulnerabilityIssue("2", componentDto.uuid());
- db.getScaIssuesReleasesDetailsDbTester().insertVulnerabilityIssue("3", componentDto.uuid());
-
- var count1 = scaIssuesReleasesDetailsDao.countByBranchUuid(db.getSession(), componentDto.branchUuid());
- assertThat(count1).isEqualTo(3);
-
- assertThat(scaIssuesReleasesDetailsDao.countByBranchUuid(db.getSession(), "bogus-branch-uuid")).isZero();
- }
-
- @Test
- void selectByReleaseUuid_shouldReturnIssues() {
- var projectData = db.components().insertPrivateProject();
- var componentDto = projectData.getMainBranchComponent();
- var issue1 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "1", componentDto.uuid());
- var release1 = issue1.releaseDto();
- // make these other issues use the same release and have a variety of CVSS
- var issue2 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "2", componentDto.uuid(),
- null, vi -> vi.toBuilder().setCvssScore(new BigDecimal("1.1")).build(),
- releaseDto -> release1,
- issueReleaseDto -> issueReleaseDto.toBuilder().setScaReleaseUuid(release1.uuid()).build());
- var issue3 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "3", componentDto.uuid(),
- null, vi -> vi.toBuilder().setCvssScore(new BigDecimal("9.9")).build(),
- releaseDto -> release1,
- issueReleaseDto -> issueReleaseDto.toBuilder().setScaReleaseUuid(release1.uuid()).build());
- var issue4 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.PROHIBITED_LICENSE, "4", componentDto.uuid(),
- null, null,
- releaseDto -> release1,
- issueReleaseDto -> issueReleaseDto.toBuilder().setScaReleaseUuid(release1.uuid()).build());
-
- var foundPage = scaIssuesReleasesDetailsDao.selectByBranchUuid(db.getSession(), componentDto.branchUuid(), Pagination.forPage(1).andSize(1));
-
- assertThat(foundPage).hasSize(1).isSubsetOf(issue1, issue2, issue3, issue4);
- var foundAllIssues = scaIssuesReleasesDetailsDao.selectByBranchUuid(db.getSession(), componentDto.branchUuid(), Pagination.forPage(1).andSize(10));
- assertThat(foundAllIssues).hasSize(4)
- .containsExactlyElementsOf(Stream.of(issue1, issue2, issue3, issue4).sorted(comparator(ScaIssuesReleasesDetailsQuery.Sort.SEVERITY_DESC)).toList());
- }
-
- @Test
- void withNoQueryFilters_shouldReturnAllIssues() {
- setupAndExecuteQueryTest(Function.identity(), QueryTestData::expectedIssuesSortedByIdentityAsc, "All issues should be returned");
- }
-
- @Test
- void withNoQueryFilters_shouldCountAllIssues() {
- setupAndExecuteQueryCountTest(Function.identity(), 6);
- }
-
- @Test
- void withNoQueryFilters_shouldSort() {
- QueryTestData testData = createQueryTestData();
- var expectedLists = new EnumMap<ScaIssuesReleasesDetailsQuery.Sort, List<ScaIssueReleaseDetailsDto>>(ScaIssuesReleasesDetailsQuery.Sort.class);
- for (var sort : ScaIssuesReleasesDetailsQuery.Sort.values()) {
- var expectedIssues = testData.expectedIssuesSorted(sort);
- executeQueryTest(testData, queryBuilder -> queryBuilder.setSort(sort), expectedIssues,
- "Sort %s should return expected issues".formatted(sort));
- expectedLists.put(sort, expectedIssues);
- }
-
- // The assertions below here are actually about the expectations, but above
- // we've just established that the actual matches the expectations.
-
- // The point of this is to assert that the test data contains a distinct ordering for each
- // ordering in ScaIssuesReleasesDetailsQuery.Sort, because if it doesn't we could get
- // false negatives in our tests.
- assertThat(expectedLists.values().stream().distinct().toList())
- .as("Expected issues should have distinct orderings for each sort")
- .containsExactlyInAnyOrderElementsOf(expectedLists.values());
-
- // for identity, assert that our ASC and DESC actually invert each other.
- // for severity and cvss score, this isn't supposed to be true because the
- // secondary sort is IDENTITY_ASC even when we sort by DESC severity; but the
- // severity and score values ignoring the other attributes should still be
- // reversed.
- assertThat(Lists.reverse(expectedLists.get(ScaIssuesReleasesDetailsQuery.Sort.IDENTITY_ASC)))
- .as("IDENTITY sort should be reversed when sorted by DESC")
- .containsExactlyElementsOf(expectedLists.get(ScaIssuesReleasesDetailsQuery.Sort.IDENTITY_DESC));
- assertThat(
- Lists.reverse(expectedLists.get(ScaIssuesReleasesDetailsQuery.Sort.SEVERITY_ASC)).stream()
- .map(ScaIssueReleaseDetailsDto::severity)
- .toList())
- .as("SEVERITY sort should be reversed when sorted by DESC")
- .containsExactlyElementsOf(expectedLists.get(ScaIssuesReleasesDetailsQuery.Sort.SEVERITY_DESC).stream()
- .map(ScaIssueReleaseDetailsDto::severity)
- .toList());
- assertThat(Lists.reverse(expectedLists.get(ScaIssuesReleasesDetailsQuery.Sort.CVSS_SCORE_ASC).stream()
- .map(ScaIssueReleaseDetailsDto::cvssScore)
- .toList()))
- .as("CVSS_SCORE sort should be reversed when sorted by DESC")
- .containsExactlyElementsOf(expectedLists.get(ScaIssuesReleasesDetailsQuery.Sort.CVSS_SCORE_DESC).stream()
- .map(ScaIssueReleaseDetailsDto::cvssScore)
- .toList());
- }
-
- @Test
- void withQueryFilteredByIssueType_shouldReturnExpectedTypes() {
- QueryTestData testData = createQueryTestData();
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setTypes(List.of(ScaIssueType.VULNERABILITY)),
- testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(expected -> expected.scaIssueType() == ScaIssueType.VULNERABILITY)
- .toList(),
- "Only vulnerability issues should be returned");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setTypes(List.of(ScaIssueType.PROHIBITED_LICENSE)),
- testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(expected -> expected.scaIssueType() == ScaIssueType.PROHIBITED_LICENSE)
- .toList(),
- "Only vulnerability issues should be returned");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setTypes(List.of(ScaIssueType.values())),
- testData.expectedIssuesSortedByIdentityAsc(),
- "All issues should be returned");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setTypes(Collections.emptyList()),
- Collections.emptyList(),
- "No issues should be returned when searching for zero types");
- }
-
- @Test
- void withQueryFilteredByIssueType_shouldCountSelectedIssues() {
- QueryTestData testData = createQueryTestData();
- executeQueryCountTest(testData,
- queryBuilder -> queryBuilder.setTypes(List.of(ScaIssueType.VULNERABILITY)),
- 4);
- executeQueryCountTest(testData,
- queryBuilder -> queryBuilder.setTypes(List.of(ScaIssueType.PROHIBITED_LICENSE)),
- 2);
- executeQueryCountTest(testData,
- queryBuilder -> queryBuilder.setTypes(List.of(ScaIssueType.values())),
- 6);
- executeQueryCountTest(testData,
- queryBuilder -> queryBuilder.setTypes(Collections.emptyList()),
- 0);
- }
-
- @Test
- void withQueryFilteredByVulnerabilityId_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedEndsInId1 = testData.expectedIssues().stream()
- .filter(issue -> issue.vulnerabilityId() != null && issue.vulnerabilityId().endsWith("Id1"))
- .toList();
- assertThat(expectedEndsInId1).hasSize(1);
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setVulnerabilityIdSubstring("Id1"),
- expectedEndsInId1,
- "Only the vulnerability ending in Id1 should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setVulnerabilityIdSubstring("NotInThere"),
- Collections.emptyList(),
- "No issues should be returned when searching for the substring 'NotInThere'");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setVulnerabilityIdSubstring("Escape% NULL AS!%"),
- Collections.emptyList(),
- "No issues should be returned when searching for a string that needs escaping");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setVulnerabilityIdSubstring(ScaIssueDto.NULL_VALUE),
- Collections.emptyList(),
- "No vulnerabilities should be returned when searching for ScaIssueDto.NULL_VALUE");
-
- var allVulnerabilityIssues = testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(issue -> issue.scaIssueType() == ScaIssueType.VULNERABILITY)
- .toList();
- assertThat(allVulnerabilityIssues).hasSize(4);
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setVulnerabilityIdSubstring("Vulnerability"),
- allVulnerabilityIssues,
- "All vulnerabilities should be returned when searching for the substring 'Vulnerability'");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setVulnerabilityIdSubstring(""),
- allVulnerabilityIssues,
- "All vulnerabilities should be returned when searching for empty vulnerabilityId");
- }
-
- @Test
- void withQueryFilteredByPackageName_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedEndsInName1 = testData.expectedIssues().subList(0, 1);
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageNameSubstring("Name1"),
- expectedEndsInName1,
- "Only the packages containing Name1 should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageNameSubstring("NotInThere"),
- Collections.emptyList(),
- "No issues should be returned when searching for the substring 'NotInThere'");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageNameSubstring("Escape% NULL AS!%"),
- Collections.emptyList(),
- "No issues should be returned when searching for a string that needs escaping");
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageNameSubstring(ScaIssueDto.NULL_VALUE),
- Collections.emptyList(),
- "No vulnerabilities should be returned when searching for ScaIssueDto.NULL_VALUE");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageNameSubstring("Package"),
- testData.expectedIssuesSortedByIdentityAsc(),
- "All issues should be returned when searching for the substring 'Package'");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageNameSubstring(""),
- testData.expectedIssuesSortedByIdentityAsc(),
- "All issues should be returned when searching for empty package name");
- }
-
- @Test
- void withQueryFilteredByNewInPullRequest_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
-
- var expectedNew = testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(issue -> issue.newInPullRequest())
- .toList();
- var expectedNotNew = testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(issue -> !issue.newInPullRequest())
- .toList();
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setNewInPullRequest(true),
- expectedNew,
- "Only the releases marked newInPullRequest should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setNewInPullRequest(false),
- expectedNotNew,
- "Only the releases marked not newInPullRequest should be returned");
- }
-
- @Test
- void withQueryFilteredBySeverity_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedSeverityInfo = testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(issue -> issue.severity() == ScaSeverity.INFO)
- .toList();
- var expectedSeverityBlocker = testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(issue -> issue.severity() == ScaSeverity.BLOCKER)
- .toList();
- assertThat(expectedSeverityInfo).hasSize(5);
- assertThat(expectedSeverityBlocker).hasSize(1);
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setSeverities(List.of(ScaSeverity.INFO)),
- expectedSeverityInfo,
- "Only the issues of severity INFO should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setSeverities(List.of(ScaSeverity.BLOCKER)),
- expectedSeverityBlocker,
- "Only the issues of severity BLOCKER should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setSeverities(List.of(ScaSeverity.LOW, ScaSeverity.HIGH)),
- Collections.emptyList(),
- "Should not match any severities of LOW or HIGH");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setSeverities(List.of(ScaSeverity.BLOCKER, ScaSeverity.INFO, ScaSeverity.LOW)),
- testData.expectedIssuesSortedByIdentityAsc(),
- "All issues should be returned when searching for a list that contains them all");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setSeverities(Collections.emptyList()),
- Collections.emptyList(),
- "No issues should be returned when searching for zero severities");
- }
-
- @Test
- void withQueryFilteredByPackageManager_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedPackageManagerNpm = testData.expectedIssuesWithPackageManager(PackageManager.NPM).stream()
- .sorted(identityComparator()).toList();
- var expectedPackageManagerMaven = testData.expectedIssuesWithPackageManager(PackageManager.MAVEN).stream()
- .sorted(identityComparator()).toList();
-
- assertThat(expectedPackageManagerNpm).hasSize(2);
- assertThat(expectedPackageManagerMaven).hasSize(4);
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageManagers(List.of(PackageManager.NPM)),
- expectedPackageManagerNpm,
- "Only the npm issues should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageManagers(List.of(PackageManager.MAVEN)),
- expectedPackageManagerMaven,
- "Only the Maven issues should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageManagers(List.of(PackageManager.NPM, PackageManager.MAVEN)),
- testData.expectedIssuesSortedByIdentityAsc(),
- "All issues should be returned when searching for two package managers");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setPackageManagers(Collections.emptyList()),
- Collections.emptyList(),
- "No issues should be returned when searching for zero package managers");
- }
-
- @Test
- void withQueryFilteredByDirect_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedDirect = testData.directIssues();
- var expectedTransitive = testData.transitiveIssues();
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setDirect(true),
- expectedDirect,
- "Only direct issues should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setDirect(false),
- expectedTransitive,
- "Only the transitive issues should be returned");
- }
-
- @Test
- void withQueryFilteredByProductionScope_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedProduction = testData.productionIssues();
- var expectedNotProduction = testData.notProductionIssues();
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setProductionScope(true),
- expectedProduction,
- "Only production issues should be returned");
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder.setProductionScope(false),
- expectedNotProduction,
- "Only the non-production issues should be returned");
- }
-
- @Test
- void withQueryMultipleFiltersNonDefaultSort_shouldReturnExpectedItems() {
- QueryTestData testData = createQueryTestData();
- var expectedPackageManagerMaven = testData.expectedIssuesWithPackageManager(PackageManager.MAVEN);
- var expectedTypeVulnerability = testData.expectedIssuesSortedByIdentityAsc().stream()
- .filter(issue -> issue.scaIssueType() == ScaIssueType.VULNERABILITY)
- .toList();
- var sortedByCvssDesc = testData.expectedIssuesSortedByCvssDesc();
- var expectedResults = sortedByCvssDesc.stream()
- .filter(expectedPackageManagerMaven::contains)
- .filter(expectedTypeVulnerability::contains)
- .toList();
- assertThat(expectedResults).hasSize(3);
-
- executeQueryTest(testData,
- queryBuilder -> queryBuilder
- .setSort(ScaIssuesReleasesDetailsQuery.Sort.CVSS_SCORE_DESC)
- .setPackageManagers(List.of(PackageManager.MAVEN))
- .setTypes(List.of(ScaIssueType.VULNERABILITY)),
- expectedResults,
- "Maven vulnerabilities returned in cvss score desc order");
- }
-
- private void setupAndExecuteQueryTest(Function<ScaIssuesReleasesDetailsQuery.Builder, ScaIssuesReleasesDetailsQuery.Builder> builderFunction,
- Function<QueryTestData, List<ScaIssueReleaseDetailsDto>> expectedIssuesFunction, String assertAs) {
- QueryTestData testData = createQueryTestData();
- executeQueryTest(testData, builderFunction, expectedIssuesFunction.apply(testData), assertAs);
- }
-
- private void executeQueryTest(QueryTestData testData,
- Function<ScaIssuesReleasesDetailsQuery.Builder, ScaIssuesReleasesDetailsQuery.Builder> builderFunction,
- List<ScaIssueReleaseDetailsDto> expectedIssues,
- String assertAs) {
- var query = builderFunction.apply(
- new ScaIssuesReleasesDetailsQuery.Builder()
- .setBranchUuid(testData.branchUuid())
- .setSort(ScaIssuesReleasesDetailsQuery.Sort.IDENTITY_ASC))
- .build();
- var foundPage = scaIssuesReleasesDetailsDao.selectByQuery(db.getSession(), query, Pagination.forPage(1).andSize(10));
-
- assertThat(foundPage).as(assertAs).containsExactlyElementsOf(expectedIssues);
- }
-
- private void setupAndExecuteQueryCountTest(Function<ScaIssuesReleasesDetailsQuery.Builder, ScaIssuesReleasesDetailsQuery.Builder> builderFunction,
- int expectedCount) {
- QueryTestData testData = createQueryTestData();
- executeQueryCountTest(testData, builderFunction, expectedCount);
- }
-
- private void executeQueryCountTest(QueryTestData testData,
- Function<ScaIssuesReleasesDetailsQuery.Builder, ScaIssuesReleasesDetailsQuery.Builder> builderFunction,
- int expectedCount) {
- var query = builderFunction.apply(
- new ScaIssuesReleasesDetailsQuery.Builder()
- .setBranchUuid(testData.branchUuid())
- .setSort(ScaIssuesReleasesDetailsQuery.Sort.IDENTITY_ASC))
- .build();
- var count = scaIssuesReleasesDetailsDao.countByQuery(db.getSession(), query);
-
- assertThat(count).isEqualTo(expectedCount);
- }
-
- private QueryTestData createQueryTestData() {
- var projectData = db.components().insertPrivateProject();
- var componentDto = projectData.getMainBranchComponent();
- // the first two are set to NPM, the others default to MAVEN
- var issue1 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "1", componentDto.uuid(),
- scaIssueDto -> scaIssueDto,
- scaVulnerabilityIssueDto -> scaVulnerabilityIssueDto,
- scaReleaseDto -> scaReleaseDto.toBuilder().setPackageManager(PackageManager.NPM).build(),
- scaIssueReleaseDto -> scaIssueReleaseDto);
- var issue2 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.PROHIBITED_LICENSE, "2", componentDto.uuid(),
- scaIssueDto -> scaIssueDto,
- scaVulnerabilityIssueDto -> scaVulnerabilityIssueDto,
- scaReleaseDto -> scaReleaseDto.toBuilder().setPackageManager(PackageManager.NPM).build(),
- scaIssueReleaseDto -> scaIssueReleaseDto);
- var issue3 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "3", componentDto.uuid());
- var issue4 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.PROHIBITED_LICENSE, "4", componentDto.uuid());
- // low cvss but high severity
- var issue5 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "5", componentDto.uuid(),
- scaIssueDto -> scaIssueDto,
- scaVulnerabilityIssueDto -> scaVulnerabilityIssueDto.toBuilder()
- .setCvssScore(new BigDecimal("2.1"))
- .setBaseSeverity(ScaSeverity.BLOCKER)
- .build(),
- scaReleaseDto -> scaReleaseDto.toBuilder().setNewInPullRequest(true).build(),
- scaIssueReleaseDto -> scaIssueReleaseDto.toBuilder().setSeverity(ScaSeverity.BLOCKER).build());
- // high cvss but low severity
- var issue6 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "6", componentDto.uuid(),
- scaIssueDto -> scaIssueDto,
- scaVulnerabilityIssueDto -> scaVulnerabilityIssueDto.toBuilder()
- .setCvssScore(new BigDecimal("9.1"))
- .setBaseSeverity(ScaSeverity.INFO)
- .build(),
- scaReleaseDto -> scaReleaseDto.toBuilder().setNewInPullRequest(true).build(),
- scaIssueReleaseDto -> scaIssueReleaseDto.toBuilder().setSeverity(ScaSeverity.INFO).build());
-
- // issue 1 weirdly has no dependency, issues 2-3 are direct, issues 4-6 are transitive
- // issues 2 and 4 are production, 3,5,6 are not production
- db.getScaDependenciesDbTester().insertScaDependency(issue2.releaseUuid(), "2",
- builder -> builder.setDirect(true).setProductionScope(true));
- var dep3 = db.getScaDependenciesDbTester().insertScaDependency(issue3.releaseUuid(), "3",
- builder -> builder.setDirect(true).setProductionScope(false));
- var dep4 = db.getScaDependenciesDbTester().insertScaDependency(issue4.releaseUuid(), "4",
- builder -> builder.setDirect(false).setProductionScope(true));
- var dep5 = db.getScaDependenciesDbTester().insertScaDependency(issue5.releaseUuid(), "5",
- builder -> builder.setDirect(false).setProductionScope(false));
- db.getScaDependenciesDbTester().insertScaDependency(issue6.releaseUuid(), "6",
- builder -> builder.setDirect(false).setProductionScope(false));
-
- // make issue3 and issue4 BOTH direct and transitive,
- // issue4 and issue5 are BOTH production and not
- db.getScaDependenciesDbTester().insertScaDependency(issue3.releaseUuid(), "7",
- builder -> builder.setDirect(!dep3.direct()).setProductionScope(dep3.productionScope()));
- db.getScaDependenciesDbTester().insertScaDependency(issue4.releaseUuid(), "8",
- builder -> builder.setDirect(!dep4.direct()).setProductionScope(!dep4.productionScope()));
- db.getScaDependenciesDbTester().insertScaDependency(issue5.releaseUuid(), "9",
- builder -> builder.setDirect(dep5.direct()).setProductionScope(!dep5.productionScope()));
-
- var directIssues = List.of(issue2, issue3, issue4).stream().sorted(identityComparator()).toList();
- var transitiveIssues = List.of(issue3, issue4, issue5, issue6).stream().sorted(identityComparator()).toList();
- var productionIssues = List.of(issue2, issue4, issue5).stream().sorted(identityComparator()).toList();
- var notProductionIssues = List.of(issue3, issue4, issue5, issue6).stream().sorted(identityComparator()).toList();
-
- return new QueryTestData(projectData, componentDto,
- List.of(issue1, issue2, issue3, issue4, issue5, issue6),
- directIssues, transitiveIssues, productionIssues, notProductionIssues);
- }
-
- @Test
- void selectByScaIssueReleaseUuid_shouldReturnAnIssue() {
- var projectData = db.components().insertPrivateProject();
- var componentDto = projectData.getMainBranchComponent();
- var issue1 = db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.VULNERABILITY, "1", componentDto.uuid());
-
- // insert another issue to assert that it's not selected
- db.getScaIssuesReleasesDetailsDbTester().insertIssue(ScaIssueType.PROHIBITED_LICENSE, "2", componentDto.uuid());
-
- var foundIssue = scaIssuesReleasesDetailsDao.selectByScaIssueReleaseUuid(db.getSession(), issue1.issueReleaseUuid());
- assertThat(foundIssue).isEqualTo(issue1);
-
- var notFoundIssue = scaIssuesReleasesDetailsDao.selectByScaIssueReleaseUuid(db.getSession(), "00000");
- assertThat(notFoundIssue).isNull();
- }
-
- private record QueryTestData(ProjectData projectData,
- ComponentDto componentDto,
- List<ScaIssueReleaseDetailsDto> expectedIssues,
- List<ScaIssueReleaseDetailsDto> directIssues,
- List<ScaIssueReleaseDetailsDto> transitiveIssues,
- List<ScaIssueReleaseDetailsDto> productionIssues,
- List<ScaIssueReleaseDetailsDto> notProductionIssues) {
-
- public String branchUuid() {
- return componentDto.branchUuid();
- }
-
- public List<ScaIssueReleaseDetailsDto> expectedIssuesSorted(ScaIssuesReleasesDetailsQuery.Sort sort) {
- return expectedIssues.stream().sorted(comparator(sort)).toList();
- }
-
- public List<ScaIssueReleaseDetailsDto> expectedIssuesSortedByIdentityAsc() {
- return expectedIssuesSorted(ScaIssuesReleasesDetailsQuery.Sort.IDENTITY_ASC);
- }
-
- public List<ScaIssueReleaseDetailsDto> expectedIssuesSortedByCvssDesc() {
- return expectedIssuesSorted(ScaIssuesReleasesDetailsQuery.Sort.CVSS_SCORE_DESC);
- }
-
- public List<ScaIssueReleaseDetailsDto> expectedIssuesWithPackageManager(PackageManager packageManager) {
- // we just have hardcoded knowledge of how we set them up, because ScaIssueReleaseDetailsDto doesn't
- // contain the ScaReleaseDto to look at this
- return switch (packageManager) {
- case NPM -> expectedIssues.subList(0, 2);
- case MAVEN -> expectedIssues.subList(2, expectedIssues.size());
- default -> Collections.emptyList();
- };
- }
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDaoIT.java
deleted file mode 100644
index f59f2fbf39c..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDaoIT.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.assertj.core.groups.Tuple;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.Pagination;
-import org.sonar.db.component.ComponentDto;
-import org.sonar.db.component.ProjectData;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaReleasesDaoIT {
-
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaReleasesDao scaReleasesDao = db.getDbClient().scaReleasesDao();
-
- @Test
- void insert_shouldPersistScaReleases() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_releases");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsExactlyInAnyOrderEntriesOf(
- Map.ofEntries(
- Map.entry("uuid", scaReleaseDto.uuid()),
- Map.entry("component_uuid", scaReleaseDto.componentUuid()),
- Map.entry("package_url", scaReleaseDto.packageUrl()),
- Map.entry("package_manager", scaReleaseDto.packageManager().name()),
- Map.entry("package_name", scaReleaseDto.packageName()),
- Map.entry("version", scaReleaseDto.version()),
- Map.entry("license_expression", scaReleaseDto.licenseExpression()),
- Map.entry("declared_license_expression", scaReleaseDto.declaredLicenseExpression()),
- Map.entry("known", scaReleaseDto.known()),
- Map.entry("new_in_pull_request", scaReleaseDto.newInPullRequest()),
- Map.entry("created_at", scaReleaseDto.createdAt()),
- Map.entry("updated_at", scaReleaseDto.updatedAt())));
- }
-
- @Test
- void deleteByUuid_shouldDeleteScaReleases() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_releases");
- assertThat(select).isNotEmpty();
-
- scaReleasesDao.deleteByUuid(db.getSession(), scaReleaseDto.uuid());
-
- select = db.select(db.getSession(), "select * from sca_releases");
- assertThat(select).isEmpty();
- }
-
- @Test
- void selectByUuid_shouldLoadScaRelease() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
-
- var loadedOptional = scaReleasesDao.selectByUuid(db.getSession(), scaReleaseDto.uuid());
-
- assertThat(loadedOptional).contains(scaReleaseDto);
- }
-
- @Test
- void selectByUuid_shouldLoadScaReleases() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto1 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
- db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "2");
- ScaReleaseDto scaReleaseDto3 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "3");
-
- // we don't ask for the second one, so this tests we only get what we asked for.
- var loaded = scaReleasesDao.selectByUuids(db.getSession(), Set.of(scaReleaseDto1.uuid(), scaReleaseDto3.uuid()));
-
- assertThat(loaded).containsExactlyInAnyOrder(scaReleaseDto1, scaReleaseDto3);
- }
-
- @Test
- void selectByUuid_shouldLoadEmptyScaReleases() {
- ComponentDto componentDto = prepareComponentDto();
- db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
- db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "2");
- db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "3");
-
- var loaded = scaReleasesDao.selectByUuids(db.getSession(), Collections.emptyList());
-
- assertThat(loaded).isEmpty();
- }
-
- @Test
- void selectByQuery_shouldReturnScaReleases_whenQueryByBranchUuid() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
- System.out.println("componentDto = " + componentDto);
-
- ScaReleasesQuery scaReleasesQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, null, null, null, null);
- List<ScaReleaseDto> results = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesQuery, Pagination.all());
-
- assertThat(results).hasSize(1);
- assertThat(results.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto);
- }
-
- @Test
- void selectByQuery_shouldReturnPaginatedScaReleases() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto1 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
- ScaReleaseDto scaReleaseDto2 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "2");
- ScaReleaseDto scaReleaseDto3 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "3");
- ScaReleaseDto scaReleaseDto4 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "4");
-
- ScaReleasesQuery scaReleasesQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, null, null, null, null);
- List<ScaReleaseDto> page1Results = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesQuery, Pagination.forPage(1).andSize(2));
- List<ScaReleaseDto> page2Results = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesQuery, Pagination.forPage(2).andSize(2));
-
- // we order by created_at so it would seem we can assert the order here... except that created_at has finite resolution, so it can be nondeterministic.
- var allResults = new ArrayList<>(page1Results);
- allResults.addAll(page2Results);
- assertThat(allResults).containsExactlyInAnyOrder(scaReleaseDto1, scaReleaseDto2, scaReleaseDto3, scaReleaseDto4);
- assertThat(List.of(page1Results.size(), page2Results.size())).containsExactly(2, 2);
- }
-
- @Test
- void selectByQuery_shouldPartiallyMatchPackageName_whenQueriedByText() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto1 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1", PackageManager.MAVEN, "foo.bar");
- db.getScaDependenciesDbTester().insertScaDependency(scaReleaseDto1, "1", true);
- db.getScaDependenciesDbTester().insertScaDependency(scaReleaseDto1, "2", false);
- var log = LoggerFactory.getLogger("");
- List<Map<String, Object>> temp = db.select(db.getSession(), "select * from sca_releases");
- log.warn("sca_releases: {}", temp.stream().count());
- for (Map<String, Object> map : temp) {
- log.warn(map.toString());
- }
- temp = db.select(db.getSession(), "select * from sca_dependencies");
- log.warn("sca_dependencies: {}", temp.stream().count());
- for (Map<String, Object> map : temp) {
- log.warn(map.toString());
- }
-
- @SuppressWarnings("unused")
- ScaReleaseDto scaReleaseDto2 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "2", PackageManager.MAVEN, "bar.mee");
- ScaReleaseDto scaReleaseDto3 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "3", PackageManager.MAVEN, "foo.bar.me");
- @SuppressWarnings("unused")
- ScaReleaseDto scaReleaseDto4 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "4", PackageManager.MAVEN, "some.foo.bar");
-
- ScaReleasesQuery scaReleasesQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, null, null, null, "foo");
- List<ScaReleaseDto> results = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesQuery, Pagination.all());
-
- assertThat(results).hasSize(3);
- assertThat(results.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto1);
- assertThat(results.get(1)).usingRecursiveComparison().isEqualTo(scaReleaseDto3);
-
- ScaReleasesQuery scaReleasesCaseInsensitiveQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, null, null, null, "Foo.Bar");
- List<ScaReleaseDto> resultsCaseInsensitive = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesCaseInsensitiveQuery, Pagination.all());
-
- assertThat(resultsCaseInsensitive).hasSize(3);
- assertThat(resultsCaseInsensitive.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto1);
- assertThat(resultsCaseInsensitive.get(1)).usingRecursiveComparison().isEqualTo(scaReleaseDto3);
- }
-
- @Test
- void selectByQuery_shouldReturnScaReleases_whenQueryByDirect() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto1 = db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto.uuid(), "1", 2, true, PackageManager.MAVEN, "foo.bar");
- ScaReleaseDto scaReleaseDto2 = db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto.uuid(), "2", 3, false, PackageManager.MAVEN, "foo.bar");
-
- ScaReleasesQuery scaReleasesDirectQuery = new ScaReleasesQuery(componentDto.branchUuid(), true, null, null, null, null);
- List<ScaReleaseDto> resultsDirect = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesDirectQuery, Pagination.all());
-
- assertThat(resultsDirect).hasSize(1);
- assertThat(resultsDirect.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto1);
-
- ScaReleasesQuery scaReleasesNoDirectQuery = new ScaReleasesQuery(componentDto.branchUuid(), false, null, null, null, null);
- List<ScaReleaseDto> resultsNoDirect = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesNoDirectQuery, Pagination.all());
-
- assertThat(resultsNoDirect).hasSize(1);
- assertThat(resultsNoDirect.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto2);
- }
-
- @Test
- void selectByQuery_shouldReturnScaReleases_whenQueryByProductionScope() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto1 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1");
- ScaReleaseDto scaReleaseDto2 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "2");
- db.getScaDependenciesDbTester().insertScaDependency(scaReleaseDto1, "1", builder -> builder.setProductionScope(true));
- db.getScaDependenciesDbTester().insertScaDependency(scaReleaseDto2, "2", builder -> builder.setProductionScope(false));
-
- ScaReleasesQuery scaReleasesProductionScopeQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, true, null, null, null);
- List<ScaReleaseDto> resultsProductionScope = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesProductionScopeQuery, Pagination.all());
-
- assertThat(resultsProductionScope).hasSize(1);
- assertThat(resultsProductionScope.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto1);
-
- ScaReleasesQuery scaReleasesNoProductionScopeQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, false, null, null, null);
- List<ScaReleaseDto> resultsNoProductionScope = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesNoProductionScopeQuery, Pagination.all());
-
- assertThat(resultsNoProductionScope).hasSize(1);
- assertThat(resultsNoProductionScope.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto2);
- }
-
- @Test
- void selectByQuery_shouldReturnScaReleases_whenQueryByPackageManager() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto1 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1", PackageManager.MAVEN, "foo.bar");
- ScaReleaseDto scaReleaseDto2 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "2", PackageManager.NPM, "foo.bar");
- ScaReleaseDto scaReleaseDto3 = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "3", PackageManager.CARGO, "foo.bar");
-
- ScaReleasesQuery scaReleasesMavenQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, null, List.of(PackageManager.MAVEN.name()), null, null);
- List<ScaReleaseDto> resultsMaven = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesMavenQuery, Pagination.all());
-
- assertThat(resultsMaven).hasSize(1);
- assertThat(resultsMaven.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto1);
-
- ScaReleasesQuery scaReleasesNpmAndCargoQuery = new ScaReleasesQuery(componentDto.branchUuid(), null, null,
- List.of(PackageManager.NPM.name(), PackageManager.CARGO.name()), null, null);
- List<ScaReleaseDto> resultsNpm = scaReleasesDao.selectByQuery(db.getSession(), scaReleasesNpmAndCargoQuery, Pagination.all());
-
- assertThat(resultsNpm).hasSize(2);
- assertThat(resultsNpm.get(0)).usingRecursiveComparison().isEqualTo(scaReleaseDto2);
- assertThat(resultsNpm.get(1)).usingRecursiveComparison().isEqualTo(scaReleaseDto3);
- }
-
- @Test
- void update_shouldUpdateScaRelease() {
- ComponentDto componentDto = prepareComponentDto();
- ScaReleaseDto scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentDto.uuid(), "1", PackageManager.MAVEN, "foo.bar");
- ScaReleaseDto updatedScaRelease = scaReleaseDto.toBuilder().setUpdatedAt(scaReleaseDto.updatedAt() + 1).setVersion("newVersion").build();
-
- scaReleasesDao.update(db.getSession(), updatedScaRelease);
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_releases");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- assertThat(stringObjectMap).containsExactlyInAnyOrderEntriesOf(
- Map.ofEntries(
- Map.entry("uuid", updatedScaRelease.uuid()),
- Map.entry("component_uuid", updatedScaRelease.componentUuid()),
- Map.entry("package_url", updatedScaRelease.packageUrl()),
- Map.entry("package_manager", updatedScaRelease.packageManager().name()),
- Map.entry("package_name", updatedScaRelease.packageName()),
- Map.entry("version", updatedScaRelease.version()),
- Map.entry("license_expression", updatedScaRelease.licenseExpression()),
- Map.entry("declared_license_expression", updatedScaRelease.declaredLicenseExpression()),
- Map.entry("known", updatedScaRelease.known()),
- Map.entry("new_in_pull_request", updatedScaRelease.newInPullRequest()),
- Map.entry("created_at", updatedScaRelease.createdAt()),
- Map.entry("updated_at", updatedScaRelease.updatedAt())));
- }
-
- @Test
- void countByQuery_shouldReturnTheTotalOfReleases() {
- ComponentDto componentDto1 = prepareComponentDto();
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "1", 1, true, PackageManager.MAVEN, "foo.bar");
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "2", 2, true, PackageManager.MAVEN, "foo.bar.mee");
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "3", 3, true, PackageManager.MAVEN, "bar.fo");
-
- ScaReleasesQuery scaReleasesQuery = new ScaReleasesQuery(componentDto1.branchUuid(), null, null, null, null, "foo");
-
- assertThat(scaReleasesDao.countByQuery(db.getSession(), scaReleasesQuery)).isEqualTo(2);
- assertThat(scaReleasesDao.countByQuery(db.getSession(), new ScaReleasesQuery(componentDto1.branchUuid(), null, null, null, null, null))).isEqualTo(3);
- assertThat(scaReleasesDao.countByQuery(db.getSession(), new ScaReleasesQuery("another_branch_uuid", null, null, null, null, null))).isZero();
- }
-
- private ComponentDto prepareComponentDto() {
- ProjectData projectData = db.components().insertPublicProject();
- return projectData.getMainBranchComponent();
- }
-
- @Test
- void countByPlatformQuery_shouldReturnPlatforms() {
- ComponentDto componentDto1 = prepareComponentDto();
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "1", 1, true, PackageManager.MAVEN, "foo.bar");
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "2", 2, true, PackageManager.NPM, "foo.bar.mee");
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "3", 3, true, PackageManager.MAVEN, "bar.foo");
- db.getScaReleasesDbTester().insertScaReleaseWithDependency(componentDto1.uuid(), "4", 4, true, PackageManager.PYPI, "bar.foo");
-
- ScaReleasesQuery scaReleasesQuery = new ScaReleasesQuery(componentDto1.branchUuid(), null, null, null, null, null);
-
- List<ScaReleaseByPackageManagerCountDto> releaseCounts = scaReleasesDao.countReleasesByPackageManager(db.getSession(), scaReleasesQuery);
- assertThat(releaseCounts).hasSize(3);
- assertThat(releaseCounts).extracting("packageManager", "releaseCount")
- .containsExactlyInAnyOrder(Tuple.tuple(PackageManager.MAVEN.name(), 2),
- Tuple.tuple(PackageManager.NPM.name(), 1),
- Tuple.tuple(PackageManager.PYPI.name(), 1));
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDependenciesDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDependenciesDaoIT.java
deleted file mode 100644
index e8384f05a0c..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaReleasesDependenciesDaoIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.component.ComponentDto;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaReleasesDependenciesDaoIT {
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaReleasesDependenciesDao scaReleasesDependenciesDao = db.getDbClient().scaReleasesDependenciesDao();
-
- @Test
- void test_whenEmptyDatabaseAndQuery_selectByReleaseUuids() {
- assertThat(scaReleasesDependenciesDao.selectByReleaseUuids(db.getSession(), List.of())).isEmpty();
- }
-
- @Test
- void test_whenSomeDependencies_selectByReleaseUuids() {
- ComponentDto componentDto = db.components().insertPublicProject().getMainBranchComponent();
-
- ScaDependencyDto scaDependencyDto1a = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "1a", true, PackageManager.MAVEN, "foo.bar1");
- // same release, different dependency
- ScaDependencyDto scaDependencyDto1b = db.getScaDependenciesDbTester().insertScaDependency(scaDependencyDto1a.scaReleaseUuid(), "1b", false);
- ScaDependencyDto scaDependencyDto2 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "2", true, PackageManager.MAVEN, "foo.bar2");
- ScaDependencyDto scaDependencyDto3 = db.getScaDependenciesDbTester().insertScaDependencyWithRelease(componentDto.uuid(), "3", true, PackageManager.MAVEN, "foo.bar3");
-
- List<ScaReleaseDependenciesDto> results = scaReleasesDependenciesDao.selectByReleaseUuids(db.getSession(),
- List.of(scaDependencyDto1a.scaReleaseUuid(), scaDependencyDto2.scaReleaseUuid()));
-
- assertThat(results.stream().map(ScaReleaseDependenciesDto::dependencies).flatMap(List::stream).toList())
- .containsExactlyInAnyOrder(scaDependencyDto1a, scaDependencyDto1b, scaDependencyDto2)
- .doesNotContain(scaDependencyDto3);
- var twoDeps = results.stream().filter(rd -> rd.releaseUuid().equals(scaDependencyDto1a.scaReleaseUuid()))
- .findFirst().map(ScaReleaseDependenciesDto::dependencies).orElseThrow();
- assertThat(twoDeps).containsExactlyInAnyOrder(scaDependencyDto1a, scaDependencyDto1b);
-
- var resultsWithEmptyQuery = scaReleasesDependenciesDao.selectByReleaseUuids(db.getSession(), List.of());
- assertThat(resultsWithEmptyQuery).isEmpty();
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaVulnerabilityIssuesDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaVulnerabilityIssuesDaoIT.java
deleted file mode 100644
index dbfbaf3d6d2..00000000000
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/sca/ScaVulnerabilityIssuesDaoIT.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.List;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaVulnerabilityIssuesDaoIT {
-
- @RegisterExtension
- private final DbTester db = DbTester.create(System2.INSTANCE);
-
- private final ScaVulnerabilityIssuesDao scaVulnerabilityIssuesDao = db.getDbClient().scaVulnerabilityIssuesDao();
-
- private static final ScaVulnerabilityIssueDto newScaVulnerabilityIssueDto(String suffix) {
- return new ScaVulnerabilityIssueDto("uuid" + suffix, ScaSeverity.INFO, List.of("cwe-" + suffix), new BigDecimal("7.1"), 1L, 2L);
- }
-
- @Test
- void insert_shouldPersistScaVulnerabilityIssues() {
- ScaVulnerabilityIssueDto issueDto = newScaVulnerabilityIssueDto("1");
- scaVulnerabilityIssuesDao.insert(db.getSession(), issueDto);
-
- List<Map<String, Object>> select = db.select(db.getSession(), "select * from sca_vulnerability_issues");
- assertThat(select).hasSize(1);
- Map<String, Object> stringObjectMap = select.get(0);
- // we can't compare doubles, so it's hackin' time
- var possibleDouble = stringObjectMap.get("cvss_score");
- if (possibleDouble instanceof Double d) {
- stringObjectMap.put("cvss_score", BigDecimal.valueOf(d));
- }
- assertThat(stringObjectMap).containsExactlyInAnyOrderEntriesOf(
- Map.ofEntries(
- Map.entry("uuid", issueDto.uuid()),
- Map.entry("base_severity", issueDto.baseSeverity().name()),
- Map.entry("cwe_ids", "[" + String.join(", ", issueDto.cweIds().stream().map(s -> "\"" + s + "\"").toList()) + "]"),
- Map.entry("cvss_score", issueDto.cvssScore()),
- Map.entry("created_at", issueDto.createdAt()),
- Map.entry("updated_at", issueDto.updatedAt())));
- }
-
- @Test
- void insert_canSaveNullCvssScore() {
- ScaVulnerabilityIssueDto issueDtoNotNull = newScaVulnerabilityIssueDto("1");
- ScaVulnerabilityIssueDto issueDto = new ScaVulnerabilityIssueDto(issueDtoNotNull.uuid(), ScaSeverity.INFO, issueDtoNotNull.cweIds(),
- null, issueDtoNotNull.createdAt(), issueDtoNotNull.updatedAt());
-
- scaVulnerabilityIssuesDao.insert(db.getSession(), issueDto);
-
- var loadedOptional = scaVulnerabilityIssuesDao.selectByUuid(db.getSession(), issueDto.uuid());
-
- assertThat(loadedOptional).contains(issueDto);
- assertThat(loadedOptional.get().cvssScore()).isNull();
- }
-
- @Test
- void insert_canSaveTenCvssScore() {
- ScaVulnerabilityIssueDto issueDtoBase = newScaVulnerabilityIssueDto("1");
- ScaVulnerabilityIssueDto issueDto = new ScaVulnerabilityIssueDto(issueDtoBase.uuid(), ScaSeverity.INFO,
- issueDtoBase.cweIds(), new BigDecimal("10.0"), issueDtoBase.createdAt(), issueDtoBase.updatedAt());
- assertThat(issueDto.cvssScore().scale()).isEqualTo(1);
-
- scaVulnerabilityIssuesDao.insert(db.getSession(), issueDto);
-
- // the different db backends are not consistent about actually keeping the scale
- // so we have to fix it to be what we expect
- var loadedOptionalScore = scaVulnerabilityIssuesDao.selectByUuid(db.getSession(), issueDto.uuid())
- .map(ScaVulnerabilityIssueDto::cvssScore)
- .map(score -> score.setScale(1, RoundingMode.HALF_UP));
-
- assertThat(loadedOptionalScore).contains(issueDto.cvssScore());
- }
-
- @Test
- void selectByUuid_shouldLoadScaVulnerabilityIssue() {
- ScaVulnerabilityIssueDto issueDto = newScaVulnerabilityIssueDto("1");
- scaVulnerabilityIssuesDao.insert(db.getSession(), issueDto);
-
- var loadedOptional = scaVulnerabilityIssuesDao.selectByUuid(db.getSession(), issueDto.uuid());
-
- assertThat(loadedOptional).contains(issueDto);
- }
-
- @Test
- void selectByUuids_shouldLoadScaVulnerabilityIssues() {
- List<ScaVulnerabilityIssueDto> issueDtos = List.of(newScaVulnerabilityIssueDto("1"),
- newScaVulnerabilityIssueDto("2"), newScaVulnerabilityIssueDto("3"));
- for (var issueDto : issueDtos) {
- scaVulnerabilityIssuesDao.insert(db.getSession(), issueDto);
- }
-
- List<String> uuidsToLoad = List.of(issueDtos.get(0).uuid(), issueDtos.get(2).uuid());
- var loaded = scaVulnerabilityIssuesDao.selectByUuids(db.getSession(), uuidsToLoad);
-
- assertThat(loaded).containsExactlyInAnyOrder(issueDtos.get(0), issueDtos.get(2));
- }
-
- @Test
- void update_shouldModifyScaVulnerabilityIssue() {
- ScaVulnerabilityIssueDto issueDto = newScaVulnerabilityIssueDto("1");
- scaVulnerabilityIssuesDao.insert(db.getSession(), issueDto);
- ScaVulnerabilityIssueDto issueDtoUpdated = new ScaVulnerabilityIssueDto(issueDto.uuid(),
- ScaSeverity.BLOCKER,
- issueDto.cweIds().stream().map(s -> s + "-updated").toList(),
- issueDto.cvssScore().add(new BigDecimal("1.3")),
- issueDto.createdAt(), 5L);
-
- assertThat(issueDtoUpdated.baseSeverity()).isNotEqualTo(issueDto.baseSeverity());
-
- scaVulnerabilityIssuesDao.update(db.getSession(), issueDtoUpdated);
-
- var loadedOptional = scaVulnerabilityIssuesDao.selectByUuid(db.getSession(), issueDto.uuid());
-
- assertThat(loadedOptional).contains(issueDtoUpdated);
- }
-}
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/user/RoleDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/user/RoleDaoIT.java
index 51740d120f0..a2ad19232a7 100644
--- a/server/sonar-db-dao/src/it/java/org/sonar/db/user/RoleDaoIT.java
+++ b/server/sonar-db-dao/src/it/java/org/sonar/db/user/RoleDaoIT.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -64,13 +64,13 @@ class RoleDaoIT {
@Test
void selectComponentUuidsByPermissionAndUserId_throws_IAR_if_permission_USER_is_specified() {
expectUnsupportedUserAndCodeViewerPermission(() -> underTest.selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession,
- UserRole.USER, Uuids.createFast(), PROJECT_QUALIFIER));
+ ProjectPermission.USER, Uuids.createFast(), PROJECT_QUALIFIER));
}
@Test
void selectComponentUuidsByPermissionAndUserId_throws_IAR_if_permission_CODEVIEWER_is_specified() {
expectUnsupportedUserAndCodeViewerPermission(() -> underTest.selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession,
- UserRole.CODEVIEWER, Uuids.createFast(), PROJECT_QUALIFIER));
+ ProjectPermission.CODEVIEWER, Uuids.createFast(), PROJECT_QUALIFIER));
}
private void expectUnsupportedUserAndCodeViewerPermission(ThrowingCallable callback) {
@@ -81,16 +81,16 @@ class RoleDaoIT {
@Test
void selectEntityIdsByPermissionAndUserUuid() {
- db.users().insertProjectPermissionOnUser(user1, UserRole.ADMIN, project1);
- db.users().insertProjectPermissionOnUser(user1, UserRole.ADMIN, project2);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ADMIN, project1);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ADMIN, project2);
// global permission - not returned
db.users().insertGlobalPermissionOnUser(user1, ADMINISTER);
// project permission on another user id - not returned
- db.users().insertProjectPermissionOnUser(user2, UserRole.ADMIN, project1);
+ db.users().insertProjectPermissionOnUser(user2, ProjectPermission.ADMIN, project1);
// project permission on another permission - not returned
- db.users().insertProjectPermissionOnUser(user1, UserRole.ISSUE_ADMIN, project1);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ISSUE_ADMIN, project1);
- List<String> entityUuids = underTest.selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession, UserRole.ADMIN, user1.getUuid(),
+ List<String> entityUuids = underTest.selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession, ProjectPermission.ADMIN, user1.getUuid(),
PROJECT_QUALIFIER);
assertThat(entityUuids).containsExactly(project1.getUuid(), project2.getUuid());
@@ -100,9 +100,9 @@ class RoleDaoIT {
void selectComponentIdsByPermissionAndUserUuid_group_permissions() {
GroupDto group1 = db.users().insertGroup();
GroupDto group2 = db.users().insertGroup();
- db.users().insertEntityPermissionOnGroup(group1, UserRole.ADMIN, project1);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.ADMIN, project1);
db.users().insertMember(group1, user1);
- db.users().insertProjectPermissionOnUser(user1, UserRole.ADMIN, project2);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ADMIN, project2);
// global permission - not returned
db.users().insertGlobalPermissionOnUser(user1, ADMINISTER);
db.users().insertPermissionOnGroup(group1, ADMINISTER);
@@ -110,9 +110,9 @@ class RoleDaoIT {
db.users().insertPermissionOnGroup(group2, ADMINISTER);
db.users().insertMember(group2, user2);
// project permission on another permission - not returned
- db.users().insertEntityPermissionOnGroup(group1, UserRole.ISSUE_ADMIN, project1);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.ISSUE_ADMIN, project1);
- List<String> result = underTest.selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession, UserRole.ADMIN, user1.getUuid(),
+ List<String> result = underTest.selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession, ProjectPermission.ADMIN, user1.getUuid(),
PROJECT_QUALIFIER);
assertThat(result).containsExactlyInAnyOrder(project1.getUuid(), project2.getUuid());
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java
index 23ee064c592..02986d9c4c6 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/DaoModule.java
@@ -88,13 +88,6 @@ import org.sonar.db.report.ReportSubscriptionDao;
import org.sonar.db.rule.RuleChangeDao;
import org.sonar.db.rule.RuleDao;
import org.sonar.db.rule.RuleRepositoryDao;
-import org.sonar.db.sca.ScaDependenciesDao;
-import org.sonar.db.sca.ScaIssuesDao;
-import org.sonar.db.sca.ScaIssuesReleasesDao;
-import org.sonar.db.sca.ScaIssuesReleasesDetailsDao;
-import org.sonar.db.sca.ScaReleasesDao;
-import org.sonar.db.sca.ScaReleasesDependenciesDao;
-import org.sonar.db.sca.ScaVulnerabilityIssuesDao;
import org.sonar.db.scannercache.ScannerAnalysisCacheDao;
import org.sonar.db.schemamigration.SchemaMigrationDao;
import org.sonar.db.scim.ScimGroupDao;
@@ -156,7 +149,6 @@ public class DaoModule extends Module {
IssueChangeDao.class,
IssueDao.class,
IssueFixedDao.class,
- ScaIssuesReleasesDetailsDao.class,
MeasureDao.class,
ProjectMeasureDao.class,
MetricDao.class,
@@ -192,12 +184,6 @@ public class DaoModule extends Module {
RuleChangeDao.class,
RuleRepositoryDao.class,
SamlMessageIdDao.class,
- ScaDependenciesDao.class,
- ScaIssuesDao.class,
- ScaIssuesReleasesDao.class,
- ScaReleasesDao.class,
- ScaReleasesDependenciesDao.class,
- ScaVulnerabilityIssuesDao.class,
ScannerAnalysisCacheDao.class,
SchemaMigrationDao.class,
ScimGroupDao.class,
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java b/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java
index ed5319a5ec9..ec1fc6884b1 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/DbClient.java
@@ -88,13 +88,6 @@ import org.sonar.db.report.ReportSubscriptionDao;
import org.sonar.db.rule.RuleChangeDao;
import org.sonar.db.rule.RuleDao;
import org.sonar.db.rule.RuleRepositoryDao;
-import org.sonar.db.sca.ScaDependenciesDao;
-import org.sonar.db.sca.ScaIssuesDao;
-import org.sonar.db.sca.ScaIssuesReleasesDao;
-import org.sonar.db.sca.ScaIssuesReleasesDetailsDao;
-import org.sonar.db.sca.ScaReleasesDao;
-import org.sonar.db.sca.ScaReleasesDependenciesDao;
-import org.sonar.db.sca.ScaVulnerabilityIssuesDao;
import org.sonar.db.scannercache.ScannerAnalysisCacheDao;
import org.sonar.db.schemamigration.SchemaMigrationDao;
import org.sonar.db.scim.ScimGroupDao;
@@ -207,13 +200,6 @@ public class DbClient {
private final ProjectExportDao projectExportDao;
private final IssueFixedDao issueFixedDao;
private final TelemetryMetricsSentDao telemetryMetricsSentDao;
- private final ScaReleasesDao scaReleasesDao;
- private final ScaDependenciesDao scaDependenciesDao;
- private final ScaReleasesDependenciesDao scaReleasesDependenciesDao;
- private final ScaIssuesDao scaIssuesDao;
- private final ScaIssuesReleasesDao scaIssuesReleasesDao;
- private final ScaVulnerabilityIssuesDao scaVulnerabilityIssuesDao;
- private final ScaIssuesReleasesDetailsDao scaIssuesReleasesDetailsDao;
public DbClient(Database database, MyBatis myBatis, DBSessions dbSessions, Dao... daos) {
this.database = database;
@@ -310,13 +296,6 @@ public class DbClient {
projectExportDao = getDao(map, ProjectExportDao.class);
issueFixedDao = getDao(map, IssueFixedDao.class);
telemetryMetricsSentDao = getDao(map, TelemetryMetricsSentDao.class);
- scaReleasesDao = getDao(map, ScaReleasesDao.class);
- scaDependenciesDao = getDao(map, ScaDependenciesDao.class);
- scaReleasesDependenciesDao = getDao(map, ScaReleasesDependenciesDao.class);
- scaIssuesDao = getDao(map, ScaIssuesDao.class);
- scaIssuesReleasesDao = getDao(map, ScaIssuesReleasesDao.class);
- scaVulnerabilityIssuesDao = getDao(map, ScaVulnerabilityIssuesDao.class);
- scaIssuesReleasesDetailsDao = getDao(map, ScaIssuesReleasesDetailsDao.class);
}
public DbSession openSession(boolean batch) {
@@ -680,32 +659,4 @@ public class DbClient {
public ProjectExportDao projectExportDao() {
return projectExportDao;
}
-
- public ScaReleasesDao scaReleasesDao() {
- return scaReleasesDao;
- }
-
- public ScaDependenciesDao scaDependenciesDao() {
- return scaDependenciesDao;
- }
-
- public ScaReleasesDependenciesDao scaReleasesDependenciesDao() {
- return scaReleasesDependenciesDao;
- }
-
- public ScaIssuesDao scaIssuesDao() {
- return scaIssuesDao;
- }
-
- public ScaIssuesReleasesDao scaIssuesReleasesDao() {
- return scaIssuesReleasesDao;
- }
-
- public ScaVulnerabilityIssuesDao scaVulnerabilityIssuesDao() {
- return scaVulnerabilityIssuesDao;
- }
-
- public ScaIssuesReleasesDetailsDao scaIssuesReleasesDetailsDao() {
- return scaIssuesReleasesDetailsDao;
- }
}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java
index cb67f4a4b65..334ad5a5cdf 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/MyBatis.java
@@ -151,13 +151,6 @@ import org.sonar.db.rule.RuleChangeMapper;
import org.sonar.db.rule.RuleMapper;
import org.sonar.db.rule.RuleParamDto;
import org.sonar.db.rule.RuleRepositoryMapper;
-import org.sonar.db.sca.ScaDependenciesMapper;
-import org.sonar.db.sca.ScaDependencyDto;
-import org.sonar.db.sca.ScaIssuesMapper;
-import org.sonar.db.sca.ScaIssuesReleasesDetailsMapper;
-import org.sonar.db.sca.ScaIssuesReleasesMapper;
-import org.sonar.db.sca.ScaReleasesMapper;
-import org.sonar.db.sca.ScaVulnerabilityIssuesMapper;
import org.sonar.db.scannercache.ScannerAnalysisCacheMapper;
import org.sonar.db.schemamigration.SchemaMigrationDto;
import org.sonar.db.schemamigration.SchemaMigrationMapper;
@@ -258,7 +251,6 @@ public class MyBatis {
confBuilder.loadAlias("QualityGate", QualityGateDto.class);
confBuilder.loadAlias("Resource", ResourceDto.class);
confBuilder.loadAlias("RuleParam", RuleParamDto.class);
- confBuilder.loadAlias("ScaDependency", ScaDependencyDto.class);
confBuilder.loadAlias("SchemaMigration", SchemaMigrationDto.class);
confBuilder.loadAlias("ScrapProperty", ScrapPropertyDto.class);
confBuilder.loadAlias("ScrapAnalysisProperty", ScrapAnalysisPropertyDto.class);
@@ -347,12 +339,6 @@ public class MyBatis {
RuleChangeMapper.class,
RuleRepositoryMapper.class,
SamlMessageIdMapper.class,
- ScaDependenciesMapper.class,
- ScaIssuesMapper.class,
- ScaIssuesReleasesMapper.class,
- ScaIssuesReleasesDetailsMapper.class,
- ScaReleasesMapper.class,
- ScaVulnerabilityIssuesMapper.class,
ScannerAnalysisCacheMapper.class,
SchemaMigrationMapper.class,
ScimGroupMapper.class,
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java
index 61f2b6d96c6..1e58c75dc36 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java
@@ -42,7 +42,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.component.ComponentDto;
@@ -877,7 +877,7 @@ public final class IssueDto implements Serializable {
public DefaultIssue toDefaultIssue() {
DefaultIssue issue = new DefaultIssue();
issue.setKey(kee);
- issue.setType(RuleType.valueOf(type));
+ issue.setType(RuleType.fromDbConstant(type));
issue.setStatus(status);
issue.setResolution(resolution);
issue.setMessage(message);
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/AuthorizationDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/AuthorizationDao.java
index 1402b8cadd0..85dd8c651e9 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/AuthorizationDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/AuthorizationDao.java
@@ -126,6 +126,10 @@ public class AuthorizationDao implements Dao {
return mapper(dbSession).countUsersWithGlobalPermissionExcludingUserPermission(permission, userUuid);
}
+ public Set<String> keepAuthorizedEntityUuids(DbSession dbSession, Collection<String> entityUuids, @Nullable String userUuid, ProjectPermission permission) {
+ return keepAuthorizedEntityUuids(dbSession, entityUuids, userUuid, permission.getKey());
+ }
+
public Set<String> keepAuthorizedEntityUuids(DbSession dbSession, Collection<String> entityUuids, @Nullable String userUuid, String permission) {
return executeLargeInputsIntoSet(
entityUuids,
@@ -142,10 +146,15 @@ public class AuthorizationDao implements Dao {
* Keep only authorized user that have the given permission on a given entity.
* Please Note that if the permission is 'Anyone' is NOT taking into account by this method.
*/
- public Collection<String> keepAuthorizedUsersForRoleAndEntity(DbSession dbSession, Collection<String> userUuids, String role, String entityUuid) {
+ public Collection<String> keepAuthorizedUsersForRoleAndEntity(DbSession dbSession, Collection<String> userUuids, ProjectPermission permission, String entityUuid) {
+ return keepAuthorizedUsersForRoleAndEntity(dbSession, userUuids, permission.getKey(), entityUuid);
+ }
+
+
+ public Collection<String> keepAuthorizedUsersForRoleAndEntity(DbSession dbSession, Collection<String> userUuids, String permission, String entityUuid) {
return executeLargeInputs(
userUuids,
- partitionOfIds -> mapper(dbSession).keepAuthorizedUsersForRoleAndEntity(role, entityUuid, partitionOfIds),
+ partitionOfIds -> mapper(dbSession).keepAuthorizedUsersForRoleAndEntity(permission, entityUuid, partitionOfIds),
partitionSize -> partitionSize / 3);
}
@@ -161,6 +170,10 @@ public class AuthorizationDao implements Dao {
return mapper(dbSession).selectEmailSubscribersWithGlobalPermission(ADMINISTER.getKey());
}
+ public Set<String> keepAuthorizedLoginsOnEntity(DbSession dbSession, Set<String> logins, String entityKey, ProjectPermission permission) {
+ return keepAuthorizedLoginsOnEntity(dbSession, logins, entityKey, permission.getKey());
+ }
+
public Set<String> keepAuthorizedLoginsOnEntity(DbSession dbSession, Set<String> logins, String entityKey, String permission) {
return executeLargeInputsIntoSet(
logins,
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/CountPerEntityPermission.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/CountPerEntityPermission.java
index 9d6c2c207ac..e3870a20127 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/CountPerEntityPermission.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/CountPerEntityPermission.java
@@ -34,9 +34,9 @@ public class CountPerEntityPermission {
}
@VisibleForTesting
- CountPerEntityPermission(String entityUuid, String permission, int count) {
+ CountPerEntityPermission(String entityUuid, ProjectPermission permission, int count) {
this.entityUuid = entityUuid;
- this.permission = permission;
+ this.permission = permission.getKey();
this.count = count;
}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GlobalPermission.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GlobalPermission.java
index 395d31a7ff9..f7998a70808 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GlobalPermission.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GlobalPermission.java
@@ -59,7 +59,7 @@ public enum GlobalPermission {
return p;
}
}
- throw new IllegalArgumentException("Unsupported permission: " + key);
+ throw new IllegalArgumentException("Unsupported global permission: " + key);
}
public static boolean contains(String key) {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java
index 3306033e1d3..bcdfaee08db 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDao.java
@@ -117,6 +117,10 @@ public class GroupPermissionDao implements Dao {
* permission, <strong>excluding group "AnyOne"</strong> (which implies the returned {@code Sett} can't contain
* {@code null}).
*/
+ public Set<String> selectGroupUuidsWithPermissionOnEntityBut(DbSession session, String entityUuid, ProjectPermission permission) {
+ return selectGroupUuidsWithPermissionOnEntityBut(session, entityUuid, permission.getKey());
+ }
+
public Set<String> selectGroupUuidsWithPermissionOnEntityBut(DbSession session, String entityUuid, String permission) {
return mapper(session).selectGroupUuidsWithPermissionOnEntityBut(entityUuid, permission);
}
@@ -205,6 +209,11 @@ public class GroupPermissionDao implements Dao {
* @param groupUuid if null, then anyone, else uuid of group
* @param entityDto if null, then global permission, otherwise the uuid of entity
*/
+ public void delete(DbSession dbSession, ProjectPermission permission, @Nullable String groupUuid,
+ @Nullable String groupName, @Nullable EntityDto entityDto) {
+ delete(dbSession, permission.getKey(), groupUuid, groupName, entityDto);
+ }
+
public void delete(DbSession dbSession, String permission, @Nullable String groupUuid,
@Nullable String groupName, @Nullable EntityDto entityDto) {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDto.java
index e0507f7bb26..d6fcd6a3646 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/GroupPermissionDto.java
@@ -64,6 +64,10 @@ public class GroupPermissionDto {
return role;
}
+ public GroupPermissionDto setRole(ProjectPermission permission) {
+ return setRole(permission.getKey());
+ }
+
public GroupPermissionDto setRole(String role) {
this.role = role;
return this;
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/PermissionQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/PermissionQuery.java
index 95dd6226eea..5bb0acd62f1 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/PermissionQuery.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/PermissionQuery.java
@@ -137,6 +137,10 @@ public class PermissionQuery {
return this;
}
+ public Builder setPermission(@Nullable ProjectPermission permission) {
+ return setPermission(permission == null ? null : permission.getKey());
+ }
+
public Builder setEntity(ComponentDto component) {
return setEntityUuid(component.uuid());
}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/ProjectPermission.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/ProjectPermission.java
new file mode 100644
index 00000000000..230594b58b5
--- /dev/null
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/ProjectPermission.java
@@ -0,0 +1,77 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2025 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.db.permission;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Set;
+
+public enum ProjectPermission {
+
+ USER("user"),
+ ADMIN("admin"),
+ CODEVIEWER("codeviewer"),
+ ISSUE_ADMIN("issueadmin"),
+ SECURITYHOTSPOT_ADMIN("securityhotspotadmin"),
+ SCAN("scan");
+
+ /**
+ * Permissions which are implicitly available for any user, any group on public projects.
+ */
+ public static final Set<ProjectPermission> PUBLIC_PERMISSIONS = Collections.unmodifiableSet(EnumSet.of(ProjectPermission.USER, ProjectPermission.CODEVIEWER));
+
+ private final String key;
+
+ ProjectPermission(String key) {
+ this.key = key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ @Override
+ public String toString() {
+ return key;
+ }
+
+ public static ProjectPermission fromKey(String key) {
+ for (ProjectPermission p : values()) {
+ if (p.getKey().equals(key)) {
+ return p;
+ }
+ }
+ throw new IllegalArgumentException("Unsupported project permission: " + key);
+ }
+
+ public static boolean contains(String key) {
+ return Arrays.stream(values()).anyMatch(v -> v.getKey().equals(key));
+ }
+
+ public static boolean isPublic(ProjectPermission permission) {
+ return PUBLIC_PERMISSIONS.contains(permission);
+ }
+
+ public static boolean isPublic(String permissionKey) {
+ return PUBLIC_PERMISSIONS.stream().anyMatch(p -> p.getKey().equals(permissionKey));
+ }
+
+}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDao.java
index 7014a0aed29..b6cc79c9f85 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDao.java
@@ -25,6 +25,7 @@ import org.sonar.db.Dao;
import org.sonar.db.DbSession;
import org.sonar.db.audit.AuditPersister;
import org.sonar.db.audit.model.PermissionTemplateNewValue;
+import org.sonar.db.permission.ProjectPermission;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
@@ -41,6 +42,10 @@ public class PermissionTemplateCharacteristicDao implements Dao {
return executeLargeInputs(templateUuids, partitionOfTemplateUuids -> mapper(dbSession).selectByTemplateUuids(partitionOfTemplateUuids));
}
+ public Optional<PermissionTemplateCharacteristicDto> selectByPermissionAndTemplateId(DbSession dbSession, ProjectPermission permission, String templateUuid) {
+ return selectByPermissionAndTemplateId(dbSession, permission.getKey(), templateUuid);
+ }
+
public Optional<PermissionTemplateCharacteristicDto> selectByPermissionAndTemplateId(DbSession dbSession, String permission, String templateUuid) {
PermissionTemplateCharacteristicDto dto = mapper(dbSession).selectByPermissionAndTemplateUuid(permission, templateUuid);
return Optional.ofNullable(dto);
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDto.java
index 89aebabc55d..fc3224c9ec6 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateCharacteristicDto.java
@@ -19,6 +19,8 @@
*/
package org.sonar.db.permission.template;
+import org.sonar.db.permission.ProjectPermission;
+
import static com.google.common.base.Preconditions.checkArgument;
public class PermissionTemplateCharacteristicDto {
@@ -54,6 +56,10 @@ public class PermissionTemplateCharacteristicDto {
return permission;
}
+ public PermissionTemplateCharacteristicDto setPermission(ProjectPermission permission) {
+ return setPermission(permission.getKey());
+ }
+
public PermissionTemplateCharacteristicDto setPermission(String permission) {
checkArgument(permission.length() <= MAX_PERMISSION_KEY_LENGTH, "Permission key length (%s) is longer than the maximum authorized (%s). '%s' was provided.",
permission.length(), MAX_PERMISSION_KEY_LENGTH, permission);
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java
index 5ef2e73adef..46a6633133e 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateDao.java
@@ -37,6 +37,7 @@ import org.sonar.db.audit.AuditPersister;
import org.sonar.db.audit.model.PermissionTemplateNewValue;
import org.sonar.db.permission.CountPerEntityPermission;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import static java.lang.String.format;
import static org.sonar.api.security.DefaultGroups.ANYONE;
@@ -175,6 +176,11 @@ public class PermissionTemplateDao implements Dao {
return permissionTemplate;
}
+ public void insertUserPermission(DbSession session, String templateUuid, String userUuid, ProjectPermission permission,
+ String templateName, String userLogin) {
+ insertUserPermission(session, templateUuid, userUuid, permission.getKey(), templateName, userLogin);
+ }
+
public void insertUserPermission(DbSession session, String templateUuid, String userUuid, String permission,
String templateName, String userLogin) {
PermissionTemplateUserDto permissionTemplateUser = new PermissionTemplateUserDto()
@@ -192,6 +198,11 @@ public class PermissionTemplateDao implements Dao {
session.commit();
}
+ public void deleteUserPermission(DbSession session, String templateUuid, String userUuid, ProjectPermission permission,
+ String templateName, String userLogin) {
+ deleteUserPermission(session, templateUuid, userUuid, permission.getKey(), templateName, userLogin);
+ }
+
public void deleteUserPermission(DbSession session, String templateUuid, String userUuid, String permission,
String templateName, String userLogin) {
PermissionTemplateUserDto permissionTemplateUser = new PermissionTemplateUserDto()
@@ -215,6 +226,11 @@ public class PermissionTemplateDao implements Dao {
}
}
+ public void insertGroupPermission(DbSession session, String templateUuid, @Nullable String groupUuid, ProjectPermission permission,
+ String templateName, @Nullable String groupName) {
+ insertGroupPermission(session, templateUuid, groupUuid, permission.getKey(), templateName, groupName);
+ }
+
public void insertGroupPermission(DbSession session, String templateUuid, @Nullable String groupUuid, String permission,
String templateName, @Nullable String groupName) {
PermissionTemplateGroupDto permissionTemplateGroup = new PermissionTemplateGroupDto()
@@ -236,6 +252,11 @@ public class PermissionTemplateDao implements Dao {
permissionTemplateGroup.getPermission(), null, null, permissionTemplateGroup.getGroupUuid(), permissionTemplateGroup.getGroupName()));
}
+ public void deleteGroupPermission(DbSession session, String templateUuid, @Nullable String groupUuid, ProjectPermission permission, String templateName,
+ @Nullable String groupName) {
+ deleteGroupPermission(session, templateUuid, groupUuid, permission.getKey(), templateName, groupName);
+ }
+
public void deleteGroupPermission(DbSession session, String templateUuid, @Nullable String groupUuid, String permission, String templateName,
@Nullable String groupName) {
PermissionTemplateGroupDto permissionTemplateGroup = new PermissionTemplateGroupDto()
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateGroupDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateGroupDto.java
index 1bd6fc26ef1..94155be3d5c 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateGroupDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/permission/template/PermissionTemplateGroupDto.java
@@ -21,6 +21,7 @@ package org.sonar.db.permission.template;
import java.util.Date;
import javax.annotation.Nullable;
+import org.sonar.db.permission.ProjectPermission;
public class PermissionTemplateGroupDto {
private String uuid;
@@ -67,6 +68,10 @@ public class PermissionTemplateGroupDto {
return this;
}
+ public PermissionTemplateGroupDto setPermission(ProjectPermission permission) {
+ return setPermission(permission.getKey());
+ }
+
public String getGroupName() {
return groupName;
}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java
index a031d8d69db..fcf9e17e0bb 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/project/ProjectDao.java
@@ -74,7 +74,7 @@ public class ProjectDao implements Dao {
if (keys.isEmpty()) {
return emptyList();
}
- return mapper(session).selectProjectsByKeys(keys);
+ return executeLargeInputs(keys, partition -> mapper(session).selectProjectsByKeys(partition));
}
public List<ProjectDto> selectApplicationsByKeys(DbSession session, Set<String> keys) {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/provisioning/DevOpsPermissionsMappingDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/provisioning/DevOpsPermissionsMappingDto.java
index d1e8a396407..d1e6085d072 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/provisioning/DevOpsPermissionsMappingDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/provisioning/DevOpsPermissionsMappingDto.java
@@ -19,5 +19,20 @@
*/
package org.sonar.db.provisioning;
+import org.apache.ibatis.annotations.AutomapConstructor;
+import org.sonar.db.permission.ProjectPermission;
+
public record DevOpsPermissionsMappingDto(String uuid, String devOpsPlatform, String role, String sonarqubePermission) {
+
+ @AutomapConstructor
+ public DevOpsPermissionsMappingDto {
+ }
+
+ public DevOpsPermissionsMappingDto(String uuid, String devOpsPlatform, String role, ProjectPermission sonarqubePermission) {
+ this(uuid, devOpsPlatform, role, sonarqubePermission.getKey());
+ }
+
+ public ProjectPermission projectPermission() {
+ return ProjectPermission.fromKey(sonarqubePermission);
+ }
}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/ExportRuleDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/ExportRuleDto.java
index 8b847759942..ec68a1f28cb 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/ExportRuleDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/ExportRuleDto.java
@@ -26,7 +26,7 @@ import java.util.Objects;
import java.util.Set;
import javax.annotation.CheckForNull;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.rule.SeverityUtil;
public class ExportRuleDto {
@@ -71,7 +71,7 @@ public class ExportRuleDto {
}
public RuleType getRuleType() {
- return RuleType.valueOf(type);
+ return RuleType.fromDbConstant(type);
}
@CheckForNull
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueFindingDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueFindingDto.java
index 43eeda81427..b3e75db1658 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueFindingDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/report/IssueFindingDto.java
@@ -22,7 +22,7 @@ package org.sonar.db.report;
import java.util.List;
import java.util.Set;
import javax.annotation.CheckForNull;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.issue.ImpactDto;
import org.sonar.db.rule.RuleDto;
@@ -77,7 +77,7 @@ public class IssueFindingDto {
}
public RuleType getType() {
- return RuleType.valueOf(type);
+ return RuleType.fromDbConstant(type);
}
public String getSeverity() {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDto.java
index 684cf6eca4a..c9dd18df7ba 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleDto.java
@@ -36,7 +36,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.issue.ImpactDto;
import static com.google.common.base.Preconditions.checkArgument;
@@ -421,7 +421,7 @@ public class RuleDto {
}
public RuleType getEnumType() {
- return RuleType.valueOf(type);
+ return RuleType.fromDbConstant(type);
}
public RuleDto setType(int type) {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleForIndexingDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleForIndexingDto.java
index f1041e97702..c03eb7c04f0 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleForIndexingDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleForIndexingDto.java
@@ -28,7 +28,7 @@ import javax.annotation.CheckForNull;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.issue.ImpactDto;
public class RuleForIndexingDto {
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/DefaultScaIssueIdentity.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/DefaultScaIssueIdentity.java
deleted file mode 100644
index 7eec1512e71..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/DefaultScaIssueIdentity.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * <p>
- * Default implementation of {@link ScaIssueIdentity}.
- * </p>
- * <p>
- * Caution: missing fields are empty string, not null, so db unique constraint works.
- * </p>
- * @param scaIssueType the issue type
- * @param packageUrl the package url (may or may not have a version)
- * @param vulnerabilityId the vulnerability id such as CVE-12345
- * @param spdxLicenseId the SPDX license identifier (not license expression)
- */
-public record DefaultScaIssueIdentity(ScaIssueType scaIssueType,
- String packageUrl,
- String vulnerabilityId,
- String spdxLicenseId) implements ScaIssueIdentity {
- public DefaultScaIssueIdentity {
- checkIdentityColumn(packageUrl, "packageUrl");
- checkIdentityColumn(vulnerabilityId, "vulnerabilityId");
- checkIdentityColumn(spdxLicenseId, "spdxLicenseId");
- }
-
- private static void checkIdentityColumn(String value, String name) {
- checkArgument(value != null, "DefaultScaIssueIdentity.%s cannot be null", name);
- checkArgument(!value.isBlank(), "DefaultScaIssueIdentity.%s cannot be blank, use ScaIssueDto.NULL_VALUE", name);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfListOfStringsTypeHandler.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfListOfStringsTypeHandler.java
deleted file mode 100644
index e90ddafba5d..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfListOfStringsTypeHandler.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import java.lang.reflect.Type;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-
-public class ListOfListOfStringsTypeHandler extends BaseTypeHandler<List<List<String>>> {
- private static final Gson GSON = new Gson();
- private static final Type type = new TypeToken<List<List<String>>>() {
- }.getType();
-
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, List<List<String>> parameter, JdbcType jdbcType) throws SQLException {
- ps.setString(i, GSON.toJson(parameter));
- }
-
- @Override
- public List<List<String>> getNullableResult(ResultSet rs, String columnName) throws SQLException {
- return GSON.fromJson(rs.getString(columnName), type);
- }
-
- @Override
- public List<List<String>> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
- return GSON.fromJson(rs.getString(columnIndex), type);
- }
-
- @Override
- public List<List<String>> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
- return GSON.fromJson(cs.getString(columnIndex), type);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfStringsTypeHandler.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfStringsTypeHandler.java
deleted file mode 100644
index 6d573e282d8..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ListOfStringsTypeHandler.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import java.lang.reflect.Type;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-
-public class ListOfStringsTypeHandler extends BaseTypeHandler<List<String>> {
- public static final int MAXIMUM_LENGTH = 255;
- private static final Gson GSON = new Gson();
- private static final Type type = new TypeToken<List<String>>() {
- }.getType();
-
- @Override
- public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
- var s = GSON.toJson(parameter);
- if (s.length() > MAXIMUM_LENGTH) {
- throw new SQLException("List of strings is too long to store in database");
- }
- ps.setString(i, s);
- }
-
- @Override
- public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
- return GSON.fromJson(rs.getString(columnName), type);
- }
-
- @Override
- public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
- return GSON.fromJson(rs.getString(columnIndex), type);
- }
-
- @Override
- public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
- return GSON.fromJson(cs.getString(columnIndex), type);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/PackageManager.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/PackageManager.java
deleted file mode 100644
index 50b49bcd185..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/PackageManager.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-/**
- * These values come from https://github.com/package-url/purl-spec/blob/master/PURL-TYPES.rst and correspond
- * to the package manager string used in PURLs.
- */
-public enum PackageManager {
- CARGO, COCOAPODS, COMPOSER, CONAN, CONDA, GEM, GOLANG, MAVEN, NPM, NUGET, PYPI
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesDao.java
deleted file mode 100644
index 166a8e0f2aa..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesDao.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-import org.sonar.db.Pagination;
-
-public class ScaDependenciesDao implements Dao {
-
- private static ScaDependenciesMapper mapper(DbSession session) {
- return session.getMapper(ScaDependenciesMapper.class);
- }
-
- public void insert(DbSession session, ScaDependencyDto scaDependencyDto) {
- mapper(session).insert(scaDependencyDto);
- }
-
- public void deleteByUuid(DbSession session, String uuid) {
- mapper(session).deleteByUuid(uuid);
- }
-
- public Optional<ScaDependencyDto> selectByUuid(DbSession dbSession, String uuid) {
- return Optional.ofNullable(mapper(dbSession).selectByUuid(uuid));
- }
-
- /**
- * Retrieves all dependencies with a specific branch UUID, no other filtering is done by this method.
- */
- public List<ScaDependencyDto> selectByBranchUuid(DbSession dbSession, String branchUuid) {
- return mapper(dbSession).selectByBranchUuid(branchUuid);
- }
-
- public List<ScaDependencyDto> selectByQuery(DbSession session, ScaDependenciesQuery scaDependenciesQuery, Pagination pagination) {
- return mapper(session).selectByQuery(scaDependenciesQuery, pagination);
- }
-
- public int countByQuery(DbSession session, ScaDependenciesQuery scaDependenciesQuery) {
- return mapper(session).countByQuery(scaDependenciesQuery);
- }
-
- public void update(DbSession session, ScaDependencyDto scaDependencyDto) {
- mapper(session).update(scaDependencyDto);
- }
-
- public List<ScaDependencyDto> selectByReleaseUuids(DbSession dbSession, Collection<String> releaseUuids) {
- return mapper(dbSession).selectByReleaseUuids(releaseUuids);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesMapper.java
deleted file mode 100644
index 9113c76a906..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesMapper.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
-import org.sonar.db.Pagination;
-
-public interface ScaDependenciesMapper {
- void insert(ScaDependencyDto dto);
-
- void deleteByUuid(String uuid);
-
- ScaDependencyDto selectByUuid(String uuid);
-
- List<ScaDependencyDto> selectByBranchUuid(String branchUuid);
-
- List<ScaDependencyDto> selectByQuery(@Param("query") ScaDependenciesQuery query, @Param("pagination") Pagination pagination);
-
- List<ScaDependencyDto> selectByReleaseUuids(Collection<String> releaseUuids);
-
- void update(ScaDependencyDto dto);
-
- int countByQuery(@Param("query") ScaDependenciesQuery query);
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesQuery.java
deleted file mode 100644
index 459fcf7a50e..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependenciesQuery.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.Locale;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import static org.sonar.db.DaoUtils.buildLikeValue;
-import static org.sonar.db.WildcardPosition.AFTER;
-
-public record ScaDependenciesQuery(
- String branchUuid,
- @Nullable Boolean direct,
- @Nullable List<String> packageManagers,
- @Nullable String query) {
-
- /**
- * Used by MyBatis mapper
- */
- @CheckForNull
- public String likeQuery() {
- return query == null ? null : buildLikeValue(query.toLowerCase(Locale.ENGLISH), AFTER);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyDto.java
deleted file mode 100644
index 2b5f59800bc..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyDto.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import com.google.gson.Gson;
-import java.util.List;
-import javax.annotation.Nullable;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Represents a Software Composition Analysis (SCA) dependency, associated with a component.
- * The component will be a package component nested inside a project branch component.
- * <p>
- * One of userDependencyFilePath or lockfileDependencyFilePath should not be null.
- *</p>
- * <p>
- * A dependency is a "mention" of a release in a project, with a scope and a specific
- * dependency file that it was mentioned in.
- *</p>
- * @param uuid primary key
- * @param scaReleaseUuid the UUID of the SCA release that this dependency refers to
- * @param direct is this a direct dependency of the project
- * @param scope the scope of the dependency e.g. "development"
- * @param productionScope whether the scope appears to be a production scope or test scope
- * @param userDependencyFilePath path to the user-editable file where the dependency was found ("manifest") e.g. package.json
- * @param lockfileDependencyFilePath path to the machine-maintained lockfile where the dependency was found e.g. package-lock.json
- * @param chains a list of the purl chains that require the dependency, stored as JSON string, e.g. [["pkg:npm/foo@1.0.0", ...], ...]
- * @param newInPullRequest is it newly-added vs. target branch in this PR
- * @param createdAt timestamp of creation
- * @param updatedAt timestamp of most recent update
- */
-public record ScaDependencyDto(
- String uuid,
- String scaReleaseUuid,
- boolean direct,
- String scope,
- boolean productionScope,
- @Nullable String userDependencyFilePath,
- @Nullable String lockfileDependencyFilePath,
- @Nullable List<List<String>> chains,
- boolean newInPullRequest,
- long createdAt,
- long updatedAt) {
-
- // These need to be in sync with the database but because the db migration module and this module don't
- // depend on each other, we can't make one just refer to the other.
- public static final int SCOPE_MAX_LENGTH = 100;
- public static final int DEPENDENCY_FILE_PATH_MAX_LENGTH = 1000;
-
- private static final Gson GSON = new Gson();
-
- public ScaDependencyDto {
- // We want these to raise errors and not silently put junk values in the db
- checkLength(scope, SCOPE_MAX_LENGTH, "scope");
- checkLength(userDependencyFilePath, DEPENDENCY_FILE_PATH_MAX_LENGTH, "userDependencyFilePath");
- checkLength(lockfileDependencyFilePath, DEPENDENCY_FILE_PATH_MAX_LENGTH, "lockfileDependencyFilePath");
- if (userDependencyFilePath == null && lockfileDependencyFilePath == null) {
- throw new IllegalArgumentException("One of userDependencyFilePath or lockfileDependencyFilePath should not be null");
- }
- }
-
- private static void checkLength(@Nullable String value, int maxLength, String name) {
- if (value != null) {
- checkArgument(value.length() <= maxLength, "Maximum length of %s is %s: %s", name, maxLength, value);
- }
- }
-
- public String getChainsJson() {
- return chains == null ? null : GSON.toJson(chains);
- }
-
- /**
- * Returns the userDependencyFilePath if it is not null, otherwise returns the lockfileDependencyFilePath.
- *
- * @return a non-null file path
- */
- public String primaryDependencyFilePath() {
- return userDependencyFilePath != null ? userDependencyFilePath : lockfileDependencyFilePath;
- }
-
- /**
- * Returns an object whose .equals and .hashCode would match that of another ScaDependencyDto's
- * identity() if the two ScaDependencyDto would count as duplicates within the sca_dependencies table.
- * This is different from the DTOs themselves being equal because some fields do not count in
- * the identity of the row, and can be updated while preserving the identity. The method just
- * returns Object and not a type, because it exists just to call .equals and .hashCode on.
- *
- * @return an object to be used for hashing and comparing ScaDependencyDto instances for identity
- */
- public Identity identity() {
- return new IdentityImpl(this);
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setUuid(this.uuid)
- .setScaReleaseUuid(this.scaReleaseUuid)
- .setDirect(this.direct)
- .setScope(this.scope)
- .setProductionScope(this.productionScope)
- .setUserDependencyFilePath(this.userDependencyFilePath)
- .setLockfileDependencyFilePath(this.lockfileDependencyFilePath)
- .setChains(this.chains)
- .setNewInPullRequest(this.newInPullRequest)
- .setCreatedAt(this.createdAt)
- .setUpdatedAt(this.updatedAt);
- }
-
- public interface Identity {
- /**
- * Return a new identity with a different scaReleaseUuid
- * @param scaReleaseUuid to swap in to the identity
- * @return an object to be used for hashing and comparing ScaDependencyDto instances for identity
- */
- Identity withScaReleaseUuid(String scaReleaseUuid);
- }
-
- /** This object has the subset of fields that have to be unique in a ScaDependencyDto,
- * so if this is the same for two ScaDependencyDto, we can update rather than insert
- * those ScaDependencyDto. Conceptually, sca_dependencies table could have a unique
- * constraint on these fields, though in practice it does not.
- *<p>
- * This class is private because it is exclusively used for .equals and .hashCode
- * so nobody cares about it otherwise.
- *</p>
- */
- private record IdentityImpl(String scaReleaseUuid,
- boolean direct,
- String scope,
- @Nullable String userDependencyFilePath,
- @Nullable String lockfileDependencyFilePath) implements Identity {
-
- IdentityImpl(ScaDependencyDto dto) {
- this(dto.scaReleaseUuid(), dto.direct(), dto.scope(), dto.userDependencyFilePath(), dto.lockfileDependencyFilePath());
- }
-
- @Override
- public IdentityImpl withScaReleaseUuid(String scaReleaseUuid) {
- return new IdentityImpl(scaReleaseUuid, direct, scope, userDependencyFilePath, lockfileDependencyFilePath);
- }
- }
-
- public static class Builder {
- private String uuid;
- private String scaReleaseUuid;
- private boolean direct;
- private String scope;
- private boolean productionScope;
- private String userDependencyFilePath;
- private String lockfileDependencyFilePath;
- private List<List<String>> chains;
- private boolean newInPullRequest;
- private long createdAt;
- private long updatedAt;
-
- public Builder setUuid(String uuid) {
- this.uuid = uuid;
- return this;
- }
-
- public Builder setScaReleaseUuid(String scaReleaseUuid) {
- this.scaReleaseUuid = scaReleaseUuid;
- return this;
- }
-
- public Builder setDirect(boolean direct) {
- this.direct = direct;
- return this;
- }
-
- public Builder setScope(String scope) {
- this.scope = scope;
- return this;
- }
-
- public Builder setProductionScope(boolean productionScope) {
- this.productionScope = productionScope;
- return this;
- }
-
- public Builder setUserDependencyFilePath(@Nullable String dependencyFilePath) {
- this.userDependencyFilePath = dependencyFilePath;
- return this;
- }
-
- public Builder setLockfileDependencyFilePath(@Nullable String dependencyFilePath) {
- this.lockfileDependencyFilePath = dependencyFilePath;
- return this;
- }
-
- public Builder setChains(@Nullable List<List<String>> chains) {
- this.chains = chains;
- return this;
- }
-
- public Builder setNewInPullRequest(boolean newInPullRequest) {
- this.newInPullRequest = newInPullRequest;
- return this;
- }
-
- public Builder setCreatedAt(long createdAt) {
- this.createdAt = createdAt;
- return this;
- }
-
- public Builder setUpdatedAt(long updatedAt) {
- this.updatedAt = updatedAt;
- return this;
- }
-
- public ScaDependencyDto build() {
- return new ScaDependencyDto(
- uuid, scaReleaseUuid, direct, scope, productionScope, userDependencyFilePath, lockfileDependencyFilePath, chains, newInPullRequest, createdAt, updatedAt);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyReleaseDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyReleaseDto.java
deleted file mode 100644
index 131a84bf1c0..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaDependencyReleaseDto.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import javax.annotation.Nullable;
-
-/**
- * This DTO represents the join of sca_dependencies and sca_releases, and is "read only"
- * (it cannot be inserted, it would only be a query result).
- *
- * @param dependencyUuid uuid of the sca_dependencies row
- * @param releaseUuid uuid of the sca_releases row
- * @param componentUuid uuid of the component both rows were associated with
- * @param direct is it a direct dep
- * @param scope scope/type of the dep like "compile"
- * @param userDependencyFilePath which manifest file (e.g. package.json)
- * @param lockfileDependencyFilePath which lockfile (e.g. package-lock.json)
- * @param chains chains that brought the dependency in, e.g. [["pkg:npm/foo@1.0.0", ...], ...]
- * @param packageUrl PURL specification URL
- * @param packageManager package manager
- * @param packageName name of package
- * @param version version
- * @param licenseExpression SPDX license expression
- * @param known was the package known to Sonar
- */
-public record ScaDependencyReleaseDto(String dependencyUuid,
- String releaseUuid,
- String componentUuid,
- boolean direct,
- String scope,
- @Nullable String userDependencyFilePath,
- @Nullable String lockfileDependencyFilePath,
- @Nullable List<List<String>> chains,
- String packageUrl,
- PackageManager packageManager,
- String packageName,
- String version,
- String licenseExpression,
- boolean known) {
-
- public ScaDependencyReleaseDto(ScaDependencyDto dependency, ScaReleaseDto release) {
- this(
- dependency.uuid(),
- release.uuid(),
- release.componentUuid(),
- dependency.direct(),
- dependency.scope(),
- dependency.userDependencyFilePath(),
- dependency.lockfileDependencyFilePath(),
- dependency.chains(),
- release.packageUrl(),
- release.packageManager(),
- release.packageName(),
- release.version(),
- release.licenseExpression(),
- release.known());
- if (!dependency.scaReleaseUuid().equals(release.uuid())) {
- throw new IllegalArgumentException("Dependency and release UUIDs should match");
- }
- }
-
- public String primaryDependencyFilePath() {
- return userDependencyFilePath != null ? userDependencyFilePath : lockfileDependencyFilePath;
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueDto.java
deleted file mode 100644
index c1d28a4916b..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueDto.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * This table has GLOBAL rows spanning all analysis runs. For a given notional
- * problem there will be ONE row. A notional problem could be a particular
- * vulnerability "CVE-12345" or a particular license rule like "GPL-3.0 is prohibited".
- * The purpose of this table is to assign a uuid to that notional problem.
- * Because the uuid must be globally unique for the same problem, there is a
- * unique constraint across all the columns.
- * <p>
- * NULL columns cannot participate in unique constraints on all database backends,
- * so irrelevant columns for a particular issue type are set to empty string instead of NULL.
- * </p>
- * <p>
- * The columns in this table should be those that establish the identity of the issue
- * and no more. See {@link ScaIssueType} which has a method returning the proper
- * ScaIssueDto for each issue type. Those same columns without uuid and timestamps
- * are also in the {@link DefaultScaIssueIdentity} type.
- * </p>
- * <p>
- * The packageUrl may or may not include a version number, depending on whether
- * the issue type is per-package or per-release.
- * </p>
- */
-public record ScaIssueDto(
- String uuid,
- ScaIssueType scaIssueType,
- String packageUrl,
- String vulnerabilityId,
- String spdxLicenseId,
- long createdAt,
- long updatedAt) implements ScaIssueIdentity {
-
- /**
- * Value that represents "does not apply" in one of the identity columns.
- * <p>
- * You know you are going to ask, so the reason we can't use empty string
- * is that Oracle thinks empty strings are NULL. And the reason we can't
- * use NULL is that not all databases have a way to consider NULL as a
- * value in a unique constraint. So anyway, just go with it.
- * </p>
- * <p>
- * This string should be invalid as an actual value for all of the
- * columns, so it's not a package url, not a vulnerability ID,
- * and not a SPDX license ID.
- * </p>
- */
- public static final String NULL_VALUE = "-";
-
- // these need to match what's in the db
- public static final int SCA_ISSUE_TYPE_MAX_LENGTH = 40;
- public static final int PACKAGE_URL_MAX_LENGTH = 400;
- public static final int VULNERABILITY_ID_MAX_LENGTH = 63;
- public static final int SPDX_LICENSE_ID_MAX_LENGTH = 127;
-
- public ScaIssueDto {
- // We want these to raise errors and not silently put junk values in the db
- checkIdentityColumn(packageUrl, PACKAGE_URL_MAX_LENGTH, "packageUrl");
- checkIdentityColumn(vulnerabilityId, VULNERABILITY_ID_MAX_LENGTH, "vulnerabilityId");
- checkIdentityColumn(spdxLicenseId, SPDX_LICENSE_ID_MAX_LENGTH, "spdxLicenseId");
- }
-
- public ScaIssueDto(String uuid, ScaIssueIdentity identity, long createdAt, long updatedAt) {
- this(uuid, identity.scaIssueType(), identity.packageUrl(), identity.vulnerabilityId(), identity.spdxLicenseId(), createdAt, updatedAt);
- }
-
- private static void checkIdentityColumn(String value, int maxLength, String name) {
- checkArgument(value != null, "Column %s cannot be null", name);
- checkArgument(!value.isBlank(), "Column %s cannot be blank, use ScaIssueDto.NULL_VALUE", name);
- checkArgument(value.length() <= maxLength, "Maximum length of %s is %s: %s", name, maxLength, value);
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setUuid(uuid)
- .setScaIssueType(scaIssueType)
- .setPackageUrl(packageUrl)
- .setVulnerabilityId(vulnerabilityId)
- .setSpdxLicenseId(spdxLicenseId)
- .setCreatedAt(createdAt)
- .setUpdatedAt(updatedAt);
- }
-
- public static class Builder {
- private String uuid;
- private ScaIssueType scaIssueType;
- private String packageUrl;
- private String vulnerabilityId;
- private String spdxLicenseId;
- private long createdAt;
- private long updatedAt;
-
- public Builder setUuid(String uuid) {
- this.uuid = uuid;
- return this;
- }
-
- public Builder setScaIssueType(ScaIssueType scaIssueType) {
- this.scaIssueType = scaIssueType;
- return this;
- }
-
- public Builder setPackageUrl(String packageUrl) {
- this.packageUrl = packageUrl;
- return this;
- }
-
- public Builder setVulnerabilityId(String vulnerabilityId) {
- this.vulnerabilityId = vulnerabilityId;
- return this;
- }
-
- public Builder setSpdxLicenseId(String spdxLicenseId) {
- this.spdxLicenseId = spdxLicenseId;
- return this;
- }
-
- public Builder setCreatedAt(long createdAt) {
- this.createdAt = createdAt;
- return this;
- }
-
- public Builder setUpdatedAt(long updatedAt) {
- this.updatedAt = updatedAt;
- return this;
- }
-
- public ScaIssueDto build() {
- return new ScaIssueDto(uuid, scaIssueType, packageUrl, vulnerabilityId, spdxLicenseId, createdAt, updatedAt);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueIdentity.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueIdentity.java
deleted file mode 100644
index fc101ea46f6..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueIdentity.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-/**
- * <p>
- * Contains those fields which are in the unique index of the sca_issues table.
- * This will be a subset of fields in the {@link ScaIssueDto} class.
- * These fields are used to assign a global uuid to each issue, such as
- * each vulnerability or each prohibited license.
- * </p>
- * <p>
- * None of the fields are nullable; if not relevant to the issue's identity
- * they must be empty string instead. Nulls are not usable in a unique index
- * in standard sql.
- * </p>
- * <p>
- * Implementations of this interface are allowed to include fields other than
- * the identity fields in their equals and hashCode, so it is probably not
- * appropriate to use instances of this interface as a hash key. You can likely
- * use a concrete implementation of this interface as a hash key, though.
- * </p>
- */
-public interface ScaIssueIdentity {
- ScaIssueType scaIssueType();
-
- String packageUrl();
-
- String vulnerabilityId();
-
- String spdxLicenseId();
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDetailsDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDetailsDto.java
deleted file mode 100644
index 5ea5e9f49a1..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDetailsDto.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.math.BigDecimal;
-import java.util.List;
-import javax.annotation.Nullable;
-import org.sonar.api.utils.DateUtils;
-
-/**
- * <p>A "read-only" DTO used to query the join of sca_issues_releases, sca_issues, and sca_*_issues.
- * This is used to return all the details shown in a list of issues in the UX.
- * This DTO and its mapper are an optimization, to do more work in SQL and
- * avoid "joining in Java."
- * </p>
- * <p>
- * The uuids in the DTOs must all correspond, or some kind of bug is happening.
- * </p>
- * <p>
- * issueReleaseUuid is passed in separately because it allows mybatis to have an ID for the DTO,
- * which it then uses for caching and lookup instead of hashing the whole object.
- * </p>
- */
-public record ScaIssueReleaseDetailsDto(
- String issueReleaseUuid,
- ScaIssueReleaseDto issueReleaseDto,
- ScaIssueDto issueDto,
- ScaReleaseDto releaseDto,
- @Nullable ScaVulnerabilityIssueDto vulnerabilityIssueDto) {
-
- public ScaIssueReleaseDetailsDto {
- // the issueReleaseUuid is separate so mybatis can use it for instance
- // identity, but it must match the UUID in the issueReleaseDto
- // and is straight-up redundant.
- if (!issueReleaseUuid.equals(issueReleaseDto.uuid())) {
- throw new IllegalArgumentException("issueReleaseUuid must match issueReleaseDto.uuid()");
- }
- if (!issueDto.uuid().equals(issueReleaseDto.scaIssueUuid())) {
- throw new IllegalArgumentException("issueDto.uuid() must match issueReleaseDto.scaIssueUuid()");
- }
- if (!releaseDto.uuid().equals(issueReleaseDto.scaReleaseUuid())) {
- throw new IllegalArgumentException("releaseDto.uuid() must match issueReleaseDto.scaReleaseUuid()");
- }
- if (vulnerabilityIssueDto != null && !vulnerabilityIssueDto.uuid().equals(issueDto.uuid())) {
- throw new IllegalArgumentException("vulnerabilityIssueDto.uuid() must match issueDto.uuid()");
- }
- }
-
- // DateUtils says that this returns an RFC 822 timestamp
- // but it is really a ISO 8601 timestamp.
- public String createdAtIso8601() {
- return DateUtils.formatDateTime(issueReleaseDto.createdAt());
- }
-
- public ScaSeverity severity() {
- return issueReleaseDto.severity();
- }
-
- public String issueUuid() {
- return issueDto.uuid();
- }
-
- public String releaseUuid() {
- return releaseDto.uuid();
- }
-
- public ScaIssueType scaIssueType() {
- return issueDto.scaIssueType();
- }
-
- public boolean newInPullRequest() {
- return releaseDto.newInPullRequest();
- }
-
- public String version() {
- return releaseDto.version();
- }
-
- /**
- * Returns the versioned package URL of the release
- */
- public String releasePackageUrl() {
- return releaseDto.packageUrl();
- }
-
- /** Returns the unversioned package URL of the security vulnerability,
- * or ScaIssueDto::NULL_VALUE if the issue is not a vulnerability.
- */
- public String issuePackageUrl() {
- return issueDto.packageUrl();
- }
-
- /**
- * Returns the vulnerability ID of the issue, or ScaIssueDto::NULL_VALUE if the issue is not a vulnerability.
- */
- public String vulnerabilityId() {
- return issueDto.vulnerabilityId();
- }
-
- /** Returns the SPDX license ID of the issue, or ScaIssueDto::NULL_VALUE if the issue is not a license issue. */
- public String spdxLicenseId() {
- return issueDto.spdxLicenseId();
- }
-
- /** Returns the base severity of the vulnerability, or null if the issue is not a vulnerability. */
- public @Nullable ScaSeverity vulnerabilityBaseSeverity() {
- return vulnerabilityIssueDto == null ? null : vulnerabilityIssueDto.baseSeverity();
- }
-
- /** Returns the CWE IDs of the vulnerability, or null if the issue is not a vulnerability. */
- public @Nullable List<String> cweIds() {
- return vulnerabilityIssueDto == null ? null : vulnerabilityIssueDto.cweIds();
- }
-
- /** Returns the CVSS score of the vulnerability, or null if the issue is not a vulnerability or does not have a CVSS score. */
- public @Nullable BigDecimal cvssScore() {
- return vulnerabilityIssueDto == null ? null : vulnerabilityIssueDto.cvssScore();
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setIssueReleaseDto(issueReleaseDto)
- .setIssueDto(issueDto)
- .setReleaseDto(releaseDto)
- .setVulnerabilityIssueDto(vulnerabilityIssueDto);
- }
-
- public static class Builder {
- private ScaIssueReleaseDto issueReleaseDto;
- private ScaIssueDto issueDto;
- private ScaReleaseDto releaseDto;
- @Nullable
- private ScaVulnerabilityIssueDto vulnerabilityIssueDto;
-
- public Builder setIssueReleaseDto(ScaIssueReleaseDto issueReleaseDto) {
- this.issueReleaseDto = issueReleaseDto;
- return this;
- }
-
- public Builder setIssueDto(ScaIssueDto issueDto) {
- this.issueDto = issueDto;
- return this;
- }
-
- public Builder setReleaseDto(ScaReleaseDto releaseDto) {
- this.releaseDto = releaseDto;
- return this;
- }
-
- public Builder setVulnerabilityIssueDto(@Nullable ScaVulnerabilityIssueDto vulnerabilityIssueDto) {
- this.vulnerabilityIssueDto = vulnerabilityIssueDto;
- return this;
- }
-
- public ScaIssueReleaseDetailsDto build() {
- return new ScaIssueReleaseDetailsDto(issueReleaseDto.uuid(), issueReleaseDto, issueDto, releaseDto, vulnerabilityIssueDto);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDto.java
deleted file mode 100644
index 74f4979b0fa..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueReleaseDto.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-/**
- * Represents a many-to-many join between Software Composition Analysis (SCA) issue and a SCA release.
- *
- * @param uuid primary key
- * @param scaIssueUuid the UUID of the SCA issue
- * @param scaReleaseUuid the UUID of the SCA release
- * @param severity the severity of the issue
- * @param createdAt timestamp of creation
- * @param updatedAt timestamp of most recent update
- */
-public record ScaIssueReleaseDto(
- String uuid,
- String scaIssueUuid,
- String scaReleaseUuid,
- ScaSeverity severity,
- long createdAt,
- long updatedAt) {
-
- /**
- * This constructor makes it a little harder to get the issue and release uuids backward,
- * if you have the DTOs around to use it.
- */
- public ScaIssueReleaseDto(String uuid, ScaIssueDto scaIssueDto, ScaReleaseDto scaReleaseDto, ScaSeverity severity, long createdAt, long updatedAt) {
- this(uuid, scaIssueDto.uuid(), scaReleaseDto.uuid(), severity, createdAt, updatedAt);
- }
-
- public int severitySortKey() {
- return severity.databaseSortKey();
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setUuid(this.uuid)
- .setScaIssueUuid(this.scaIssueUuid)
- .setScaReleaseUuid(this.scaReleaseUuid)
- .setSeverity(this.severity)
- .setCreatedAt(this.createdAt)
- .setUpdatedAt(this.updatedAt);
- }
-
- /**
- * Returns an object whose .equals and .hashCode would match that of another ScaIssueReleaseDto's
- * identity() if the two ScaIssueReleaseDto would count as duplicates within the sca_issues_releases
- * table.
- * This is different from the DTOs themselves being equal because some fields do not count in
- * the identity of the row, and can be updated while preserving the identity. The method just
- * returns Object and not a type, because it exists just to call .equals and .hashCode on.
- *
- * @return an object to be used for hashing and comparing ScaReleaseDto instances for identity
- */
- public Identity identity() {
- return new IdentityImpl(this);
- }
-
- public interface Identity {
- }
-
- private record IdentityImpl(String scaIssueUuid, String scaReleaseUuid) implements Identity {
- IdentityImpl(ScaIssueReleaseDto dto) {
- this(dto.scaIssueUuid(), dto.scaReleaseUuid());
- }
- }
-
- public static class Builder {
- private String uuid;
- private String scaIssueUuid;
- private String scaReleaseUuid;
- private ScaSeverity severity;
- private long createdAt;
- private long updatedAt;
-
- public Builder setUuid(String uuid) {
- this.uuid = uuid;
- return this;
- }
-
- public Builder setScaIssueUuid(String scaIssueUuid) {
- this.scaIssueUuid = scaIssueUuid;
- return this;
- }
-
- public Builder setScaReleaseUuid(String scaReleaseUuid) {
- this.scaReleaseUuid = scaReleaseUuid;
- return this;
- }
-
- public Builder setSeverity(ScaSeverity severity) {
- this.severity = severity;
- return this;
- }
-
- public Builder setCreatedAt(long createdAt) {
- this.createdAt = createdAt;
- return this;
- }
-
- public Builder setUpdatedAt(long updatedAt) {
- this.updatedAt = updatedAt;
- return this;
- }
-
- public ScaIssueReleaseDto build() {
- return new ScaIssueReleaseDto(
- uuid, scaIssueUuid, scaReleaseUuid, severity, createdAt, updatedAt);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueType.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueType.java
deleted file mode 100644
index 0dcd8825622..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssueType.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-/**
- * The type of ScaIssue (not the type of generic Sonar issue).
- */
-public enum ScaIssueType {
- VULNERABILITY,
- PROHIBITED_LICENSE;
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesDao.java
deleted file mode 100644
index 93c527cff7a..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesDao.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-
-public class ScaIssuesDao implements Dao {
-
- private static ScaIssuesMapper mapper(DbSession session) {
- return session.getMapper(ScaIssuesMapper.class);
- }
-
- public void insert(DbSession session, ScaIssueDto scaIssueDto) {
- mapper(session).insert(scaIssueDto);
- }
-
- public Optional<ScaIssueDto> selectByUuid(DbSession dbSession, String uuid) {
- return Optional.ofNullable(mapper(dbSession).selectByUuid(uuid));
- }
-
- public List<ScaIssueDto> selectByUuids(DbSession dbSession, Collection<String> uuids) {
- return mapper(dbSession).selectByUuids(uuids);
- }
-
- public Optional<String> selectUuidByValue(DbSession dbSession, ScaIssueIdentity scaIssueIdentity) {
- return mapper(dbSession).selectUuidByValue(scaIssueIdentity);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesMapper.java
deleted file mode 100644
index 0ebe2c02056..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-
-public interface ScaIssuesMapper {
- void insert(ScaIssueDto dto);
-
- ScaIssueDto selectByUuid(String uuid);
-
- List<ScaIssueDto> selectByUuids(Collection<String> uuids);
-
- Optional<String> selectUuidByValue(ScaIssueIdentity scaIssueIdentity);
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDao.java
deleted file mode 100644
index 710deb12d2c..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDao.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-
-public class ScaIssuesReleasesDao implements Dao {
-
- private static ScaIssuesReleasesMapper mapper(DbSession session) {
- return session.getMapper(ScaIssuesReleasesMapper.class);
- }
-
- public void insert(DbSession session, ScaIssueReleaseDto scaIssueReleaseDto) {
- mapper(session).insert(scaIssueReleaseDto);
- }
-
- public void update(DbSession session, ScaIssueReleaseDto scaIssueReleaseDto) {
- mapper(session).update(scaIssueReleaseDto);
- }
-
- public void deleteByUuid(DbSession session, String uuid) {
- mapper(session).deleteByUuid(uuid);
- }
-
- public List<ScaIssueReleaseDto> selectByBranchUuid(DbSession dbSession, String branchUuid) {
- return mapper(dbSession).selectByBranchUuid(branchUuid);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDao.java
deleted file mode 100644
index 31a0d5dd611..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDao.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-import org.sonar.db.Pagination;
-
-public class ScaIssuesReleasesDetailsDao implements Dao {
-
- private static ScaIssuesReleasesDetailsMapper mapper(DbSession session) {
- return session.getMapper(ScaIssuesReleasesDetailsMapper.class);
- }
-
- /**
- * Retrieves all issues with a specific branch UUID, no other filtering is done by this method.
- */
- public List<ScaIssueReleaseDetailsDto> selectByBranchUuid(DbSession dbSession, String branchUuid, Pagination pagination) {
- return mapper(dbSession).selectByBranchUuid(branchUuid, pagination);
- }
-
- /**
- * Retrieves all issues with a specific release UUID, no other filtering is done by this method.
- */
- public List<ScaIssueReleaseDetailsDto> selectByReleaseUuid(DbSession dbSession, String releaseUuid) {
- return mapper(dbSession).selectByReleaseUuid(releaseUuid);
- }
-
- /**
- * Counts all issues with a specific branch UUID, no other filtering is done by this method.
- */
- public int countByBranchUuid(DbSession dbSession, String branchUuid) {
- return mapper(dbSession).countByBranchUuid(branchUuid);
- }
-
- public List<ScaIssueReleaseDetailsDto> selectByQuery(DbSession dbSession, ScaIssuesReleasesDetailsQuery query, Pagination pagination) {
- return mapper(dbSession).selectByQuery(query, pagination);
- }
-
- public int countByQuery(DbSession dbSession, ScaIssuesReleasesDetailsQuery query) {
- return mapper(dbSession).countByQuery(query);
- }
-
- /**
- * Retrieves a single issue with a specific release.
- */
- public ScaIssueReleaseDetailsDto selectByScaIssueReleaseUuid(DbSession dbSession, String scaIssueReleaseUuid) {
- return mapper(dbSession).selectByScaIssueReleaseUuid(scaIssueReleaseUuid);
- }
-
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.java
deleted file mode 100644
index 35d6608322d..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
-import org.sonar.db.Pagination;
-
-public interface ScaIssuesReleasesDetailsMapper {
- List<ScaIssueReleaseDetailsDto> selectByBranchUuid(@Param("branchUuid") String branchUuid, @Param("pagination") Pagination pagination);
-
- ScaIssueReleaseDetailsDto selectByScaIssueReleaseUuid(String scaIssueReleaseUuid);
-
- List<ScaIssueReleaseDetailsDto> selectByReleaseUuid(String releaseUuid);
-
- int countByBranchUuid(String branchUuid);
-
- List<ScaIssueReleaseDetailsDto> selectByQuery(@Param("query") ScaIssuesReleasesDetailsQuery query, @Param("pagination") Pagination pagination);
-
- int countByQuery(@Param("query") ScaIssuesReleasesDetailsQuery query);
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQuery.java
deleted file mode 100644
index 17397e97c34..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQuery.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.Objects;
-import java.util.Optional;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-import org.sonar.db.WildcardPosition;
-
-import static org.sonar.db.DaoUtils.buildLikeValue;
-import static org.sonar.db.WildcardPosition.BEFORE_AND_AFTER;
-
-public record ScaIssuesReleasesDetailsQuery(
- String branchUuid,
- Sort sort,
- @Nullable Boolean direct,
- @Nullable Boolean productionScope,
- @Nullable String vulnerabilityIdSubstring,
- @Nullable String packageNameSubstring,
- @Nullable Boolean newInPullRequest,
- @Nullable List<ScaIssueType> types,
- @Nullable List<ScaSeverity> severities,
- @Nullable List<PackageManager> packageManagers) {
-
- public ScaIssuesReleasesDetailsQuery {
- Objects.requireNonNull(branchUuid);
- Objects.requireNonNull(sort);
- }
-
- /** For use in the mapper after <code>upper(vulnerabilityId) LIKE</code>,
- * and per the {@link org.sonar.db.DaoUtils#buildLikeValue(String, WildcardPosition)}}
- * docs, we have to say <code>ESCAPE '/'</code>. We are using uppercase because
- * most ids will be uppercase already.
- */
- @CheckForNull
- public String vulnerabilityIdUppercaseEscapedAsLikeValue() {
- return vulnerabilityIdSubstring == null ? null : buildLikeValue(vulnerabilityIdSubstring.toUpperCase(Locale.ROOT), BEFORE_AND_AFTER);
- }
-
- /** For use in the mapper after <code>lower(packageName) LIKE</code>,
- * and per the {@link org.sonar.db.DaoUtils#buildLikeValue(String, WildcardPosition)}}
- * docs, we have to say <code>ESCAPE '/'</code>. We are using lowercase because most
- * package names will be all or mostly lowercase already.
- */
- @CheckForNull
- public String packageNameLowercaseEscapedAsLikeValue() {
- return packageNameSubstring == null ? null : buildLikeValue(packageNameSubstring.toLowerCase(Locale.ROOT), BEFORE_AND_AFTER);
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setBranchUuid(branchUuid)
- .setSort(sort)
- .setDirect(direct)
- .setProductionScope(productionScope)
- .setVulnerabilityIdSubstring(vulnerabilityIdSubstring)
- .setPackageNameSubstring(packageNameSubstring)
- .setNewInPullRequest(newInPullRequest)
- .setTypes(types)
- .setSeverities(severities)
- .setPackageManagers(packageManagers);
- }
-
- public enum Sort {
- IDENTITY_ASC("+identity"),
- IDENTITY_DESC("-identity"),
- SEVERITY_ASC("+severity"),
- SEVERITY_DESC("-severity"),
- CVSS_SCORE_ASC("+cvssScore"),
- CVSS_SCORE_DESC("-cvssScore");
-
- private final String queryParameterValue;
-
- Sort(String queryParameterValue) {
- this.queryParameterValue = queryParameterValue;
- }
-
- /**
- * Convert a query parameter value to the corresponding {@link Sort} enum value.
- * The passed-in string must not be null.
- */
- public static Optional<Sort> fromQueryParameterValue(String queryParameterValue) {
- for (Sort sort : values()) {
- if (sort.queryParameterValue.equals(queryParameterValue)) {
- return Optional.of(sort);
- }
- }
- return Optional.empty();
- }
-
- public String queryParameterValue() {
- return queryParameterValue;
- }
- }
-
- public static class Builder {
- private String branchUuid;
- private Sort sort;
- private Boolean direct;
- private Boolean productionScope;
- private String vulnerabilityIdSubstring;
- private String packageNameSubstring;
- private Boolean newInPullRequest;
- private List<ScaIssueType> types;
- private List<ScaSeverity> severities;
- private List<PackageManager> packageManagers;
-
- public Builder setBranchUuid(String branchUuid) {
- this.branchUuid = branchUuid;
- return this;
- }
-
- public Builder setSort(Sort sort) {
- this.sort = sort;
- return this;
- }
-
- public Builder setDirect(@Nullable Boolean direct) {
- this.direct = direct;
- return this;
- }
-
- public Builder setProductionScope(@Nullable Boolean productionScope) {
- this.productionScope = productionScope;
- return this;
- }
-
- public Builder setVulnerabilityIdSubstring(@Nullable String vulnerabilityIdSubstring) {
- this.vulnerabilityIdSubstring = vulnerabilityIdSubstring;
- return this;
- }
-
- public Builder setPackageNameSubstring(@Nullable String packageNameSubstring) {
- this.packageNameSubstring = packageNameSubstring;
- return this;
- }
-
- public Builder setNewInPullRequest(@Nullable Boolean newInPullRequest) {
- this.newInPullRequest = newInPullRequest;
- return this;
- }
-
- public Builder setTypes(@Nullable List<ScaIssueType> types) {
- this.types = types;
- return this;
- }
-
- public Builder setSeverities(@Nullable List<ScaSeverity> severities) {
- this.severities = severities;
- return this;
- }
-
- public Builder setPackageManagers(@Nullable List<PackageManager> packageManagers) {
- this.packageManagers = packageManagers;
- return this;
- }
-
- public ScaIssuesReleasesDetailsQuery build() {
- return new ScaIssuesReleasesDetailsQuery(branchUuid, sort, direct, productionScope, vulnerabilityIdSubstring,
- packageNameSubstring, newInPullRequest, types, severities, packageManagers);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesMapper.java
deleted file mode 100644
index 58c40fd1435..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaIssuesReleasesMapper.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-
-public interface ScaIssuesReleasesMapper {
- void insert(ScaIssueReleaseDto dto);
-
- void update(ScaIssueReleaseDto dto);
-
- void deleteByUuid(String uuid);
-
- List<ScaIssueReleaseDto> selectByBranchUuid(String branchUuid);
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseByPackageManagerCountDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseByPackageManagerCountDto.java
deleted file mode 100644
index 35f2625f7c2..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseByPackageManagerCountDto.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-public record ScaReleaseByPackageManagerCountDto(String packageManager, int releaseCount) {
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDependenciesDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDependenciesDto.java
deleted file mode 100644
index 82204443c5a..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDependenciesDto.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * This DTO represents the join of sca_releases and sca_dependencies, and is "read only"
- * (it cannot be inserted, it would only be a query result).
- * <p>
- * The releaseUuid must match the uuid in the release DTO, it is duplicated to help out mybatis
- * in caching and lookup (allow the mapper for this DTO have an idArg).
- * </p>
- * @param releaseUuid uuid of the releaseDto
- * @param release release
- * @param dependencies dependency DTOs
- */
-public record ScaReleaseDependenciesDto(
- String releaseUuid,
- ScaReleaseDto release,
- List<ScaDependencyDto> dependencies) {
-
- public ScaReleaseDependenciesDto {
- Objects.requireNonNull(release);
- Objects.requireNonNull(dependencies);
- if (!releaseUuid.equals(release.uuid())) {
- throw new IllegalArgumentException("releaseUuid must match release.uuid()");
- }
- }
-
- public ScaReleaseDependenciesDto(ScaReleaseDto release, List<ScaDependencyDto> dependencies) {
- this(release.uuid(), release, dependencies);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDto.java
deleted file mode 100644
index 0a7916383db..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleaseDto.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Represents a single release of a package, such as an npm or maven package,
- * as found in a single dependency analysis run (so it's attached to a branch component,
- * and there's a separate copy of each release per branch it appears in).
- *
- * @param uuid Primary key
- * @param componentUuid the component the release is associated with
- * @param packageUrl package URL following the PURL specification
- * @param packageManager package manager e.g. PYPI
- * @param packageName package name e.g. "urllib3"
- * @param version package version e.g. "1.25.6"
- * @param licenseExpression an SPDX license expression (NOT a single license, can have parens/AND/OR)
- * @param declaredLicenseExpression the valid SPDX license expression declared by the package itself
- * @param known is this package and version known to Sonar (if not it be internal, could be malicious, could be from a weird repo)
- * @param newInPullRequest is it newly added in a PR (always false when not on a PR)
- * @param createdAt timestamp it was created
- * @param updatedAt timestamp it was last updated
- */
-public record ScaReleaseDto(
- String uuid,
- String componentUuid,
- String packageUrl,
- PackageManager packageManager,
- String packageName,
- String version,
- String licenseExpression,
- String declaredLicenseExpression,
- boolean known,
- boolean newInPullRequest,
- long createdAt,
- long updatedAt) {
-
- // these need to match what's in the db
- public static final int PACKAGE_URL_MAX_LENGTH = 400;
- public static final int PACKAGE_MANAGER_MAX_LENGTH = 20;
- public static final int PACKAGE_NAME_MAX_LENGTH = 400;
- public static final int VERSION_MAX_LENGTH = 400;
- public static final int LICENSE_EXPRESSION_MAX_LENGTH = 400;
-
- public ScaReleaseDto {
- // We want these to raise errors and not silently put junk values in the db
- checkLength(packageUrl, PACKAGE_URL_MAX_LENGTH, "packageUrl");
- checkLength(packageName, PACKAGE_NAME_MAX_LENGTH, "packageName");
- checkLength(version, VERSION_MAX_LENGTH, "version");
- checkLength(licenseExpression, LICENSE_EXPRESSION_MAX_LENGTH, "licenseExpression");
- }
-
- private static void checkLength(String value, int maxLength, String name) {
- checkArgument(value.length() <= maxLength, "Maximum length of %s is %s: %s", name, maxLength, value);
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setUuid(this.uuid)
- .setComponentUuid(this.componentUuid)
- .setPackageUrl(this.packageUrl)
- .setPackageManager(this.packageManager)
- .setPackageName(this.packageName)
- .setVersion(this.version)
- .setLicenseExpression(this.licenseExpression)
- .setDeclaredLicenseExpression(this.declaredLicenseExpression)
- .setKnown(this.known)
- .setNewInPullRequest(this.newInPullRequest)
- .setCreatedAt(this.createdAt)
- .setUpdatedAt(this.updatedAt);
- }
-
- /**
- * Returns an object whose .equals and .hashCode would match that of another ScaReleaseDto's
- * identity() if the two ScaReleaseDto would count as duplicates within the sca_releases table
- * (within a single analysis, so ignoring the componentUuid).
- * This is different from the DTOs themselves being equal because some fields do not count in
- * the identity of the row, and can be updated while preserving the identity. The method just
- * returns Object and not a type, because it exists just to call .equals and .hashCode on.
- *
- * @return an object to be used for hashing and comparing ScaReleaseDto instances for identity
- */
- public Identity identity() {
- return new IdentityImpl(this);
- }
-
- public interface Identity {
- }
-
- private record IdentityImpl(String packageUrl) implements Identity {
- IdentityImpl(ScaReleaseDto dto) {
- this(dto.packageUrl());
- }
- }
-
- public static class Builder {
- private String uuid;
- private String componentUuid;
- private String packageUrl;
- private PackageManager packageManager;
- private String packageName;
- private String version;
- private String licenseExpression;
- private String declaredLicenseExpression;
- private boolean known;
- private boolean newInPullRequest;
- private long createdAt;
- private long updatedAt;
-
- public Builder setUuid(String uuid) {
- this.uuid = uuid;
- return this;
- }
-
- public Builder setComponentUuid(String componentUuid) {
- this.componentUuid = componentUuid;
- return this;
- }
-
- public Builder setPackageUrl(String packageUrl) {
- this.packageUrl = packageUrl;
- return this;
- }
-
- public Builder setPackageManager(PackageManager packageManager) {
- this.packageManager = packageManager;
- return this;
- }
-
- public Builder setPackageName(String packageName) {
- this.packageName = packageName;
- return this;
- }
-
- public Builder setVersion(String version) {
- this.version = version;
- return this;
- }
-
- public Builder setLicenseExpression(String licenseExpression) {
- this.licenseExpression = licenseExpression;
- return this;
- }
-
- public Builder setDeclaredLicenseExpression(String declaredLicenseExpression) {
- this.declaredLicenseExpression = declaredLicenseExpression;
- return this;
- }
-
- public Builder setKnown(boolean known) {
- this.known = known;
- return this;
- }
-
- public Builder setNewInPullRequest(boolean newInPullRequest) {
- this.newInPullRequest = newInPullRequest;
- return this;
- }
-
- public Builder setCreatedAt(long createdAt) {
- this.createdAt = createdAt;
- return this;
- }
-
- public Builder setUpdatedAt(long updatedAt) {
- this.updatedAt = updatedAt;
- return this;
- }
-
- public ScaReleaseDto build() {
- return new ScaReleaseDto(
- uuid, componentUuid, packageUrl, packageManager, packageName, version, licenseExpression, declaredLicenseExpression, known, newInPullRequest, createdAt, updatedAt);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDao.java
deleted file mode 100644
index 878276874de..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDao.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-import org.sonar.db.Pagination;
-
-public class ScaReleasesDao implements Dao {
-
- private static ScaReleasesMapper mapper(DbSession session) {
- return session.getMapper(ScaReleasesMapper.class);
- }
-
- public void insert(DbSession session, ScaReleaseDto scaReleaseDto) {
- mapper(session).insert(scaReleaseDto);
- }
-
- public void deleteByUuid(DbSession session, String uuid) {
- mapper(session).deleteByUuid(uuid);
- }
-
- public Optional<ScaReleaseDto> selectByUuid(DbSession dbSession, String uuid) {
- return Optional.ofNullable(mapper(dbSession).selectByUuid(uuid));
- }
-
- public List<ScaReleaseDto> selectByUuids(DbSession dbSession, Collection<String> uuids) {
- return mapper(dbSession).selectByUuids(uuids);
- }
-
- /**
- * Retrieves all releases with a specific branch UUID, no other filtering is done by this method.
- */
- public List<ScaReleaseDto> selectByBranchUuid(DbSession dbSession, String branchUuid) {
- return mapper(dbSession).selectByBranchUuid(branchUuid);
- }
-
- public List<ScaReleaseDto> selectByQuery(DbSession session, ScaReleasesQuery scaReleasesQuery, Pagination pagination) {
- return mapper(session).selectByQuery(scaReleasesQuery, pagination);
- }
-
- public int countByQuery(DbSession session, ScaReleasesQuery scaReleasesQuery) {
- return mapper(session).countByQuery(scaReleasesQuery);
- }
-
- public List<ScaReleaseByPackageManagerCountDto> countReleasesByPackageManager(DbSession session, ScaReleasesQuery scaReleasesQuery) {
- return mapper(session).countReleasesByPackageManager(scaReleasesQuery);
- }
-
- public void update(DbSession session, ScaReleaseDto scaReleaseDto) {
- mapper(session).update(scaReleaseDto);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDependenciesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDependenciesDao.java
deleted file mode 100644
index b4b1d2c1564..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesDependenciesDao.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-
-public class ScaReleasesDependenciesDao implements Dao {
-
- private static ScaReleasesMapper releasesMapper(DbSession session) {
- return session.getMapper(ScaReleasesMapper.class);
- }
-
- private static ScaDependenciesMapper dependenciesMapper(DbSession session) {
- return session.getMapper(ScaDependenciesMapper.class);
- }
-
- /**
- * Obtain ScaReleaseDependenciesDto for each of the release uuids.
- *
- * @param dbSession db session
- * @param uuids uuids for sca_releases
- * @return the list of ScaReleaseDependenciesDto
- */
- public List<ScaReleaseDependenciesDto> selectByReleaseUuids(DbSession dbSession, Collection<String> uuids) {
- List<ScaReleaseDto> releases = releasesMapper(dbSession).selectByUuids(uuids);
- return selectByReleaseDtos(dbSession, releases);
- }
-
- /**
- * Obtain ScaReleaseDependenciesDto wrapping each of the passed-in ScaReleaseDto and adding
- * the dependencies list.
- *
- * @param dbSession db session
- * @param releases ScaReleaseDto to be wrapped in ScaReleaseDependenciesDto after selecting dependencies
- * @return the list of ScaReleaseDependenciesDto
- */
- public List<ScaReleaseDependenciesDto> selectByReleaseDtos(DbSession dbSession, Collection<ScaReleaseDto> releases) {
- // This has a somewhat abnormal implementation (not in the mapper xml) due to
- // https://github.com/mybatis/mybatis-3/issues/101 ,
- // essentially a mapper cannot mix "creating immutable objects via constructor" (the &lt;constructor&gt; tag)
- // "filling in child objects from another query" (the &lt;collection&gt; tag), because mybatis would have to
- // be refactored to postpone creating the parent objects until it had loaded the child objects.
- // Some options considered:
- // 1. use mutable DTOs or temporary mutable DTOs that we then convert (lots of cruft)
- // 2. use a single join query instead of two queries (result set duplicates the parent's columns for each child)
- // 3. custom result handler doing something-or-other (not really worked out)
- // 4. just don't use a mapper and have a Dao that delegates to other mappers (this solution)
- List<ScaDependencyDto> dependencies = dependenciesMapper(dbSession).selectByReleaseUuids(releases.stream().map(ScaReleaseDto::uuid).toList());
- Map<String, List<ScaDependencyDto>> dependenciesGroupedByReleaseId = dependencies.stream().collect(Collectors.groupingBy(ScaDependencyDto::scaReleaseUuid));
-
- return releases.stream().map(releaseDto -> {
- // by returning empty list instead of omitting the release if there are no deps, we simulate a left join.
- // We may never actually save dependency-less sca_releases in real life though, which means we may
- // only be doing this so our tests don't always have to create dependencies in order to load releases
- // through here.
- var dependenciesDtos = Optional.ofNullable(dependenciesGroupedByReleaseId.get(releaseDto.uuid())).orElse(Collections.emptyList());
- return new ScaReleaseDependenciesDto(releaseDto, dependenciesDtos);
- }).toList();
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesMapper.java
deleted file mode 100644
index 0694271ee3f..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesMapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
-import org.sonar.db.Pagination;
-
-public interface ScaReleasesMapper {
- void insert(ScaReleaseDto dto);
-
- void deleteByUuid(String uuid);
-
- ScaReleaseDto selectByUuid(String uuid);
-
- List<ScaReleaseDto> selectByUuids(Collection<String> uuids);
-
- List<ScaReleaseDto> selectByBranchUuid(String branchUuid);
-
- List<ScaReleaseDto> selectByQuery(@Param("query") ScaReleasesQuery query, @Param("pagination") Pagination pagination);
-
- void update(ScaReleaseDto dto);
-
- int countByQuery(@Param("query") ScaReleasesQuery query);
-
- List<ScaReleaseByPackageManagerCountDto> countReleasesByPackageManager(@Param("query") ScaReleasesQuery query);
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesQuery.java
deleted file mode 100644
index 1e24eaf8c6a..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaReleasesQuery.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.Locale;
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import static org.sonar.db.DaoUtils.buildLikeValue;
-import static org.sonar.db.WildcardPosition.BEFORE_AND_AFTER;
-
-public record ScaReleasesQuery(
- String branchUuid,
- @Nullable Boolean direct,
- @Nullable Boolean productionScope,
- @Nullable List<String> packageManagers,
- @Nullable Boolean newInPullRequest,
- @Nullable String query) {
-
- /**
- * Used by MyBatis mapper
- */
- @CheckForNull
- public String likeQuery() {
- return query == null ? null : buildLikeValue(query.toLowerCase(Locale.ENGLISH), BEFORE_AND_AFTER);
- }
-
- public Builder toBuilder() {
- return new Builder()
- .setBranchUuid(branchUuid)
- .setDirect(direct)
- .setProductionScope(productionScope)
- .setPackageManagers(packageManagers)
- .setNewInPullRequest(newInPullRequest)
- .setQuery(query);
- }
-
- public static class Builder {
- private String branchUuid;
- private Boolean direct;
- private Boolean productionScope;
- private List<String> packageManagers;
- private Boolean newInPullRequest;
- private String query;
-
- public Builder setBranchUuid(String branchUuid) {
- this.branchUuid = branchUuid;
- return this;
- }
-
- public Builder setDirect(Boolean direct) {
- this.direct = direct;
- return this;
- }
-
- public Builder setProductionScope(Boolean productionScope) {
- this.productionScope = productionScope;
- return this;
- }
-
- public Builder setPackageManagers(List<String> packageManagers) {
- this.packageManagers = packageManagers;
- return this;
- }
-
- public Builder setNewInPullRequest(Boolean newInPullRequest) {
- this.newInPullRequest = newInPullRequest;
- return this;
- }
-
- public Builder setQuery(String query) {
- this.query = query;
- return this;
- }
-
- public ScaReleasesQuery build() {
- return new ScaReleasesQuery(branchUuid, direct, productionScope, packageManagers, newInPullRequest, query);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaSeverity.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaSeverity.java
deleted file mode 100644
index d7d0e63eafd..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaSeverity.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-/**
- * The severity of a dependency issue found by SCA.
- * This is calculated as a base severity (which may be based on a vulnerability's CVSS score
- * or just based on the type of issue), and then analysis-specific factors such as reachability
- * can be considered to get the final severity.
- */
-public enum ScaSeverity {
- INFO(5),
- LOW(10),
- MEDIUM(15),
- HIGH(20),
- BLOCKER(25);
-
- // this needs to match the DB varchar length
- public static final int MAX_NAME_LENGTH = 15;
- private final int databaseSortKey;
-
- ScaSeverity(int databaseSortKey) {
- this.databaseSortKey = databaseSortKey;
- }
-
- /**
- * Returns the sort key for the severity in the database.
- * We store the severity as a string for debuggability
- * and so on, but to sort by severity we need an integer
- * that gets higher as the severity gets more severe.
- * The sort keys have gaps so we could add new
- * in-between values to the enum without a big data migration.
- * @return integer to sort by severity
- */
- public final int databaseSortKey() {
- return databaseSortKey;
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssueDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssueDto.java
deleted file mode 100644
index 7746571d087..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssueDto.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.math.BigDecimal;
-import java.util.List;
-import javax.annotation.Nullable;
-
-/**
- * This table has GLOBAL rows spanning all analysis runs. It represents
- * extra fields on all rows of sca_issues that are of {@link ScaIssueType#VULNERABILITY},
- * in other words it's a polymorphic child class of sca_issues.
- * <p>
- * The uuid primary key will match the primary key of the corresponding row in the sca_issues table.
- * </p>
- * <p>
- * The base severity does not consider project-specific considerations such as reachability.
- * </p>
- * <p>
- * At least in the current take, this table does not contain all attributes of a given
- * vulnerability; it only contains those that we show in a list of issues, but not those
- * that appear when we show full details of a vulnerability. The columns in this table
- * need to be returned by the cloud endpoint that analyzes dependency files.
- * </p>
- */
-public record ScaVulnerabilityIssueDto(
- String uuid,
- ScaSeverity baseSeverity,
- List<String> cweIds,
- @Nullable BigDecimal cvssScore,
- long createdAt,
- long updatedAt) {
-
- // these need to match what's in the db
- public static final int CWE_IDS_MAX_LENGTH = 255;
-
- public Builder toBuilder() {
- return new Builder()
- .setUuid(uuid)
- .setBaseSeverity(baseSeverity)
- .setCweIds(cweIds)
- .setCvssScore(cvssScore)
- .setCreatedAt(createdAt)
- .setUpdatedAt(updatedAt);
- }
-
- public static class Builder {
- private String uuid;
- private ScaSeverity baseSeverity;
- private List<String> cweIds;
- private BigDecimal cvssScore;
- private long createdAt;
- private long updatedAt;
-
- public Builder setUuid(String uuid) {
- this.uuid = uuid;
- return this;
- }
-
- public Builder setBaseSeverity(ScaSeverity baseSeverity) {
- this.baseSeverity = baseSeverity;
- return this;
- }
-
- public Builder setCweIds(List<String> cweIds) {
- this.cweIds = cweIds;
- return this;
- }
-
- public Builder setCvssScore(BigDecimal cvssScore) {
- this.cvssScore = cvssScore;
- return this;
- }
-
- public Builder setCreatedAt(long createdAt) {
- this.createdAt = createdAt;
- return this;
- }
-
- public Builder setUpdatedAt(long updatedAt) {
- this.updatedAt = updatedAt;
- return this;
- }
-
- public ScaVulnerabilityIssueDto build() {
- return new ScaVulnerabilityIssueDto(uuid, baseSeverity, cweIds, cvssScore, createdAt, updatedAt);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesDao.java
deleted file mode 100644
index d06bfb872da..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesDao.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Dao;
-import org.sonar.db.DbSession;
-
-public class ScaVulnerabilityIssuesDao implements Dao {
-
- private static ScaVulnerabilityIssuesMapper mapper(DbSession session) {
- return session.getMapper(ScaVulnerabilityIssuesMapper.class);
- }
-
- public void insert(DbSession session, ScaVulnerabilityIssueDto scaVulnerabilityIssueDto) {
- mapper(session).insert(scaVulnerabilityIssueDto);
- }
-
- public Optional<ScaVulnerabilityIssueDto> selectByUuid(DbSession dbSession, String uuid) {
- return Optional.ofNullable(mapper(dbSession).selectByUuid(uuid));
- }
-
- public List<ScaVulnerabilityIssueDto> selectByUuids(DbSession dbSession, Collection<String> uuids) {
- return mapper(dbSession).selectByUuids(uuids);
- }
-
- public void update(DbSession session, ScaVulnerabilityIssueDto scaVulnerabilityIssueDto) {
- mapper(session).update(scaVulnerabilityIssueDto);
- }
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.java
deleted file mode 100644
index 487039a1e06..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Collection;
-import java.util.List;
-
-public interface ScaVulnerabilityIssuesMapper {
- void insert(ScaVulnerabilityIssueDto dto);
-
- ScaVulnerabilityIssueDto selectByUuid(String uuid);
-
- List<ScaVulnerabilityIssueDto> selectByUuids(Collection<String> uuids);
-
- void update(ScaVulnerabilityIssueDto dto);
-}
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/package-info.java b/server/sonar-db-dao/src/main/java/org/sonar/db/sca/package-info.java
deleted file mode 100644
index 91273c3d426..00000000000
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/sca/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.db.sca;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/user/RoleDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/user/RoleDao.java
index 6c725d60262..bc823cc79a6 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/user/RoleDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/user/RoleDao.java
@@ -19,33 +19,33 @@
*/
package org.sonar.db.user;
-import com.google.common.collect.ImmutableSet;
import java.util.Collection;
+import java.util.EnumSet;
import java.util.List;
import java.util.Set;
-import org.sonar.api.web.UserRole;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
+import org.sonar.db.permission.ProjectPermission;
import static com.google.common.base.Preconditions.checkArgument;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class RoleDao implements Dao {
- private static final Set<String> UNSUPPORTED_PROJECT_PERMISSIONS = ImmutableSet.of(USER, CODEVIEWER);
+ private static final Set<ProjectPermission> UNSUPPORTED_PROJECT_PERMISSIONS = EnumSet.of(USER, CODEVIEWER);
/**
* All the entities on which the user has {@code permission}, directly or through
* groups.
*
- * @throws IllegalArgumentException this method does not support permissions {@link UserRole#USER user} nor
- * {@link UserRole#CODEVIEWER codeviewer} because it does not support public root components.
+ * @throws IllegalArgumentException this method does not support permissions {@link ProjectPermission#USER user} nor
+ * {@link ProjectPermission#CODEVIEWER codeviewer} because it does not support public root components.
*/
- public List<String> selectEntityUuidsByPermissionAndUserUuidAndQualifier(DbSession dbSession, String permission, String userUuid, Collection<String> qualifiers) {
+ public List<String> selectEntityUuidsByPermissionAndUserUuidAndQualifier(DbSession dbSession, ProjectPermission permission, String userUuid, Collection<String> qualifiers) {
checkArgument(
!UNSUPPORTED_PROJECT_PERMISSIONS.contains(permission),
"Permissions %s are not supported by selectEntityUuidsByPermissionAndUserUuidAndQualifier", UNSUPPORTED_PROJECT_PERMISSIONS);
- return mapper(dbSession).selectEntityUuidsByPermissionAndUserUuidAndQualifier(permission, userUuid, qualifiers);
+ return mapper(dbSession).selectEntityUuidsByPermissionAndUserUuidAndQualifier(permission.getKey(), userUuid, qualifiers);
}
public void deleteGroupRolesByGroupUuid(DbSession session, String groupUuid) {
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaDependenciesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaDependenciesMapper.xml
deleted file mode 100644
index c3aabf332f2..00000000000
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaDependenciesMapper.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
-<mapper namespace="org.sonar.db.sca.ScaDependenciesMapper">
- <!-- we're using a resultMap instead of the usual resultType approach in order to provide
- a typeHandler for the chains column -->
- <resultMap id="scaDependencyResultMap" type="org.sonar.db.sca.ScaDependencyDto">
- <constructor>
- <idArg column="uuid" javaType="String"/>
- <arg column="sca_release_uuid" javaType="String"/>
- <!-- the underscore prefix means to use the primitive type instead of boxed type -->
- <arg column="direct" javaType="_boolean"/>
- <arg column="scope" javaType="String"/>
- <arg column="production_scope" javaType="_boolean"/>
- <arg column="user_dependency_file_path" javaType="String"/>
- <arg column="lockfile_dependency_file_path" javaType="String"/>
- <arg column="chains" typeHandler="org.sonar.db.sca.ListOfListOfStringsTypeHandler" jdbcType="CLOB"
- javaType="java.util.List"/>
- <arg column="new_in_pull_request" javaType="_boolean"/>
- <arg column="created_at" javaType="_long"/>
- <arg column="updated_at" javaType="_long"/>
- </constructor>
- </resultMap>
-
- <sql id="scaDependenciesColumns">
- sd.uuid,
- sd.sca_release_uuid,
- sd.direct,
- sd.scope,
- sd.production_scope,
- sd.user_dependency_file_path,
- sd.lockfile_dependency_file_path,
- sd.chains,
- sd.new_in_pull_request,
- sd.created_at,
- sd.updated_at
- </sql>
-
- <insert id="insert" parameterType="org.sonar.db.sca.ScaDependencyDto" useGeneratedKeys="false">
- insert into sca_dependencies (
- uuid,
- sca_release_uuid,
- direct,
- scope,
- production_scope,
- user_dependency_file_path,
- lockfile_dependency_file_path,
- chains,
- new_in_pull_request,
- created_at,
- updated_at
- ) values (
- #{uuid,jdbcType=VARCHAR},
- #{scaReleaseUuid,jdbcType=VARCHAR},
- #{direct,jdbcType=BOOLEAN},
- #{scope,jdbcType=VARCHAR},
- #{productionScope,jdbcType=BOOLEAN},
- #{userDependencyFilePath,jdbcType=VARCHAR},
- #{lockfileDependencyFilePath,jdbcType=VARCHAR},
- #{chains,jdbcType=CLOB,typeHandler=org.sonar.db.sca.ListOfListOfStringsTypeHandler},
- #{newInPullRequest,jdbcType=BOOLEAN},
- #{createdAt,jdbcType=BIGINT},
- #{updatedAt,jdbcType=BIGINT}
- )
- </insert>
-
- <delete id="deleteByUuid" parameterType="string">
- delete from sca_dependencies
- where uuid = #{uuid,jdbcType=VARCHAR}
- </delete>
-
- <select id="selectByUuid" parameterType="string" resultMap="scaDependencyResultMap">
- select <include refid="scaDependenciesColumns"/>
- from sca_dependencies sd
- where sd.uuid = #{uuid,jdbcType=VARCHAR}
- </select>
-
- <select id="selectByReleaseUuids" parameterType="string" resultMap="scaDependencyResultMap">
- select <include refid="scaDependenciesColumns"/>
- from sca_dependencies sd
- <if test="arg0.isEmpty()">
- where 1=0
- </if>
- <if test="!arg0.isEmpty()">
- where sd.sca_release_uuid in
- <foreach collection="collection" item="sca_release_uuid" open="(" close=")" separator=",">
- #{sca_release_uuid, jdbcType=VARCHAR}
- </foreach>
- </if>
- </select>
-
- <select id="selectByBranchUuid" parameterType="string" resultMap="scaDependencyResultMap">
- select <include refid="scaDependenciesColumns"/>
- from sca_dependencies sd
- inner join sca_releases sr on sd.sca_release_uuid = sr.uuid
- where sr.component_uuid = #{branchUuid,jdbcType=VARCHAR}
- </select>
-
- <select id="selectByQuery" parameterType="map" resultMap="scaDependencyResultMap">
- select <include refid="scaDependenciesColumns"/>
- <include refid="sqlSelectByQuery"/>
- ORDER BY sd.uuid ASC
- <include refid="org.sonar.db.common.Common.pagination"/>
- </select>
-
- <select id="countByQuery" resultType="int">
- select count(sd.uuid)
- <include refid="sqlSelectByQuery"/>
- </select>
-
- <sql id="sqlSelectByQuery">
- from sca_dependencies sd
- inner join sca_releases sr on sd.sca_release_uuid = sr.uuid
- where sr.component_uuid = #{query.branchUuid,jdbcType=VARCHAR}
- <if test="query.direct != null">
- AND sd.direct = #{query.direct,jdbcType=BOOLEAN}
- </if>
- <if test="query.packageManagers != null and !query.packageManagers.isEmpty()">
- AND sr.package_manager IN
- <foreach collection="query.packageManagers" open="(" close=")" item="packageManager" separator=",">
- #{packageManager,jdbcType=VARCHAR}
- </foreach>
- </if>
- <if test="query.query() != null">
- AND lower(sr.package_name) LIKE #{query.likeQuery} ESCAPE '/'
- </if>
- </sql>
-
- <update id="update" parameterType="org.sonar.db.sca.ScaDependencyDto" useGeneratedKeys="false">
- update sca_dependencies
- set
- uuid = #{uuid, jdbcType=VARCHAR},
- sca_release_uuid = #{scaReleaseUuid, jdbcType=VARCHAR},
- direct = #{direct, jdbcType=BOOLEAN},
- scope = #{scope, jdbcType=VARCHAR},
- production_scope = #{productionScope, jdbcType=BOOLEAN},
- user_dependency_file_path = #{userDependencyFilePath, jdbcType=VARCHAR},
- lockfile_dependency_file_path = #{lockfileDependencyFilePath, jdbcType=VARCHAR},
- chains = #{chains, jdbcType=CLOB, typeHandler=org.sonar.db.sca.ListOfListOfStringsTypeHandler},
- new_in_pull_request = #{newInPullRequest, jdbcType=BOOLEAN},
- updated_at = #{updatedAt, jdbcType=BIGINT}
- where
- uuid = #{uuid, jdbcType=VARCHAR}
- </update>
-
-</mapper>
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesMapper.xml
deleted file mode 100644
index 39e8b4eade8..00000000000
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesMapper.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
-<mapper namespace="org.sonar.db.sca.ScaIssuesMapper">
- <resultMap id="scaIssueResultMap" type="org.sonar.db.sca.ScaIssueDto">
- <constructor>
- <idArg column="uuid" javaType="String"/>
- <arg column="sca_issue_type" javaType="org.sonar.db.sca.ScaIssueType"/>
- <arg column="package_url" javaType="String"/>
- <arg column="vulnerability_id" javaType="String"/>
- <arg column="spdx_license_id" javaType="String"/>
- <arg column="created_at" javaType="_long"/>
- <arg column="updated_at" javaType="_long"/>
- </constructor>
- </resultMap>
-
- <sql id="scaIssuesColumns">
- si.uuid,
- si.sca_issue_type,
- si.package_url,
- si.vulnerability_id,
- si.spdx_license_id,
- si.created_at,
- si.updated_at
- </sql>
-
- <insert id="insert" parameterType="org.sonar.db.sca.ScaIssueDto" useGeneratedKeys="false">
- insert into sca_issues (
- uuid,
- sca_issue_type,
- package_url,
- vulnerability_id,
- spdx_license_id,
- created_at,
- updated_at
- ) values (
- #{uuid,jdbcType=VARCHAR},
- #{scaIssueType,jdbcType=VARCHAR},
- #{packageUrl,jdbcType=VARCHAR},
- #{vulnerabilityId,jdbcType=VARCHAR},
- #{spdxLicenseId,jdbcType=VARCHAR},
- #{createdAt,jdbcType=BIGINT},
- #{updatedAt,jdbcType=BIGINT}
- )
- </insert>
-
- <!-- delete is left out for now, because it is very dangerous without foreign key constraints and ON DELETE behavior,
- and it hasn't yet been necessary to try to "garbage collect" this table. -->
-
- <select id="selectByUuid" parameterType="string" resultMap="scaIssueResultMap">
- select <include refid="scaIssuesColumns"/>
- from sca_issues si
- where si.uuid = #{uuid,jdbcType=VARCHAR}
- </select>
-
- <select id="selectByUuids" parameterType="string" resultMap="scaIssueResultMap">
- select <include refid="scaIssuesColumns"/>
- from sca_issues si
- <if test="arg0.isEmpty()">
- where 1=0
- </if>
- <if test="!arg0.isEmpty()">
- where si.uuid in
- <foreach collection="collection" item="uuid" open="(" close=")" separator=",">
- #{uuid, jdbcType=VARCHAR}
- </foreach>
- </if>
- </select>
-
- <!-- selectByValue is used to upsert (get or create) the issues found in an analysis. -->
- <select id="selectUuidByValue" parameterType="org.sonar.db.sca.ScaIssueIdentity" resultType="String">
- select si.uuid
- from sca_issues si
- where (si.sca_issue_type = #{scaIssueType,jdbcType=VARCHAR}
- and si.package_url = #{packageUrl,jdbcType=VARCHAR}
- and si.vulnerability_id = #{vulnerabilityId,jdbcType=VARCHAR}
- and si.spdx_license_id = #{spdxLicenseId,jdbcType=VARCHAR})
- </select>
-
- <!-- there is no update operation; sca_issues table is append-only -->
-</mapper>
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.xml
deleted file mode 100644
index fc5b3468983..00000000000
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesDetailsMapper.xml
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
-<mapper namespace="org.sonar.db.sca.ScaIssuesReleasesDetailsMapper">
- <resultMap id="scaIssueReleaseDetailsResultMap" type="org.sonar.db.sca.ScaIssueReleaseDetailsDto">
- <constructor>
- <idArg column="issue_release_uuid" javaType="String"/>
- <arg resultMap="org.sonar.db.sca.ScaIssuesReleasesMapper.scaIssueReleaseResultMap"
- columnPrefix="sir_"
- javaType="org.sonar.db.sca.ScaIssueReleaseDto"/>
- <arg resultMap="org.sonar.db.sca.ScaIssuesMapper.scaIssueResultMap"
- columnPrefix="si_"
- javaType="org.sonar.db.sca.ScaIssueDto"/>
- <arg resultMap="org.sonar.db.sca.ScaReleasesMapper.scaReleaseResultMap"
- columnPrefix="sr_"
- javaType="org.sonar.db.sca.ScaReleaseDto"/>
- <arg resultMap="org.sonar.db.sca.ScaVulnerabilityIssuesMapper.scaVulnerabilityIssueResultMap"
- columnPrefix="svi_"
- javaType="org.sonar.db.sca.ScaVulnerabilityIssueDto"/>
- </constructor>
- </resultMap>
-
- <sql id="columns">
- <!-- These have to match all of the properties in the other tables' mappers,
- adding the columnPrefix given in our resultMap above -->
- sir.uuid as issue_release_uuid,
- sir.uuid as sir_uuid,
- sir.sca_issue_uuid as sir_sca_issue_uuid,
- sir.sca_release_uuid as sir_sca_release_uuid,
- sir.severity as sir_severity,
- sir.severity_sort_key as sir_severity_sort_key,
- sir.created_at as sir_created_at,
- sir.updated_at as sir_updated_at,
- si.uuid as si_uuid,
- si.sca_issue_type as si_sca_issue_type,
- si.package_url as si_package_url,
- si.vulnerability_id as si_vulnerability_id,
- si.spdx_license_id as si_spdx_license_id,
- si.created_at as si_created_at,
- si.updated_at as si_updated_at,
- sr.uuid as sr_uuid,
- sr.component_uuid as sr_component_uuid,
- sr.package_url as sr_package_url,
- sr.package_manager as sr_package_manager,
- sr.package_name as sr_package_name,
- sr.version as sr_version,
- sr.license_expression as sr_license_expression,
- sr.declared_license_expression as sr_declared_license_expression,
- sr.known as sr_known,
- sr.new_in_pull_request as sr_new_in_pull_request,
- sr.created_at as sr_created_at,
- sr.updated_at as sr_updated_at,
- svi.uuid as svi_uuid,
- svi.base_severity as svi_base_severity,
- svi.cwe_ids as svi_cwe_ids,
- svi.cvss_score as svi_cvss_score,
- svi.created_at as svi_created_at,
- svi.updated_at as svi_updated_at
- </sql>
-
- <sql id="columnsWithCvssSortKey">
- <include refid="columns"/>,
- <!-- It seems that the behavior of NULL in ORDER BY varies by database backend, with different
- defaults and a lack of universal support for NULLS FIRST / NULLS LAST.
- This poses an issue for nullable columns we want to sort by such as cvss_score.
- On databases that support it, NULLS FIRST could probably use the index while this COALESCE
- hack does not, so maybe someday we want to conditionalize on db backend somehow. -->
- <!-- NULL score is treated as least severe -->
- COALESCE(svi.cvss_score, 0.0) as cvss_sort_key
- </sql>
-
- <sql id="sqlBaseJoins">
- from sca_issues_releases sir
- inner join sca_issues si on sir.sca_issue_uuid = si.uuid
- inner join sca_releases sr on sir.sca_release_uuid = sr.uuid
- left join sca_vulnerability_issues svi on sir.sca_issue_uuid = svi.uuid
- </sql>
-
- <sql id="sqlSelectByScaIssueReleaseUuid">
- <include refid="sqlBaseJoins"/>
- where sir.uuid = #{scaIssueReleaseUuid,jdbcType=VARCHAR}
- </sql>
-
- <sql id="sqlSelectByReleaseUuid">
- <include refid="sqlBaseJoins"/>
- where sr.uuid = #{releaseUuid,jdbcType=VARCHAR}
- </sql>
-
- <sql id="sqlSelectByBranchUuid">
- <include refid="sqlBaseJoins"/>
- where sr.component_uuid = #{branchUuid,jdbcType=VARCHAR}
- </sql>
-
- <select id="selectByReleaseUuid" parameterType="map" resultMap="scaIssueReleaseDetailsResultMap">
- select <include refid="columnsWithCvssSortKey"/>
- <include refid="sqlSelectByReleaseUuid"/>
- <include refid="sqlOrderBySeverityDesc"/>
- </select>
-
- <select id="selectByBranchUuid" parameterType="map" resultMap="scaIssueReleaseDetailsResultMap">
- select <include refid="columnsWithCvssSortKey"/>
- <include refid="sqlSelectByBranchUuid"/>
- <include refid="sqlOrderBySeverityDesc"/>
- <include refid="org.sonar.db.common.Common.pagination"/>
- </select>
-
- <select id="selectByScaIssueReleaseUuid" parameterType="map" resultMap="scaIssueReleaseDetailsResultMap">
- select <include refid="columns"/>
- <include refid="sqlSelectByScaIssueReleaseUuid"/>
- <!-- no ORDER BY here because it's always one result -->
- </select>
-
- <select id="countByBranchUuid" parameterType="string" resultType="int">
- select count(sir.uuid)
- <include refid="sqlSelectByBranchUuid"/>
- </select>
-
- <sql id="sqlSelectByQueryWhereClause">
- <where>
- sr.component_uuid = #{query.branchUuid,jdbcType=VARCHAR}
- <if test="query.direct != null">
- <!-- we only want each sca_releases row once, so this isn't a join. Note that each release
- can be BOTH direct and !direct if it has multiple dependencies. -->
- AND exists (select 1 from sca_dependencies sd where sd.sca_release_uuid = sr.uuid and sd.direct = #{query.direct,jdbcType=BOOLEAN})
- </if>
- <if test="query.productionScope != null">
- <!-- we only want each sca_releases row once, so this isn't a join. -->
- AND exists (select 1 from sca_dependencies sd where sd.sca_release_uuid = sr.uuid and sd.production_scope = #{query.productionScope,jdbcType=BOOLEAN})
- </if>
- <if test="query.vulnerabilityIdSubstring != null">
- <!-- this screens out non-vulnerability-having issue types even if the search is for empty string -->
- AND si.vulnerability_id != '${@org.sonar.db.sca.ScaIssueDto@NULL_VALUE}'
- <if test="query.vulnerabilityIdSubstring.length > 0">
- AND upper(si.vulnerability_id) LIKE #{query.vulnerabilityIdUppercaseEscapedAsLikeValue, jdbcType=VARCHAR} ESCAPE '/'
- </if>
- </if>
- <if test="query.packageNameSubstring != null and query.packageNameSubstring.length > 0">
- AND lower(sr.package_name) LIKE #{query.packageNameLowercaseEscapedAsLikeValue, jdbcType=VARCHAR} ESCAPE '/'
- </if>
- <if test="query.newInPullRequest != null">
- AND sr.new_in_pull_request = #{query.newInPullRequest, jdbcType=BOOLEAN}
- </if>
- <if test="query.types != null">
- <if test="query.types.isEmpty()">
- AND 1=0
- </if>
- <if test="!query.types.isEmpty()">
- AND si.sca_issue_type in
- <foreach collection="query.types" open="(" close=")" item="type" separator=",">
- #{type, jdbcType=VARCHAR}
- </foreach>
- </if>
- </if>
- <if test="query.severities != null">
- <if test="query.severities.isEmpty()">
- AND 1=0
- </if>
- <if test="!query.severities.isEmpty()">
- AND sir.severity in
- <foreach collection="query.severities" open="(" close=")" item="severity" separator=",">
- #{severity, jdbcType=VARCHAR}
- </foreach>
- </if>
- </if>
- <if test="query.packageManagers != null">
- <if test="query.packageManagers.isEmpty()">
- AND 1=0
- </if>
- <if test="!query.packageManagers.isEmpty()">
- AND sr.package_manager in
- <foreach collection="query.packageManagers" open="(" close=")" item="packageManager" separator=",">
- #{packageManager, jdbcType=VARCHAR}
- </foreach>
- </if>
- </if>
- </where>
- </sql>
-
- <sql id="sqlIdentityOrderColumns">
- <!-- the unique index is ordered as: scaIssueType, vulnerabilityId, packageUrl, spdxLicenseId
- so we're guessing (or hoping?) that is the most efficient sort order, and it should sort of make
- more sense to users than random. This sort is alphabetical first by issue type then
- by CVE ID or license name. -->
- si.sca_issue_type ASC, si.vulnerability_id ASC, si.package_url ASC, si.spdx_license_id ASC, sir.uuid ASC
- </sql>
-
- <!-- this is the default sort for the selects that don't have a sort parameter (i.e. not the query)
- but is probably slower than the identity sort until/unless we create a matching index -->
- <sql id="sqlOrderBySeverityDesc">
- ORDER BY sir.severity_sort_key DESC, cvss_sort_key DESC, <include refid="sqlIdentityOrderColumns"/>
- </sql>
-
- <sql id="sqlOrderByQuery">
- <choose>
- <when test="query.sort == @org.sonar.db.sca.ScaIssuesReleasesDetailsQuery$Sort@IDENTITY_ASC">
- ORDER BY <include refid="sqlIdentityOrderColumns"/>
- </when>
- <when test="query.sort == @org.sonar.db.sca.ScaIssuesReleasesDetailsQuery$Sort@IDENTITY_DESC">
- <!-- This is a bizarre and useless sort order and we really only have it for symmetry in the REST API -->
- ORDER BY si.sca_issue_type DESC, si.vulnerability_id DESC, si.package_url DESC, si.spdx_license_id DESC, sir.uuid DESC
- </when>
- <when test="query.sort == @org.sonar.db.sca.ScaIssuesReleasesDetailsQuery$Sort@SEVERITY_ASC">
- <!-- because many severities are the same, we try to keep the user intent by ordering by cvss score secondarily -->
- ORDER BY sir.severity_sort_key ASC, cvss_sort_key ASC, <include refid="sqlIdentityOrderColumns"/>
- </when>
- <when test="query.sort == @org.sonar.db.sca.ScaIssuesReleasesDetailsQuery$Sort@SEVERITY_DESC">
- <!-- because many severities are the same, we try to keep the user intent by ordering by cvss score secondarily -->
- <include refid="sqlOrderBySeverityDesc"/>
- </when>
- <when test="query.sort == @org.sonar.db.sca.ScaIssuesReleasesDetailsQuery$Sort@CVSS_SCORE_ASC">
- <!-- because cvss score can be null, we try to keep the user intent by ordering by severity secondarily -->
- ORDER BY cvss_sort_key ASC, sir.severity_sort_key ASC, <include refid="sqlIdentityOrderColumns"/>
- </when>
- <when test="query.sort == @org.sonar.db.sca.ScaIssuesReleasesDetailsQuery$Sort@CVSS_SCORE_DESC">
- <!-- because cvss score can be null, we try to keep the user intent by ordering by severity secondarily -->
- ORDER BY cvss_sort_key DESC, sir.severity_sort_key DESC, <include refid="sqlIdentityOrderColumns"/>
- </when>
- <otherwise>
- <!-- generate a noisy failure -->
- ORDER BY SYNTAX ERROR SHOULD NOT BE REACHED
- </otherwise>
- </choose>
- </sql>
-
- <select id="selectByQuery" parameterType="map" resultMap="scaIssueReleaseDetailsResultMap">
- select <include refid="columnsWithCvssSortKey"/>
- <include refid="sqlBaseJoins"/>
- <include refid="sqlSelectByQueryWhereClause"/>
- <include refid="sqlOrderByQuery"/>
- <include refid="org.sonar.db.common.Common.pagination"/>
- </select>
-
- <select id="countByQuery" parameterType="string" resultType="int">
- select count(sir.uuid)
- <include refid="sqlBaseJoins"/>
- <include refid="sqlSelectByQueryWhereClause"/>
- </select>
-</mapper>
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesMapper.xml
deleted file mode 100644
index 27895f8b276..00000000000
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaIssuesReleasesMapper.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
-<mapper namespace="org.sonar.db.sca.ScaIssuesReleasesMapper">
- <resultMap id="scaIssueReleaseResultMap" type="org.sonar.db.sca.ScaIssueReleaseDto">
- <constructor>
- <idArg name="uuid" column="uuid" javaType="String"/>
- <arg name="scaIssueUuid" column="sca_issue_uuid" javaType="String"/>
- <arg name="scaReleaseUuid" column="sca_release_uuid" javaType="String"/>
- <arg name="severity" column="severity" javaType="org.sonar.db.sca.ScaSeverity" jdbcType="VARCHAR"/>
- <arg name="createdAt" column="created_at" javaType="_long"/>
- <arg name="updatedAt" column="updated_at" javaType="_long"/>
- </constructor>
- </resultMap>
-
- <sql id="scaIssuesReleasesColumns">
- sir.uuid,
- sir.sca_issue_uuid,
- sir.sca_release_uuid,
- sir.severity,
- sir.created_at,
- sir.updated_at
- </sql>
-
- <insert id="insert" parameterType="org.sonar.db.sca.ScaIssueReleaseDto" useGeneratedKeys="false">
- insert into sca_issues_releases (
- uuid,
- sca_issue_uuid,
- sca_release_uuid,
- severity,
- severity_sort_key,
- created_at,
- updated_at
- ) values (
- #{uuid,jdbcType=VARCHAR},
- #{scaIssueUuid,jdbcType=VARCHAR},
- #{scaReleaseUuid,jdbcType=VARCHAR},
- #{severity,jdbcType=VARCHAR},
- #{severitySortKey,jdbcType=INTEGER},
- #{createdAt,jdbcType=BIGINT},
- #{updatedAt,jdbcType=BIGINT}
- )
- </insert>
-
- <delete id="deleteByUuid" parameterType="string">
- delete from sca_issues_releases
- where uuid = #{uuid,jdbcType=VARCHAR}
- </delete>
-
- <update id="update" parameterType="org.sonar.db.sca.ScaIssueReleaseDto" useGeneratedKeys="false">
- update sca_issues_releases
- set
- sca_issue_uuid = #{scaIssueUuid, jdbcType=VARCHAR},
- sca_release_uuid = #{scaReleaseUuid, jdbcType=VARCHAR},
- severity = #{severity, jdbcType=VARCHAR},
- severity_sort_key = #{severitySortKey, jdbcType=VARCHAR},
- updated_at = #{updatedAt, jdbcType=BIGINT}
- where
- uuid = #{uuid, jdbcType=VARCHAR}
-</update>
-
-
- <select id="selectByBranchUuid" parameterType="string" resultMap="scaIssueReleaseResultMap">
- select <include refid="scaIssuesReleasesColumns"/>
- from sca_issues_releases sir
- inner join sca_releases sr on sir.sca_release_uuid = sr.uuid
- where sr.component_uuid = #{branchUuid,jdbcType=VARCHAR}
- order by sir.uuid asc
- </select>
-</mapper>
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaReleasesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaReleasesMapper.xml
deleted file mode 100644
index b394011781f..00000000000
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaReleasesMapper.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
-<mapper namespace="org.sonar.db.sca.ScaReleasesMapper">
- <resultMap id="scaReleaseResultMap" type="org.sonar.db.sca.ScaReleaseDto">
- <constructor>
- <idArg name="uuid" column="uuid" javaType="String"/>
- <arg name="componentUuid" column="component_uuid" javaType="String"/>
- <arg name="packageUrl" column="package_url" javaType="String"/>
- <arg name="packageManager" column="package_manager" javaType="org.sonar.db.sca.PackageManager" jdbcType="VARCHAR"/>
- <arg name="packageName" column="package_name" javaType="String"/>
- <arg name="version" column="version" javaType="String"/>
- <arg name="licenseExpression" column="license_expression" javaType="String"/>
- <arg name="declaredLicenseExpression" column="declared_license_expression" javaType="String"/>
- <arg name="known" column="known" javaType="_boolean"/>
- <arg name="newInPullRequest" column="new_in_pull_request" javaType="_boolean"/>
- <arg name="createdAt" column="created_at" javaType="_long"/>
- <arg name="updatedAt" column="updated_at" javaType="_long"/>
- </constructor>
- </resultMap>
-
- <sql id="scaReleasesColumns">
- sr.uuid as uuid,
- sr.component_uuid,
- sr.package_url,
- sr.package_manager,
- sr.package_name,
- sr.version,
- sr.license_expression,
- sr.declared_license_expression,
- sr.known,
- sr.new_in_pull_request,
- sr.created_at,
- sr.updated_at
- </sql>
-
- <insert id="insert" parameterType="org.sonar.db.sca.ScaReleaseDto" useGeneratedKeys="false">
- insert into sca_releases (
- uuid,
- component_uuid,
- package_url,
- package_manager,
- package_name,
- version,
- license_expression,
- declared_license_expression,
- known,
- new_in_pull_request,
- created_at,
- updated_at
- ) values (
- #{uuid,jdbcType=VARCHAR},
- #{componentUuid,jdbcType=VARCHAR},
- #{packageUrl,jdbcType=VARCHAR},
- #{packageManager,jdbcType=VARCHAR},
- #{packageName,jdbcType=VARCHAR},
- #{version,jdbcType=VARCHAR},
- #{licenseExpression,jdbcType=VARCHAR},
- #{declaredLicenseExpression,jdbcType=VARCHAR},
- #{known,jdbcType=BOOLEAN},
- #{newInPullRequest,jdbcType=BOOLEAN},
- #{createdAt,jdbcType=BIGINT},
- #{updatedAt,jdbcType=BIGINT}
- )
- </insert>
-
- <delete id="deleteByUuid" parameterType="string">
- delete from sca_releases
- where uuid = #{uuid,jdbcType=VARCHAR}
- </delete>
-
- <select id="selectByUuid" parameterType="string" resultMap="scaReleaseResultMap">
- select <include refid="scaReleasesColumns"/>
- from sca_releases sr
- where sr.uuid = #{uuid,jdbcType=VARCHAR}
- </select>
-
- <select id="selectByUuids" parameterType="string" resultMap="scaReleaseResultMap">
- select <include refid="scaReleasesColumns"/>
- from sca_releases sr
- <if test="arg0.isEmpty()">
- where 1=0
- </if>
- <if test="!arg0.isEmpty()">
- where sr.uuid in
- <foreach collection="collection" item="uuid" open="(" close=")" separator=",">
- #{uuid, jdbcType=VARCHAR}
- </foreach>
- </if>
- </select>
-
- <sql id="scaReleasesOrderBy">
- sr.uuid ASC
- </sql>
-
- <select id="selectByBranchUuid" parameterType="string" resultMap="scaReleaseResultMap">
- select <include refid="scaReleasesColumns"/>
- from sca_releases sr
- where sr.component_uuid = #{branchUuid,jdbcType=VARCHAR}
- order by <include refid="scaReleasesOrderBy"/>
- </select>
-
- <select id="selectByQuery" parameterType="map" resultMap="scaReleaseResultMap">
- select <include refid="scaReleasesColumns"/>
- <include refid="sqlSelectByQuery"/>
- ORDER BY <include refid="scaReleasesOrderBy"/>
- <include refid="org.sonar.db.common.Common.pagination"/>
- </select>
-
- <select id="countByQuery" resultType="int">
- select count(sr.uuid)
- <include refid="sqlSelectByQuery"/>
- </select>
-
- <select id="countReleasesByPackageManager" resultType="org.sonar.db.sca.ScaReleaseByPackageManagerCountDto">
- SELECT
- package_manager AS packageManager,
- count(sr.uuid) AS releaseCount
- <include refid="sqlSelectByQuery"/>
- GROUP BY package_manager
- </select>
-
- <sql id="sqlSelectByQuery">
- from sca_releases sr
- where sr.component_uuid = #{query.branchUuid,jdbcType=VARCHAR}
- <if test="query.direct != null">
- <!-- we only want each sca_releases row once, so this isn't a join. -->
- AND exists (select 1 from sca_dependencies sd where sd.sca_release_uuid = sr.uuid and sd.direct = #{query.direct,jdbcType=BOOLEAN})
- </if>
- <if test="query.productionScope != null">
- <!-- we only want each sca_releases row once, so this isn't a join. -->
- AND exists (select 1 from sca_dependencies sd where sd.sca_release_uuid = sr.uuid and sd.production_scope = #{query.productionScope,jdbcType=BOOLEAN})
- </if>
- <if test="query.packageManagers != null and !query.packageManagers.isEmpty()">
- AND sr.package_manager IN
- <foreach collection="query.packageManagers" open="(" close=")" item="packageManager" separator=",">
- #{packageManager,jdbcType=VARCHAR}
- </foreach>
- </if>
- <if test="query.newInPullRequest != null">
- AND sr.new_in_pull_request = #{query.newInPullRequest,jdbcType=BOOLEAN}
- </if>
- <if test="query.query() != null">
- AND lower(sr.package_name) LIKE #{query.likeQuery} ESCAPE '/'
- </if>
- </sql>
-
- <update id="update" parameterType="org.sonar.db.sca.ScaReleaseDto" useGeneratedKeys="false">
- update sca_releases
- set
- uuid = #{uuid, jdbcType=VARCHAR},
- component_uuid = #{componentUuid, jdbcType=VARCHAR},
- package_url = #{packageUrl, jdbcType=VARCHAR},
- package_manager = #{packageManager, jdbcType=VARCHAR},
- package_name = #{packageName, jdbcType=VARCHAR},
- version = #{version, jdbcType=VARCHAR},
- license_expression = #{licenseExpression, jdbcType=VARCHAR},
- declared_license_expression = #{declaredLicenseExpression, jdbcType=VARCHAR},
- known = #{known, jdbcType=BOOLEAN},
- new_in_pull_request = #{newInPullRequest, jdbcType=BOOLEAN},
- updated_at = #{updatedAt, jdbcType=BIGINT}
- where
- uuid = #{uuid, jdbcType=VARCHAR}
- </update>
-</mapper>
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.xml
deleted file mode 100644
index 1f9a7e07600..00000000000
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/sca/ScaVulnerabilityIssuesMapper.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
-<mapper namespace="org.sonar.db.sca.ScaVulnerabilityIssuesMapper">
- <!-- we're using a resultMap instead of the usual resultType approach in order to provide
- a typeHandler for the cwe_ids column -->
- <resultMap id="scaVulnerabilityIssueResultMap" type="org.sonar.db.sca.ScaVulnerabilityIssueDto">
- <constructor>
- <idArg column="uuid" javaType="String"/>
- <arg column="base_severity" javaType="org.sonar.db.sca.ScaSeverity" jdbcType="VARCHAR"/>
- <arg column="cwe_ids" typeHandler="org.sonar.db.sca.ListOfStringsTypeHandler" jdbcType="VARCHAR"
- javaType="java.util.List"/>
- <arg column="cvss_score" javaType="java.math.BigDecimal"/>
- <!-- the underscore prefix means to use the primitive type instead of boxed type -->
- <arg column="created_at" javaType="_long"/>
- <arg column="updated_at" javaType="_long"/>
- </constructor>
- </resultMap>
-
- <sql id="scaVulnerabilityIssuesColumns">
- svi.uuid,
- svi.base_severity,
- svi.cwe_ids,
- svi.cvss_score,
- svi.created_at,
- svi.updated_at
- </sql>
-
- <insert id="insert" parameterType="org.sonar.db.sca.ScaVulnerabilityIssueDto" useGeneratedKeys="false">
- insert into sca_vulnerability_issues (
- uuid,
- base_severity,
- cwe_ids,
- cvss_score,
- created_at,
- updated_at
- ) values (
- #{uuid,jdbcType=VARCHAR},
- #{baseSeverity,jdbcType=VARCHAR},
- #{cweIds,jdbcType=VARCHAR,typeHandler=org.sonar.db.sca.ListOfStringsTypeHandler},
- #{cvssScore,jdbcType=DECIMAL},
- #{createdAt,jdbcType=BIGINT},
- #{updatedAt,jdbcType=BIGINT}
- )
- </insert>
-
- <!-- delete is left out for now, because it is very dangerous without foreign key constraints and ON DELETE behavior,
- and it hasn't yet been necessary to try to "garbage collect" this table. -->
-
- <select id="selectByUuid" parameterType="string" resultMap="scaVulnerabilityIssueResultMap">
- select <include refid="scaVulnerabilityIssuesColumns"/>
- from sca_vulnerability_issues svi
- where svi.uuid = #{uuid,jdbcType=VARCHAR}
- </select>
-
- <select id="selectByUuids" parameterType="string" resultMap="scaVulnerabilityIssueResultMap">
- select <include refid="scaVulnerabilityIssuesColumns"/>
- from sca_vulnerability_issues svi
- <if test="arg0.isEmpty()">
- where 1=0
- </if>
- <if test="!arg0.isEmpty()">
- where svi.uuid in
- <foreach collection="collection" item="uuid" open="(" close=")" separator=",">
- #{uuid, jdbcType=VARCHAR}
- </foreach>
- </if>
- </select>
-
- <update id="update" parameterType="org.sonar.db.sca.ScaVulnerabilityIssueDto" useGeneratedKeys="false">
- update sca_vulnerability_issues
- set
- uuid = #{uuid, jdbcType=VARCHAR},
- base_severity = #{baseSeverity, jdbcType=VARCHAR},
- cwe_ids = #{cweIds, jdbcType=VARCHAR, typeHandler=org.sonar.db.sca.ListOfStringsTypeHandler},
- cvss_score = #{cvssScore, jdbcType=DECIMAL},
- updated_at = #{updatedAt, jdbcType=BIGINT}
- where
- uuid = #{uuid, jdbcType=VARCHAR}
- </update>
-</mapper>
diff --git a/server/sonar-db-dao/src/schema/schema-sq.ddl b/server/sonar-db-dao/src/schema/schema-sq.ddl
index d2d54a7a8f7..33f9b380ce5 100644
--- a/server/sonar-db-dao/src/schema/schema-sq.ddl
+++ b/server/sonar-db-dao/src/schema/schema-sq.ddl
@@ -399,9 +399,9 @@ ALTER TABLE "GROUPS" ADD CONSTRAINT "PK_GROUPS" PRIMARY KEY("UUID");
CREATE UNIQUE NULLS NOT DISTINCT INDEX "UNIQ_GROUPS_NAME" ON "GROUPS"("NAME" NULLS FIRST);
CREATE TABLE "GROUPS_USERS"(
+ "UUID" CHARACTER VARYING(40) NOT NULL,
"GROUP_UUID" CHARACTER VARYING(40) NOT NULL,
- "USER_UUID" CHARACTER VARYING(255) NOT NULL,
- "UUID" CHARACTER VARYING(40) NOT NULL
+ "USER_UUID" CHARACTER VARYING(255) NOT NULL
);
ALTER TABLE "GROUPS_USERS" ADD CONSTRAINT "PK_GROUPS_USERS" PRIMARY KEY("UUID");
CREATE INDEX "INDEX_GROUPS_USERS_GROUP_UUID" ON "GROUPS_USERS"("GROUP_UUID" NULLS FIRST);
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/PopulateDb.java b/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/PopulateDb.java
index c7821cf24d3..57d80bc8fc1 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/PopulateDb.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/createdb/PopulateDb.java
@@ -39,7 +39,7 @@ import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.measures.CoreMetrics;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.core.metric.SoftwareQualitiesMetrics;
import org.sonar.core.util.UuidFactoryImpl;
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java
index 790a9dd48b5..00e1d78fb3e 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java
@@ -34,7 +34,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.protobuf.DbIssues;
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDtoTest.java
index 6ccc07e07d6..e043370f381 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDtoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleDtoTest.java
@@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.Uuids;
import org.sonar.db.issue.ImpactDto;
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleForIndexingDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleForIndexingDtoTest.java
index a9886bd355c..8a72fbe785e 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleForIndexingDtoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleForIndexingDtoTest.java
@@ -25,7 +25,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
import org.sonar.api.rules.CleanCodeAttributeCategory;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.issue.ImpactDto;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/DefaultScaIssueIdentityTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/DefaultScaIssueIdentityTest.java
deleted file mode 100644
index 122e328a16b..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/DefaultScaIssueIdentityTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class DefaultScaIssueIdentityTest {
-
- @Test
- void test_constructWithValidValues() {
- var issueIdentity = new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", "spdxLicenseId");
- assertEquals(ScaIssueType.VULNERABILITY, issueIdentity.scaIssueType());
- assertEquals("packageUrl", issueIdentity.packageUrl());
- assertEquals("vulnerabilityId", issueIdentity.vulnerabilityId());
- assertEquals("spdxLicenseId", issueIdentity.spdxLicenseId());
- }
-
- @Test
- void test_throwsOnInvalidValues() {
- assertThrows(IllegalArgumentException.class, () -> new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "", "vulnerabilityId", "spdxLicenseId"));
- assertThrows(IllegalArgumentException.class, () -> new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, null, "vulnerabilityId", "spdxLicenseId"));
- assertThrows(IllegalArgumentException.class, () -> new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "packageUrl", "", "spdxLicenseId"));
- assertThrows(IllegalArgumentException.class, () -> new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "packageUrl", null, "spdxLicenseId"));
- assertThrows(IllegalArgumentException.class, () -> new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", ""));
- assertThrows(IllegalArgumentException.class, () -> new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", null));
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/PackageManagerTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/PackageManagerTest.java
deleted file mode 100644
index eed4dcfa2aa..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/PackageManagerTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class PackageManagerTest {
-
- @Test
- void test_namesAreShortEnough() {
- for (PackageManager packageManager : PackageManager.values()) {
- assertThat(packageManager.name().length()).isLessThanOrEqualTo(ScaReleaseDto.PACKAGE_MANAGER_MAX_LENGTH);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependenciesQueryTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependenciesQueryTest.java
deleted file mode 100644
index 7a88e9ba53a..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependenciesQueryTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-
-class ScaDependenciesQueryTest {
-
- @Test
- void testLikeQuery() {
- ScaDependenciesQuery scaDependenciesQuery = new ScaDependenciesQuery("branchUuid", null, null, "QUERY");
- assertEquals("query%", scaDependenciesQuery.likeQuery());
- }
-
- @Test
- void testLikeQueryWithNullQuery() {
- ScaDependenciesQuery scaDependenciesQuery = new ScaDependenciesQuery("branchUuid", null, null, null);
- assertNull(scaDependenciesQuery.likeQuery());
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyDtoTest.java
deleted file mode 100644
index 505a06d6f35..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyDtoTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-
-class ScaDependencyDtoTest {
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var scaDependencyDto = new ScaDependencyDto("scaDependencyUuid",
- "scaReleaseUuid",
- true,
- "compile",
- false,
- "some/path",
- "another/path",
- List.of(List.of("pkg:npm/fodo@1.0.0")),
- true,
- 1L,
- 2L);
- assertThat(scaDependencyDto.toBuilder().build()).isEqualTo(scaDependencyDto);
- }
-
- @Test
- void test_identity_shouldIgnoreUuidAndUpdatableFields() {
- var scaDependencyDto = new ScaDependencyDto("scaDependencyUuid",
- "scaReleaseUuid",
- true,
- "compile",
- false,
- "some/path",
- "another/path",
- List.of(List.of("pkg:npm/IGNORED@1.0.0")),
- false,
- 1L,
- 2L);
- var scaDependencyDtoDifferentButSameIdentity = new ScaDependencyDto("differentUuid",
- "scaReleaseUuid",
- true,
- "compile",
- true,
- "some/path",
- "another/path",
- List.of(List.of("pkg:npm/DIFFERENT_ALSO_IGNORED@1.0.0")),
- true,
- 42L,
- 57L);
- assertThat(scaDependencyDto.identity()).isEqualTo(scaDependencyDtoDifferentButSameIdentity.identity());
- assertThat(scaDependencyDto).isNotEqualTo(scaDependencyDtoDifferentButSameIdentity);
- }
-
- @Test
- void test_identity_changingScaReleaseUuid() {
- var scaDependencyDto = new ScaDependencyDto("scaDependencyUuid",
- "scaReleaseUuid",
- true,
- "compile",
- false,
- "some/path",
- "another/path",
- List.of(List.of("pkg:npm/IGNORED@1.0.0")),
- true,
- 1L,
- 2L);
- var scaDependencyDtoChangedReleaseUuid = new ScaDependencyDto("scaDependencyUuid",
- "scaReleaseUuidDifferent",
- true,
- "compile",
- false,
- "some/path",
- "another/path",
- List.of(List.of("pkg:npm/IGNORED@1.0.0")),
- false,
- 1L,
- 2L);
- assertThat(scaDependencyDto.identity()).isNotEqualTo(scaDependencyDtoChangedReleaseUuid.identity());
- assertThat(scaDependencyDto.identity().withScaReleaseUuid("scaReleaseUuidDifferent")).isEqualTo(scaDependencyDtoChangedReleaseUuid.identity());
- }
-
- @Test
- void test_primaryDependencyFilePath() {
- ScaDependencyDto withUserDependencyFilePath = newScaDependencyDto("manifest");
- assertThat(withUserDependencyFilePath.primaryDependencyFilePath()).isEqualTo("manifest");
- ScaDependencyDto withoutUserDependencyFilePath = newScaDependencyDto(null);
- assertThat(withoutUserDependencyFilePath.primaryDependencyFilePath()).isEqualTo("lockfileDependencyFilePath");
- }
-
- private ScaDependencyDto newScaDependencyDto(@Nullable String userDependencyFilePath) {
- return new ScaDependencyDto("dependencyUuid",
- "scaReleaseUuid",
- true,
- "compile",
- false,
- userDependencyFilePath,
- "lockfileDependencyFilePath",
- List.of(List.of("pkg:npm/foo@1.0.0")),
- false,
- 1L,
- 2L);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyReleaseDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyReleaseDtoTest.java
deleted file mode 100644
index a0be47c280f..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaDependencyReleaseDtoTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class ScaDependencyReleaseDtoTest {
-
- @Test
- void test_primaryDependencyFilePath() {
- ScaDependencyReleaseDto withUserDependencyFilePath = newScaDependencyReleaseDto("manifest");
- assertEquals("manifest", withUserDependencyFilePath.primaryDependencyFilePath());
- ScaDependencyReleaseDto withoutUserDependencyFilePath = newScaDependencyReleaseDto(null);
- assertEquals("lockfileDependencyFilePath", withoutUserDependencyFilePath.primaryDependencyFilePath());
- }
-
- private ScaDependencyReleaseDto newScaDependencyReleaseDto(@Nullable String userDependencyFilePath) {
- return new ScaDependencyReleaseDto("dependencyUuid",
- "releaseUuid",
- "componentUuid",
- true,
- "scope",
- userDependencyFilePath,
- "lockfileDependencyFilePath",
- List.of(List.of("pkg:npm/foo@1.0.0")),
- "packageUrl",
- PackageManager.MAVEN,
- "packageName",
- "version",
- "licenseExpression",
- true);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueDtoTest.java
deleted file mode 100644
index da9eb91dddf..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueDtoTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class ScaIssueDtoTest {
-
- @Test
- void test_constructWithValidValues() {
- var dto = new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", "spdxLicenseId", 1L, 2L);
- assertEquals("uuid", dto.uuid());
- assertEquals(ScaIssueType.VULNERABILITY, dto.scaIssueType());
- assertEquals("packageUrl", dto.packageUrl());
- assertEquals("vulnerabilityId", dto.vulnerabilityId());
- assertEquals("spdxLicenseId", dto.spdxLicenseId());
- assertEquals(1L, dto.createdAt());
- assertEquals(2L, dto.updatedAt());
- }
-
- @Test
- void test_throwsOnInvalidValues() {
- assertThrows(IllegalArgumentException.class, () -> new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "", "vulnerabilityId", "spdxLicenseId", 1L, 2L));
- assertThrows(IllegalArgumentException.class, () -> new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, null, "vulnerabilityId", "spdxLicenseId", 1L, 2L));
- assertThrows(IllegalArgumentException.class, () -> new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "packageUrl", "", "spdxLicenseId", 1L, 2L));
- assertThrows(IllegalArgumentException.class, () -> new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "packageUrl", null, "spdxLicenseId", 1L, 2L));
- assertThrows(IllegalArgumentException.class, () -> new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", "", 1L, 2L));
- assertThrows(IllegalArgumentException.class, () -> new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", null, 1L, 2L));
- }
-
- @Test
- void test_constructFromIdentity() {
- var identity = new DefaultScaIssueIdentity(ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", "spdxLicenseId");
- var dto = new ScaIssueDto("uuid", identity, 1L, 2L);
- assertEquals("uuid", dto.uuid());
- assertEquals(ScaIssueType.VULNERABILITY, dto.scaIssueType());
- assertEquals("packageUrl", dto.packageUrl());
- assertEquals("vulnerabilityId", dto.vulnerabilityId());
- assertEquals("spdxLicenseId", dto.spdxLicenseId());
- assertEquals(1L, dto.createdAt());
- assertEquals(2L, dto.updatedAt());
- }
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var dto = new ScaIssueDto("uuid", ScaIssueType.VULNERABILITY, "packageUrl", "vulnerabilityId", "spdxLicenseId", 1L, 2L);
- assertEquals(dto.toBuilder().build(), dto);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDetailsDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDetailsDtoTest.java
deleted file mode 100644
index a5e62a7d417..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDetailsDtoTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.math.BigDecimal;
-import java.util.List;
-import org.assertj.core.api.ThrowableAssert;
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
-
-class ScaIssueReleaseDetailsDtoTest {
- private static ScaIssueDto newSampleIssueDto() {
- return new ScaIssueDto("issueUuid",
- ScaIssueType.VULNERABILITY,
- "packageUrl",
- "vulnerabilityId",
- "spdxLicenseId",
- 1L,
- 2L);
- }
-
- private static ScaReleaseDto newSampleReleaseDto() {
- return new ScaReleaseDto("releaseUuid",
- "componentUuid",
- "packageUrl",
- PackageManager.MAVEN,
- "foo:bar",
- "1.0.0",
- "MIT",
- "NOASSERTION",
- true,
- false,
- 2L,
- 3L);
- }
-
- private static ScaIssueReleaseDto newSampleIssueReleaseDto(ScaIssueDto issueDto, ScaReleaseDto releaseDto) {
- return new ScaIssueReleaseDto(
- "issueReleaseUuid",
- issueDto.uuid(),
- releaseDto.uuid(),
- ScaSeverity.INFO,
- 3L,
- 4L);
- }
-
- private static ScaVulnerabilityIssueDto newSampleVulnerabilityIssueDto(ScaIssueDto issueDto) {
- return new ScaVulnerabilityIssueDto(
- issueDto.uuid(),
- ScaSeverity.HIGH,
- List.of("cwe1"),
- BigDecimal.ONE,
- 5L,
- 6L);
- }
-
- private static ScaIssueReleaseDetailsDto newSampleIssueReleaseDetailsDto() {
- var issueDto = newSampleIssueDto();
- var releaseDto = newSampleReleaseDto();
- var issueReleaseDto = newSampleIssueReleaseDto(issueDto, releaseDto);
- var vulnerabilityIssueDto = newSampleVulnerabilityIssueDto(issueDto);
- return new ScaIssueReleaseDetailsDto(
- issueReleaseDto.uuid(),
- issueReleaseDto,
- issueDto,
- releaseDto,
- vulnerabilityIssueDto);
- }
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var dto = newSampleIssueReleaseDetailsDto();
- assertThat(dto.toBuilder().build()).isEqualTo(dto);
- }
-
- @Test
- void test_withMismatchedReleaseInIssueReleaseDto_throwsIllegalArgumentException() {
- var validDto = newSampleIssueReleaseDetailsDto();
- var differentIssueReleaseDto = validDto.issueReleaseDto().toBuilder().setScaReleaseUuid("differentUuid").build();
- var invalidBuilder = validDto.toBuilder().setIssueReleaseDto(differentIssueReleaseDto);
- assertThatThrownBy(invalidBuilder::build).isInstanceOf(IllegalArgumentException.class);
- }
-
- @Test
- void test_withMismatchedIssueInIssueReleaseDto_throwsIllegalArgumentException() {
- var validDto = newSampleIssueReleaseDetailsDto();
- var differentIssueReleaseDto = validDto.issueReleaseDto().toBuilder().setScaIssueUuid("differentUuid").build();
- var invalidBuilder = validDto.toBuilder().setIssueReleaseDto(differentIssueReleaseDto);
- assertThatThrownBy(invalidBuilder::build).isInstanceOf(IllegalArgumentException.class);
- }
-
- @Test
- void test_withMismatchedIssueReleaseUuid_throwsIllegalArgumentException() {
- var validDto = newSampleIssueReleaseDetailsDto();
- ThrowableAssert.ThrowingCallable constructInvalid = () -> new ScaIssueReleaseDetailsDto("differentUuid",
- validDto.issueReleaseDto(), validDto.issueDto(), validDto.releaseDto(), validDto.vulnerabilityIssueDto());
- assertThatThrownBy(constructInvalid).isInstanceOf(IllegalArgumentException.class);
- }
-
- @Test
- void test_withMismatchedVulnerabilityIssue_throwsIllegalArgumentException() {
- var validDto = newSampleIssueReleaseDetailsDto();
- var differentVulnerabiiltyIssue = validDto.vulnerabilityIssueDto().toBuilder().setUuid("differentUuid").build();
- var invalidBuilder = validDto.toBuilder().setVulnerabilityIssueDto(differentVulnerabiiltyIssue);
- assertThatThrownBy(invalidBuilder::build).isInstanceOf(IllegalArgumentException.class);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDtoTest.java
deleted file mode 100644
index e1df2cfd1c2..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueReleaseDtoTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-
-class ScaIssueReleaseDtoTest {
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var scaIssueReleaseDto = new ScaIssueReleaseDto("sca-issue-release-uuid",
- "sca-issue-uuid",
- "sca-release-uuid",
- ScaSeverity.INFO,
- 1L,
- 2L);
- assertThat(scaIssueReleaseDto.toBuilder().build()).isEqualTo(scaIssueReleaseDto);
- }
-
- @Test
- void test_identity_shouldIgnoreUuidAndUpdatableFields() {
- var scaIssueReleaseDto = new ScaIssueReleaseDto("sca-issue-release-uuid",
- "sca-issue-uuid",
- "sca-release-uuid",
- ScaSeverity.INFO,
- 1L,
- 2L);
- var scaIssueReleaseDtoDifferentButSameIdentity = new ScaIssueReleaseDto("differentUuid",
- "sca-issue-uuid",
- "sca-release-uuid",
- ScaSeverity.HIGH,
- 10L,
- 20L);
- assertThat(scaIssueReleaseDto.identity()).isEqualTo(scaIssueReleaseDtoDifferentButSameIdentity.identity());
- assertThat(scaIssueReleaseDto).isNotEqualTo(scaIssueReleaseDtoDifferentButSameIdentity);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueTypeTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueTypeTest.java
deleted file mode 100644
index 3027f5e96bd..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssueTypeTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaIssueTypeTest {
-
- @Test
- void test_namesAreShortEnough() {
- for (ScaIssueType issueType : ScaIssueType.values()) {
- assertThat(issueType.name().length()).isLessThanOrEqualTo(ScaIssueDto.SCA_ISSUE_TYPE_MAX_LENGTH);
- }
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQueryTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQueryTest.java
deleted file mode 100644
index e295fc6b3b4..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaIssuesReleasesDetailsQueryTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import org.assertj.core.api.AssertionsForClassTypes;
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaIssuesReleasesDetailsQueryTest {
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var query = new ScaIssuesReleasesDetailsQuery("branchUuid", ScaIssuesReleasesDetailsQuery.Sort.IDENTITY_ASC,
- true, true, "vulnerabilityIdSubstring", "packageNameSubstring", true,
- List.of(ScaIssueType.VULNERABILITY), List.of(ScaSeverity.BLOCKER), List.of(PackageManager.NPM));
- AssertionsForClassTypes.assertThat(query.toBuilder().build()).isEqualTo(query);
- }
-
- @Test
- void test_queryParameterValues() {
- for (var value : ScaIssuesReleasesDetailsQuery.Sort.values()) {
- var queryParameterValue = value.queryParameterValue();
- var fromQueryParameterValue = ScaIssuesReleasesDetailsQuery.Sort.fromQueryParameterValue(queryParameterValue);
- assertThat(fromQueryParameterValue).contains(value);
- assertThat((queryParameterValue.startsWith("+") && value.name().endsWith("_ASC")) ||
- (queryParameterValue.startsWith("-") && value.name().endsWith("_DESC")))
- .as("+/- prefix and ASC/DESC suffix line up")
- .isTrue();
- }
- }
-
- @Test
- void test_whenValueIsInvalid_fromQueryParameterValue() {
- assertThat(ScaIssuesReleasesDetailsQuery.Sort.fromQueryParameterValue("invalid")).isEmpty();
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleaseDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleaseDtoTest.java
deleted file mode 100644
index 6c0ac3d9e53..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleaseDtoTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-
-class ScaReleaseDtoTest {
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var scaReleaseDto = new ScaReleaseDto("scaReleaseUuid",
- "componentUuid",
- "packageUrl",
- PackageManager.MAVEN,
- "foo:bar",
- "1.0.0",
- "MIT",
- "MIT",
- true,
- false,
- 1L,
- 2L);
- assertThat(scaReleaseDto.toBuilder().build()).isEqualTo(scaReleaseDto);
- }
-
- @Test
- void test_identity_shouldIgnoreUuidAndUpdatableFields() {
- var scaReleaseDto = new ScaReleaseDto("scaReleaseUuid",
- "componentUuid",
- "packageUrl",
- PackageManager.MAVEN,
- "foo:bar",
- "1.0.0",
- "MIT",
- "MIT",
- true,
- false,
- 1L,
- 2L);
- var scaReleaseDtoDifferentButSameIdentity = new ScaReleaseDto("differentUuid",
- "componentUuidDifferent",
- "packageUrl",
- PackageManager.NPM,
- "foo:bar-different",
- "2.0.0",
- "GPL-3.0",
- "GPL-3.0",
- false,
- true,
- 10L,
- 30L);
- assertThat(scaReleaseDto.identity()).isEqualTo(scaReleaseDtoDifferentButSameIdentity.identity());
- assertThat(scaReleaseDto).isNotEqualTo(scaReleaseDtoDifferentButSameIdentity);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleasesQueryTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleasesQueryTest.java
deleted file mode 100644
index 23a16876ac9..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaReleasesQueryTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import org.assertj.core.api.AssertionsForClassTypes;
-import org.junit.jupiter.api.Test;
-
-class ScaReleasesQueryTest {
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var query = new ScaReleasesQuery("branchUuid",
- true, false, List.of("NPM"), true, "query");
- AssertionsForClassTypes.assertThat(query.toBuilder().build()).isEqualTo(query);
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaSeverityTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaSeverityTest.java
deleted file mode 100644
index 023f2bd9b20..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaSeverityTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.stream.Stream;
-import org.junit.jupiter.api.Test;
-import org.sonar.api.issue.impact.Severity;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaSeverityTest {
- private static void assertSortOrder(ScaSeverity lower, ScaSeverity higher) {
- assertThat(lower.databaseSortKey())
- .as(lower + " sorts below " + higher)
- .isLessThan(higher.databaseSortKey());
- }
-
- @Test
- void test_maxLength() {
- for (ScaSeverity severity : ScaSeverity.values()) {
- assertThat(severity.name().length()).as(severity.name() + " is short enough")
- .isLessThanOrEqualTo(ScaSeverity.MAX_NAME_LENGTH);
- }
- }
-
- @Test
- void test_sortKeysInOrder() {
- assertSortOrder(ScaSeverity.INFO, ScaSeverity.LOW);
- assertSortOrder(ScaSeverity.LOW, ScaSeverity.MEDIUM);
- assertSortOrder(ScaSeverity.MEDIUM, ScaSeverity.HIGH);
- assertSortOrder(ScaSeverity.HIGH, ScaSeverity.BLOCKER);
- }
-
- @Test
- void test_matchesImpactSeverity() {
- assertThat(Stream.of(ScaSeverity.values()).map(Enum::name).toList())
- .as("ScaSeverity has the same values in the same order as impact.Severity")
- .isEqualTo(Stream.of(Severity.values()).map(Enum::name).toList());
- }
-}
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaVulnerabilityIssueDtoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaVulnerabilityIssueDtoTest.java
deleted file mode 100644
index 1019f1e3e5d..00000000000
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/sca/ScaVulnerabilityIssueDtoTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.math.BigDecimal;
-import java.util.List;
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class ScaVulnerabilityIssueDtoTest {
- @Test
- void test_cweIdsLength_handledByTypeHandler() {
- // this test is here to prevent accidentally messing it up
- assertThat(ScaVulnerabilityIssueDto.CWE_IDS_MAX_LENGTH).isLessThanOrEqualTo(ListOfStringsTypeHandler.MAXIMUM_LENGTH);
- }
-
- @Test
- void test_toBuilder_build_shouldRoundTrip() {
- var scaVulnerabilityIssueDto = new ScaVulnerabilityIssueDto("sca-issue-uuid",
- ScaSeverity.INFO,
- List.of("cwe"),
- new BigDecimal("7.1"),
- 1L,
- 2L);
- assertThat(scaVulnerabilityIssueDto.toBuilder().build()).isEqualTo(scaVulnerabilityIssueDto);
- }
-}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/DbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/DbTester.java
index 41975647b49..866b89dfadb 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/DbTester.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/DbTester.java
@@ -56,11 +56,6 @@ import org.sonar.db.property.PropertyDbTester;
import org.sonar.db.qualitygate.QualityGateDbTester;
import org.sonar.db.qualityprofile.QualityProfileDbTester;
import org.sonar.db.rule.RuleDbTester;
-import org.sonar.db.sca.ScaDependenciesDbTester;
-import org.sonar.db.sca.ScaIssuesDbTester;
-import org.sonar.db.sca.ScaIssuesReleasesDbTester;
-import org.sonar.db.sca.ScaIssuesReleasesDetailsDbTester;
-import org.sonar.db.sca.ScaReleasesDbTester;
import org.sonar.db.source.FileSourceTester;
import org.sonar.db.user.UserDbTester;
import org.sonar.db.webhook.WebhookDbTester;
@@ -101,11 +96,6 @@ public class DbTester extends AbstractDbTester<TestDbImpl> implements BeforeEach
private final AlmPatsDbTester almPatsDbtester;
private final AuditDbTester auditDbTester;
private final AnticipatedTransitionDbTester anticipatedTransitionDbTester;
- private final ScaDependenciesDbTester scaDependenciesDbTester;
- private final ScaIssuesDbTester scaIssuesDbTester;
- private final ScaIssuesReleasesDbTester scaIssuesReleasesDbTester;
- private final ScaIssuesReleasesDetailsDbTester scaIssuesReleasesDetailsDbTester;
- private final ScaReleasesDbTester scaReleasesDbTester;
private DbTester(UuidFactory uuidFactory, System2 system2, @Nullable String schemaPath, AuditPersister auditPersister, MyBatisConfExtension... confExtensions) {
super(TestDbImpl.create(schemaPath, confExtensions));
@@ -138,11 +128,6 @@ public class DbTester extends AbstractDbTester<TestDbImpl> implements BeforeEach
this.almPatsDbtester = new AlmPatsDbTester(this);
this.auditDbTester = new AuditDbTester(this);
this.anticipatedTransitionDbTester = new AnticipatedTransitionDbTester(this);
- this.scaDependenciesDbTester = new ScaDependenciesDbTester(this);
- this.scaIssuesDbTester = new ScaIssuesDbTester(this);
- this.scaIssuesReleasesDbTester = new ScaIssuesReleasesDbTester(this);
- this.scaIssuesReleasesDetailsDbTester = new ScaIssuesReleasesDetailsDbTester(this);
- this.scaReleasesDbTester = new ScaReleasesDbTester(this);
}
public static DbTester create() {
@@ -294,22 +279,6 @@ public class DbTester extends AbstractDbTester<TestDbImpl> implements BeforeEach
return anticipatedTransitionDbTester;
}
- public ScaDependenciesDbTester getScaDependenciesDbTester() {
- return scaDependenciesDbTester;
- }
-
- public ScaIssuesDbTester getScaIssuesDbTester() {
- return scaIssuesDbTester;
- }
-
- public ScaIssuesReleasesDetailsDbTester getScaIssuesReleasesDetailsDbTester() {
- return scaIssuesReleasesDetailsDbTester;
- }
-
- public ScaReleasesDbTester getScaReleasesDbTester() {
- return scaReleasesDbTester;
- }
-
@Override
public void afterEach(ExtensionContext context) throws Exception {
after();
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java
index 82112928b32..171ac2ea2de 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/issue/IssueDbTester.java
@@ -24,7 +24,7 @@ import java.util.Random;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssueComment;
import org.sonar.core.issue.FieldDiffs;
import org.sonar.core.util.Uuids;
@@ -38,7 +38,7 @@ import org.sonar.db.user.UserDto;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Arrays.stream;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/PermissionsTestHelper.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/PermissionsTestHelper.java
index 740c25e5ccb..4f644ffe6e0 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/PermissionsTestHelper.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/PermissionsTestHelper.java
@@ -20,7 +20,6 @@
package org.sonar.db.permission;
import java.util.Set;
-import org.sonar.api.web.UserRole;
import static org.sonar.db.permission.GlobalPermission.APPLICATION_CREATOR;
import static org.sonar.db.permission.GlobalPermission.PORTFOLIO_CREATOR;
@@ -28,8 +27,9 @@ import static org.sonar.db.permission.GlobalPermission.SCAN;
public class PermissionsTestHelper {
- public static final Set<String> ALL_PERMISSIONS = Set.of(UserRole.ADMIN, UserRole.CODEVIEWER, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN,
- SCAN.getKey(), UserRole.USER, APPLICATION_CREATOR.getKey(), PORTFOLIO_CREATOR.getKey());
+ public static final Set<String> ALL_PERMISSIONS = Set.of(ProjectPermission.ADMIN.getKey(), ProjectPermission.CODEVIEWER.getKey(),
+ ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(),
+ SCAN.getKey(), ProjectPermission.USER.getKey(), APPLICATION_CREATOR.getKey(), PORTFOLIO_CREATOR.getKey());
private PermissionsTestHelper() {
}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/template/PermissionTemplateDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/template/PermissionTemplateDbTester.java
index 981ffa9664c..4eb8168524e 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/template/PermissionTemplateDbTester.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/permission/template/PermissionTemplateDbTester.java
@@ -23,6 +23,7 @@ import java.util.function.Consumer;
import javax.annotation.Nullable;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
@@ -68,32 +69,60 @@ public class PermissionTemplateDbTester {
return templateInDb;
}
+ public void addGroupToTemplate(PermissionTemplateDto permissionTemplate, GroupDto group, ProjectPermission permission) {
+ addGroupToTemplate(permissionTemplate, group, permission.getKey());
+ }
+
public void addGroupToTemplate(PermissionTemplateDto permissionTemplate, GroupDto group, String permission) {
addGroupToTemplate(permissionTemplate.getUuid(), group.getUuid(), permission, permissionTemplate.getName(), group.getName());
}
+ public void addGroupToTemplate(String templateUuid, @Nullable String groupUuid, ProjectPermission permission, String templateName, @Nullable String groupName) {
+ addGroupToTemplate(templateUuid, groupUuid, permission.getKey(), templateName, groupName);
+ }
+
public void addGroupToTemplate(String templateUuid, @Nullable String groupUuid, String permission, String templateName, @Nullable String groupName) {
dbClient.permissionTemplateDao().insertGroupPermission(db.getSession(), templateUuid, groupUuid, permission, templateName, groupName);
db.commit();
}
+ public void addAnyoneToTemplate(PermissionTemplateDto permissionTemplate, ProjectPermission permission) {
+ addAnyoneToTemplate(permissionTemplate, permission.getKey());
+ }
+
public void addAnyoneToTemplate(PermissionTemplateDto permissionTemplate, String permission) {
addGroupToTemplate(permissionTemplate.getUuid(), null, permission, permissionTemplate.getName(), null);
}
+ public void addUserToTemplate(PermissionTemplateDto permissionTemplate, UserDto user, ProjectPermission permission) {
+ addUserToTemplate(permissionTemplate, user, permission.getKey());
+ }
+
public void addUserToTemplate(PermissionTemplateDto permissionTemplate, UserDto user, String permission) {
addUserToTemplate(permissionTemplate.getUuid(), user.getUuid(), permission, permissionTemplate.getName(), user.getName());
}
+ public void addUserToTemplate(String templateUuid, String userUuid, ProjectPermission permission, String templateName, String userLogin) {
+ addUserToTemplate(templateUuid, userUuid, permission.getKey(), templateName, userLogin);
+ }
+
public void addUserToTemplate(String templateUuid, String userUuid, String permission, String templateName, String userLogin) {
dbClient.permissionTemplateDao().insertUserPermission(db.getSession(), templateUuid, userUuid, permission, templateName, userLogin);
db.commit();
}
+ public void addProjectCreatorToTemplate(PermissionTemplateDto permissionTemplate, ProjectPermission permission) {
+ addProjectCreatorToTemplate(permissionTemplate, permission.getKey());
+ }
+
public void addProjectCreatorToTemplate(PermissionTemplateDto permissionTemplate, String permission) {
addProjectCreatorToTemplate(permissionTemplate.getUuid(), permission, permissionTemplate.getName());
}
+ public void addProjectCreatorToTemplate(String templateUuid, ProjectPermission permission, String templateName) {
+ addProjectCreatorToTemplate(templateUuid, permission.getKey(), templateName);
+ }
+
public void addProjectCreatorToTemplate(String templateUuid, String permission, String templateName) {
dbClient.permissionTemplateCharacteristicDao().insert(db.getSession(), newPermissionTemplateCharacteristicDto()
.setWithProjectCreator(true)
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleDbTester.java
index 18bbfe1e700..a984b01cf27 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleDbTester.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleDbTester.java
@@ -23,12 +23,12 @@ import java.util.Arrays;
import java.util.Random;
import java.util.function.Consumer;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import static java.util.Arrays.asList;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.db.rule.RuleTesting.newDeprecatedRuleKey;
import static org.sonar.db.rule.RuleTesting.newRule;
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleTesting.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleTesting.java
index 73a0b5a0993..cdb250e515d 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleTesting.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleTesting.java
@@ -31,7 +31,7 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RuleParamType;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
@@ -44,7 +44,7 @@ import static com.google.common.collect.Sets.newHashSet;
import static java.util.Arrays.stream;
import static org.apache.commons.lang3.RandomStringUtils.secure;
import static org.sonar.api.rule.RuleKey.EXTERNAL_RULE_REPO_PREFIX;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.db.rule.RuleDescriptionSectionDto.createDefaultRuleDescriptionSection;
/**
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaDependenciesDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaDependenciesDbTester.java
deleted file mode 100644
index 97d6a718ea5..00000000000
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaDependenciesDbTester.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.List;
-import java.util.function.Function;
-import javax.annotation.Nullable;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbTester;
-import org.sonar.db.component.ComponentDto;
-
-public class ScaDependenciesDbTester {
- private final DbTester db;
- private final DbClient dbClient;
-
- public ScaDependenciesDbTester(DbTester db) {
- this.db = db;
- this.dbClient = db.getDbClient();
- }
-
- public static ScaDependencyDto newScaDependencyDto(String scaReleaseUuid, String suffix) {
- return newScaDependencyDto(scaReleaseUuid, suffix, null);
- }
-
- public static ScaDependencyDto newScaDependencyDto(String scaReleaseUuid, String suffix, boolean direct) {
- return newScaDependencyDto(scaReleaseUuid, suffix, builder -> builder.setDirect(direct));
- }
-
- public static ScaDependencyDto newScaDependencyDto(String scaReleaseUuid, String suffix, @Nullable Function<ScaDependencyDto.Builder, ScaDependencyDto.Builder> customizer) {
- long now = 1348L;
- var builder = new ScaDependencyDto("scaDependencyUuid" + suffix,
- scaReleaseUuid,
- true,
- "compile",
- false,
- "pom.xml",
- "package-lock.json",
- List.of(List.of("pkg:npm/foo@1.0.0")),
- false,
- now,
- now).toBuilder();
- if (customizer != null) {
- builder = customizer.apply(builder);
- }
- return builder.build();
- }
-
- public ComponentDto newComponentDto(String branchUuid, String suffix) {
- return new ComponentDto().setUuid("uuid" + suffix)
- .setKey("key" + suffix)
- .setUuidPath("uuidPath" + suffix)
- .setBranchUuid(branchUuid);
- }
-
- public ComponentDto insertComponent(String branchUuid, String suffix) {
- ComponentDto componentDto = newComponentDto(branchUuid, suffix);
- db.components().insertComponent(componentDto);
- return componentDto;
- }
-
- public ScaDependencyDto insertScaDependency(String scaReleaseUuid, String suffix, Function<ScaDependencyDto.Builder, ScaDependencyDto.Builder> customizer) {
- ScaDependencyDto scaDependencyDto = newScaDependencyDto(scaReleaseUuid, suffix, customizer);
- dbClient.scaDependenciesDao().insert(db.getSession(), scaDependencyDto);
- return scaDependencyDto;
- }
-
- public ScaDependencyDto insertScaDependency(ScaReleaseDto scaReleaseDto, String suffix, Function<ScaDependencyDto.Builder, ScaDependencyDto.Builder> customizer) {
- return insertScaDependency(scaReleaseDto.uuid(), suffix, customizer);
- }
-
- public ScaDependencyDto insertScaDependency(String scaReleaseUuid, String suffix) {
- ScaDependencyDto scaDependencyDto = newScaDependencyDto(scaReleaseUuid, suffix);
- dbClient.scaDependenciesDao().insert(db.getSession(), scaDependencyDto);
- return scaDependencyDto;
- }
-
- public ScaDependencyDto insertScaDependency(ScaReleaseDto scaReleaseDto, String suffix) {
- return insertScaDependency(scaReleaseDto.uuid(), suffix);
- }
-
- public ScaDependencyDto insertScaDependency(String scaReleaseUuid, String suffix, boolean direct) {
- ScaDependencyDto scaDependencyDto = newScaDependencyDto(scaReleaseUuid, suffix, direct);
- dbClient.scaDependenciesDao().insert(db.getSession(), scaDependencyDto);
- return scaDependencyDto;
- }
-
- public ScaDependencyDto insertScaDependency(ScaReleaseDto scaReleaseDto, String suffix, boolean direct) {
- return insertScaDependency(scaReleaseDto.uuid(), suffix, direct);
- }
-
- public ScaDependencyDto insertScaDependencyWithRelease(String componentUuid, String suffix, boolean direct, PackageManager packageManager, String packageName) {
- var scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentUuid, suffix, packageManager, packageName);
- return insertScaDependency(scaReleaseDto.uuid(), suffix, direct);
- }
-
- public ScaDependencyDto insertScaDependencyWithRelease(String componentUuid, String suffix, Function<ScaDependencyDto.Builder, ScaDependencyDto.Builder> customizer,
- PackageManager packageManager, String packageName) {
- var scaReleaseDto = db.getScaReleasesDbTester().insertScaRelease(componentUuid, suffix, packageManager, packageName);
- return insertScaDependency(scaReleaseDto.uuid(), suffix, customizer);
- }
-}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesDbTester.java
deleted file mode 100644
index c7c26bbd0ae..00000000000
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesDbTester.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbTester;
-
-public class ScaIssuesDbTester {
- private static final Map<String, String> SAMPLE_LICENSES_BY_SUFFIX = Map.of(
- "1", "MIT",
- "2", "0BSD",
- "3", "GPL-3.0",
- "4", "Apache-2.0",
- "5", "BSD-3-Clause");
-
- private final DbTester db;
- private final DbClient dbClient;
-
- public ScaIssuesDbTester(DbTester db) {
- this.db = db;
- this.dbClient = db.getDbClient();
- }
-
- public static ScaVulnerabilityIssueDto newVulnerabilityIssueDto(String suffix) {
- return new ScaVulnerabilityIssueDto("sca-issue-uuid" + suffix, ScaSeverity.INFO, List.of("cwe" + suffix), new BigDecimal("7.1"), 1L, 2L);
- }
-
- public static ScaIssueDto newVulnerabilityScaIssueDto(String suffix) {
- return new ScaIssueDto("sca-issue-uuid" + suffix, ScaIssueType.VULNERABILITY, "fakePackageUrl" + suffix, "fakeVulnerabilityId" + suffix, ScaIssueDto.NULL_VALUE, 1L,
- 2L);
- }
-
- public static ScaIssueDto newProhibitedLicenseScaIssueDto(String suffix) {
- return new ScaIssueDto("sca-issue-uuid" + suffix, ScaIssueType.PROHIBITED_LICENSE, ScaIssueDto.NULL_VALUE, ScaIssueDto.NULL_VALUE,
- SAMPLE_LICENSES_BY_SUFFIX.getOrDefault(suffix, "GPL-3.0-only"), 1L, 2L);
- }
-
- Map.Entry<ScaIssueDto, ScaVulnerabilityIssueDto> newVulnerabilityIssue(String suffix) {
- var scaIssueDto = newVulnerabilityScaIssueDto(suffix);
- var vulnerabilityIssueDto = newVulnerabilityIssueDto(suffix);
- return Map.entry(scaIssueDto, vulnerabilityIssueDto);
- }
-
- Map.Entry<ScaIssueDto, ScaVulnerabilityIssueDto> insertVulnerabilityIssue(String suffix) {
- var scaIssueDto = newVulnerabilityScaIssueDto(suffix);
- var vulnerabilityIssueDto = newVulnerabilityIssueDto(suffix);
-
- dbClient.scaIssuesDao().insert(db.getSession(), scaIssueDto);
- dbClient.scaVulnerabilityIssuesDao().insert(db.getSession(), vulnerabilityIssueDto);
- return Map.entry(scaIssueDto, vulnerabilityIssueDto);
- }
-
- ScaIssueDto insertProhibitedLicenseIssue(String suffix) {
- var scaIssueDto = newProhibitedLicenseScaIssueDto(suffix);
- dbClient.scaIssuesDao().insert(db.getSession(), scaIssueDto);
- return scaIssueDto;
- }
-}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDbTester.java
deleted file mode 100644
index 7e1b39fd260..00000000000
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDbTester.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.sonar.db.DbClient;
-import org.sonar.db.DbTester;
-
-public class ScaIssuesReleasesDbTester {
- private final DbTester db;
- private final DbClient dbClient;
-
- public ScaIssuesReleasesDbTester(DbTester db) {
- this.db = db;
- this.dbClient = db.getDbClient();
- }
-
- public static ScaIssueReleaseDto fromDtos(ScaIssueDto issueDto, ScaReleaseDto releaseDto, String suffix) {
- return new ScaIssueReleaseDto("issueReleaseUuid" + suffix, issueDto.uuid(), releaseDto.uuid(), ScaSeverity.INFO, 89L, 90L);
- }
-
- public static IssueReleaseData newProhibitedLicenseIssueReleaseDto(String suffix) {
- var issueDto = ScaIssuesDbTester.newProhibitedLicenseScaIssueDto(suffix);
- var releaseDto = ScaReleasesDbTester.newScaReleaseDto(suffix);
- var issueReleaseDto = fromDtos(issueDto, releaseDto, suffix);
- return new IssueReleaseData(issueReleaseDto, issueDto, releaseDto, null);
- }
-
- public static IssueReleaseData newVulnerabilityIssueReleaseDto(String suffix) {
- var issueDto = ScaIssuesDbTester.newVulnerabilityScaIssueDto(suffix);
- var vulnerabiiltyIssueDto = ScaIssuesDbTester.newVulnerabilityIssueDto(suffix);
- var releaseDto = ScaReleasesDbTester.newScaReleaseDto(suffix);
- var issueReleaseDto = fromDtos(issueDto, releaseDto, suffix);
- return new IssueReleaseData(issueReleaseDto, issueDto, releaseDto, vulnerabiiltyIssueDto);
- }
-
- public IssueReleaseData insertProhibitedLicenseIssueReleaseDto(String suffix) {
- var data = newProhibitedLicenseIssueReleaseDto(suffix);
- dbClient.scaIssuesDao().insert(db.getSession(), data.issueDto);
- dbClient.scaReleasesDao().insert(db.getSession(), data.releaseDto);
- dbClient.scaIssuesReleasesDao().insert(db.getSession(), data.issueReleaseDto);
- return data;
- }
-
- public IssueReleaseData insertVulnerabilityIssueReleaseDto(String suffix) {
- var data = newVulnerabilityIssueReleaseDto(suffix);
- dbClient.scaIssuesDao().insert(db.getSession(), data.issueDto);
- dbClient.scaReleasesDao().insert(db.getSession(), data.releaseDto);
- dbClient.scaIssuesReleasesDao().insert(db.getSession(), data.issueReleaseDto);
- dbClient.scaVulnerabilityIssuesDao().insert(db.getSession(), data.vulnerabilityIssueDto);
- return data;
- }
-
- public record IssueReleaseData(
- ScaIssueReleaseDto issueReleaseDto,
- ScaIssueDto issueDto,
- ScaReleaseDto releaseDto,
- ScaVulnerabilityIssueDto vulnerabilityIssueDto) {
- }
-}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDbTester.java
deleted file mode 100644
index 869a62e61a2..00000000000
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaIssuesReleasesDetailsDbTester.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import java.util.Optional;
-import java.util.function.Function;
-import javax.annotation.Nullable;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class ScaIssuesReleasesDetailsDbTester {
- private final DbTester db;
- private final DbClient dbClient;
-
- public ScaIssuesReleasesDetailsDbTester(DbTester db) {
- this.db = db;
- this.dbClient = db.getDbClient();
- }
-
- public static ScaIssueReleaseDetailsDto fromIssueReleaseData(ScaIssuesReleasesDbTester.IssueReleaseData issueReleaseData) {
- return new ScaIssueReleaseDetailsDto(
- issueReleaseData.issueReleaseDto().uuid(),
- issueReleaseData.issueReleaseDto(),
- issueReleaseData.issueDto(),
- issueReleaseData.releaseDto(),
- issueReleaseData.vulnerabilityIssueDto());
- }
-
- public static ScaIssueReleaseDetailsDto fromDtos(ScaIssueReleaseDto issueReleaseDto, ScaIssueDto issueDto,
- Optional<ScaVulnerabilityIssueDto> vulnerabilityIssueDtoOptional, ScaReleaseDto releaseDto) {
- return new ScaIssueReleaseDetailsDto(issueReleaseDto.uuid(), issueReleaseDto,
- issueDto, releaseDto, vulnerabilityIssueDtoOptional.orElse(null));
- }
-
- private ScaIssueReleaseDetailsDto insertIssue(ScaIssueDto scaIssue, Optional<ScaVulnerabilityIssueDto> scaVulnerabilityIssueDtoOptional,
- String suffix, String componentUuid) {
- // insertScaRelease has suffix and componentUuid swapped vs. our own method...
- var scaRelease = db.getScaReleasesDbTester().insertScaRelease(componentUuid, suffix);
- var scaIssueRelease = new ScaIssueReleaseDto("sca-issue-release-uuid-" + suffix, scaIssue, scaRelease, ScaSeverity.INFO, 1L, 2L);
- dbClient.scaIssuesReleasesDao().insert(db.getSession(), scaIssueRelease);
- return fromDtos(scaIssueRelease, scaIssue, scaVulnerabilityIssueDtoOptional, scaRelease);
- }
-
- public ScaIssueReleaseDetailsDto insertVulnerabilityIssue(String suffix, String componentUuid) {
- var entry = db.getScaIssuesDbTester().insertVulnerabilityIssue(suffix);
- return insertIssue(entry.getKey(), Optional.of(entry.getValue()), suffix, componentUuid);
- }
-
- public ScaIssueReleaseDetailsDto insertProhibitedLicenseIssue(String suffix, String componentUuid) {
- var scaIssue = db.getScaIssuesDbTester().insertProhibitedLicenseIssue(suffix);
- return insertIssue(scaIssue, Optional.empty(), suffix, componentUuid);
- }
-
- public ScaIssueReleaseDetailsDto insertIssue(ScaIssueType scaIssueType, String suffix, String componentUuid) {
- return insertIssue(scaIssueType, suffix, componentUuid,
- null, null, null, null);
- }
-
- public ScaIssueReleaseDetailsDto insertIssue(ScaIssueType scaIssueType, String suffix, String componentUuid,
- @Nullable Function<ScaIssueDto, ScaIssueDto> scaIssueModifier,
- @Nullable Function<ScaVulnerabilityIssueDto, ScaVulnerabilityIssueDto> scaVulnerabilityIssueModifier,
- @Nullable Function<ScaReleaseDto, ScaReleaseDto> scaReleaseModifier,
- @Nullable Function<ScaIssueReleaseDto, ScaIssueReleaseDto> scaIssueReleaseModifier) {
- var scaRelease = ScaReleasesDbTester.newScaReleaseDto(componentUuid, suffix, PackageManager.MAVEN, "packageName" + suffix);
- if (scaReleaseModifier != null) {
- scaRelease = scaReleaseModifier.apply(scaRelease);
- }
- // little hack here because it's useful to allow providing a release that already exists
- var existing = dbClient.scaReleasesDao().selectByUuid(db.getSession(), scaRelease.uuid());
- if (existing.isEmpty()) {
- dbClient.scaReleasesDao().insert(db.getSession(), scaRelease);
- } else {
- assertThat(existing).contains(scaRelease);
- }
- var scaIssue = switch (scaIssueType) {
- case PROHIBITED_LICENSE -> ScaIssuesDbTester.newProhibitedLicenseScaIssueDto(suffix);
- case VULNERABILITY -> ScaIssuesDbTester.newVulnerabilityScaIssueDto(suffix);
- };
- if (scaIssueModifier != null) {
- scaIssue = scaIssueModifier.apply(scaIssue);
- }
- dbClient.scaIssuesDao().insert(db.getSession(), scaIssue);
- ScaVulnerabilityIssueDto scaVulnerabilityIssue = null;
- if (scaIssue.scaIssueType() == ScaIssueType.VULNERABILITY) {
- scaVulnerabilityIssue = ScaIssuesDbTester.newVulnerabilityIssueDto(suffix);
- if (!scaVulnerabilityIssue.uuid().equals(scaIssue.uuid())) {
- throw new IllegalStateException("ScaVulnerabilityIssueDto.uuid must match ScaIssueDto.uuid or we won't find the ScaVueberabilityIssueDto");
- }
- if (scaVulnerabilityIssueModifier != null) {
- scaVulnerabilityIssue = scaVulnerabilityIssueModifier.apply(scaVulnerabilityIssue);
- }
- dbClient.scaVulnerabilityIssuesDao().insert(db.getSession(), scaVulnerabilityIssue);
- }
- var scaIssueRelease = new ScaIssueReleaseDto("sca-issue-release-uuid-" + suffix, scaIssue, scaRelease, ScaSeverity.INFO, 1L, 2L);
- if (scaIssueReleaseModifier != null) {
- scaIssueRelease = scaIssueReleaseModifier.apply(scaIssueRelease);
- }
- dbClient.scaIssuesReleasesDao().insert(db.getSession(), scaIssueRelease);
- return fromDtos(scaIssueRelease, scaIssue, Optional.ofNullable(scaVulnerabilityIssue), scaRelease);
- }
-}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaReleasesDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaReleasesDbTester.java
deleted file mode 100644
index 0921c265bfa..00000000000
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/sca/ScaReleasesDbTester.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.db.sca;
-
-import org.sonar.db.DbClient;
-import org.sonar.db.DbTester;
-
-public class ScaReleasesDbTester {
- private final DbTester db;
- private final DbClient dbClient;
-
- public ScaReleasesDbTester(DbTester db) {
- this.db = db;
- this.dbClient = db.getDbClient();
- }
-
- public static ScaReleaseDto newScaReleaseDto(String suffix) {
- return newScaReleaseDto("componentUuid_release_" + suffix, suffix, PackageManager.MAVEN, "packageName" + suffix);
- }
-
- public static ScaReleaseDto newScaReleaseDto(String componentUuid, String suffix, PackageManager packageManager, String packageName) {
- return new ScaReleaseDto("scaReleaseUuid" + suffix,
- componentUuid,
- "packageUrl" + suffix,
- packageManager,
- packageName,
- "1.0.0-" + suffix,
- "MIT",
- "MIT",
- true,
- false,
- 1L,
- 2L);
- }
-
- public ScaReleaseDto insertScaRelease(String componentUuid, String suffix) {
- return insertScaRelease(componentUuid, suffix, PackageManager.MAVEN, "packageName" + suffix);
- }
-
- public ScaReleaseDto insertScaRelease(String componentUuid, String suffix, PackageManager packageManager, String packageName) {
- var scaReleaseDto = newScaReleaseDto(componentUuid, suffix, packageManager, packageName);
- dbClient.scaReleasesDao().insert(db.getSession(), scaReleaseDto);
- return scaReleaseDto;
- }
-
- /**
- * Inserts a release and also dependencyCount sca_dependencies that depend on that release.
- */
- public ScaReleaseDto insertScaReleaseWithDependency(String componentUuid, String suffix, int dependencyCount, boolean direct, PackageManager packageManager, String packageName) {
- var scaReleaseDto = insertScaRelease(componentUuid, suffix, packageManager, packageName);
- while (dependencyCount > 0) {
- db.getScaDependenciesDbTester().insertScaDependency(scaReleaseDto, suffix + "-" + dependencyCount, direct);
- dependencyCount--;
- }
- return scaReleaseDto;
- }
-}
diff --git a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java
index 0335b8fe354..26dcfbab451 100644
--- a/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java
+++ b/server/sonar-db-dao/src/testFixtures/java/org/sonar/db/user/UserDbTester.java
@@ -28,18 +28,18 @@ import java.util.Set;
import java.util.function.Consumer;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.security.DefaultGroups;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.dismissmessage.MessageType;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.UserPermissionDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.provisioning.GithubOrganizationGroupDto;
@@ -51,10 +51,10 @@ import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toSet;
import static org.apache.commons.lang3.RandomStringUtils.secure;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER;
+import static org.sonar.db.permission.ProjectPermission.PUBLIC_PERMISSIONS;
import static org.sonar.db.user.GroupTesting.newGroupDto;
public class UserDbTester {
- private static final Set<String> PUBLIC_PERMISSIONS = Set.of(UserRole.USER, UserRole.CODEVIEWER);
public static final String PERMISSIONS_CANT_BE_GRANTED_ON_BRANCHES = "Permissions can't be granted on branches";
private final Random random = new SecureRandom();
@@ -253,10 +253,18 @@ public class UserDbTester {
return dto;
}
+ public GroupPermissionDto insertPermissionOnAnyone(ProjectPermission permission) {
+ return insertPermissionOnAnyone(permission.getKey());
+ }
+
public GroupPermissionDto insertPermissionOnAnyone(GlobalPermission permission) {
return insertPermissionOnAnyone(permission.getKey());
}
+ public Set<GroupPermissionDto> insertPermissionsOnGroup(GroupDto group, ProjectPermission... permissions) {
+ return insertPermissionsOnGroup(group, stream(permissions).map(ProjectPermission::getKey).toArray(String[]::new));
+ }
+
public Set<GroupPermissionDto> insertPermissionsOnGroup(GroupDto group, String... permissions) {
return stream(permissions)
.map(p -> insertPermissionOnGroup(group, p))
@@ -277,9 +285,13 @@ public class UserDbTester {
return insertPermissionOnGroup(group, permission.getKey());
}
+ public GroupPermissionDto insertPermissionOnGroup(GroupDto group, ProjectPermission permission) {
+ return insertPermissionOnGroup(group, permission.getKey());
+ }
+
public GroupPermissionDto insertProjectPermissionOnAnyone(String permission, ComponentDto project) {
checkArgument(!project.isPrivate(), "No permission to group AnyOne can be granted on a private project");
- checkArgument(!PUBLIC_PERMISSIONS.contains(permission),
+ checkArgument(!PUBLIC_PERMISSIONS.stream().map(ProjectPermission::getKey).collect(toSet()).contains(permission),
"permission %s can't be granted on a public project", permission);
Optional<BranchDto> branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), project.branchUuid());
// I don't know if this check is worth it
@@ -300,9 +312,13 @@ public class UserDbTester {
return dto;
}
+ public GroupPermissionDto insertEntityPermissionOnAnyone(ProjectPermission permission, EntityDto entity) {
+ return insertEntityPermissionOnAnyone(permission.getKey(), entity);
+ }
+
public GroupPermissionDto insertEntityPermissionOnAnyone(String permission, EntityDto entity) {
checkArgument(!entity.isPrivate(), "No permission to group AnyOne can be granted on a private entity");
- checkArgument(!PUBLIC_PERMISSIONS.contains(permission),
+ checkArgument(!PUBLIC_PERMISSIONS.stream().map(ProjectPermission::getKey).collect(toSet()).contains(permission),
"permission %s can't be granted on a public entity", permission);
GroupPermissionDto dto = new GroupPermissionDto()
.setUuid(Uuids.createFast())
@@ -315,13 +331,17 @@ public class UserDbTester {
return dto;
}
- public void deleteProjectPermissionFromAnyone(EntityDto entity, String permission) {
- db.getDbClient().groupPermissionDao().delete(db.getSession(), permission, null, null, entity);
+ public void deleteProjectPermissionFromAnyone(EntityDto entity, ProjectPermission permission) {
+ db.getDbClient().groupPermissionDao().delete(db.getSession(), permission.getKey(), null, null, entity);
db.commit();
}
+ public GroupPermissionDto insertProjectPermissionOnGroup(GroupDto group, ProjectPermission permission, ComponentDto project) {
+ return insertProjectPermissionOnGroup(group, permission.getKey(), project);
+ }
+
public GroupPermissionDto insertProjectPermissionOnGroup(GroupDto group, String permission, ComponentDto project) {
- checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
+ checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.stream().map(ProjectPermission::getKey).collect(toSet()).contains(permission),
"%s can't be granted on a public project", permission);
Optional<BranchDto> branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), project.branchUuid());
// I don't know if this check is worth it
@@ -343,12 +363,20 @@ public class UserDbTester {
return dto;
}
+ public Set<GroupPermissionDto> insertEntityPermissionsOnGroup(GroupDto group, EntityDto entity, ProjectPermission... permissions) {
+ return insertEntityPermissionsOnGroup(group, entity, stream(permissions).map(ProjectPermission::getKey).toArray(String[]::new));
+ }
+
public Set<GroupPermissionDto> insertEntityPermissionsOnGroup(GroupDto group, EntityDto entity, String... permissions) {
return stream(permissions)
.map(permission -> insertEntityPermissionOnGroup(group, permission, entity))
.collect(toSet());
}
+ public GroupPermissionDto insertEntityPermissionOnGroup(GroupDto group, ProjectPermission permission, EntityDto entity) {
+ return insertEntityPermissionOnGroup(group, permission.getKey(), entity);
+ }
+
public GroupPermissionDto insertEntityPermissionOnGroup(GroupDto group, String permission, EntityDto entity) {
checkArgument(entity.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
"%s can't be granted on a public entity (project or portfolio)", permission);
@@ -405,16 +433,20 @@ public class UserDbTester {
db.commit();
}
- public void deletePermissionFromUser(EntityDto project, UserDto user, String permission) {
- db.getDbClient().userPermissionDao().deleteEntityPermission(db.getSession(), user, permission, project);
+ public void deletePermissionFromUser(EntityDto project, UserDto user, ProjectPermission permission) {
+ db.getDbClient().userPermissionDao().deleteEntityPermission(db.getSession(), user, permission.getKey(), project);
db.commit();
}
/**
* Grant permission on given project
*/
+ public UserPermissionDto insertProjectPermissionOnUser(UserDto user, ProjectPermission permission, ComponentDto project) {
+ return insertProjectPermissionOnUser(user, permission.getKey(), project);
+ }
+
public UserPermissionDto insertProjectPermissionOnUser(UserDto user, String permission, ComponentDto project) {
- checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
+ checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.stream().map(ProjectPermission::getKey).collect(toSet()).contains(permission),
"%s can't be granted on a public project", permission);
EntityDto entityDto;
if (project.qualifier().equals(ComponentQualifiers.VIEW) || project.qualifier().equals(ComponentQualifiers.SUBVIEW)) {
@@ -436,8 +468,12 @@ public class UserDbTester {
return dto;
}
+ public UserPermissionDto insertProjectPermissionOnUser(UserDto user, ProjectPermission permission, EntityDto project) {
+ return insertProjectPermissionOnUser(user, permission.getKey(), project);
+ }
+
public UserPermissionDto insertProjectPermissionOnUser(UserDto user, String permission, EntityDto project) {
- checkArgument(project.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
+ checkArgument(project.isPrivate() || !ProjectPermission.isPublic(permission),
"%s can't be granted on a public project", permission);
UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), project.getUuid());
db.getDbClient().userPermissionDao().insert(db.getSession(), dto, project, user, null);
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaIT.java
index ac9362850c5..9c965a93899 100644
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaIT.java
+++ b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchemaIT.java
@@ -60,6 +60,7 @@ class CreateInitialSchemaIT {
.containsOnly(
"active_rules",
"active_rule_parameters",
+ "anticipated_transitions",
"app_branch_project_branch",
"alm_pats",
"app_projects",
@@ -73,23 +74,31 @@ class CreateInitialSchemaIT {
"ce_task_characteristics",
"ce_task_input",
"ce_task_message",
+ "cves",
+ "cve_cwe",
"components",
"default_qprofiles",
"deprecated_rule_keys",
+ "devops_perms_mapping",
"duplications_index",
"es_queue",
"events",
"event_component_changes",
+ "external_groups",
"file_sources",
+ "github_orgs_groups",
"groups",
"groups_users",
"group_roles",
"internal_component_props",
"internal_properties",
"issues",
+ "issues_dependency",
+ "issues_fixed",
+ "issues_impacts",
"issue_changes",
- "live_measures",
"metrics",
+ "measures",
"new_code_periods",
"new_code_reference_issues",
"notifications",
@@ -106,8 +115,8 @@ class CreateInitialSchemaIT {
"projects",
"project_badge_token",
"project_branches",
+ "project_dependencies",
"project_links",
- "project_mappings",
"project_measures",
"project_qprofiles",
"project_qgates",
@@ -120,6 +129,12 @@ class CreateInitialSchemaIT {
"qprofile_edit_users",
"quality_gates",
"quality_gate_conditions",
+ "report_schedules",
+ "report_subscriptions",
+ "rule_changes",
+ "rule_impact_changes",
+ "rule_tags",
+ "rules_default_impacts",
"rules",
"rules_parameters",
"rules_profiles",
@@ -128,9 +143,12 @@ class CreateInitialSchemaIT {
"saml_message_ids",
"scanner_analysis_cache",
"schema_migrations",
+ "scim_groups",
"scim_users",
+ "scm_accounts",
"session_tokens",
"snapshots",
+ "telemetry_metrics_sent",
"users",
"user_dismissed_messages",
"user_roles",
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaIT.java
index 8cd32fb3219..1a4052d78fd 100644
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaIT.java
+++ b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchemaIT.java
@@ -36,6 +36,7 @@ import org.sonar.core.platform.SonarQubeVersion;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.MigrationDbTester;
+import org.sonar.server.platform.db.migration.history.MigrationHistory;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
@@ -50,15 +51,18 @@ class PopulateInitialSchemaIT {
private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
private final System2 system2 = mock(System2.class);
private final SonarQubeVersion sonarQubeVersion = mock(SonarQubeVersion.class);
+ private final MigrationHistory migrationHistory = mock(MigrationHistory.class);
@RegisterExtension
public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateInitialSchema.class);
- private final PopulateInitialSchema underTest = new PopulateInitialSchema(db.database(), system2, uuidFactory, sonarQubeVersion);
+ private final PopulateInitialSchema underTest = new PopulateInitialSchema(db.database(), system2, uuidFactory, sonarQubeVersion,
+ migrationHistory);
@BeforeEach
public void setUp() {
when(sonarQubeVersion.get()).thenReturn(version);
+ when(migrationHistory.getInitialDbVersion()).thenReturn(-1L);
}
@Test
@@ -179,7 +183,7 @@ class PopulateInitialSchemaIT {
"text_value as \"VAL\"," +
"created_at as \"CREATED_AT\" " +
" from properties");
- assertThat(rows).hasSize(4);
+ assertThat(rows).hasSize(5);
Map<String, Map<String, Object>> rowsByKey = rows.stream().collect(Collectors.toMap(t -> (String) t.get("PROP_KEY"), Function.identity()));
verifyProperty(rowsByKey, "sonar.forceAuthentication", "true");
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjectsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjectsIT.java
deleted file mode 100644
index 545df59e5aa..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjectsIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class AddNclocToProjectsIT {
-
- private static final String TABLE_NAME = "projects";
- private static final String COLUMN_NAME = "ncloc";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddNclocToProjects.class);
- private final DdlChange underTest = new AddNclocToProjects(db.database());
-
- @Test
- void add_column() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BIGINT, null, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BIGINT, null, true);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTableIT.java
deleted file mode 100644
index eda88d6eeb8..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTableIT.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v100.CreateScimGroupsTable.TABLE_NAME;
-
-class CreateScimGroupsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateScimGroupsTable.class);
-
- private final DdlChange underTest = new CreateScimGroupsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "scim_uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "group_uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_scim_groups", "scim_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuidIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuidIT.java
deleted file mode 100644
index f9af83bd81a..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuidIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v100.CreateScimGroupsTable.TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v100.CreateUniqueIndexForScimGroupsUuid.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v100.CreateUniqueIndexForScimGroupsUuid.INDEX_NAME;
-
-class CreateUniqueIndexForScimGroupsUuidIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueIndexForScimGroupsUuid.class);
- private final DdlChange underTest = new CreateUniqueIndexForScimGroupsUuid(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponentsIT.java
deleted file mode 100644
index afe49078337..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponentsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropBModuleUuidInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "b_module_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropBModuleUuidInComponents.class);
- private final DdlChange underTest = new DropBModuleUuidInComponents(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponentsIT.java
deleted file mode 100644
index f5004803d9b..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponentsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropBModuleUuidPathInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "b_module_uuid_path";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropBModuleUuidPathInComponents.class);
- private final DdlChange underTest = new DropBModuleUuidPathInComponents(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 1500, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 1500, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponentsIT.java
deleted file mode 100644
index c91d3c11905..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponentsIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropIndexProjectsModuleUuidInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "module_uuid";
- private static final String INDEX_NAME = "projects_module_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexProjectsModuleUuidInComponents.class);
- private final DdlChange underTest = new DropIndexProjectsModuleUuidInComponents(db.database());
-
- @Test
- void drops_index() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-
- @Test
- void execute_whenIndexNameWithPrefix_shouldStillDelete() throws SQLException {
- String alteredIndexName = "idx_1234567891345678916456789_" + INDEX_NAME;
- db.renameIndex(TABLE_NAME, INDEX_NAME, alteredIndexName);
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- db.assertIndex(TABLE_NAME, alteredIndexName, COLUMN_NAME);
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, alteredIndexName);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponentsIT.java
deleted file mode 100644
index 2d1216f19cf..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponentsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropIndexProjectsRootUuidInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "root_uuid";
- private static final String INDEX_NAME = "projects_root_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexProjectsRootUuidInComponents.class);
- private final DdlChange underTest = new DropIndexProjectsRootUuidInComponents(db.database());
-
- @Test
- void drops_index() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponentsIT.java
deleted file mode 100644
index 9252b3b90ee..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponentsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropModuleUuidInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "module_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropModuleUuidInComponents.class);
- private final DdlChange underTest = new DropModuleUuidInComponents(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponentsIT.java
deleted file mode 100644
index 1dd6526905b..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponentsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropModuleUuidPathInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "module_uuid_path";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropModuleUuidPathInComponents.class);
- private final DdlChange underTest = new DropModuleUuidPathInComponents(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 1500, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 1500, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponentsIT.java
deleted file mode 100644
index 652ac5b330c..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponentsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropRootUuidInComponentsIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "root_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropRootUuidInComponents.class);
- private final DdlChange underTest = new DropRootUuidInComponents(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, false);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioningIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioningIT.java
deleted file mode 100644
index 46df6158f77..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioningIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class DropScimUserProvisioningIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropScimUserProvisioning.class);
- private final DataChange underTest = new DropScimUserProvisioning(db.database());
-
- @Test
- void migration_should_truncate_scim_users_table() throws SQLException {
- insertScimUser(1);
- insertScimUser(2);
-
- underTest.execute();
-
- assertThat(db.select("select * from scim_users")).isEmpty();
- }
-
- private void insertScimUser(long id) {
- db.executeInsert("scim_users",
- "scim_uuid", "any-scim-uuid-" + id,
- "user_uuid", "any-user-uuid-" + id
- );
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- insertScimUser(1);
- insertScimUser(2);
-
- underTest.execute();
- underTest.execute();
- assertThat(db.select("select * from scim_users")).isEmpty();
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledPropertyIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledPropertyIT.java
deleted file mode 100644
index 2f98f95049e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledPropertyIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-class DropSonarScimEnabledPropertyIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropSonarScimEnabledProperty.class);
- private final DataChange underTest = new DropSonarScimEnabledProperty(db.database());
-
- @Test
- void migration_should_remove_scim_property() throws SQLException {
- insertScimProperty(db);
-
- underTest.execute();
-
- Assertions.assertThat(db.select("select * from properties")).isEmpty();
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- insertScimProperty(db);
-
- underTest.execute();
- underTest.execute();
-
- Assertions.assertThat(db.select("select * from properties")).isEmpty();
- }
-
- private void insertScimProperty(MigrationDbTester db) {
- db.executeInsert("properties ",
- "prop_key", "sonar.scim.enabled",
- "is_empty", false,
- "text_value", "true",
- "created_at", 100_000L,
- "uuid", "some-random-uuid"
- );
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentPropertyIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentPropertyIT.java
deleted file mode 100644
index adaa135d410..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentPropertyIT.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.slf4j.event.Level;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.v100.LogMessageIfSonarScimEnabledPresentProperty.SONAR_SCIM_ENABLED;
-
-class LogMessageIfSonarScimEnabledPresentPropertyIT {
-
- @RegisterExtension
- public final LogTesterJUnit5 logger = new LogTesterJUnit5();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(LogMessageIfSonarScimEnabledPresentProperty.class);
- private final DataChange underTest = new LogMessageIfSonarScimEnabledPresentProperty(db.database());
-
- @BeforeEach
- public void before() {
- logger.clear();
- }
-
- @Test
- void migration_should_log_message_when_scim_property() throws SQLException {
- db.executeInsert("properties ",
- "prop_key", "sonar.scim.enabled",
- "is_empty", false,
- "text_value", "true",
- "created_at", 100_000L,
- "uuid", "some-random-uuid"
- );
-
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN))
- .hasSize(1)
- .containsExactly("'" + SONAR_SCIM_ENABLED + "' property is defined but not read anymore. Please read the upgrade notes" +
- " for the instruction to upgrade. User provisioning is deactivated until reactivated from the SonarQube" +
- " Administration Interface (\"General->Authentication\"). "
- + "See documentation: https://docs.sonarsource.com/sonarqube/10.1/instance-administration/authentication/saml/scim/overview/");
- }
-
- @Test
- void migration_should_not_log_if_no_scim_property() throws SQLException {
-
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).isEmpty();
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.executeInsert("properties ",
- "prop_key", "sonar.scim.enabled",
- "is_empty", false,
- "text_value", "true",
- "created_at", 100_000L,
- "uuid", "some-random-uuid"
- );
-
- underTest.execute();
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).hasSize(2);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsersIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsersIT.java
deleted file mode 100644
index 3cf711ebcdf..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsersIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-
-class MakeColumnUserLocalNotNullableInUsersIT {
- private static final String TABLE_NAME = "users";
- private static final String COLUMN_NAME = "user_local";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MakeColumnUserLocalNotNullableInUsers.class);
- private final MakeColumnUserLocalNotNullableInUsers underTest = new MakeColumnUserLocalNotNullableInUsers(db.database());
-
- @Test
- void user_local_column_is_not_null() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, true);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjectsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjectsIT.java
deleted file mode 100644
index 5c47eafbdc0..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjectsIT.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.apache.commons.lang3.RandomStringUtils.secure;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-class PopulateNclocForForProjectsIT {
-
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateNclocForForProjects.class);
-
- private final DataChange underTest = new PopulateNclocForForProjects(db.database());
-
- @Test
- void migration_populates_ncloc_for_projects() throws SQLException {
- Map<String, Long> expectedNclocByProjectUuid = populateData();
- underTest.execute();
- verifyNclocCorrectlyPopulatedForProjects(expectedNclocByProjectUuid);
- }
-
- @Test
- void migration_does_nothing_if_live_measures_table_is_missing() {
- db.executeDdl("drop table live_measures");
- db.assertTableDoesNotExist("live_measures");
-
- assertThatCode(underTest::execute)
- .doesNotThrowAnyException();
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- Map<String, Long> expectedNclocByProjectUuid = populateData();
- underTest.execute();
- // re-entrant
- underTest.execute();
- verifyNclocCorrectlyPopulatedForProjects(expectedNclocByProjectUuid);
- }
-
- private Map<String, Long> populateData() {
- String nclocMetricUuid = insertMetric("ncloc");
-
- String projectUuid1 = insertProject();
- String project1Branch1 = insertProjectBranch(projectUuid1);
- String project1Branch2 = insertProjectBranch(projectUuid1);
-
- long project1maxNcloc = 100;
- insertLiveMeasure(nclocMetricUuid, projectUuid1, project1Branch1, 80L);
- insertLiveMeasure(nclocMetricUuid, projectUuid1, project1Branch2, project1maxNcloc);
-
- String otherMetricUuid = insertMetric("other");
- insertLiveMeasure(otherMetricUuid, projectUuid1, project1Branch1, 5000L);
- insertLiveMeasure(otherMetricUuid, projectUuid1, project1Branch2, 6000L);
-
- String projectUuid2 = insertProject();
- String project2Branch1 = insertProjectBranch(projectUuid2);
- String project2Branch2 = insertProjectBranch(projectUuid2);
- String project2Branch3 = insertProjectBranch(projectUuid2);
-
- long project2maxNcloc = 60;
- insertLiveMeasure(nclocMetricUuid, projectUuid2, project2Branch1, 20L);
- insertLiveMeasure(nclocMetricUuid, projectUuid2, project2Branch2, 50L);
- insertLiveMeasure(nclocMetricUuid, projectUuid2, project2Branch3, project2maxNcloc);
-
- return Map.of(projectUuid1, project1maxNcloc, projectUuid2, project2maxNcloc);
- }
-
- private void verifyNclocCorrectlyPopulatedForProjects(Map<String, Long> expectedNclocByProjectUuid) {
- for (Map.Entry<String, Long> entry : expectedNclocByProjectUuid.entrySet()) {
- String query = String.format("select ncloc from projects where uuid='%s'", entry.getKey());
- Long nclocFromProject = (Long) db.selectFirst(query).get("NCLOC");
- assertThat(nclocFromProject).isEqualTo(entry.getValue());
- }
- }
-
- private String insertMetric(String name) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("NAME", name);
- db.executeInsert("metrics", map);
- return uuid;
- }
-
- private String insertProject() {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("KEE", secure().nextAlphabetic(20));
- map.put("QUALIFIER", "TRK");
- map.put("PRIVATE", true);
- map.put("UPDATED_AT", System.currentTimeMillis());
- db.executeInsert("projects", map);
- return uuid;
- }
-
- private String insertProjectBranch(String projectUuid) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("PROJECT_UUID", projectUuid);
- map.put("KEE", secure().nextAlphabetic(20));
- map.put("BRANCH_TYPE", "PULL_REQUEST");
- map.put("UPDATED_AT", System.currentTimeMillis());
- map.put("CREATED_AT", System.currentTimeMillis());
- map.put("NEED_ISSUE_SYNC", false);
- db.executeInsert("project_branches", map);
- return uuid;
- }
-
- private void insertLiveMeasure(String metricUuid, String projectUuid, String componentUuid, Long value) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("PROJECT_UUID", projectUuid);
- map.put("COMPONENT_UUID", componentUuid);
- map.put("METRIC_UUID", metricUuid);
- map.put("VALUE", value);
- map.put("UPDATED_AT", System.currentTimeMillis());
- map.put("CREATED_AT", System.currentTimeMillis());
- db.executeInsert("live_measures", map);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfilesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfilesIT.java
deleted file mode 100644
index 226fd4d6619..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfilesIT.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.SequenceUuidFactory;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.sonar.core.util.SequenceUuidFactory.UUID_1;
-
-class RemoveOrphanRulesFromQualityProfilesIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RemoveOrphanRulesFromQualityProfiles.class);
- private final System2 system2 = mock(System2.class);
- private final UuidFactory instance = new SequenceUuidFactory();
- private final DataChange underTest = new RemoveOrphanRulesFromQualityProfiles(db.database(), instance, system2);
-
- @BeforeEach
- public void before() {
- when(system2.now()).thenReturn(1L);
- }
-
- @Test
- void migration_should_remove_orphans() throws SQLException {
- insertData();
-
- underTest.execute();
-
- assertOrphanRuleRemoved();
- assertQualityProfileChanges();
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- insertData();
-
- // re-entrant
- underTest.execute();
- underTest.execute();
-
- assertOrphanRuleRemoved();
- assertQualityProfileChanges();
- }
-
- private void insertData() {
- insertRule("uuid-rule-1", "language-1", "rule1");
- insertRule("uuid-rule-2", "language-2", "rule2");
- insertProfile("uuid-profile-1", "language-1");
- insertProfile("uuid-profile-2", "language-2");
- activateRule("uuid-active-rule-1", "uuid-profile-1", "uuid-rule-1");
- activateRule("uuid-active-rule-2", "uuid-profile-1", "uuid-rule-2");
- activateRule("uuid-active-rule-3", "uuid-profile-2", "uuid-rule-2");
- }
-
- private void insertRule(String uuid, String language, String ruleKey) {
- Map<String, Object> rule = new HashMap<>();
- rule.put("uuid", uuid);
- rule.put("plugin_rule_key", language + ":" + ruleKey);
- rule.put("plugin_name", "plugin-name-1");
- rule.put("scope", "MAIN");
- rule.put("language", language);
- rule.put("is_template", false);
- rule.put("is_ad_hoc", false);
- rule.put("is_external", false);
- db.executeInsert("rules", rule);
- }
-
- private void insertProfile(String uuid, String language) {
- Map<String, Object> profile = new HashMap<>();
- profile.put("uuid", uuid);
- profile.put("name", "profile-name-1");
- profile.put("language", language);
- profile.put("is_built_in", false);
- db.executeInsert("rules_profiles", profile);
- }
-
- private void activateRule(String activeRuleUuid, String profileUuid, String ruleUuid) {
- Map<String, Object> active_rule = new HashMap<>();
- active_rule.put("uuid", activeRuleUuid);
- active_rule.put("failure_level", 3);
- active_rule.put("profile_uuid", profileUuid);
- active_rule.put("rule_uuid", ruleUuid);
- db.executeInsert("active_rules", active_rule);
- }
-
- private void assertOrphanRuleRemoved() {
- assertThat(db.select("SELECT * from active_rules"))
- .extracting(r -> r.get("UUID"))
- .containsExactly("uuid-active-rule-1", "uuid-active-rule-3");
- }
-
- private void assertQualityProfileChanges() {
- assertThat(db.select("SELECT * from qprofile_changes"))
- .extracting(r -> r.get("KEE"), r -> r.get("RULES_PROFILE_UUID"), r -> r.get("CHANGE_TYPE"), r -> r.get("USER_UUID"), r -> r.get("CHANGE_DATA"), r -> r.get("CREATED_AT"))
- .containsExactly(tuple(UUID_1, "uuid-profile-1", "DEACTIVATED", null, "ruleUuid=uuid-rule-2", 1L));
- }
-
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsersIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsersIT.java
deleted file mode 100644
index 294a8963e5a..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsersIT.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.apache.commons.lang3.RandomStringUtils.secure;
-import static org.assertj.core.api.Assertions.assertThat;
-
-class UpdateUserLocalValueInUsersIT {
-
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(UpdateUserLocalValueInUsers.class);
-
- private final DataChange underTest = new UpdateUserLocalValueInUsers(db.database());
-
- @Test
- void migration_updates_user_local_if_null() throws SQLException {
- String userUuid1 = insertUser(true);
- String userUuid2 = insertUser(false);
- String userUuid3 = insertUser(null);
-
- underTest.execute();
-
- assertUserLocalIsUpdatedCorrectly(userUuid1, true);
- assertUserLocalIsUpdatedCorrectly(userUuid2, false);
- assertUserLocalIsUpdatedCorrectly(userUuid3, true);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- String userUuid1 = insertUser(true);
- String userUuid2 = insertUser(false);
- String userUuid3 = insertUser(null);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- assertUserLocalIsUpdatedCorrectly(userUuid1, true);
- assertUserLocalIsUpdatedCorrectly(userUuid2, false);
- assertUserLocalIsUpdatedCorrectly(userUuid3, true);
- }
-
- private void assertUserLocalIsUpdatedCorrectly(String userUuid, boolean expected) {
- String selectSql = String.format("select user_local from users where uuid='%s'", userUuid);
- assertThat(db.select(selectSql).stream()
- .map(row -> row.get("USER_LOCAL"))
- .toList())
- .containsExactlyInAnyOrder(expected);
- }
-
- private String insertUser(Boolean userLocal) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("LOGIN", secure().nextAlphabetic(20));
- map.put("EXTERNAL_LOGIN", secure().nextAlphabetic(20));
- map.put("EXTERNAL_IDENTITY_PROVIDER", "sonarqube");
- map.put("EXTERNAL_ID", secure().nextNumeric(5));
- map.put("CREATED_AT", System.currentTimeMillis());
- map.put("USER_LOCAL", userLocal);
- map.put("RESET_PASSWORD", false);
- db.executeInsert("users", map);
- return uuid;
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTableIT.java
deleted file mode 100644
index e5bad3ef96b..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTableIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class AddCodeVariantsColumnInIssuesTableIT {
-
- private static final String TABLE_NAME = "issues";
- private static final String COLUMN_NAME = "code_variants";
- private static final int COLUMN_SIZE = 4000;
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddCodeVariantsColumnInIssuesTable.class);
- private final AddCodeVariantsColumnInIssuesTable underTest = new AddCodeVariantsColumnInIssuesTable(db.database());
-
- @Test
- void migration_should_add_column() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, COLUMN_SIZE, true);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, COLUMN_SIZE, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranchesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranchesIT.java
deleted file mode 100644
index 05a62aa1c07..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranchesIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-
-class AddIsMainColumnInProjectBranchesIT {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String COLUMN_NAME = "is_main";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddIsMainColumnInProjectBranches.class);
- private final AddIsMainColumnInProjectBranches underTest = new AddIsMainColumnInProjectBranches(db.database());
-
- @Test
- void is_main_column_exists_with_null_value() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, null);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, null);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTableIT.java
deleted file mode 100644
index ef2fc8cd56f..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTableIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.AddReportSchedulesTable.TABLE_NAME;
-
-class AddReportSchedulesTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddReportSchedulesTable.class);
-
- private final DdlChange underTest = new AddReportSchedulesTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "portfolio_uuid", Types.VARCHAR, UUID_SIZE, true);
- db.assertColumnDefinition(TABLE_NAME, "branch_uuid", Types.VARCHAR, UUID_SIZE, true);
- db.assertColumnDefinition(TABLE_NAME, "last_send_time_in_ms", Types.BIGINT, null, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_report_schedules", "uuid");
-
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTableIT.java
deleted file mode 100644
index 0eb52dbc866..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTableIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.AddReportSubscriptionsTable.TABLE_NAME;
-
-class AddReportSubscriptionsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddReportSubscriptionsTable.class);
-
- private final DdlChange underTest = new AddReportSubscriptionsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "portfolio_uuid", Types.VARCHAR, UUID_SIZE, true);
- db.assertColumnDefinition(TABLE_NAME, "branch_uuid", Types.VARCHAR, UUID_SIZE, true);
- db.assertColumnDefinition(TABLE_NAME, "user_uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_report_subscriptions", "uuid");
-
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranchesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranchesIT.java
deleted file mode 100644
index f62e1edbd23..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranchesIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-
-class AlterIsMainColumnInProjectBranchesIT {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String COLUMN_NAME = "is_main";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AlterIsMainColumnInProjectBranches.class);
- private final AlterIsMainColumnInProjectBranches underTest = new AlterIsMainColumnInProjectBranches(db.database());
-
- @Test
- void execute_shouldNotBeNullable() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, true);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTableIT.java
deleted file mode 100644
index ac82425e781..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTableIT.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.EXTERNAL_GROUP_ID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.GROUP_UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.TABLE_NAME;
-
-class CreateExternalGroupsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateExternalGroupsTable.class);
-
- private final DdlChange createExternalGroupsTable = new CreateExternalGroupsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createExternalGroupsTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, GROUP_UUID_COLUMN_NAME, Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, EXTERNAL_GROUP_ID_COLUMN_NAME, Types.VARCHAR, 255, false);
- db.assertColumnDefinition(TABLE_NAME, EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME, Types.VARCHAR, 100, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_external_groups", GROUP_UUID_COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createExternalGroupsTable.execute();
- // re-entrant
- createExternalGroupsTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTableIT.java
deleted file mode 100644
index 77a057b360e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTableIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v101.CreateIndexForEmailOnUsersTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateIndexForEmailOnUsersTable.INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateIndexForEmailOnUsersTable.TABLE_NAME;
-
-class CreateIndexForEmailOnUsersTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexForEmailOnUsersTable.class);
- private final CreateIndexForEmailOnUsersTable createIndexForEmailOnUsersTable = new CreateIndexForEmailOnUsersTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createIndexForEmailOnUsersTable.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndexForEmailOnUsersTable.execute();
- createIndexForEmailOnUsersTable.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTableIT.java
deleted file mode 100644
index 6c66fb25e30..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTableIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v101.CreateIndexForScmAccountOnScmAccountsTable.INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNTS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNT_COLUMN_NAME;
-
-class CreateIndexForScmAccountOnScmAccountsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexForScmAccountOnScmAccountsTable.class);
- private final CreateIndexForScmAccountOnScmAccountsTable createIndexForScmAccountOnScmAccountsTable = new CreateIndexForScmAccountOnScmAccountsTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(SCM_ACCOUNTS_TABLE_NAME, INDEX_NAME);
-
- createIndexForScmAccountOnScmAccountsTable.execute();
-
- db.assertIndex(SCM_ACCOUNTS_TABLE_NAME, INDEX_NAME, SCM_ACCOUNT_COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndexForScmAccountOnScmAccountsTable.execute();
- createIndexForScmAccountOnScmAccountsTable.execute();
-
- db.assertIndex(SCM_ACCOUNTS_TABLE_NAME, INDEX_NAME, SCM_ACCOUNT_COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTableIT.java
deleted file mode 100644
index 508e22e955d..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTableIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.EXTERNAL_GROUP_ID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.INDEX_NAME;
-
-class CreateIndexOnExternalIdAndIdentityOnExternalGroupsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.class);
- private final CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable createIndexOnExternalIdAndIdentityOnExternalGroupsTable = new CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable(
- db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createIndexOnExternalIdAndIdentityOnExternalGroupsTable.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME, EXTERNAL_GROUP_ID_COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndexOnExternalIdAndIdentityOnExternalGroupsTable.execute();
- createIndexOnExternalIdAndIdentityOnExternalGroupsTable.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME, EXTERNAL_GROUP_ID_COLUMN_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokensIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokensIT.java
deleted file mode 100644
index 7a5f57c5bde..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokensIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class CreateProjectUuidInUserTokensIT {
- private static final String TABLE_NAME = "user_tokens";
- private static final String COLUMN_NAME = "project_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateProjectUuidInUserTokens.class);
- private final CreateProjectUuidInUserTokens underTest = new CreateProjectUuidInUserTokens(db.database());
-
- @Test
- void migration_creates_new_column() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 40, null);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 40, null);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTableIT.java
deleted file mode 100644
index 1e5f562baed..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTableIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.USER_UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNTS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNT_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNT_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.USER_UUID_COLUMN_NAME;
-
-class CreateScmAccountsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateScmAccountsTable.class);
-
- private final DdlChange createScmAccountsTable = new CreateScmAccountsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(SCM_ACCOUNTS_TABLE_NAME);
-
- createScmAccountsTable.execute();
-
- db.assertTableExists(SCM_ACCOUNTS_TABLE_NAME);
- db.assertColumnDefinition(SCM_ACCOUNTS_TABLE_NAME, USER_UUID_COLUMN_NAME, Types.VARCHAR, USER_UUID_SIZE, false);
- db.assertColumnDefinition(SCM_ACCOUNTS_TABLE_NAME, SCM_ACCOUNT_COLUMN_NAME, Types.VARCHAR, SCM_ACCOUNT_SIZE, false);
- db.assertPrimaryKey(SCM_ACCOUNTS_TABLE_NAME, "pk_scm_accounts", USER_UUID_COLUMN_NAME, SCM_ACCOUNT_COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(SCM_ACCOUNTS_TABLE_NAME);
-
- createScmAccountsTable.execute();
- // re-entrant
- createScmAccountsTable.execute();
-
- db.assertTableExists(SCM_ACCOUNTS_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTableIT.java
deleted file mode 100644
index 2a7a470d5a8..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTableIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v101.AddReportSchedulesTable.TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSchedulesTable.COLUMN_NAME_BRANCH;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSchedulesTable.COLUMN_NAME_PORTFOLIO;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSchedulesTable.INDEX_NAME;
-
-
-class CreateUniqueIndexForReportSchedulesTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueIndexForReportSchedulesTable.class);
- private final CreateUniqueIndexForReportSchedulesTable createUniqueIndexForReportSchedulesTable = new CreateUniqueIndexForReportSchedulesTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createUniqueIndexForReportSchedulesTable.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME_PORTFOLIO, COLUMN_NAME_BRANCH);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createUniqueIndexForReportSchedulesTable.execute();
- createUniqueIndexForReportSchedulesTable.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME_PORTFOLIO, COLUMN_NAME_BRANCH);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTableIT.java
deleted file mode 100644
index 22584426e20..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTableIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v101.AddReportSubscriptionsTable.TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSubscriptionsTable.COLUMN_NAME_BRANCH;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSubscriptionsTable.COLUMN_NAME_PORTFOLIO;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSubscriptionsTable.COLUMN_NAME_USER;
-import static org.sonar.server.platform.db.migration.version.v101.CreateUniqueIndexForReportSubscriptionsTable.INDEX_NAME;
-
-
-class CreateUniqueIndexForReportSubscriptionsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueIndexForReportSubscriptionsTable.class);
- private final CreateUniqueIndexForReportSubscriptionsTable createUniqueIndexForReportSubscriptionsTable = new CreateUniqueIndexForReportSubscriptionsTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createUniqueIndexForReportSubscriptionsTable.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME_PORTFOLIO, COLUMN_NAME_BRANCH, COLUMN_NAME_USER);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createUniqueIndexForReportSubscriptionsTable.execute();
- createUniqueIndexForReportSubscriptionsTable.execute();
-
- db.assertUniqueIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME_PORTFOLIO, COLUMN_NAME_BRANCH, COLUMN_NAME_USER);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokensIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokensIT.java
deleted file mode 100644
index c62580f7941..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokensIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v101.DropProjectKeyInUserTokens.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.DropProjectKeyInUserTokens.TABLE_NAME;
-
-class DropProjectKeyInUserTokensIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropProjectKeyInUserTokens.class);
- private final DdlChange underTest = new DropProjectKeyInUserTokens(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 255, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 255, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsersIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsersIT.java
deleted file mode 100644
index 9aa14860131..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsersIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v101.DropScmAccountsInUsers.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.DropScmAccountsInUsers.TABLE_NAME;
-
-class DropScmAccountsInUsersIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropScmAccountsInUsers.class);
- private final DdlChange dropScmAccountsInUsers = new DropScmAccountsInUsers(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 4000, true);
- dropScmAccountsInUsers.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 4000, true);
- dropScmAccountsInUsers.execute();
- dropScmAccountsInUsers.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfoliosIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfoliosIT.java
deleted file mode 100644
index 1c39c8133cb..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfoliosIT.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import javax.annotation.Nullable;
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.util.stream.Collectors.toSet;
-
-class FixDifferentUuidsForSubportfoliosIT {
- private static final String OLD_UUID = "differentSubPfUuid";
- private static final String SUB_PF_KEY = "subPfKey";
- private static final String NEW_SUBPF_UUID = "subPfUuid";
- private static final String PF_UUID = "pfUuid";
- private static final String NEW_CHILD_SUBPF_UUID = "childsubpfUuid";
- private static final String OLD_CHILD_SUBPF_UUID = "old_child_subpf_uuid";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(FixDifferentUuidsForSubportfolios.class);
- private final FixDifferentUuidsForSubportfolios underTest = new FixDifferentUuidsForSubportfolios(db.database());
-
- @Test
- void execute_shouldUpdatePortfoliosAndPortfolioProjectsAndPortfolioReferenceTable() throws SQLException {
- insertPortfolio("pfKey", PF_UUID);
- insertComponent(SUB_PF_KEY, NEW_SUBPF_UUID, PF_UUID, "SVW");
- insertSubPortfolio(SUB_PF_KEY, PF_UUID, PF_UUID, OLD_UUID);
- insertPortfolioProject("projUuid", OLD_UUID);
- insertPortfolioReference("refUuid", OLD_UUID);
-
- underTest.execute();
-
- Assertions.assertThat(findValueIn("portfolios", "uuid")).containsExactlyInAnyOrder(PF_UUID, NEW_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolio_projects", "portfolio_uuid")).containsExactlyInAnyOrder(NEW_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolio_references", "portfolio_uuid")).containsExactlyInAnyOrder(NEW_SUBPF_UUID);
- }
-
- @Test
- void execute_shouldBeRentrant() throws SQLException {
- insertPortfolio("pfKey", PF_UUID);
- insertComponent(SUB_PF_KEY, NEW_SUBPF_UUID, PF_UUID, "SVW");
- insertSubPortfolio(SUB_PF_KEY, PF_UUID, PF_UUID, OLD_UUID);
- insertPortfolioProject("projUuid", OLD_UUID);
- insertPortfolioReference("refUuid", OLD_UUID);
-
- underTest.execute();
- underTest.execute();
-
- Assertions.assertThat(findValueIn("portfolios", "uuid")).containsExactlyInAnyOrder(PF_UUID, NEW_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolio_projects", "portfolio_uuid")).containsExactlyInAnyOrder(NEW_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolio_references", "portfolio_uuid")).containsExactlyInAnyOrder(NEW_SUBPF_UUID);
- }
-
- @Test
- void execute_shouldFixUuidForSubPortfolioAtDifferentLevels() throws SQLException {
- insertPortfolio("pfKey", PF_UUID);
-
- insertComponent(SUB_PF_KEY, NEW_SUBPF_UUID, PF_UUID, "SVW");
- insertComponent("child_subpfkey", NEW_CHILD_SUBPF_UUID, PF_UUID, "SVW");
-
- insertSubPortfolio(SUB_PF_KEY, PF_UUID, PF_UUID, OLD_UUID);
- insertSubPortfolio("child_subpfkey", OLD_UUID, PF_UUID, OLD_CHILD_SUBPF_UUID);
- insertPortfolioProject("projUuid", OLD_CHILD_SUBPF_UUID);
- insertPortfolioReference("refUuid", OLD_CHILD_SUBPF_UUID);
-
- underTest.execute();
-
- Assertions.assertThat(findValueIn("portfolios", "uuid")).containsExactlyInAnyOrder(PF_UUID, NEW_SUBPF_UUID, NEW_CHILD_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolios", "parent_uuid")).containsExactlyInAnyOrder(null, PF_UUID, NEW_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolio_projects", "portfolio_uuid")).containsExactlyInAnyOrder(NEW_CHILD_SUBPF_UUID);
- Assertions.assertThat(findValueIn("portfolio_references", "portfolio_uuid")).containsExactlyInAnyOrder(NEW_CHILD_SUBPF_UUID);
- }
-
- private Set<String> findValueIn(String table, String field) {
- return db.select(String.format("select %s FROM %s", field, table))
- .stream()
- .map(row -> (String) row.get(field))
- .collect(toSet());
- }
-
- private String insertComponent(String key, String uuid, String branchUuid, String qualifier) {
- Map<String, Object> map = new HashMap<>();
- map.put("UUID", uuid);
- map.put("KEE", key);
- map.put("BRANCH_UUID", branchUuid);
- map.put("UUID_PATH", "." + uuid + ".");
- map.put("QUALIFIER", qualifier);
- map.put("ENABLED", true);
- map.put("PRIVATE", true);
-
- db.executeInsert("components", map);
- return uuid;
- }
-
- private String insertPortfolio(String kee, String uuid) {
- return insertSubPortfolio(kee, uuid, uuid);
- }
-
- private String insertSubPortfolio(String kee, String rootUuid, String uuid) {
- return insertSubPortfolio(kee, null, rootUuid, uuid);
- }
-
- private String insertSubPortfolio(String kee, @Nullable String parentUuid, String rootUuid, String uuid) {
- Map<String, Object> map = new HashMap<>();
- map.put("UUID", uuid);
- map.put("KEE", kee);
- map.put("NAME", uuid);
- map.put("ROOT_UUID", rootUuid);
- map.put("PRIVATE", false);
- map.put("SELECTION_MODE", "MANUAL");
- map.put("PARENT_UUID", parentUuid);
- map.put("CREATED_AT", System.currentTimeMillis());
- map.put("UPDATED_AT", System.currentTimeMillis());
-
- db.executeInsert("portfolios", map);
- return uuid;
- }
-
- private String insertPortfolioReference(String uuid, String portfolioUuid) {
- Map<String, Object> map = new HashMap<>();
- map.put("UUID", uuid);
- map.put("PORTFOLIO_UUID", portfolioUuid);
- map.put("REFERENCE_UUID", "reference");
- map.put("CREATED_AT", System.currentTimeMillis());
-
- db.executeInsert("portfolio_references", map);
- return uuid;
- }
-
- private String insertPortfolioProject(String uuid, String portfolioUuid) {
- Map<String, Object> map = new HashMap<>();
- map.put("UUID", uuid);
- map.put("PORTFOLIO_UUID", portfolioUuid);
- map.put("PROJECT_UUID", portfolioUuid);
- map.put("CREATED_AT", System.currentTimeMillis());
-
- db.executeInsert("portfolio_projects", map);
- return uuid;
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalPropertiesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalPropertiesIT.java
deleted file mode 100644
index 103c066b0dd..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalPropertiesIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseKeeColumnSizeInInternalProperties.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseKeeColumnSizeInInternalProperties.NEW_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseKeeColumnSizeInInternalProperties.TABLE_NAME;
-
-class IncreaseKeeColumnSizeInInternalPropertiesIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(IncreaseKeeColumnSizeInInternalProperties.class);
- private final IncreaseKeeColumnSizeInInternalProperties underTest = new IncreaseKeeColumnSizeInInternalProperties(db.database());
-
- @Test
- void execute_increaseColumnSize() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 20, false);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 20, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivityIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivityIT.java
deleted file mode 100644
index dcfe635e1aa..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivityIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseTaskTypeColumnSizeInCeActivity.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseTaskTypeColumnSizeInCeActivity.NEW_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseTaskTypeColumnSizeInCeActivity.TABLE_NAME;
-
-class IncreaseTaskTypeColumnSizeInCeActivityIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(IncreaseTaskTypeColumnSizeInCeActivity.class);
- private final IncreaseTaskTypeColumnSizeInCeActivity underTest = new IncreaseTaskTypeColumnSizeInCeActivity(db.database());
-
- @Test
- void execute_increaseColumnSize() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 15, false);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 15, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueueIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueueIT.java
deleted file mode 100644
index 4ec0f8e8241..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueueIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseTaskTypeColumnSizeInCeQueue.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseTaskTypeColumnSizeInCeQueue.NEW_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v101.IncreaseTaskTypeColumnSizeInCeQueue.TABLE_NAME;
-
-class IncreaseTaskTypeColumnSizeInCeQueueIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(IncreaseTaskTypeColumnSizeInCeQueue.class);
- private final IncreaseTaskTypeColumnSizeInCeQueue underTest = new IncreaseTaskTypeColumnSizeInCeQueue(db.database());
-
- @Test
- void execute_increaseColumnSize() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 15, false);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 15, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccountsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccountsIT.java
deleted file mode 100644
index 5826466b48e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccountsIT.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.version.v101.MigrateScmAccountsFromUsersToScmAccounts.ScmAccountRow;
-
-import static java.lang.String.format;
-import static java.util.stream.Collectors.toSet;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatNoException;
-import static org.sonar.server.platform.db.migration.version.v101.MigrateScmAccountsFromUsersToScmAccounts.SCM_ACCOUNTS_SEPARATOR_CHAR;
-
-class MigrateScmAccountsFromUsersToScmAccountsIT {
-
- private static final UuidFactory UUID_FACTORY = UuidFactoryFast.getInstance();
- private static final String SCM_ACCOUNT1 = "scmaccount";
- private static final String SCM_ACCOUNT2 = "scmaccount2";
- private static final String SCM_ACCOUNT_CAMELCASE = "scmAccount3";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigrateScmAccountsFromUsersToScmAccounts.class);
- private final DataChange migrateScmAccountsFromUsersToScmAccounts = new MigrateScmAccountsFromUsersToScmAccounts(db.database());
-
- @Test
- void execute_whenUserHasNullScmAccounts_doNotInsertInScmAccounts() throws SQLException {
- insertUserAndGetUuid(null);
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).isEmpty();
- }
-
- @Test
- void execute_whenUserHasEmptyScmAccounts_doNotInsertInScmAccounts() throws SQLException {
- insertUserAndGetUuid("");
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).isEmpty();
- }
-
- @Test
- void execute_whenUserHasEmptyScmAccountsWithOneSeparator_doNotInsertInScmAccounts() throws SQLException {
- insertUserAndGetUuid(String.valueOf(SCM_ACCOUNTS_SEPARATOR_CHAR));
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).isEmpty();
- }
-
- @Test
- void execute_whenUserHasEmptyScmAccountsWithTwoSeparators_doNotInsertInScmAccounts() throws SQLException {
- insertUserAndGetUuid(SCM_ACCOUNTS_SEPARATOR_CHAR + String.valueOf(SCM_ACCOUNTS_SEPARATOR_CHAR));
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).isEmpty();
- }
-
- @Test
- void execute_whenUserHasOneScmAccountWithoutSeparator_insertsInScmAccounts() throws SQLException {
- String userUuid = insertUserAndGetUuid(SCM_ACCOUNT1);
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).containsExactly(new ScmAccountRow(userUuid, SCM_ACCOUNT1));
- }
-
- @Test
- void execute_whenUserHasOneScmAccountWithSeparators_insertsInScmAccounts() throws SQLException {
- String userUuid = insertUserAndGetUuid(format("%s%s%s", SCM_ACCOUNTS_SEPARATOR_CHAR, SCM_ACCOUNT1, SCM_ACCOUNTS_SEPARATOR_CHAR));
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).containsExactly(new ScmAccountRow(userUuid, SCM_ACCOUNT1));
- }
-
- @Test
- void execute_whenUserHasOneScmAccountWithMixedCase_insertsInScmAccountsInLowerCase() throws SQLException {
- String userUuid = insertUserAndGetUuid(format("%s%s%s", SCM_ACCOUNTS_SEPARATOR_CHAR, SCM_ACCOUNT_CAMELCASE, SCM_ACCOUNTS_SEPARATOR_CHAR));
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).containsExactly(new ScmAccountRow(userUuid, SCM_ACCOUNT_CAMELCASE.toLowerCase(Locale.ENGLISH)));
- }
-
- @Test
- void execute_whenUserHasTwoScmAccount_insertsInScmAccounts() throws SQLException {
- String userUuid = insertUserAndGetUuid(format("%s%s%s%s%s",
- SCM_ACCOUNTS_SEPARATOR_CHAR, SCM_ACCOUNT1, SCM_ACCOUNTS_SEPARATOR_CHAR, SCM_ACCOUNT2, SCM_ACCOUNTS_SEPARATOR_CHAR));
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).containsExactlyInAnyOrder(
- new ScmAccountRow(userUuid, SCM_ACCOUNT1),
- new ScmAccountRow(userUuid, SCM_ACCOUNT2)
- );
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- String userUuid = insertUserAndGetUuid(SCM_ACCOUNT1);
-
- migrateScmAccountsFromUsersToScmAccounts.execute();
- migrateScmAccountsFromUsersToScmAccounts.execute();
-
- Set<ScmAccountRow> scmAccounts = findAllScmAccounts();
- assertThat(scmAccounts).containsExactly(new ScmAccountRow(userUuid, SCM_ACCOUNT1));
- }
-
- @Test
- void migration_should_be_reentrant_if_scm_account_column_dropped() {
- db.executeDdl("alter table users drop column scm_accounts");
-
- assertThatNoException().isThrownBy(migrateScmAccountsFromUsersToScmAccounts::execute);
- }
-
-
- private Set<ScmAccountRow> findAllScmAccounts() {
- Set<ScmAccountRow> scmAccounts = db.select("select user_uuid, scm_account from scm_accounts")
- .stream()
- .map(row -> new ScmAccountRow((String) row.get("user_uuid"), (String) row.get("scm_account")))
- .collect(toSet());
- return scmAccounts;
- }
-
- private String insertUserAndGetUuid(@Nullable String scmAccounts) {
-
- Map<String, Object> map = new HashMap<>();
- String uuid = UUID_FACTORY.create();
- String login = "login_" + uuid;
- map.put("UUID", uuid);
- map.put("LOGIN", login);
- map.put("HASH_METHOD", "tagada");
- map.put("EXTERNAL_LOGIN", login);
- map.put("EXTERNAL_IDENTITY_PROVIDER", "sonarqube");
- map.put("EXTERNAL_ID", login);
- map.put("CREATED_AT", System.currentTimeMillis());
- map.put("RESET_PASSWORD", false);
- map.put("USER_LOCAL", true);
- map.put("SCM_ACCOUNTS", scmAccounts);
- db.executeInsert("users", map);
- return uuid;
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokensIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokensIT.java
deleted file mode 100644
index e91b3319b73..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokensIT.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.groups.Tuple.tuple;
-
-class PopulateProjectUuidInUserTokensIT {
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateProjectUuidInUserTokens.class);
-
- private final DataChange underTest = new PopulateProjectUuidInUserTokens(db.database());
-
- @Test
- void migration_populates_project_uuid_for_tokens() throws SQLException {
- String project1Uuid = insertProject("project1");
- String project2Uuid = insertProject("project2");
-
- String token1Uuid = insertUserToken("project1");
- String token2Uuid = insertUserToken("project1");
- String token3Uuid = insertUserToken("project2");
- String token4Uuid = insertUserToken(null);
-
- underTest.execute();
- assertThat(db.select("select * from user_tokens"))
- .extracting(r -> r.get("UUID"), r -> r.get("PROJECT_UUID"))
- .containsOnly(
- tuple(token1Uuid, project1Uuid),
- tuple(token2Uuid, project1Uuid),
- tuple(token3Uuid, project2Uuid),
- tuple(token4Uuid, null));
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- String project1Uuid = insertProject("project1");
- String project2Uuid = insertProject("project2");
-
- String token1Uuid = insertUserToken("project1");
- String token2Uuid = insertUserToken("project1");
- String token3Uuid = insertUserToken("project2");
- String token4Uuid = insertUserToken(null);
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select * from user_tokens"))
- .extracting(r -> r.get("UUID"), r -> r.get("PROJECT_UUID"))
- .containsOnly(
- tuple(token1Uuid, project1Uuid),
- tuple(token2Uuid, project1Uuid),
- tuple(token3Uuid, project2Uuid),
- tuple(token4Uuid, null));
- }
-
- private String insertUserToken(@Nullable String projectKey) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("USER_UUID", "user" + uuid);
- map.put("NAME", "name" + uuid);
- map.put("TOKEN_HASH", "token" + uuid);
- map.put("CREATED_AT", 1);
- map.put("PROJECT_KEY", projectKey);
- map.put("TYPE", "PROJECT_ANALYSIS_TOKEN");
-
- db.executeInsert("user_tokens", map);
- return uuid;
- }
-
- private String insertProject(String projectKey) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("KEE", projectKey);
- map.put("QUALIFIER", "TRK");
- map.put("PRIVATE", true);
- map.put("UPDATED_AT", System.currentTimeMillis());
- db.executeInsert("projects", map);
- return uuid;
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedulesIT.java
deleted file mode 100644
index 148bb2211e2..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedulesIT.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class PopulateReportSchedulesIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateReportSchedules.class);
-
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
- private final DataChange underTest = new PopulateReportSchedules(db.database());
-
- @Test
- void execute_shouldPopulateFromPortfolioProperties() throws SQLException {
- insertPortfolio("uuid1");
- insertPortfolioProperty("uuid1", "1234");
-
- underTest.execute();
-
- assertThat(db.select("select * from report_schedules"))
- .extracting(m -> m.get("PORTFOLIO_UUID"), m -> m.get("BRANCH_UUID"), m -> m.get("LAST_SEND_TIME_IN_MS"))
- .containsOnly(tuple("uuid1", null, 1234L));
- }
-
- @Test
- void execute_shouldPopulateFromBranchProperties() throws SQLException {
- insertBranch("uuid1");
- insertProjectBranchProperty("uuid1", "1234");
-
- underTest.execute();
-
- assertThat(db.select("select * from report_schedules"))
- .extracting(m -> m.get("PORTFOLIO_UUID"), m -> m.get("BRANCH_UUID"), m -> m.get("LAST_SEND_TIME_IN_MS"))
- .containsOnly(tuple(null, "uuid1", 1234L));
- }
-
- @Test
- void execute_whenPropertyMatchesBothBranchAndPortfolio_shouldNotPopulate() throws SQLException {
- insertBranch("uuid1");
- insertPortfolio("uuid1");
- insertProjectBranchProperty("uuid1", "1234");
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select * from report_schedules")).isEmpty();
- }
-
- private void insertPortfolio(String uuid) {
- db.executeInsert("portfolios",
- "uuid", uuid,
- "kee", "kee_" + uuid,
- "name", "name_" + uuid,
- "root_uuid", uuid,
- "private", true,
- "selection_mode", "manual",
- "created_at", 1000,
- "updated_at", 1000
- );
- }
-
- private void insertProjectBranchProperty(String portfolioUuid, String value) {
- db.executeInsert("properties",
- "uuid", uuidFactory.create(),
- "prop_key", "sonar.governance.report.project.branch.lastSendTimeInMs",
- "is_empty", false,
- "text_value", value,
- "created_at", 1000,
- "entity_uuid", portfolioUuid
- );
- }
-
- private void insertPortfolioProperty(String portfolioUuid, String value) {
- db.executeInsert("properties",
- "uuid", uuidFactory.create(),
- "prop_key", "sonar.governance.report.lastSendTimeInMs",
- "is_empty", false,
- "text_value", value,
- "created_at", 1000,
- "entity_uuid", portfolioUuid
- );
- }
-
- private void insertBranch(String uuid) {
- db.executeInsert("project_branches",
- "uuid", uuid,
- "project_uuid", "project_" + uuid,
- "kee", "kee_" + uuid,
- "branch_type", "BRANCH",
- "created_at", 1000,
- "updated_at", 1000,
- "need_issue_sync", false,
- "is_main", true
- );
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptionsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptionsIT.java
deleted file mode 100644
index 673c8e06b41..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptionsIT.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class PopulateReportSubscriptionsIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateReportSubscriptions.class);
-
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
- private final DataChange underTest = new PopulateReportSubscriptions(db.database());
-
- @Test
- void execute_shouldPopulateFromPortfolioProperties() throws SQLException {
- insertPortfolio("uuid1");
- insertPortfolioProperty("uuid1", "1234");
-
- underTest.execute();
-
- assertThat(db.select("select * from report_subscriptions"))
- .extracting(m -> m.get("PORTFOLIO_UUID"), m -> m.get("BRANCH_UUID"), m -> m.get("USER_UUID"))
- .containsOnly(tuple("uuid1", null, "1234"));
- }
-
- @Test
- void execute_shouldPopulateFromBranchProperties() throws SQLException {
- insertBranch("uuid1");
- insertBranchProperty("uuid1", "1234");
-
- underTest.execute();
-
- assertThat(db.select("select * from report_subscriptions"))
- .extracting(m -> m.get("PORTFOLIO_UUID"), m -> m.get("BRANCH_UUID"), m -> m.get("USER_UUID"))
- .containsOnly(tuple(null, "uuid1", "1234"));
- }
-
- @Test
- void execute_whenPropertyMatchesBothBranchAndPortfolio_shouldNotPopulate() throws SQLException {
- insertBranch("uuid1");
- insertPortfolio("uuid1");
- insertBranchProperty("uuid1", "1234");
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select * from report_subscriptions")).isEmpty();
- }
-
- private void insertPortfolio(String uuid) {
- db.executeInsert("portfolios",
- "uuid", uuid,
- "kee", "kee_" + uuid,
- "name", "name_" + uuid,
- "root_uuid", uuid,
- "private", true,
- "selection_mode", "manual",
- "created_at", 1000,
- "updated_at", 1000
- );
- }
-
- private void insertBranchProperty(String branchUuid, String userUuid){
- insertProperty( branchUuid, userUuid, "sonar.governance.report.userNotification");
- }
-
- private void insertPortfolioProperty(String branchUuid, String userUuid){
- insertProperty( branchUuid, userUuid, "sonar.governance.report.project.branch.userNotification");
- }
-
- private void insertProperty(String componentUuid, String userUuid, String propertyKey) {
- db.executeInsert("properties",
- "uuid", uuidFactory.create(),
- "prop_key", propertyKey,
- "is_empty", false,
- "text_value", "true",
- "created_at", 1000,
- "entity_uuid", componentUuid,
- "user_uuid", userUuid
- );
- }
-
- private void insertBranch(String uuid) {
- db.executeInsert("project_branches",
- "uuid", uuid,
- "project_uuid", "project_" + uuid,
- "kee", "kee_" + uuid,
- "branch_type", "BRANCH",
- "created_at", 1000,
- "updated_at", 1000,
- "need_issue_sync", false,
- "is_main", true
- );
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokensIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokensIT.java
deleted file mode 100644
index 24946bfa8fa..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokensIT.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class RemoveOrphanUserTokensIT {
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RemoveOrphanUserTokens.class);
-
- private final DataChange underTest = new RemoveOrphanUserTokens(db.database());
-
- @Test
- void migration_deletes_orphan_tokens() throws SQLException {
- String project1Uuid = insertProject("project1");
-
- String token1Uuid = insertUserToken("project1");
- String token2Uuid = insertUserToken("orphan");
- String token3Uuid = insertUserToken(null);
-
- underTest.execute();
- assertThat(db.select("select * from user_tokens"))
- .extracting(r -> r.get("UUID"))
- .containsOnly(token1Uuid, token3Uuid);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- String project1Uuid = insertProject("project1");
-
- String token1Uuid = insertUserToken("project1");
- String token2Uuid = insertUserToken("orphan");
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select * from user_tokens"))
- .extracting(r -> r.get("UUID"))
- .containsOnly(token1Uuid);
- }
-
- private String insertUserToken( @Nullable String projectKey) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("USER_UUID", "user" + uuid);
- map.put("NAME", "name" + uuid);
- map.put("TOKEN_HASH", "token" + uuid);
- map.put("CREATED_AT", 1);
- map.put("PROJECT_KEY", projectKey);
- map.put("TYPE", "PROJECT_ANALYSIS_TOKEN");
-
- db.executeInsert("user_tokens", map);
- return uuid;
- }
-
- private String insertProject(String projectKey) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- map.put("KEE", projectKey);
- map.put("QUALIFIER", "TRK");
- map.put("PRIVATE", true);
- map.put("UPDATED_AT", System.currentTimeMillis());
- db.executeInsert("projects", map);
- return uuid;
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportPropertiesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportPropertiesIT.java
deleted file mode 100644
index 2ad919913d9..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportPropertiesIT.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class RemoveReportPropertiesIT {
-
- private static final String SONAR_GOVERNANCE_REPORT_USER_NOTIFICATION = "sonar.governance.report.userNotification";
- private static final String SONAR_GOVERNANCE_REPORT_PROJECT_BRANCH_USER_NOTIFICATION = "sonar.governance.report.project.branch.userNotification";
- private static final String SONAR_GOVERNANCE_REPORT_LAST_SEND_TIME_IN_MS = "sonar.governance.report.lastSendTimeInMs";
- private static final String SONAR_GOVERNANCE_REPORT_PROJECT_BRANCH_LAST_SEND_TIME_IN_MS = "sonar.governance.report.project.branch.lastSendTimeInMs";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RemoveReportProperties.class);
-
- private final DataChange underTest = new RemoveReportProperties(db.database());
-
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-
- @Test
- void execute_shouldRemoveRelevantPropertiesFromTable() throws SQLException {
- insertProperty( "branch_uuid", "user_uuid", SONAR_GOVERNANCE_REPORT_USER_NOTIFICATION, "true");
- insertProperty( "portfolio_uuid", "user_uuid", SONAR_GOVERNANCE_REPORT_PROJECT_BRANCH_USER_NOTIFICATION, "true");
- insertProperty( "branch_uuid", "user_uuid", SONAR_GOVERNANCE_REPORT_LAST_SEND_TIME_IN_MS, "12");
- insertProperty( "portfolio_uuid", "user_uuid", SONAR_GOVERNANCE_REPORT_PROJECT_BRANCH_LAST_SEND_TIME_IN_MS, "123");
- insertProperty( "portfolio_uuid", "user_uuid", "sonar.other.property", "123");
-
- underTest.execute();
-
- assertThat(db.select("select * from properties")).hasSize(1)
- .extracting(r->r.get("PROP_KEY")).containsExactly("sonar.other.property");
- }
-
- @Test
- void execute_shouldBeIdempotent() throws SQLException {
- insertProperty( "branch_uuid", "user_uuid", SONAR_GOVERNANCE_REPORT_USER_NOTIFICATION, "true");
- insertProperty( "portfolio_uuid", "user_uuid", SONAR_GOVERNANCE_REPORT_PROJECT_BRANCH_USER_NOTIFICATION, "true");
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select * from properties")).isEmpty();
- }
-
- private void insertProperty(String componentUuid, String userUuid, String propertyKey, String value) {
- db.executeInsert("properties",
- "uuid", uuidFactory.create(),
- "prop_key", propertyKey,
- "is_empty", false,
- "text_value", value,
- "created_at", 1000,
- "entity_uuid", componentUuid,
- "user_uuid", userUuid
- );
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInPropertiesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInPropertiesIT.java
deleted file mode 100644
index 126bb6100bd..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInPropertiesIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class RenameColumnComponentUuidInPropertiesIT {
-
- public static final String TABLE_NAME = "properties";
- public static final String NEW_COLUMN_NAME = "entity_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameColumnComponentUuidInProperties.class);
- private final RenameColumnComponentUuidInProperties underTest = new RenameColumnComponentUuidInProperties(db.database());
-
- @Test
- void columnIsRenamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranchesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranchesIT.java
deleted file mode 100644
index 9ee17933868..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranchesIT.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class UpdateIsMainColumnInProjectBranchesIT {
-
- private final UuidFactory uuidFactory = UuidFactoryFast.getInstance();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(UpdateIsMainColumnInProjectBranches.class);
-
- private final DataChange underTest = new UpdateIsMainColumnInProjectBranches(db.database());
-
- private static int not_random_value_always_incremented = 0;
-
- @Test
- void migration_updates_is_main_if_row_has_the_same_uuids() throws SQLException {
- String branchUuid1 = insertProjectBranch(true);
- String branchUuid2 = insertProjectBranch(false);
-
- underTest.execute();
-
- assertBranchIsMain(branchUuid1);
- assertBranchIsNotMain(branchUuid2);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- String branchUuid1 = insertProjectBranch(true);
- String branchUuid2 = insertProjectBranch(false);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- assertBranchIsMain(branchUuid1);
- assertBranchIsNotMain(branchUuid2);
- }
-
- private void assertBranchIsMain(String branchUuid) {
- assertBranchIs(branchUuid, true);
- }
-
- private void assertBranchIsNotMain(String branchUuid) {
- assertBranchIs(branchUuid, false);
- }
-
- private void assertBranchIs(String branchUuid, boolean isMain) {
- String selectSql = String.format("select is_main from project_branches where uuid='%s'", branchUuid);
- assertThat(db.select(selectSql).stream()
- .map(row -> row.get("IS_MAIN"))
- .toList())
- .containsExactlyInAnyOrder(isMain);
- }
-
- private String insertProjectBranch(boolean sameUuids) {
- Map<String, Object> map = new HashMap<>();
- String uuid = uuidFactory.create();
- map.put("UUID", uuid);
- if(sameUuids) {
- map.put("PROJECT_UUID", uuid);
- } else {
- map.put("PROJECT_UUID", "uuid" + not_random_value_always_incremented++);
- }
- map.put("KEE", "randomKey");
- map.put("BRANCH_TYPE", "BRANCH");
- map.put("MERGE_BRANCH_UUID", null);
- map.put("CREATED_AT", System.currentTimeMillis());
- map.put("UPDATED_AT", System.currentTimeMillis());
- map.put("PULL_REQUEST_BINARY", null);
- map.put("EXCLUDE_FROM_PURGE", true);
- map.put("NEED_ISSUE_SYNC", false);
- db.executeInsert("project_branches", map);
- return uuid;
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRulesIT.java
deleted file mode 100644
index 2fd67d44eae..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRulesIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-class AddCleanCodeAttributeInRulesIT {
- private static final String TABLE_NAME = "rules";
- private static final String COLUMN_NAME = "clean_code_attribute";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddCleanCodeAttributeInRules.class);
-
- private final AddCleanCodeAttributeInRules underTest = new AddCleanCodeAttributeInRules(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, true);
- }
-
- @Test
- void execute_whenExecutedTwice_shouldNotFail() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabledIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabledIT.java
deleted file mode 100644
index 280d63dfddb..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabledIT.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.slf4j.event.Level;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.v102.AddUserConsentRequiredIfGithubAutoProvisioningEnabled.PROP_KEY;
-import static org.sonar.server.platform.db.migration.version.v102.AddUserConsentRequiredIfGithubAutoProvisioningEnabled.PROVISIONING_GITHUB_ENABLED_PROP_KEY;
-
-class AddUserConsentRequiredIfGithubAutoProvisioningEnabledIT {
-
- @RegisterExtension
- public final LogTesterJUnit5 logger = new LogTesterJUnit5();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddUserConsentRequiredIfGithubAutoProvisioningEnabled.class);
- private final DataChange underTest = new AddUserConsentRequiredIfGithubAutoProvisioningEnabled(db.database(), new System2(), UuidFactoryFast.getInstance());
-
- @BeforeEach
- public void before() {
- logger.clear();
- }
-
- @Test
- void migration_whenGitHubAutoProvisioningPropertyNotPresent_shouldNotRequireConsent() throws SQLException {
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).isEmpty();
- assertThat(isConsentRequired()).isFalse();
- }
-
- @Test
- void migration_whenGitHubAutoProvisioningDisabled_shouldNotRequireConsent() throws SQLException {
- disableGithubProvisioning();
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).isEmpty();
- assertThat(isConsentRequired()).isFalse();
- }
-
- @Test
- void migration_whenGitHubAutoProvisioningEnabled_shouldRequireConsent() throws SQLException {
- enableGithubProvisioning();
-
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).containsExactly("Automatic synchronization was previously activated for GitHub. It requires user consent to continue working as new"
- + " features were added with the synchronization. Please read the upgrade notes.");
- assertThat(isConsentRequired()).isTrue();
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- enableGithubProvisioning();
-
- underTest.execute();
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).containsExactly("Automatic synchronization was previously activated for GitHub. It requires user consent to continue working as new"
- + " features were added with the synchronization. Please read the upgrade notes.");
- assertThat(isConsentRequired()).isTrue();
- }
-
- private void disableGithubProvisioning() {
- toggleGithubProvisioning(false);
- }
- private void enableGithubProvisioning() {
- toggleGithubProvisioning(true);
- }
-
- private boolean isConsentRequired() {
- return db.countSql("select count(*) from properties where prop_key = '" + PROP_KEY + "'") >= 1;
- }
-
- private void toggleGithubProvisioning(boolean enabled) {
- db.executeInsert("internal_properties", "kee", PROVISIONING_GITHUB_ENABLED_PROP_KEY, "text_value", String.valueOf(enabled), "is_empty", true, "created_at", 0);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTableIT.java
deleted file mode 100644
index c870442dd97..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTableIT.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.USER_UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v102.CreateAnticipatedTransitionsTable.ANTICIPATED_TRANSITIONS_TABLE_NAME;
-
-class CreateAnticipatedTransitionsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateAnticipatedTransitionsTable.class);
-
- private final DdlChange createAnticipatedTransitionsTable = new CreateAnticipatedTransitionsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(ANTICIPATED_TRANSITIONS_TABLE_NAME);
-
- createAnticipatedTransitionsTable.execute();
-
- db.assertTableExists(ANTICIPATED_TRANSITIONS_TABLE_NAME);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "project_uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "user_uuid", Types.VARCHAR, USER_UUID_SIZE, false);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "transition", Types.VARCHAR, 20, false);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "transition_comment", Types.VARCHAR, MAX_SIZE, true);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "line", Types.INTEGER, null, true);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "message", Types.VARCHAR, MAX_SIZE, true);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "line_hash", Types.VARCHAR, 255, true);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "rule_key", Types.VARCHAR, 200, false);
- db.assertColumnDefinition(ANTICIPATED_TRANSITIONS_TABLE_NAME, "file_path", Types.VARCHAR, 1500, false);
- db.assertPrimaryKey(ANTICIPATED_TRANSITIONS_TABLE_NAME, "pk_anticipated_transitions", "uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(ANTICIPATED_TRANSITIONS_TABLE_NAME);
-
- createAnticipatedTransitionsTable.execute();
- // re-entrant
- createAnticipatedTransitionsTable.execute();
-
- db.assertTableExists(ANTICIPATED_TRANSITIONS_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshotsIT.java
deleted file mode 100644
index 95755bbcec9..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshotsIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-
-class CreateBooleanPurgedColumnInSnapshotsIT {
-
- private static final String TABLE_NAME = "snapshots";
- private static final String COLUMN_NAME = "purged";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateBooleanPurgedColumnInSnapshots.class);
-
- private final CreateBooleanPurgedColumnInSnapshots underTest = new CreateBooleanPurgedColumnInSnapshots(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreatePurgedColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, null);
- }
-
- @Test
- void execute_whenExecutedTwice_shouldNotFail() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, null);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTableIT.java
deleted file mode 100644
index 0ec928e608b..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTableIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v102.CreateGithubOrganizationsGroupsTable.GROUP_UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v102.CreateGithubOrganizationsGroupsTable.ORGANIZATION_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v102.CreateGithubOrganizationsGroupsTable.TABLE_NAME;
-
-class CreateGithubOrganizationsGroupsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateGithubOrganizationsGroupsTable.class);
- private final DdlChange createGithubOrganizationsGroupsTable = new CreateGithubOrganizationsGroupsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createGithubOrganizationsGroupsTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, GROUP_UUID_COLUMN_NAME, Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, ORGANIZATION_COLUMN_NAME, Types.VARCHAR, 100, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_github_orgs_groups", GROUP_UUID_COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createGithubOrganizationsGroupsTable.execute();
- // re-entrant
- createGithubOrganizationsGroupsTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveriesIT.java
deleted file mode 100644
index 83df756e86c..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateIndexCreatedAtInWebhookDeliveriesIT {
-
- public static final String TABLE_NAME = "webhook_deliveries";
- public static final String INDEX_NAME = "wd_created_at";
- public static final String EXPECTED_COLUMN = "created_at";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexCreatedAtInWebhookDeliveries.class);
- private final DdlChange createIndex = new CreateIndexCreatedAtInWebhookDeliveries(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, EXPECTED_COLUMN);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, EXPECTED_COLUMN);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivityIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivityIT.java
deleted file mode 100644
index 45b7981f962..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivityIT.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-class CreateIndexEntityUuidInCeActivityIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexEntityUuidInCeActivity.class);
- private final CreateIndexEntityUuidInCeActivity createIndex = new CreateIndexEntityUuidInCeActivity(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("ce_activity", "ce_activity_entity_uuid");
-
- createIndex.execute();
-
- db.assertIndex("ce_activity", "ce_activity_entity_uuid", "entity_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex("ce_activity", "ce_activity_entity_uuid", "entity_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueueIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueueIT.java
deleted file mode 100644
index d80604d9415..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueueIT.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-class CreateIndexEntityUuidInCeQueueIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexEntityUuidInCeQueue.class);
- private final CreateIndexEntityUuidInCeQueue createIndex = new CreateIndexEntityUuidInCeQueue(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("ce_queue", "ce_queue_entity_uuid");
-
- createIndex.execute();
-
- db.assertIndex("ce_queue", "ce_queue_entity_uuid", "entity_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex("ce_queue", "ce_queue_entity_uuid", "entity_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRolesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRolesIT.java
deleted file mode 100644
index cd3a604afd6..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRolesIT.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-class CreateIndexEntityUuidInGroupRolesIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexEntityUuidInGroupRoles.class);
- private final CreateIndexEntityUuidInGroupRoles createIndex = new CreateIndexEntityUuidInGroupRoles(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("group_roles", "group_roles_entity_uuid");
-
- createIndex.execute();
-
- db.assertIndex("group_roles", "group_roles_entity_uuid", "entity_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex("group_roles", "group_roles_entity_uuid", "entity_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRolesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRolesIT.java
deleted file mode 100644
index b98c6802061..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRolesIT.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-class CreateIndexEntityUuidInUserRolesIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexEntityUuidInUserRoles.class);
- private final CreateIndexEntityUuidInUserRoles createIndex = new CreateIndexEntityUuidInUserRoles(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("user_roles", "user_roles_entity_uuid");
-
- createIndex.execute();
-
- db.assertIndex("user_roles", "user_roles_entity_uuid", "entity_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex("user_roles", "user_roles_entity_uuid", "entity_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveriesIT.java
deleted file mode 100644
index a77dca305b4..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateIndexProjectUuidCreatedAtInWebhookDeliveriesIT {
-
- public static final String TABLE_NAME = "webhook_deliveries";
- public static final String INDEX_NAME = "wd_project_uuid_created_at";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexProjectUuidCreatedAtInWebhookDeliveries.class);
- private final DdlChange createIndex = new CreateIndexProjectUuidCreatedAtInWebhookDeliveries(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "project_uuid", "created_at");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "project_uuid", "created_at");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranchesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranchesIT.java
deleted file mode 100644
index 927bbf09730..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranchesIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class CreateIndexProjectUuidInProjectBranchesIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexProjectUuidInProjectBranches.class);
- private final CreateIndexProjectUuidInProjectBranches createIndex = new CreateIndexProjectUuidInProjectBranches(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("project_branches", "project_branches_project_uuid");
-
- createIndex.execute();
-
- db.assertIndex("project_branches", "project_branches_project_uuid", "project_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex("project_branches", "project_branches_project_uuid", "project_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshotsIT.java
deleted file mode 100644
index bfb20829a37..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshotsIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class CreateIndexRootComponentUuidInSnapshotsIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexRootComponentUuidInSnapshots.class);
- private final CreateIndexRootComponentUuidInSnapshots createIndex = new CreateIndexRootComponentUuidInSnapshots(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("snapshots", "snapshots_root_component_uuid");
-
- createIndex.execute();
-
- db.assertIndex("snapshots", "snapshots_root_component_uuid", "root_component_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex("snapshots", "snapshots_root_component_uuid", "root_component_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveriesIT.java
deleted file mode 100644
index fef3462f9b3..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateIndexTaskUuidCreatedAtInWebhookDeliveriesIT {
-
- public static final String TABLE_NAME = "webhook_deliveries";
- public static final String INDEX_NAME = "wd_ce_task_uuid_created_at";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexTaskUuidCreatedAtInWebhookDeliveries.class);
- private final DdlChange createIndex = new CreateIndexTaskUuidCreatedAtInWebhookDeliveries(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "ce_task_uuid", "created_at");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "ce_task_uuid", "created_at");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveriesIT.java
deleted file mode 100644
index e2b6e872f23..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateIndexWebhookUuidCreatedAtInWebhookDeliveriesIT {
-
- public static final String TABLE_NAME = "webhook_deliveries";
- public static final String INDEX_NAME = "wd_webhook_uuid_created_at";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexWebhookUuidCreatedAtInWebhookDeliveries.class);
- private final DdlChange createIndex = new CreateIndexWebhookUuidCreatedAtInWebhookDeliveries(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "webhook_uuid", "created_at");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "webhook_uuid", "created_at");
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTableIT.java
deleted file mode 100644
index f23e55704a9..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTableIT.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateIssueImpactsTableIT {
- private static final String EXPECTED_TABLE_NAME = "issues_impacts";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIssueImpactsTable.class);
-
- private final DdlChange underTest = new CreateIssueImpactsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(EXPECTED_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(EXPECTED_TABLE_NAME);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "issue_key", Types.VARCHAR, 40, false);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "software_quality", Types.VARCHAR, 40, false);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "severity", Types.VARCHAR, 40, false);
- db.assertPrimaryKey(EXPECTED_TABLE_NAME, null, "uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(EXPECTED_TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(EXPECTED_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriodsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriodsIT.java
deleted file mode 100644
index 80601d4abd6..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriodsIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class CreatePreviousNonCompliantValueInNewCodePeriodsIT {
-
- private static final String COLUMN_NAME= "previous_non_compliant_value";
-
- private static final String TABLE_NAME = "new_code_periods";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreatePreviousNonCompliantValueInNewCodePeriods.class);
- private final CreatePreviousNonCompliantValueInNewCodePeriods underTest = new CreatePreviousNonCompliantValueInNewCodePeriods(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreatePurgedColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 255, null);
- }
-
- @Test
- void execute_whenExecutedTwice_shouldNotFail() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 255, null);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTableIT.java
deleted file mode 100644
index 5990ac995eb..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTableIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-
-class CreateRulesDefaultImpactsTableIT {
- private static final String EXPECTED_TABLE_NAME = "rules_default_impacts";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateRulesDefaultImpactsTable.class);
-
- private final DdlChange underTest = new CreateRulesDefaultImpactsTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(EXPECTED_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(EXPECTED_TABLE_NAME);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "rule_uuid", Types.VARCHAR, 40, false);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "software_quality", Types.VARCHAR, 40, false);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "severity", Types.VARCHAR, 40, false);
- db.assertPrimaryKey(EXPECTED_TABLE_NAME, null, "uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(EXPECTED_TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(EXPECTED_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpactsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpactsIT.java
deleted file mode 100644
index bd5551d801e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpactsIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class CreateUniqueConstraintOnIssuesImpactsIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueConstraintOnIssuesImpacts.class);
- private final CreateUniqueConstraintOnIssuesImpacts underTest = new CreateUniqueConstraintOnIssuesImpacts(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("issues_impacts", "uniq_iss_key_sof_qual");
-
- underTest.execute();
-
- db.assertUniqueIndex("issues_impacts", "uniq_iss_key_sof_qual", "issue_key", "software_quality");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
-
- db.assertUniqueIndex("issues_impacts", "uniq_iss_key_sof_qual", "issue_key", "software_quality");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpactsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpactsIT.java
deleted file mode 100644
index 06736e508fa..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpactsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-
-class CreateUniqueConstraintOnRulesDefaultImpactsIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueConstraintOnRulesDefaultImpacts.class);
- private final CreateUniqueConstraintOnRulesDefaultImpacts underTest = new CreateUniqueConstraintOnRulesDefaultImpacts(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist("rules_default_impacts", "uniq_rul_uuid_sof_qual");
-
- underTest.execute();
-
- db.assertUniqueIndex("rules_default_impacts", "uniq_rul_uuid_sof_qual", "rule_uuid", "software_quality");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
-
- db.assertUniqueIndex("rules_default_impacts", "uniq_rul_uuid_sof_qual", "rule_uuid", "software_quality");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT.java
deleted file mode 100644
index 0b9fb69b560..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.CoreDbTester;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropIndexComponentUuidInGroupRolesIT {
-
- private static final String TABLE_NAME = "group_roles";
- private static final String COLUMN_NAME = "component_uuid";
- private static final String INDEX_NAME = "group_roles_component_uuid";
-
- /**
- * {@link MigrationDbTester} is not used because we are expecting index with component_uuid to exist. However, renaming the column component_uuid to entity_uuid
- * also updated the index
- */
- @RegisterExtension
- public final CoreDbTester db = CoreDbTester.createForSchema(DropIndexComponentUuidInGroupRolesIT.class, "schema.sql");
- private final DropIndexComponentUuidInGroupRoles underTest = new DropIndexComponentUuidInGroupRoles(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshotsIT.java
deleted file mode 100644
index 479405de7ba..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshotsIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropIndexComponentUuidInSnapshotsIT {
-
- private static final String TABLE_NAME = "snapshots";
- private static final String COLUMN_NAME = "component_uuid";
- private static final String INDEX_NAME = "snapshot_component";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexComponentUuidInSnapshots.class);
- private final DropIndexComponentUuidInSnapshots underTest = new DropIndexComponentUuidInSnapshots(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT.java
deleted file mode 100644
index fa0ff9f3df2..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.CoreDbTester;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropIndexComponentUuidInUserRolesIT {
-
- private static final String TABLE_NAME = "user_roles";
- private static final String COLUMN_NAME = "component_uuid";
- private static final String INDEX_NAME = "user_roles_component_uuid";
-
- /**
- * {@link MigrationDbTester} is not used because we are expecting index with component_uuid to exist. However, renaming the column component_uuid to entity_uuid
- * also updated the index
- */
- @RegisterExtension
- public final CoreDbTester db = CoreDbTester.createForSchema(DropIndexComponentUuidInUserRolesIT.class, "schema.sql");
- private final DropIndexComponentUuidInUserRoles underTest = new DropIndexComponentUuidInUserRoles(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveriesIT.java
deleted file mode 100644
index 9ca24e7f36b..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropIndexComponentUuidInWebhookDeliveriesIT {
-
- private static final String TABLE_NAME = "webhook_deliveries";
- private static final String COLUMN_NAME = "component_uuid";
- private static final String INDEX_NAME = "component_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexComponentUuidInWebhookDeliveries.class);
- private final DropIndexComponentUuidInWebhookDeliveries underTest = new DropIndexComponentUuidInWebhookDeliveries(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivityIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivityIT.java
deleted file mode 100644
index 0e45b0398c4..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivityIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropIndexMainComponentUuidInCeActivityIT {
-
- private static final String TABLE_NAME = "ce_activity";
- private static final String COLUMN_NAME = "main_component_uuid";
- private static final String INDEX_NAME = "ce_activity_main_component";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexMainComponentUuidInCeActivity.class);
- private final DropIndexMainComponentUuidInCeActivity underTest = new DropIndexMainComponentUuidInCeActivity(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueueIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueueIT.java
deleted file mode 100644
index 1a8442b9547..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueueIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropIndexMainComponentUuidInCeQueueIT {
-
- private static final String TABLE_NAME = "ce_queue";
- private static final String COLUMN_NAME = "main_component_uuid";
- private static final String INDEX_NAME = "ce_queue_main_component";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexMainComponentUuidInCeQueue.class);
- private final DropIndexMainComponentUuidInCeQueue underTest = new DropIndexMainComponentUuidInCeQueue(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuidIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuidIT.java
deleted file mode 100644
index 94972bcb48e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuidIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropIndexOnMainBranchProjectUuidIT {
- private static final String TABLE_NAME = "components";
- private static final String COLUMN_NAME = "main_branch_project_uuid";
- private static final String INDEX_NAME = "idx_main_branch_prj_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexOnMainBranchProjectUuid.class);
- private final DdlChange underTest = new DropIndexOnMainBranchProjectUuid(db.database());
-
- @Test
- void drops_index() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT.java
deleted file mode 100644
index 55da8cc41ab..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.CoreDbTester;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropIndexProjectUuidInWebhookDeliveriesIT {
-
- private static final String TABLE_NAME = "webhook_deliveries";
- private static final String COLUMN_NAME = "project_uuid";
- private static final String INDEX_NAME = "wd_project_uuid";
-
- /**
- * {@link MigrationDbTester} is not used because we are expecting index with component_uuid to exist. However, renaming the column component_uuid to entity_uuid
- * also updated the index
- */
- @RegisterExtension
- public final CoreDbTester db = CoreDbTester.createForSchema(DropIndexProjectUuidInWebhookDeliveriesIT.class, "schema.sql");
- private final DdlChange underTest = new DropIndexProjectUuidInWebhookDeliveries(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveriesIT.java
deleted file mode 100644
index 11c3cefbd6e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropIndexTaskUuidInWebhookDeliveriesIT {
-
- private static final String TABLE_NAME = "webhook_deliveries";
- private static final String COLUMN_NAME = "ce_task_uuid";
- private static final String INDEX_NAME = "ce_task_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexTaskUuidInWebhookDeliveries.class);
- private final DdlChange underTest = new DropIndexTaskUuidInWebhookDeliveries(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveriesIT.java
deleted file mode 100644
index 45d56e1c942..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropIndexWebhookUuidInWebhookDeliveriesIT {
-
- private static final String TABLE_NAME = "webhook_deliveries";
- private static final String COLUMN_NAME = "webhook_uuid";
- private static final String INDEX_NAME = "idx_wbhk_dlvrs_wbhk_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexWebhookUuidInWebhookDeliveries.class);
- private final DdlChange underTest = new DropIndexWebhookUuidInWebhookDeliveries(db.database());
-
- @Test
- void index_is_dropped() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndexDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponentsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponentsIT.java
deleted file mode 100644
index 329bb1ebc37..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponentsIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v102.DropMainBranchProjectUuidInComponents.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v102.DropMainBranchProjectUuidInComponents.TABLE_NAME;
-
-class DropMainBranchProjectUuidInComponentsIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropMainBranchProjectUuidInComponents.class);
- private final DdlChange underTest = new DropMainBranchProjectUuidInComponents(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 50, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshotsIT.java
deleted file mode 100644
index bce5e938251..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshotsIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropPurgeStatusColumnInSnapshotsIT {
-
- private static final String TABLE_NAME = "snapshots";
- private static final String COLUMN_NAME = "purge_status";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropPurgeStatusColumnInSnapshots.class);
- private final DropPurgeStatusColumnInSnapshots underTest = new DropPurgeStatusColumnInSnapshots(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.INTEGER, null, null);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.INTEGER, null, null);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappingsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappingsIT.java
deleted file mode 100644
index 2f99322000b..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappingsIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class DropTableProjectMappingsIT {
- public static final String TABLE_NAME = "project_mappings";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropTableProjectMappings.class);
- private final DropTableProjectMappings underTest = new DropTableProjectMappings(db.database());
-
- @Test
- void execute_shouldDropTable() throws SQLException {
- db.assertTableExists(TABLE_NAME);
- underTest.execute();
- db.assertTableDoesNotExist(TABLE_NAME);
- }
-
- @Test
- void execute_shouldSupportReentrantMigrationExecution() throws SQLException {
- db.assertTableExists(TABLE_NAME);
- underTest.execute();
- underTest.execute();
- db.assertTableDoesNotExist(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescriptionIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescriptionIT.java
deleted file mode 100644
index 4928d10eac4..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescriptionIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class FixSqaleIndexMetricDescriptionIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(FixSqaleIndexMetricDescription.class);
- private final FixSqaleIndexMetricDescription underTest = new FixSqaleIndexMetricDescription(db.database());
- private final String OLD_DESCRIPTION = "Total effort (in hours) to fix all the issues on the component and therefore to comply to all the requirements.";
- private final String NEW_DESCRIPTION = "Total effort (in minutes) to fix all the issues on the component and therefore to comply to all the requirements.";
-
- @BeforeEach
- public void setUp() {
- db.executeInsert("metrics",
- "uuid", "uuid",
- "name", "sqale_index",
- "description", OLD_DESCRIPTION);
- }
-
- @Test
- void execute_whenExecuted_shouldUpdateSqaleIndexDescription() throws SQLException {
- assertThat(select()).isEqualTo(OLD_DESCRIPTION);
- underTest.execute();
- assertThat(select()).isEqualTo(NEW_DESCRIPTION);
- }
-
- @Test
- void execute_WhenExecutedTwice_shouldBeReentrant() throws SQLException {
- assertThat(select()).isEqualTo(OLD_DESCRIPTION);
- underTest.execute();
- underTest.execute();
- assertThat(select()).isEqualTo(NEW_DESCRIPTION);
- }
-
- private String select() {
- return (String) db.selectFirst("SELECT description FROM metrics WHERE name = 'sqale_index'").get("description");
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivityIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivityIT.java
deleted file mode 100644
index d96ad15c169..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivityIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v102.IncreaseIsLastKeyInCeActivity.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v102.IncreaseIsLastKeyInCeActivity.NEW_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v102.IncreaseIsLastKeyInCeActivity.TABLE_NAME;
-
-class IncreaseIsLastKeyInCeActivityIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(IncreaseIsLastKeyInCeActivity.class);
- private final IncreaseIsLastKeyInCeActivity underTest = new IncreaseIsLastKeyInCeActivity(db.database());
-
- @Test
- void execute_increaseColumnSize() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 55, false);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 55, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivityIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivityIT.java
deleted file mode 100644
index 28d00a4c131..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivityIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v102.IncreaseMainIsLastKeyInCeActivity.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v102.IncreaseMainIsLastKeyInCeActivity.NEW_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v102.IncreaseMainIsLastKeyInCeActivity.TABLE_NAME;
-
-class IncreaseMainIsLastKeyInCeActivityIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(IncreaseMainIsLastKeyInCeActivity.class);
- private final IncreaseMainIsLastKeyInCeActivity underTest = new IncreaseMainIsLastKeyInCeActivity(db.database());
-
- @Test
- void execute_increaseColumnSize() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 55, false);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 55, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, NEW_COLUMN_SIZE, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessagesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessagesIT.java
deleted file mode 100644
index 05c4e121439..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessagesIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class MakeProjectUuidNullableInUserDismissedMessagesIT {
-
- private static final String TABLE_NAME = "user_dismissed_messages";
- private static final String COLUMN_NAME = "project_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MakeProjectUuidNullableInUserDismissedMessages.class);
- private final MakeProjectUuidNullableInUserDismissedMessages underTest = new MakeProjectUuidNullableInUserDismissedMessages(db.database());
-
- @Test
- void execute_shouldBeNullable() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 40, false);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 40, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 40, false);
- underTest.execute();
- underTest.execute();
-
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshotsIT.java
deleted file mode 100644
index e8faf66f43a..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshotsIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-
-class MakePurgedColumnNotNullableInSnapshotsIT {
- private static final String TABLE_NAME = "snapshots";
- private static final String COLUMN_NAME = "purged";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MakePurgedColumnNotNullableInSnapshots.class);
- private final MakePurgedColumnNotNullableInSnapshots underTest = new MakePurgedColumnNotNullableInSnapshots(db.database());
-
- @Test
- void execute_whenColumnIsNullable_shouldMakeColumnNullable() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, true);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, false);
- }
-
- @Test
- void execute_whenExecutedTwice_shouldMakeColumnNullable() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, BOOLEAN, null, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRulesIT.java
deleted file mode 100644
index 8074c39e777..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRulesIT.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-class PopulateCleanCodeAttributeColumnInRulesIT {
-
- private static final String TABLE_NAME = "rules";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateCleanCodeAttributeColumnInRules.class);
- private final PopulateCleanCodeAttributeColumnInRules underTest = new PopulateCleanCodeAttributeColumnInRules(db.database());
-
- @Test
- void execute_whenRulesDoNotExist_shouldNotFail() {
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
- @Test
- void execute_whenRuleWithUndefinedCleanCodeAttribute_shouldUpdate() throws SQLException {
- insertRule("1", null);
- underTest.execute();
- assertThat(db.select("select uuid, clean_code_attribute from rules"))
- .extracting(stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsExactly(CleanCodeAttribute.CONVENTIONAL.name());
- }
-
- @Test
- void execute_whenRuleWithUndefinedCleanCodeAttribute_shouldBeReentrant() throws SQLException {
- insertRule("1", null);
- underTest.execute();
- underTest.execute();
- assertThat(db.select("select uuid, clean_code_attribute from rules"))
- .extracting(stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsExactly(CleanCodeAttribute.CONVENTIONAL.name());
- }
-
- @Test
- void execute_whenRuleWithDefinedCleanCodeAttribute_shouldNotUpdate() throws SQLException {
- insertRule("1", CleanCodeAttribute.FOCUSED);
- underTest.execute();
- assertThat(db.select("select uuid, clean_code_attribute from rules"))
- .extracting(stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsExactly(CleanCodeAttribute.FOCUSED.name());
- }
-
- @Test
- void execute_whenRuleIsHotspot_shouldNotUpdate() throws SQLException {
- insertRule("1", RuleType.SECURITY_HOTSPOT, null, null);
- underTest.execute();
- assertThat(db.select("select uuid, clean_code_attribute from rules"))
- .extracting(stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsOnlyNulls();
- }
-
- @Test
- void execute_whenAdhocRuleIsHotspot_shouldNotUpdate() throws SQLException {
- insertRule("1", null, RuleType.SECURITY_HOTSPOT, null);
- underTest.execute();
- assertThat(db.select("select uuid, clean_code_attribute from rules"))
- .extracting(stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsOnlyNulls();
- }
-
-
- private void insertRule(String uuid, @Nullable RuleType ruleType, @Nullable RuleType adhocRuleType, @Nullable CleanCodeAttribute cleanCodeAttribute) {
- db.executeInsert(TABLE_NAME,
- "UUID", uuid,
- "PLUGIN_RULE_KEY", "key",
- "PLUGIN_NAME", "name",
- "SCOPE", "1",
- "CLEAN_CODE_ATTRIBUTE", cleanCodeAttribute != null ? cleanCodeAttribute.name() : null,
- "IS_TEMPLATE", false,
- "RULE_TYPE", ruleType != null ? ruleType.getDbConstant() : null,
- "AD_HOC_TYPE", adhocRuleType != null ? adhocRuleType.getDbConstant() : null,
- "IS_AD_HOC", false,
- "IS_EXTERNAL", false);
- }
-
- private void insertRule(String uuid, @Nullable CleanCodeAttribute cleanCodeAttribute) {
- insertRule(uuid, RuleType.CODE_SMELL, null, cleanCodeAttribute);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRulesIT.java
deleted file mode 100644
index ee6ac81abb8..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRulesIT.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.batch.rule.Severity;
-import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.core.util.Uuids;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.tuple;
-
-class PopulateDefaultImpactsInRulesIT {
- private static final String TABLE_NAME = "rules";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateDefaultImpactsInRules.class);
- @RegisterExtension
- public final LogTesterJUnit5 logTester = new LogTesterJUnit5();
-
- private final PopulateDefaultImpactsInRules underTest = new PopulateDefaultImpactsInRules(db.database());
-
- @Test
- void execute_whenRulesDoNotExist_shouldNotFail() {
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
- @Test
- void execute_whenRulesHasTypeAndSeverity_shouldCreateImpact() throws SQLException {
- insertRuleWithType("uuid", RuleType.CODE_SMELL, Severity.MAJOR);
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.MAINTAINABILITY.name(), org.sonar.api.issue.impact.Severity.MEDIUM.name()));
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- insertRuleWithType("uuid", RuleType.CODE_SMELL, Severity.MAJOR);
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .hasSize(1)
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.MAINTAINABILITY.name(), org.sonar.api.issue.impact.Severity.MEDIUM.name()));
-
- }
-
- @Test
- void execute_shouldNotBeExecuted_whenImpactsTableHasAlreadyRecords() throws SQLException {
- insertRuleWithType("uuid", RuleType.CODE_SMELL, Severity.MAJOR);
- insertRuleWithType("uuid2", RuleType.CODE_SMELL, Severity.MAJOR);
- insertImpact("uuid", SoftwareQuality.SECURITY, org.sonar.api.issue.impact.Severity.HIGH);
-
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .hasSize(1)
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.SECURITY.name(), org.sonar.api.issue.impact.Severity.HIGH.name()));
- }
-
- @Test
- void execute_whenAdhocRulesHasTypeAndSeverity_shouldCreateImpact() throws SQLException {
- insertRuleWithAdHocType("uuid", RuleType.CODE_SMELL, Severity.MAJOR);
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .hasSize(1)
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.MAINTAINABILITY.name(), org.sonar.api.issue.impact.Severity.MEDIUM.name()));
-
- }
-
- @Test
- void execute_whenAdhocRulesHasImpactAlready_shouldNotCreateImpact() throws SQLException {
- insertRuleWithAdHocType("uuid", RuleType.CODE_SMELL, Severity.MAJOR);
- insertImpact("uuid", SoftwareQuality.SECURITY, org.sonar.api.issue.impact.Severity.HIGH);
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .hasSize(1)
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.SECURITY.name(), org.sonar.api.issue.impact.Severity.HIGH.name()));
-
- }
-
- @Test
- void execute_whenNoTypeAndSeverityDefined_shouldNotCreateImpact() throws SQLException {
- insertRuleWithType("uuid", null, null);
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .isEmpty();
-
- }
-
- @Test
- void execute_whenInvalidValueDefined_shouldNotCreateImpactAndLog() throws SQLException {
- insertInvalidRule("uuid");
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .isEmpty();
- assertThat(logTester.logs()).contains("Error while mapping type to impact for rule 'uuid'");
-
- }
-
- @Test
- void execute_whenTypeIsHotspot_shouldNotCreateImpactAndLog() throws SQLException {
- insertRuleWithType("uuid", RuleType.SECURITY_HOTSPOT, Severity.MAJOR);
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .isEmpty();
- assertThat(logTester.logs()).doesNotContain("Error while mapping type to impact for rule 'uuid'");
- }
-
- @Test
- void execute_whenRuleHasEmptyFields_shouldCreateADefaultImpact() throws SQLException {
- insertPlaceholderAdhocRule("uuid");
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .hasSize(1)
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.MAINTAINABILITY.name(), org.sonar.api.issue.impact.Severity.MEDIUM.name()));
- }
-
- @Test
- void execute_whenStandardRuleHasBothAdhocAndStandardTypeAndSeverity_shouldCreateADefaultImpactWithAdhocTypes() throws SQLException {
- insertRule("uuid", RuleType.CODE_SMELL, Severity.CRITICAL, RuleType.VULNERABILITY, Severity.MINOR, true);
- underTest.execute();
-
- assertThat(db.select("select software_quality, severity from rules_default_impacts"))
- .hasSize(1)
- .extracting(stringObjectMap -> stringObjectMap.get("software_quality"),
- stringObjectMap -> stringObjectMap.get("severity"))
- .containsExactly(tuple(SoftwareQuality.SECURITY.name(), org.sonar.api.issue.impact.Severity.LOW.name()));
- }
-
- private void insertRuleWithType(String uuid, @Nullable RuleType ruleType, @Nullable Severity severity) {
- insertRule(uuid, ruleType, severity, null, null);
- }
-
- private void insertRuleWithAdHocType(String uuid, @Nullable RuleType adHocType, @Nullable Severity adHocseverity) {
- insertRule(uuid, null, null, adHocType, adHocseverity);
- }
-
-
- private void insertRule(String uuid, @Nullable RuleType ruleType, @Nullable Severity severity, @Nullable RuleType adHocType, @Nullable Severity adHocseverity) {
- insertRule(uuid, ruleType, severity, adHocType, adHocseverity, adHocType != null);
- }
-
- private void insertRule(String uuid, @Nullable RuleType ruleType, @Nullable Severity severity, @Nullable RuleType adHocType, @Nullable Severity adHocseverity, boolean isAdhoc) {
- db.executeInsert(TABLE_NAME,
- "UUID", uuid,
- "PLUGIN_RULE_KEY", "key" + uuid,
- "PLUGIN_NAME", "name",
- "SCOPE", "1",
- "RULE_TYPE", ruleType != null ? ruleType.getDbConstant() : null,
- "PRIORITY", severity != null ? org.sonar.api.rule.Severity.ALL.indexOf(severity.name()) : null,
- "AD_HOC_TYPE", adHocType != null ? adHocType.getDbConstant() : null,
- "AD_HOC_SEVERITY", adHocseverity != null ? adHocseverity.name() : null,
- "IS_TEMPLATE", false,
- "IS_AD_HOC", isAdhoc,
- "IS_EXTERNAL", isAdhoc);
- }
-
- private void insertInvalidRule(String uuid) {
- db.executeInsert(TABLE_NAME,
- "UUID", uuid,
- "PLUGIN_RULE_KEY", "key" + uuid,
- "PLUGIN_NAME", "name",
- "SCOPE", "1",
- "RULE_TYPE", 100,
- "PRIORITY", -1,
- "AD_HOC_TYPE", 100,
- "AD_HOC_SEVERITY", "-1",
- "IS_TEMPLATE", false,
- "IS_AD_HOC", false,
- "IS_EXTERNAL", false);
- }
-
- private void insertPlaceholderAdhocRule(String uuid) {
- db.executeInsert(TABLE_NAME,
- "UUID", uuid,
- "PLUGIN_RULE_KEY", "key" + uuid,
- "PLUGIN_NAME", "name",
- "SCOPE", "1",
- "IS_TEMPLATE", false,
- "IS_AD_HOC", true,
- "IS_EXTERNAL", false);
- }
-
- private void insertImpact(String ruleUuid, SoftwareQuality softwareQuality, org.sonar.api.issue.impact.Severity severity) {
- db.executeInsert("RULES_DEFAULT_IMPACTS",
- "UUID", Uuids.create(),
- "RULE_UUID", ruleUuid,
- "SOFTWARE_QUALITY", softwareQuality.name(),
- "SEVERITY", severity.name());
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshotsIT.java
deleted file mode 100644
index 51134683836..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshotsIT.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.tuple;
-
-class PopulatePurgedColumnInSnapshotsIT {
- private static final String TABLE_NAME = "snapshots";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulatePurgedColumnInSnapshots.class);
- private final PopulatePurgedColumnInSnapshots underTest = new PopulatePurgedColumnInSnapshots(db.database());
-
- @Test
- void execute_whenSnapshotsDoesNotExist_shouldNotFail() {
- assertThatCode(underTest::execute)
- .doesNotThrowAnyException();
- }
-
- @Test
- void execute_whenSnapshotsExist_shouldPopulatePurgedColumn() throws SQLException {
- insertSnapshot("uuid-1", null);
- insertSnapshot("uuid-2", 1);
- insertSnapshot("uuid-3", 0);
- insertSnapshot("uuid-4", null);
-
- underTest.execute();
-
- assertThat(db.select("select uuid, purged from snapshots"))
- .extracting(stringObjectMap -> stringObjectMap.get("uuid"), stringObjectMap -> stringObjectMap.get("purged"))
- .containsExactlyInAnyOrder(
- tuple("uuid-1", false),
- tuple("uuid-2", true),
- tuple("uuid-3", false),
- tuple("uuid-4", false));
- }
-
- private void insertSnapshot(String uuid, @Nullable Integer status) {
- db.executeInsert(TABLE_NAME,
- "UUID", uuid,
- "ROOT_COMPONENT_UUID", "r_c_uuid",
- "STATUS", "s",
- "ISLAST", true,
- "PURGE_STATUS", status,
- "PURGED", null);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshotsIT.java
deleted file mode 100644
index debe98cc276..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshotsIT.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class RenameBuildDateInSnapshotsIT {
- private static final String TABLE_NAME = "snapshots";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameBuildDateInSnapshots.class);
- private final RenameBuildDateInSnapshots underTest = new RenameBuildDateInSnapshots(db.database());
-
- @Test
- void execute_whenExecuted_shouldRenameColumn() throws SQLException {
- assertColumnExists("build_date");
- underTest.execute();
- assertColumnExists("analysis_date");
- }
-
- @Test
- void execute_whenExecutedTwice_shouldNotFail() throws SQLException {
- assertColumnExists("build_date");
- underTest.execute();
- underTest.execute();
- assertColumnExists("analysis_date");
- }
-
- private void assertColumnExists(String columnName) {
- db.assertColumnDefinition(TABLE_NAME, columnName, Types.BIGINT, null, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRolesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRolesIT.java
deleted file mode 100644
index d148a65eeb3..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRolesIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class RenameComponentUuidInGroupRolesIT {
- public static final String TABLE_NAME = "group_roles";
- public static final String NEW_COLUMN_NAME = "entity_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameComponentUuidInGroupRoles.class);
- private final RenameComponentUuidInGroupRoles underTest = new RenameComponentUuidInGroupRoles(db.database());
-
- @Test
- void columnIsRenamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshotsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshotsIT.java
deleted file mode 100644
index 4e4ce2ef6ce..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshotsIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class RenameComponentUuidInSnapshotsIT {
- public static final String TABLE_NAME = "snapshots";
- public static final String NEW_COLUMN_NAME = "root_component_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameComponentUuidInSnapshots.class);
- private final RenameComponentUuidInSnapshots underTest = new RenameComponentUuidInSnapshots(db.database());
-
- @Test
- void columnIsRenamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 50, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 50, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRolesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRolesIT.java
deleted file mode 100644
index 747cce992b0..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRolesIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class RenameComponentUuidInUserRolesIT {
- public static final String TABLE_NAME = "user_roles";
- public static final String NEW_COLUMN_NAME = "entity_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameComponentUuidInUserRoles.class);
- private final RenameComponentUuidInUserRoles underTest = new RenameComponentUuidInUserRoles(db.database());
-
- @Test
- void columnIsRenamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveriesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveriesIT.java
deleted file mode 100644
index 719486076fc..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveriesIT.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.AbstractDbTester;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.db.TestDb;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-import org.sonar.server.platform.db.migration.version.RenameVarcharColumnAbstractTest;
-
-class RenameComponentUuidInWebhookDeliveriesIT extends RenameVarcharColumnAbstractTest {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameComponentUuidInWebhookDeliveries.class);
-
- public RenameComponentUuidInWebhookDeliveriesIT() {
- super("webhook_deliveries", "project_uuid", false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- super.verifyMigrationIsReentrant();
- }
-
- @Test
- void column_is_renamed() throws SQLException {
- super.verifyColumnIsRenamed();
- }
-
- @Override
- protected RenameVarcharColumnChange getClassUnderTest() {
- return new RenameComponentUuidInWebhookDeliveries(db.database());
- }
-
- @Override
- protected AbstractDbTester<? extends TestDb> getDatabase() {
- return db;
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivityIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivityIT.java
deleted file mode 100644
index b51f0442020..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivityIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class RenameMainComponentUuidInCeActivityIT {
- public static final String TABLE_NAME = "ce_activity";
- public static final String NEW_COLUMN_NAME = "entity_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameMainComponentUuidInCeActivity.class);
- private final RenameMainComponentUuidInCeActivity underTest = new RenameMainComponentUuidInCeActivity(db.database());
-
- @Test
- void column_is_renamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueueIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueueIT.java
deleted file mode 100644
index c4d54188283..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueueIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-
-class RenameMainComponentUuidInCeQueueIT {
- public static final String TABLE_NAME = "ce_queue";
- public static final String NEW_COLUMN_NAME = "entity_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameMainComponentUuidInCeQueue.class);
- private final RenameMainComponentUuidInCeQueue underTest = new RenameMainComponentUuidInCeQueue(db.database());
-
- @Test
- void column_is_renamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 40, true);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriodsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriodsIT.java
deleted file mode 100644
index 9697905bd2d..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriodsIT.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriodsIT {
-
- private static final String TABLE_NAME = "new_code_periods";
- private static final String PROJECT_UUID = "project-uuid";
- private static final String BRANCH_UUID = "branch-uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods.class);
- public final UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods underTest = new UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods(db.database());
-
- @Test
- void execute_whenSnapshotsExist_shouldPopulatePurgedColumn() throws SQLException {
- insertNewCodePeriods("uuid-1", PROJECT_UUID, BRANCH_UUID, "PREVIOUS_VERSION", null);
- insertNewCodePeriods("uuid-2", PROJECT_UUID, null, "NUMBER_OF_DAYS", "90");
- insertNewCodePeriods("uuid-3", null, null, "NUMBER_OF_DAYS", "97");
-
- underTest.execute();
-
- assertThat(db.select("select uuid, value, previous_non_compliant_value from new_code_periods"))
- .extracting(stringObjectMap -> stringObjectMap.get("uuid"), stringObjectMap -> stringObjectMap.get("value"),
- stringObjectMap -> stringObjectMap.get("previous_non_compliant_value"))
- .containsExactlyInAnyOrder(
- tuple("uuid-1", null, null),
- tuple("uuid-2", "90", null),
- tuple("uuid-3", "90", "97"));
- }
-
- private void insertNewCodePeriods(String uuid, @Nullable String projectUuid, @Nullable String branchUuid, String type, String value) {
- db.executeInsert(TABLE_NAME,
- "UUID", uuid,
- "PROJECT_UUID", projectUuid,
- "BRANCH_UUID", branchUuid,
- "TYPE", type,
- "VALUE", value,
- "UPDATED_AT", System.currentTimeMillis(),
- "CREATED_AT", System.currentTimeMillis());
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTableIT.java
deleted file mode 100644
index ec959be0df7..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-class AddCleanCodeAttributeColumnInIssuesTableIT {
- private static final String TABLE_NAME = "issues";
- private static final String COLUMN_NAME = "clean_code_attribute";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddCleanCodeAttributeColumnInIssuesTable.class);
- private final AddCleanCodeAttributeColumnInIssuesTable underTest = new AddCleanCodeAttributeColumnInIssuesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTableIT.java
deleted file mode 100644
index 34593e87572..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_CREATION_METHOD_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_CREATION_METHOD_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_TABLE_NAME;
-
-class AddCreationMethodColumnInProjectsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddCreationMethodColumnInProjectsTable.class);
- private final AddCreationMethodColumnInProjectsTable underTest = new AddCreationMethodColumnInProjectsTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME, VARCHAR, PROJECTS_CREATION_METHOD_COLUMN_SIZE, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChangesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChangesIT.java
deleted file mode 100644
index 7f35b30b308..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChangesIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-class AddRuleChangesUuidColumnInQProfileChangesIT {
-
- private static final String TABLE_NAME = "qprofile_changes";
- private static final String COLUMN_NAME = "rule_change_uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddRuleChangesUuidColumnInQProfileChanges.class);
- private final AddRuleChangesUuidColumnInQProfileChanges underTest = new AddRuleChangesUuidColumnInQProfileChanges(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTableIT.java
deleted file mode 100644
index 68735826365..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTableIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-class AddSqVersionColumnInQprofileChangesTableIT {
-
- private static final String TABLE_NAME = "qprofile_changes";
- private static final String COLUMN_NAME = "sq_version";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddSqVersionColumnInQprofileChangesTable.class);
- private final AddSqVersionColumnInQprofileChangesTable underTest = new AddSqVersionColumnInQprofileChangesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTableIT.java
deleted file mode 100644
index 2f33aeb0495..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTableIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.GITHUB_PERMISSIONS_MAPPING_TABLE_NAME;
-
-class CreateGithubPermissionsMappingTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateGithubPermissionsMappingTable.class);
-
- private final DdlChange createGithubPermissionsMappingTable = new CreateGithubPermissionsMappingTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME);
-
- createGithubPermissionsMappingTable.execute();
-
- db.assertTableExists(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME);
- db.assertColumnDefinition(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, "uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, "github_role", Types.VARCHAR, 100, false);
- db.assertColumnDefinition(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, "sonarqube_permission", Types.VARCHAR, 64, false);
- db.assertPrimaryKey(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, "pk_github_perms_mapping", "uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME);
-
- createGithubPermissionsMappingTable.execute();
- // re-entrant
- createGithubPermissionsMappingTable.execute();
-
- db.assertTableExists(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTableIT.java
deleted file mode 100644
index dc851d12d69..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTableIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-
-class CreateIndexForRuleImpactChangesTableIT {
-
- static final String INDEX_NAME = "rule_impact_changes_r_c_uuid";
- static final String TABLE_NAME = "rule_impact_changes";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexForRuleImpactChangesTable.class);
- private final CreateIndexForRuleImpactChangesTable underTest = new CreateIndexForRuleImpactChangesTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "rule_change_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, "rule_change_uuid");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTableIT.java
deleted file mode 100644
index 3e61048fa77..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTableIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-class CreateRuleChangesTableIT {
-
- private final static String TABLE_NAME = "rule_changes";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateRuleChangesTable.class);
-
- private final DdlChange underTest = new CreateRuleChangesTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "uuid", Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "new_clean_code_attribute", Types.VARCHAR, 40, true);
- db.assertColumnDefinition(TABLE_NAME, "old_clean_code_attribute", Types.VARCHAR, 40, true);
- db.assertColumnDefinition(TABLE_NAME, "rule_uuid", Types.VARCHAR, UUID_SIZE, false);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTableIT.java
deleted file mode 100644
index 42891eedcb6..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTableIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-class CreateRuleImpactChangesTableIT {
-
-
- private final static String TABLE_NAME = "rule_impact_changes";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateRuleImpactChangesTable.class);
-
- private final DdlChange underTest = new CreateRuleImpactChangesTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "new_software_quality", Types.VARCHAR, 40, true);
- db.assertColumnDefinition(TABLE_NAME, "old_software_quality", Types.VARCHAR, 40, true);
- db.assertColumnDefinition(TABLE_NAME, "new_severity", Types.VARCHAR, 40, true);
- db.assertColumnDefinition(TABLE_NAME, "old_severity", Types.VARCHAR, 40, true);
- db.assertColumnDefinition(TABLE_NAME, "rule_change_uuid", Types.VARCHAR, UUID_SIZE, false);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTableIT.java
deleted file mode 100644
index 055132471d5..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTableIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.GITHUB_PERMISSIONS_MAPPING_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.GITHUB_ROLE_COLUMN;
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.SONARQUBE_PERMISSION_COLUMN;
-import static org.sonar.server.platform.db.migration.version.v103.CreateUniqueIndexForGithubPermissionsMappingTable.INDEX_NAME;
-
-class CreateUniqueIndexForGithubPermissionsMappingTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueIndexForGithubPermissionsMappingTable.class);
- private final CreateUniqueIndexForGithubPermissionsMappingTable createIndex = new CreateUniqueIndexForGithubPermissionsMappingTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, INDEX_NAME);
-
- createIndex.execute();
-
- db.assertUniqueIndex(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, INDEX_NAME, GITHUB_ROLE_COLUMN, SONARQUBE_PERMISSION_COLUMN);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertUniqueIndex(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, INDEX_NAME, GITHUB_ROLE_COLUMN, SONARQUBE_PERMISSION_COLUMN);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTableIT.java
deleted file mode 100644
index 73141c898be..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTableIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v103.CreateUniqueIndexForPropertiesTable.INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v103.CreateUniqueIndexForPropertiesTable.PROPERTIES_TABLE_NAME;
-
-
-class CreateUniqueIndexForPropertiesTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueIndexForPropertiesTable.class);
- private final CreateUniqueIndexForPropertiesTable createIndex = new CreateUniqueIndexForPropertiesTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(PROPERTIES_TABLE_NAME, INDEX_NAME);
-
- createIndex.execute();
-
- db.assertUniqueIndex(PROPERTIES_TABLE_NAME, INDEX_NAME, "prop_key", "entity_uuid", "user_uuid");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertUniqueIndex(PROPERTIES_TABLE_NAME, INDEX_NAME, "prop_key", "entity_uuid", "user_uuid");
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTableIT.java
deleted file mode 100644
index 126474d6bd7..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTableIT.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.util.Date;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.Uuids;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class DeduplicatePropertiesTableIT {
- public static final String KEY = "key";
- public static final String ENTITY = "entity";
- public static final String USER = "user";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DeduplicatePropertiesTable.class);
- private final DeduplicatePropertiesTable underTest = new DeduplicatePropertiesTable(db.database());
-
-
- public void createBaseProperties() {
- createProperty(KEY, null, null);
- createProperty(KEY, USER, null);
- createProperty(KEY, USER, ENTITY);
- }
-
- private void createProperty(String key, @Nullable String user, @Nullable String entity) {
- db.executeInsert("PROPERTIES",
- "UUID", Uuids.createFast(),
- "PROP_KEY", key,
- "TEXT_VALUE", "value",
- "ENTITY_UUID", entity,
- "USER_UUID", user,
- "IS_EMPTY", false,
- "CREATED_AT", new Date().getTime());
- }
-
- @Test
- void execute_shouldDeduplicateRows_WhenOnlyKeyIsSpecified() throws SQLException {
- createBaseProperties();
- createProperty(KEY, null, null);
- createProperty(KEY, null, null);
- underTest.execute();
- assertThat(db.select("select * from properties"))
- .hasSize(3)
- .extracting(str -> str.get("PROP_KEY"), str -> str.get("USER_UUID"), str -> str.get("ENTITY_UUID"))
- .containsExactlyInAnyOrder(tuple(KEY, null, null), tuple(KEY, USER, null), tuple(KEY, USER, ENTITY));
- }
-
- @Test
- void execute_shouldDeduplicateRows_WhenOnlyKeyAndUserAreSpecified() throws SQLException {
- createBaseProperties();
- createProperty(KEY, USER, null);
- createProperty(KEY, USER, null);
- underTest.execute();
- assertThat(db.select("select * from properties"))
- .hasSize(3)
- .extracting(str -> str.get("PROP_KEY"), str -> str.get("USER_UUID"), str -> str.get("ENTITY_UUID"))
- .containsExactlyInAnyOrder(tuple(KEY, null, null), tuple(KEY, USER, null), tuple(KEY, USER, ENTITY));
- }
-
- @Test
- void execute_shouldDeduplicateRows_WhenKeyUserAndEntityAreSpecified() throws SQLException {
- createBaseProperties();
- createProperty(KEY, USER, ENTITY);
- createProperty(KEY, USER, ENTITY);
- underTest.execute();
- assertThat(db.select("select * from properties"))
- .hasSize(3)
- .extracting(str -> str.get("PROP_KEY"), str -> str.get("USER_UUID"), str -> str.get("ENTITY_UUID"))
- .containsExactlyInAnyOrder(tuple(KEY, null, null), tuple(KEY, USER, null), tuple(KEY, USER, ENTITY));
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- createBaseProperties();
- createProperty(KEY, USER, ENTITY);
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select * from properties"))
- .hasSize(3)
- .extracting(str -> str.get("PROP_KEY"), str -> str.get("USER_UUID"), str -> str.get("ENTITY_UUID"))
- .containsExactlyInAnyOrder(tuple(KEY, null, null), tuple(KEY, USER, null), tuple(KEY, USER, ENTITY));
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullableIT.java
deleted file mode 100644
index eab88021c1e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_CREATION_METHOD_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_TABLE_NAME;
-
-class MakeCreationMethodColumnInProjectsNotNullableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MakeCreationMethodColumnInProjectsNotNullable.class);
- private final MakeCreationMethodColumnInProjectsNotNullable underTest = new MakeCreationMethodColumnInProjectsNotNullable(db.database());
-
- @Test
- void user_local_column_is_not_null() throws SQLException {
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME, VARCHAR, null, true);
- underTest.execute();
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME, VARCHAR, null, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME, VARCHAR, null, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME, VARCHAR, null, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTableIT.java
deleted file mode 100644
index 685e8c88147..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTableIT.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_TABLE_NAME;
-
-class PopulateCreationMethodColumnInProjectsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateCreationMethodColumnInProjectsTable.class);
- private final PopulateCreationMethodColumnInProjectsTable underTest = new PopulateCreationMethodColumnInProjectsTable(db.database());
-
- @Test
- void execute_whenProjectsTableIsEmpty_shouldDoNothing() throws SQLException {
- underTest.execute();
-
- assertThat(db.select("select creation_method from projects")).isEmpty();
- }
-
- @Test
- void execute_whenProjectsExist_shouldPopulateCreationMethodColumn() throws SQLException {
- insertProject("uuid-1");
- insertProject("uuid-2");
-
- underTest.execute();
-
- assertThat(db.select("select creation_method from projects"))
- .extracting(stringObjectMap -> stringObjectMap.get("CREATION_METHOD"))
- .containsExactlyInAnyOrder("UNKNOWN", "UNKNOWN");
- }
-
- @Test
- void execute_isReentrant() throws SQLException {
- insertProject("uuid-1");
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select creation_method from projects"))
- .extracting(stringObjectMap -> stringObjectMap.get("CREATION_METHOD"))
- .containsExactlyInAnyOrder("UNKNOWN");
- }
-
- private void insertProject(String uuid) {
- db.executeInsert(PROJECTS_TABLE_NAME,
- "UUID", uuid,
- "KEE", uuid,
- "QUALIFIER", "TRK",
- "PRIVATE", true,
- "UPDATED_AT", 1);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMappingIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMappingIT.java
deleted file mode 100644
index cbfc828e88c..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMappingIT.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.GITHUB_PERMISSIONS_MAPPING_TABLE_NAME;
-
-class PopulateGithubPermissionsMappingIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateGithubPermissionsMapping.class);
- @RegisterExtension
- public final LogTesterJUnit5 logTester = new LogTesterJUnit5();
-
- private final PopulateGithubPermissionsMapping migration = new PopulateGithubPermissionsMapping(db.database(), UuidFactoryFast.getInstance());
-
- @Test
- void execute_whenTableAlreadyPopulated_doesNothing() throws SQLException {
- db.executeInsert(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME,
- "UUID", UuidFactoryFast.getInstance().create(),
- "github_role", "gh_role",
- "sonarqube_permission", "sq_perm");
-
- migration.execute();
-
- assertThat(db.select("select github_role, sonarqube_permission from github_perms_mapping"))
- .extracting(stringObjectMap -> stringObjectMap.get("GITHUB_ROLE"), stringObjectMap -> stringObjectMap.get("SONARQUBE_PERMISSION"))
- .containsExactly(tuple("gh_role", "sq_perm"));
- }
-
- @Test
- void execute_whenTableIsEmpty_shouldPopulate() throws SQLException {
- migration.execute();
-
- verifyMapping();
- }
-
- @Test
- void execute_isReentrant() throws SQLException {
- migration.execute();
- migration.execute();
- migration.execute();
-
- verifyMapping();
- }
-
- private void verifyMapping() {
- assertThat(db.select("select github_role, sonarqube_permission from github_perms_mapping"))
- .extracting(stringObjectMap -> stringObjectMap.get("GITHUB_ROLE"), stringObjectMap -> stringObjectMap.get("SONARQUBE_PERMISSION"))
- .containsExactlyInAnyOrder(
- tuple("read", "codeviewer"),
- tuple("read", "user"),
- tuple("triage", "codeviewer"),
- tuple("triage", "user"),
- tuple("write", "codeviewer"),
- tuple("write", "user"),
- tuple("write", "issueadmin"),
- tuple("write", "securityhotspotadmin"),
- tuple("write", "scan"),
- tuple("maintain", "codeviewer"),
- tuple("maintain", "user"),
- tuple("maintain", "issueadmin"),
- tuple("maintain", "securityhotspotadmin"),
- tuple("maintain", "scan"),
- tuple("admin", "codeviewer"),
- tuple("admin", "user"),
- tuple("admin", "issueadmin"),
- tuple("admin", "securityhotspotadmin"),
- tuple("admin", "scan"),
- tuple("admin", "admin")
- );
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRulesIT.java
deleted file mode 100644
index 8c8a9b24cc1..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRulesIT.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.impl.utils.TestSystem2;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class SetAllowQualityProfileDisableInheritedRulesIT {
-
- private static final long NOW = 1;
-
- @RegisterExtension
- public final MigrationDbTester dbTester = MigrationDbTester.createForMigrationStep(SetAllowQualityProfileDisableInheritedRules.class);
- private final System2 system2 = new TestSystem2().setNow(NOW);
-
- private final SetAllowQualityProfileDisableInheritedRules script = new SetAllowQualityProfileDisableInheritedRules(dbTester.database(), system2, UuidFactoryFast.getInstance());
-
- @Test
- void execute_shouldInsertPropertyWithFalseValue() throws SQLException {
- script.execute();
-
- assertThatForceAuthenticationEquals("false");
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- script.execute();
- // re-entrant
- script.execute();
-
- assertThatForceAuthenticationEquals("false");
- }
-
- @Test
- void execute_shouldNotUpdateTheValueThatAlreadyExistsInTheDatabase() throws SQLException {
- insertPropertyWithValueAsTrue();
- script.execute();
-
- assertThatForceAuthenticationEquals("true");
- }
-
- private void assertThatForceAuthenticationEquals(String s) {
- assertThat(dbTester.selectFirst("select p.text_value from properties p where p.prop_key = 'sonar.qualityProfiles.allowDisableInheritedRules'"))
- .containsEntry("TEXT_VALUE", s);
- }
-
- private void insertPropertyWithValueAsTrue() {
- dbTester.executeInsert("properties",
- "uuid", "uuid-1",
- "prop_key", "sonar.qualityProfiles.allowDisableInheritedRules",
- "is_empty", false,
- "text_value", "true",
- "created_at", NOW);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsersIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsersIT.java
deleted file mode 100644
index 3167af80300..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsersIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-class AddUuidColumnToGroupsUsersIT {
-
- private static final String TABLE_NAME = "groups_users";
- private static final String COLUMN_NAME = "uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddUuidColumnToGroupsUsers.class);
- private final AddUuidColumnToGroupsUsers underTest = new AddUuidColumnToGroupsUsers(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTableIT.java
deleted file mode 100644
index 0b8a956adef..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTableIT.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v104.CreateIssuesFixedTable.COLUMN_ISSUE_KEY;
-import static org.sonar.server.platform.db.migration.version.v104.CreateIssuesFixedTable.COLUMN_PULL_REQUEST_UUID;
-import static org.sonar.server.platform.db.migration.version.v104.CreateIssuesFixedTable.TABLE_NAME;
-
-class CreateIssuesFixedTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIssuesFixedTable.class);
-
- private final DdlChange underTest = new CreateIssuesFixedTable(db.database());
-
- @Test
- void execute_shouldCreateTable() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, COLUMN_PULL_REQUEST_UUID, Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, COLUMN_ISSUE_KEY, Types.VARCHAR, 50, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_issues_fixed", COLUMN_PULL_REQUEST_UUID, COLUMN_ISSUE_KEY);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTableIT.java
deleted file mode 100644
index 4f17ee5579c..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTableIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.CreatePrimaryKeyOnGroupsUsersTable.PK_NAME;
-
-class CreatePrimaryKeyOnGroupsUsersTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreatePrimaryKeyOnGroupsUsersTable.class);
- private final CreatePrimaryKeyOnGroupsUsersTable createIndex = new CreatePrimaryKeyOnGroupsUsersTable(db.database());
-
- @Test
- void execute_whenPrimaryKeyDoesntExist_shouldCreatePrimaryKey() throws SQLException {
- db.assertNoPrimaryKey(GROUPS_USERS_TABLE_NAME);
-
- createIndex.execute();
- db.assertPrimaryKey(GROUPS_USERS_TABLE_NAME, PK_NAME, GROUPS_USERS_UUID_COLUMN_NAME);
- }
-
- @Test
- void execute_whenPrimaryKeyAlreadyExist_shouldKeepThePrimaryKeyAndNotFail() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertPrimaryKey(GROUPS_USERS_TABLE_NAME, PK_NAME, GROUPS_USERS_UUID_COLUMN_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTableIT.java
deleted file mode 100644
index 9085440e27a..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTableIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v104.CreateRuleTagsTable.IS_SYSTEM_TAG_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.CreateRuleTagsTable.RULE_TAGS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.CreateRuleTagsTable.RULE_UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.CreateRuleTagsTable.VALUE_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.CreateRuleTagsTable.VALUE_COLUMN_SIZE;
-
-class CreateRuleTagsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateRuleTagsTable.class);
-
- private final DdlChange createScmAccountsTable = new CreateRuleTagsTable(db.database());
-
- @Test
- void execute_whenRun_shouldCreateRuleTagsTable() throws SQLException {
- db.assertTableDoesNotExist(RULE_TAGS_TABLE_NAME);
-
- createScmAccountsTable.execute();
-
- db.assertTableExists(RULE_TAGS_TABLE_NAME);
- db.assertColumnDefinition(RULE_TAGS_TABLE_NAME, VALUE_COLUMN_NAME, Types.VARCHAR, VALUE_COLUMN_SIZE, false);
- db.assertColumnDefinition(RULE_TAGS_TABLE_NAME, IS_SYSTEM_TAG_COLUMN_NAME, Types.BOOLEAN, null, false);
- db.assertColumnDefinition(RULE_TAGS_TABLE_NAME, RULE_UUID_COLUMN_NAME, Types.VARCHAR, UUID_SIZE, false);
- db.assertPrimaryKey(RULE_TAGS_TABLE_NAME, "pk_rule_tags", VALUE_COLUMN_NAME, RULE_UUID_COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(RULE_TAGS_TABLE_NAME);
-
- createScmAccountsTable.execute();
- // re-entrant
- createScmAccountsTable.execute();
-
- db.assertTableExists(RULE_TAGS_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplicationsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplicationsIT.java
deleted file mode 100644
index 8e141309373..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplicationsIT.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.util.Map;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class DeleteRedundantFailedAlertsForApplicationsIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DeleteRedundantFailedAlertsForApplications.class);
- private final DataChange underTest = new DeleteRedundantFailedAlertsForApplications(db.database());
-
- @BeforeEach
- public void setUp() {
- // cleanup db
- db.executeUpdateSql("truncate table events");
- db.executeUpdateSql("truncate table event_component_changes");
- db.executeUpdateSql("truncate table components");
- }
-
- @Test
- void givenFailedAlertsForApplication_whenExecuted_thenFailedAlertsAreDeleted() throws SQLException {
- // given
- insertComponent("app1", "appUuid1", "appUuid1", "APP");
-
- // event that should be deleted
- insertEvent("eventUuid1", "appUuid1", "Failed", "Alert", "{ stillFailing: false, status: \"ERROR\" }");
- insertEventChanges("eventChangeUuid1", "eventUuid1", "appUuid1");
- insertEventChanges("eventChangeUuid2", "eventUuid1", "appUuid1");
-
- // events that should not be deleted
- insertEvent("eventUuid2", "appUuid1", "Passed", "Alert", "{ stillFailing: false, status: \"ERROR\" }");
- insertEventChanges("eventChangeUuid3", "eventUuid2", "appUuid1");
- insertEvent("eventUuid3", "appUuid1", "Failed", "Alert", "{ stillFailing: false, status: \"PASSED\" }");
- insertEventChanges("eventChangeUuid4", "eventUuid3", "appUuid1");
-
- // when
- underTest.execute();
-
- // then
- assertThat(db.countRowsOfTable("events")).isEqualTo(2);
- assertThat(db.countSql("select count(1) from events where uuid = 'eventUuid1'")).isZero();
-
- assertThat(db.countRowsOfTable("event_component_changes")).isEqualTo(2);
- assertThat(db.countSql("select count(1) from event_component_changes where uuid = 'eventUuid1'")).isZero();
- }
-
- @Test
- void givenFailedAlertsForProject_whenExecute_thenTheEventsAreNotDeleted() throws SQLException {
- // given
- insertComponent("project1", "projectUuid1", "projectUuid1", "TRK");
-
- // event that should not be deleted
- insertEvent("eventUuid1", "projectUuid1", "Failed", "Alert", "{ stillFailing: false, status: \"ERROR\" }");
- insertEventChanges("eventChangeUuid1", "eventUuid1", "projectUuid1");
- insertEventChanges("eventChangeUuid2", "eventUuid1", "projectUuid1");
-
- // when
- underTest.execute();
-
- // then
- assertThat(db.countSql("select count(1) from events where uuid = 'eventUuid1'")).isEqualTo(1);
- assertThat(db.countSql("select count(1) from event_component_changes where event_uuid = 'eventUuid1'")).isEqualTo(2);
- }
-
- @Test
- void givenMigration_whenExecutedMoreThanOnce_thenNoError() throws SQLException {
- // given
- insertComponent("app1", "appUuid1", "appUuid1", "APP");
-
- // event that should be deleted
- insertEvent("eventUuid1", "appUuid1", "Failed", "Alert", "{ stillFailing: false, status: \"ERROR\" }");
- insertEventChanges("eventChangeUuid1", "eventUuid1", "appUuid1");
- insertEventChanges("eventChangeUuid2", "eventUuid1", "appUuid1");
-
- // when
- underTest.execute();
- underTest.execute();
-
- // then
- assertThat(db.countSql("select count(1) from events where uuid = 'eventUuid1'")).isZero();
- assertThat(db.countSql("select count(1) from event_component_changes where uuid = 'eventUuid1'")).isZero();
- }
-
- private void insertComponent(String key, String uuid, String branchUuid, String qualifier) {
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("KEE", key),
- Map.entry("BRANCH_UUID", branchUuid),
- Map.entry("UUID_PATH", "." + uuid + "."),
- Map.entry("QUALIFIER", qualifier),
- Map.entry("ENABLED", true),
- Map.entry("PRIVATE", true)
- );
-
- db.executeInsert("components", map);
- }
-
- private void insertEvent(String uuid, String componentUuid, String name, String category, String eventData) {
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("NAME", name),
- Map.entry("ANALYSIS_UUID", "analysisUuid"),
- Map.entry("CATEGORY", category),
- Map.entry("CREATED_AT", 1_500_000_000_000L),
- Map.entry("EVENT_DATE", 1_500_000_000_000L),
- Map.entry("COMPONENT_UUID", componentUuid),
- Map.entry("EVENT_DATA", eventData)
- );
-
- db.executeInsert("events", map);
- }
-
- private void insertEventChanges(String uuid, String eventUuid, String componentUuid) {
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("EVENT_UUID", eventUuid),
- Map.entry("EVENT_COMPONENT_UUID", componentUuid),
- Map.entry("EVENT_ANALYSIS_UUID", "analysisUuid"),
- Map.entry("CHANGE_CATEGORY", "FAILED_QG"),
- Map.entry("COMPONENT_UUID", uuid),
- Map.entry("COMPONENT_KEY", "app"),
- Map.entry("COMPONENT_NAME", "app"),
- Map.entry("COMPONENT_BRANCH_KEY", 1_500_000_000_000L),
- Map.entry("CREATED_AT", 1_500_000_000_000L)
- );
-
- db.executeInsert("event_component_changes", map);
- }
-
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRulesIT.java
deleted file mode 100644
index cb2da4c5f24..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRulesIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropSystemTagsInRulesIT {
- private static final String TABLE_NAME = "rules";
- private static final String COLUMN_NAME = "system_tags";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropSystemTagsInRules.class);
- private final DdlChange underTest = new DropSystemTagsInRules(db.database());
-
- @Test
- void executed_whenRun_shouldDropSystemTagsColumn() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 4000, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 4000, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRulesIT.java
deleted file mode 100644
index f19c47c1302..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRulesIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropTagsInRulesIT {
- static final String TABLE_NAME = "rules";
- static final String COLUMN_NAME = "tags";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropTagsInRules.class);
- private final DdlChange underTest = new DropTagsInRules(db.database());
-
- @Test
- void executed_whenRun_shouldDropTagsColumn() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 4000, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void execute_whenExecutedMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 4000, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullableIT.java
deleted file mode 100644
index fe60acbfbf9..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullableIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_UUID_COLUMN_NAME;
-
-class MakeUuidInGroupsUsersNotNullableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep( MakeUuidInGroupsUsersNotNullable.class);
- private final MakeUuidInGroupsUsersNotNullable underTest = new MakeUuidInGroupsUsersNotNullable(db.database());
-
- @Test
- void execute_whenUuidColumnIsNullable_shouldMakeItNonNullable() throws SQLException {
- db.assertColumnDefinition(GROUPS_USERS_TABLE_NAME, GROUPS_USERS_UUID_COLUMN_NAME, VARCHAR, null, true);
- underTest.execute();
- db.assertColumnDefinition(GROUPS_USERS_TABLE_NAME, GROUPS_USERS_UUID_COLUMN_NAME, VARCHAR, null, false);
- }
-
- @Test
- void execute_whenUuidColumnIsNullable_shouldKeepItNullableAndNotFail() throws SQLException {
- db.assertColumnDefinition(GROUPS_USERS_TABLE_NAME, GROUPS_USERS_UUID_COLUMN_NAME, VARCHAR, null, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(GROUPS_USERS_TABLE_NAME, GROUPS_USERS_UUID_COLUMN_NAME, VARCHAR, null, false);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuidIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuidIT.java
deleted file mode 100644
index bc01c870478..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuidIT.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-import org.assertj.core.groups.Tuple;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactoryFast;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class PopulateGroupsUsersUuidIT {
-
- private static final String GROUPS_USERS_TABLE_NAME = "groups_users";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateGroupsUsersUuid.class);
-
- private final PopulateGroupsUsersUuid migration = new PopulateGroupsUsersUuid(db.database(), UuidFactoryFast.getInstance());
-
- @Test
- void execute_whenTableIsEmpty_shouldPopulate() throws SQLException {
- insertRowsWithoutUuid();
-
- migration.execute();
-
- verifyUuidPresentAndUnique();
- }
-
-
-
- @Test
- void execute_isReentrant() throws SQLException {
- insertRowsWithoutUuid();
- migration.execute();
- List<Tuple> existingUuids = getExistingUuids();
-
- migration.execute();
- verifyUuidsNotChanged(existingUuids);
-
- migration.execute();
- verifyUuidsNotChanged(existingUuids);
- }
-
- private void insertRowsWithoutUuid() {
- db.executeInsert(GROUPS_USERS_TABLE_NAME,
- "uuid", null,
- "group_uuid", "group1_uuid",
- "user_uuid", "user1_uuid");
-
- db.executeInsert(GROUPS_USERS_TABLE_NAME,
- "uuid", null,
- "group_uuid", "group2_uuid",
- "user_uuid", "user2_uuid");
-
- db.executeInsert(GROUPS_USERS_TABLE_NAME,
- "uuid", null,
- "group_uuid", "group3_uuid",
- "user_uuid", "user3_uuid");
- }
-
- private void verifyUuidPresentAndUnique() {
- List<Map<String, Object>> rows = db.select("select uuid, group_uuid, user_uuid from groups_users");
- rows
- .forEach(stringObjectMap -> assertThat(stringObjectMap.get("UUID")).isNotNull());
- long uniqueCount = rows.stream().map(row -> row.get("UUID")).distinct().count();
- assertThat(uniqueCount).isEqualTo(rows.size());
-
- }
-
- private List<Tuple> getExistingUuids() {
- return db.select("select uuid, group_uuid, user_uuid from groups_users")
- .stream()
- .map(stringObjectMap -> tuple(stringObjectMap.get("UUID"), stringObjectMap.get("GROUP_UUID"), stringObjectMap.get("USER_UUID")))
- .toList();
- }
-
- private void verifyUuidsNotChanged(List<Tuple> existingUuids) {
- assertThat(db.select("select uuid, group_uuid, user_uuid from groups_users"))
- .extracting(stringObjectMap -> tuple(stringObjectMap.get("UUID"), stringObjectMap.get("GROUP_UUID"), stringObjectMap.get("USER_UUID")))
- .containsExactlyInAnyOrderElementsOf(existingUuids);
- }
-
-
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTableIT.java
deleted file mode 100644
index f57865659a9..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTableIT.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import javax.annotation.Nullable;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class PopulateRuleTagsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateRuleTagsTable.class);
-
- private final PopulateRuleTagsTable migration = new PopulateRuleTagsTable(db.database());
-
- @Test
- void execute_whenTagsExist_shouldPopulateProperly() throws SQLException {
- insertRule("uuid-1", null, "tag_1,tag_2");
- insertRule("uuid-2", "systag_1,systag_2", null);
- insertRule("uuid-3", "systag_3,systag_4", "tag_3,tag_4");
-
- migration.execute();
-
- assertThat(db.select("select value, is_system_tag, rule_uuid from rule_tags"))
- .extracting(t -> t.get("value"), t -> t.get("is_system_tag"), t -> t.get("rule_uuid"))
- .containsExactlyInAnyOrder(
- tuple("systag_1", true, "uuid-2"),
- tuple("systag_2", true, "uuid-2"),
- tuple("tag_1", false, "uuid-1"),
- tuple("tag_2", false, "uuid-1"),
- tuple("systag_3", true, "uuid-3"),
- tuple("systag_4", true, "uuid-3"),
- tuple("tag_3", false, "uuid-3"),
- tuple("tag_4", false, "uuid-3")
- );
- }
-
- @Test
- void execute_whenEmptyOrDuplicateTagsExist_shouldNotBeMigrated() throws SQLException {
- insertRule("uuid-1", null, "tag_1,,tag_2");
- insertRule("uuid-2", "systag_1,,systag_2,systag_2,", null);
-
- migration.execute();
-
- assertThat(db.select("select value, is_system_tag, rule_uuid from rule_tags"))
- .extracting(t -> t.get("value"), t -> t.get("is_system_tag"), t -> t.get("rule_uuid"))
- .containsExactlyInAnyOrder(
- tuple("systag_1", true, "uuid-2"),
- tuple("systag_2", true, "uuid-2"),
- tuple("tag_1", false, "uuid-1"),
- tuple("tag_2", false, "uuid-1")
- );
- }
-
- @Test
- void execute_whenSystemAndCustomTagShareTheSameTag_removeDuplicates() throws SQLException {
- insertRule("uuid-1", "test,other1", "test,other2");
-
- migration.execute();
-
- assertThat(db.select("select value, is_system_tag, rule_uuid from rule_tags"))
- .extracting(t -> t.get("value"), t -> t.get("is_system_tag"), t -> t.get("rule_uuid"))
- .containsExactlyInAnyOrder(
- tuple("test", true, "uuid-1"),
- tuple("other1", true, "uuid-1"),
- tuple("other2", false, "uuid-1")
- );
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- insertRule("uuid-3", "sys_tag", "tag");
- migration.execute();
- migration.execute();
- migration.execute();
- verifyMapping();
- }
-
- private void verifyMapping() {
- assertThat(db.select("select value, is_system_tag, rule_uuid from rule_tags"))
- .extracting(t -> t.get("value"), t -> t.get("is_system_tag"), t -> t.get("rule_uuid"))
- .containsExactlyInAnyOrder(
- tuple("sys_tag", true, "uuid-3"),
- tuple("tag", false, "uuid-3")
- );
- }
-
- private void insertRule(String uuid, @Nullable String systemTags, @Nullable String tags) {
- db.executeInsert("rules",
- "UUID", uuid,
- "PLUGIN_RULE_KEY", uuid,
- "PLUGIN_NAME", uuid,
- "SCOPE", "1",
- "IS_TEMPLATE", false,
- "IS_AD_HOC", false,
- "SYSTEM_TAGS", systemTags,
- "TAGS", tags,
- "IS_EXTERNAL", false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRulesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRulesIT.java
deleted file mode 100644
index d3d7e415472..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRulesIT.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class RemoveCleanCodeAttributeFromCustomHotspotRulesIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RemoveCleanCodeAttributeFromCustomHotspotRules.class);
- private final RemoveCleanCodeAttributeFromCustomHotspotRules underTest = new RemoveCleanCodeAttributeFromCustomHotspotRules(db.database());
-
- @Test
- void execute_whenRulesTableIsEmpty_shouldDoNothing() throws SQLException {
- underTest.execute();
-
- assertThat(db.select("select clean_code_attribute from rules")).isEmpty();
- }
-
- @Test
- void execute_whenCustomHotspotRuleExist_shouldRemoveCleanCodeAttributeOnlyFromHotspot() throws SQLException {
- insertRule("custom_hotspot_rule", 4, "CONVENTIONAL");
- insertRule("other_rule", 1, "ETHICAL");
-
- underTest.execute();
-
- List<Map<String, Object>> selectResult = db.select("select name, clean_code_attribute, updated_at from rules");
-
- assertThat(selectResult)
- .extracting(stringObjectMap -> stringObjectMap.get("name"), stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsExactlyInAnyOrder(tuple("custom_hotspot_rule", null), tuple("other_rule", "ETHICAL"));
-
- Optional<Object> updatedAtForHotspotRule = selectResult.stream().filter(map -> map.containsValue("custom_hotspot_rule"))
- .map(map -> map.get("updated_at")).findFirst();
- assertThat(updatedAtForHotspotRule.get()).isNotEqualTo(0L);
-
- Optional<Object> updatedAtForOtherRule = selectResult.stream().filter(map -> map.containsValue("other_rule"))
- .map(map -> map.get("updated_at")).findFirst();
- assertThat(updatedAtForOtherRule).contains(0L);
- }
-
- @Test
- void execute_whenCustomHotspotRuleExist_isReentrant() throws SQLException {
- insertRule("custom_hotspot_rule", 4, "CONVENTIONAL");
- insertRule("other_rule", 1, "ETHICAL");
-
- underTest.execute();
- underTest.execute();
-
- List<Map<String, Object>> selectResult = db.select("select name, clean_code_attribute from rules");
-
- assertThat(selectResult)
- .extracting(stringObjectMap -> stringObjectMap.get("name"), stringObjectMap -> stringObjectMap.get("clean_code_attribute"))
- .containsExactlyInAnyOrder(tuple("custom_hotspot_rule", null), tuple("other_rule", "ETHICAL"));
- }
-
- private void insertRule(String name, int ruleType, String cleanCodeAttribute) {
- db.executeInsert("rules",
- "PLUGIN_RULE_KEY", name,
- "PLUGIN_NAME", name,
- "SCOPE", name,
- "NAME", name,
- "IS_EXTERNAL", true,
- "IS_AD_HOC", false,
- "UUID", name,
- "RULE_TYPE", ruleType,
- "UPDATED_AT", 0L,
- "CLEAN_CODE_ATTRIBUTE", cleanCodeAttribute);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetricIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetricIT.java
deleted file mode 100644
index 8ddb78496e1..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetricIT.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-
-class RenameWontFixIssuesMetricIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameWontFixIssuesMetric.class);
- private final RenameWontFixIssuesMetric underTest = new RenameWontFixIssuesMetric(db.database());
-
- @Test
- void execute_whenMetricsTableIsEmpty_shouldDoNothing() throws SQLException {
- underTest.execute();
-
- assertThat(db.select("select name from metrics")).isEmpty();
- }
-
- @Test
- void execute_whenWontFixMetricExist_shouldRenameToAccepted() throws SQLException {
- insertMetric("wont_fix_issues");
- insertMetric("other_metric");
-
- underTest.execute();
-
- assertThat(db.select("select name from metrics"))
- .extracting(stringObjectMap -> stringObjectMap.get("NAME"))
- .containsExactlyInAnyOrder("accepted_issues", "other_metric");
- }
-
- @Test
- void execute_isReentrant() throws SQLException {
- insertMetric("wont_fix_issues");
- insertMetric("other_metric");
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.select("select name from metrics"))
- .extracting(stringObjectMap -> stringObjectMap.get("NAME"))
- .containsExactlyInAnyOrder("accepted_issues", "other_metric");
- }
-
- private void insertMetric(String name) {
- db.executeInsert("metrics",
- "NAME", name,
- "DESCRIPTION", "description " + name,
- "DIRECTION", -1,
- "DOMAIN", "Issues",
- "SHORT_NAME", name,
- "QUALITATIVE", true,
- "VAL_TYPE", "int",
- "ENABLED", true,
- "OPTIMIZED_BEST_VALUE", true,
- "HIDDEN", false,
- "DELETE_HISTORICAL_DATA", false,
- "UUID", name);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTableIT.java
deleted file mode 100644
index 14b5f1ab0f7..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTableIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnIssuesImpactsTable.ISSUE_KEY_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnIssuesImpactsTable.PK_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnIssuesImpactsTable.SOFTWARE_QUALITY_COLUMN;
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnIssuesImpactsTable.TABLE_NAME;
-
-class CreatePrimaryKeyOnIssuesImpactsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreatePrimaryKeyOnIssuesImpactsTable.class);
-
- private final CreatePrimaryKeyOnIssuesImpactsTable createIndex = new CreatePrimaryKeyOnIssuesImpactsTable(db.database());
-
- @Test
- void execute_whenPrimaryKeyDoesntExist_shouldCreatePrimaryKey() throws SQLException {
- db.assertNoPrimaryKey(TABLE_NAME);
-
- createIndex.execute();
- db.assertPrimaryKey(TABLE_NAME, PK_NAME, ISSUE_KEY_COLUMN_NAME, SOFTWARE_QUALITY_COLUMN);
- }
-
- @Test
- void execute_whenPrimaryKeyAlreadyExist_shouldKeepThePrimaryKeyAndNotFail() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertPrimaryKey(TABLE_NAME, PK_NAME, ISSUE_KEY_COLUMN_NAME, SOFTWARE_QUALITY_COLUMN);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTableIT.java
deleted file mode 100644
index 6f208062da2..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTableIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnRulesDefaultImpactsTable.PK_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnRulesDefaultImpactsTable.RULE_UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnRulesDefaultImpactsTable.SOFTWARE_QUALITY_COLUMN;
-import static org.sonar.server.platform.db.migration.version.v105.CreatePrimaryKeyOnRulesDefaultImpactsTable.TABLE_NAME;
-
-class CreatePrimaryKeyOnRulesDefaultImpactsTableIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreatePrimaryKeyOnRulesDefaultImpactsTable.class);
-
- private final CreatePrimaryKeyOnRulesDefaultImpactsTable createIndex = new CreatePrimaryKeyOnRulesDefaultImpactsTable(db.database());
-
- @Test
- void execute_whenPrimaryKeyDoesntExist_shouldCreatePrimaryKey() throws SQLException {
- db.assertNoPrimaryKey(TABLE_NAME);
-
- createIndex.execute();
- db.assertPrimaryKey(TABLE_NAME, PK_NAME, RULE_UUID_COLUMN_NAME, SOFTWARE_QUALITY_COLUMN);
- }
-
- @Test
- void execute_whenPrimaryKeyAlreadyExist_shouldKeepThePrimaryKeyAndNotFail() throws SQLException {
- createIndex.execute();
- createIndex.execute();
-
- db.assertPrimaryKey(TABLE_NAME, PK_NAME, RULE_UUID_COLUMN_NAME, SOFTWARE_QUALITY_COLUMN);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySetIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySetIT.java
deleted file mode 100644
index 1a8d44fb80d..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySetIT.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-class DeleteLanguageSpecificParametersPropertySetIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DeleteLanguageSpecificParametersPropertySet.class);
- private final DataChange underTest = new DeleteLanguageSpecificParametersPropertySet(db.database());
-
- @Test
- void migration_should_remove_root_property_and_children() throws SQLException {
- insertLanguageSpecificParametersPropertySet(db);
-
- underTest.execute();
-
- Assertions.assertThat(db.select("select * from properties")).isEmpty();
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- insertLanguageSpecificParametersPropertySet(db);
-
- underTest.execute();
- underTest.execute();
-
- Assertions.assertThat(db.select("select * from properties")).isEmpty();
- }
-
- private void insertLanguageSpecificParametersPropertySet(MigrationDbTester db) {
- db.executeInsert("properties ",
- "prop_key", "languageSpecificParameters",
- "is_empty", false,
- "text_value", "0,1",
- "created_at", 100_000L,
- "uuid", "some-random-uuid1");
- db.executeInsert("properties ",
- "prop_key", "languageSpecificParameters.0.language",
- "is_empty", false,
- "text_value", "java",
- "created_at", 100_000L,
- "uuid", "some-random-uuid2");
- db.executeInsert("properties ",
- "prop_key", "languageSpecificParameters.0.man_days",
- "is_empty", false,
- "text_value", "10",
- "created_at", 100_000L,
- "uuid", "some-random-uuid3");
- db.executeInsert("properties ",
- "prop_key", "languageSpecificParameters.1.language",
- "is_empty", false,
- "text_value", "php",
- "created_at", 100_000L,
- "uuid", "some-random-uuid4");
- db.executeInsert("properties ",
- "prop_key", "languageSpecificParameters.1.man_days",
- "is_empty", false,
- "text_value", "20",
- "created_at", 100_000L,
- "uuid", "some-random-uuid5");
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTableIT.java
deleted file mode 100644
index 11ae8577308..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTableIT.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v105.DropPrimaryKeyConstraintInIssuesImpactsTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.DropPrimaryKeyConstraintInIssuesImpactsTable.CONSTRAINT_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.DropPrimaryKeyConstraintInIssuesImpactsTable.TABLE_NAME;
-
-class DropPrimaryKeyConstraintInIssuesImpactsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropPrimaryKeyConstraintInIssuesImpactsTable.class);
-
- private final DbPrimaryKeyConstraintFinder dbPrimaryKeyConstraintFinder = new DbPrimaryKeyConstraintFinder(db.database());
- private final DdlChange underTest = new DropPrimaryKeyConstraintInIssuesImpactsTable(db.database(),
- new DropPrimaryKeySqlGenerator(db.database(), dbPrimaryKeyConstraintFinder), dbPrimaryKeyConstraintFinder);
-
- @Test
- void execute_shouldRemoveExistingPrimaryKey() throws SQLException {
- db.assertPrimaryKey(TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertNoPrimaryKey(TABLE_NAME);
- }
-
- @Test
- void execute_when_reentrant_shouldRemoveExistingPrimaryKey() throws SQLException {
- db.assertPrimaryKey(TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertNoPrimaryKey(TABLE_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTableIT.java
deleted file mode 100644
index 40d99c3efdc..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTableIT.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v105.DropPrimaryKeyConstraintInRulesDefaultImpactsTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.DropPrimaryKeyConstraintInRulesDefaultImpactsTable.CONSTRAINT_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.DropPrimaryKeyConstraintInRulesDefaultImpactsTable.TABLE_NAME;
-
-class DropPrimaryKeyConstraintInRulesDefaultImpactsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropPrimaryKeyConstraintInRulesDefaultImpactsTable.class);
-
- private final DbPrimaryKeyConstraintFinder dbPrimaryKeyConstraintFinder = new DbPrimaryKeyConstraintFinder(db.database());
- private final DdlChange underTest = new DropPrimaryKeyConstraintInRulesDefaultImpactsTable(db.database(),
- new DropPrimaryKeySqlGenerator(db.database(), dbPrimaryKeyConstraintFinder), dbPrimaryKeyConstraintFinder);
-
- @Test
- void execute_shouldRemoveExistingPrimaryKey() throws SQLException {
- db.assertPrimaryKey(TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertNoPrimaryKey(TABLE_NAME);
- }
-
- @Test
- void execute_when_reentrant_shouldRemoveExistingPrimaryKey() throws SQLException {
- db.assertPrimaryKey(TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertNoPrimaryKey(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTableIT.java
deleted file mode 100644
index 3ba5f31b7cc..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTableIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v105.DropUuidColumnInIssuesImpactsTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v105.DropUuidColumnInIssuesImpactsTable.TABLE_NAME;
-
-class DropUuidColumnInIssuesImpactsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropUuidColumnInIssuesImpactsTable.class);
- private final DdlChange underTest = new DropUuidColumnInIssuesImpactsTable(db.database());
-
- @Test
- void executed_whenRun_shouldDropSystemTagsColumn() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, false);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTableIT.java
deleted file mode 100644
index 73d57722d9e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTableIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropUuidColumnInRulesDefaultImpactsTableIT {
- private static final String TABLE_NAME = "issues_impacts";
- private static final String COLUMN_NAME = "uuid";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropUuidColumnInIssuesImpactsTable.class);
- private final DdlChange underTest = new DropUuidColumnInIssuesImpactsTable(db.database());
-
- @Test
- void executed_whenRun_shouldDropSystemTagsColumn() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, false);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.VARCHAR, 40, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTableIT.java
deleted file mode 100644
index 401848cc8e5..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v106.AddPrioritizedRuleColumnToActiveRulesTable.ACTIVE_RULES_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v106.AddPrioritizedRuleColumnToActiveRulesTable.PRIORITIZED_RULE_COLUMN_NAME;
-
-class AddPrioritizedRuleColumnToActiveRulesTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddPrioritizedRuleColumnToActiveRulesTable.class);
- private final AddPrioritizedRuleColumnToActiveRulesTable underTest = new AddPrioritizedRuleColumnToActiveRulesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(ACTIVE_RULES_TABLE_NAME, PRIORITIZED_RULE_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(ACTIVE_RULES_TABLE_NAME, PRIORITIZED_RULE_COLUMN_NAME, Types.BOOLEAN, null, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTableIT.java
deleted file mode 100644
index 6e26fef4bf3..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTableIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v106.AddPrioritizedRuleColumnToIssuesTable.PRIORITIZED_RULE_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v106.AddPrioritizedRuleColumnToIssuesTable.ISSUES_TABLE_NAME;
-
-
-class AddPrioritizedRuleColumnToIssuesTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddPrioritizedRuleColumnToIssuesTable.class);
- private final AddPrioritizedRuleColumnToIssuesTable underTest = new AddPrioritizedRuleColumnToIssuesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(ISSUES_TABLE_NAME, PRIORITIZED_RULE_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(ISSUES_TABLE_NAME, PRIORITIZED_RULE_COLUMN_NAME, Types.BOOLEAN, null, true);
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT.java
deleted file mode 100644
index 04cb0373153..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.CoreDbTester;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.version.v104.CreateRuleTagsTable;
-
-class ResizeValueColumnInRuleTagsTableIT {
-
- private static final String EXPECTED_TABLE_NAME = "rule_tags";
- private static final String EXPECTED_COLUMN_NAME = "value";
-
- /**
- * This is database that has run the new version of the {@link CreateRuleTagsTable} migration with the 400 limit of the value column.
- */
- @RegisterExtension
- public final MigrationDbTester dbWith400LimitOnValueColumn = MigrationDbTester.createForMigrationStep(ResizeValueColumnInRuleTagsTable.class);
-
- /**
- * This is the database that has run the old version of the {@link CreateRuleTagsTable} migration with the 40 limit of the value column.
- */
- @RegisterExtension
- public final CoreDbTester dbWith40LimitOnValueColumn = CoreDbTester.createForSchema(ResizeValueColumnInRuleTagsTableIT.class, "schema.sql");
-
- private final ResizeValueColumnInRuleTagsTable underTestNoAction = new ResizeValueColumnInRuleTagsTable(dbWith400LimitOnValueColumn.database());
- private final ResizeValueColumnInRuleTagsTable underTestThatFixesColumnSize = new ResizeValueColumnInRuleTagsTable(dbWith40LimitOnValueColumn.database());
-
- @Test
- void execute_whenColumnIsNotResized_shouldResizeTheColumn() throws SQLException {
- dbWith40LimitOnValueColumn.assertColumnDefinition(EXPECTED_TABLE_NAME, EXPECTED_COLUMN_NAME, Types.VARCHAR, 40, false);
- underTestThatFixesColumnSize.execute();
- dbWith40LimitOnValueColumn.assertColumnDefinition(EXPECTED_TABLE_NAME, EXPECTED_COLUMN_NAME, Types.VARCHAR, 400, false);
- }
-
- @Test
- void execute_whenColumnIsAlreadyResized_shouldDoNothing() throws SQLException {
- dbWith400LimitOnValueColumn.assertColumnDefinition(EXPECTED_TABLE_NAME, EXPECTED_COLUMN_NAME, Types.VARCHAR, 400, false);
- underTestNoAction.execute();
- dbWith400LimitOnValueColumn.assertColumnDefinition(EXPECTED_TABLE_NAME, EXPECTED_COLUMN_NAME, Types.VARCHAR, 400, false);
- }
-
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTableIT.java
deleted file mode 100644
index 9139b434319..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTableIT.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v107.AddAiCodeAssuranceColumnInProjectsTable.AI_CODE_ASSURANCE;
-import static org.sonar.server.platform.db.migration.version.v107.AddAiCodeAssuranceColumnInProjectsTable.DEFAULT_COLUMN_VALUE;
-import static org.sonar.server.platform.db.migration.version.v107.AddAiCodeAssuranceColumnInProjectsTable.PROJECTS_TABLE_NAME;
-
-class AddAiCodeAssuranceColumnInProjectsTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddAiCodeAssuranceColumnInProjectsTable.class);
-
- private final AddAiCodeAssuranceColumnInProjectsTable underTest = new AddAiCodeAssuranceColumnInProjectsTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(PROJECTS_TABLE_NAME, AI_CODE_ASSURANCE);
- underTest.execute();
- assertColumnExists();
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertColumnExists();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
- @Test
- void execute_whenDataAlreadyExists_shouldCreateColumnWithDefaultValue() throws SQLException {
- db.executeInsert(PROJECTS_TABLE_NAME,
- "UUID", "uuid",
- "KEE", "uuid",
- "QUALIFIER", "TRK",
- "PRIVATE", true,
- "UPDATED_AT", 1,
- "CREATION_METHOD", "UI");
-
- underTest.execute();
- assertAiCodeAssuranceColumnSetToDefault();
- assertColumnExists();
- }
-
- private void assertAiCodeAssuranceColumnSetToDefault() {
- Map<String, Object> selectResult = db.selectFirst("select ai_code_assurance from projects where uuid = 'uuid'");
- assertThat(selectResult).containsEntry(AI_CODE_ASSURANCE, DEFAULT_COLUMN_VALUE);
- }
-
- private void assertColumnExists() {
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, AI_CODE_ASSURANCE, BOOLEAN, null, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMappingIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMappingIT.java
deleted file mode 100644
index f2e21319c6e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMappingIT.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.v107.AddDevopsPlatformColumnInDevopsPermsMapping.DEVOPS_PLATFORM_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.AddDevopsPlatformColumnInDevopsPermsMapping.DEFAULT_COLUMN_VALUE;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-class AddDevopsPlatformColumnInDevopsPermsMappingIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddDevopsPlatformColumnInDevopsPermsMapping.class);
-
- private final AddDevopsPlatformColumnInDevopsPermsMapping underTest = new AddDevopsPlatformColumnInDevopsPermsMapping(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, DEVOPS_PLATFORM_COLUMN_NAME);
- underTest.execute();
- assertColumnExists();
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertColumnExists();
- underTest.execute();
- }
-
- @Test
- void execute_whenDataAlreadyExists_shouldCreateColumnWithDefaultValue() throws SQLException {
- db.executeInsert(DEVOPS_PERMS_MAPPING_TABLE_NAME, "uuid", "UUID", "devops_platform_role", "uniqAdmin", "sonarqube_permission", "uniqPermission");
- underTest.execute();
- assertDevopsPlatformColumnSetToDefault();
- assertColumnExists();
- }
-
- private void assertDevopsPlatformColumnSetToDefault() {
- Map<String, Object> selectResult = db.selectFirst("select devops_platform from devops_perms_mapping where uuid = 'UUID'");
- assertThat(selectResult).containsEntry("devops_platform", DEFAULT_COLUMN_VALUE);
- }
-
- private void assertColumnExists() {
- db.assertColumnDefinition(DEVOPS_PERMS_MAPPING_TABLE_NAME, DEVOPS_PLATFORM_COLUMN_NAME, VARCHAR, 40, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabledIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabledIT.java
deleted file mode 100644
index e2cc100e655..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabledIT.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.slf4j.event.Level;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.v107.AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.PROP_KEY;
-import static org.sonar.server.platform.db.migration.version.v107.AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.PROVISIONING_GITLAB_ENABLED_PROP_KEY;
-
-class AddUserConsentRequiredIfGitlabAutoProvisioningEnabledIT {
- @RegisterExtension
- public final LogTesterJUnit5 logger = new LogTesterJUnit5();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.class);
- private final DataChange underTest = new AddUserConsentRequiredIfGitlabAutoProvisioningEnabled(db.database(), new System2(), UuidFactoryImpl.INSTANCE);
-
- @BeforeEach
- public void before() {
- logger.clear();
- }
-
- @Test
- void migration_whenGitlabAutoProvisioningPropertyNotPresent_shouldNotRequireConsent() throws SQLException {
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).isEmpty();
- assertThat(isConsentRequired()).isFalse();
- }
-
- @Test
- void migration_whenGitlabAutoProvisioningDisabled_shouldNotRequireConsent() throws SQLException {
- disableGitlabProvisioning();
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).isEmpty();
- assertThat(isConsentRequired()).isFalse();
- }
-
- @Test
- void migration_whenGitlabAutoProvisioningEnabled_shouldRequireConsent() throws SQLException {
- enableGitlabProvisioning();
-
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).containsExactly("Automatic synchronization was previously activated for Gitlab. It requires user consent to continue working as new"
- + " features were added with the synchronization. Please read the upgrade notes.");
- assertThat(isConsentRequired()).isTrue();
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- enableGitlabProvisioning();
-
- underTest.execute();
- underTest.execute();
-
- assertThat(logger.logs(Level.WARN)).containsExactly("Automatic synchronization was previously activated for Gitlab. It requires user consent to continue working as new"
- + " features were added with the synchronization. Please read the upgrade notes.");
- assertThat(isConsentRequired()).isTrue();
- }
-
- private void disableGitlabProvisioning() {
- toggleGitlabProvisioning(false);
- }
- private void enableGitlabProvisioning() {
- toggleGitlabProvisioning(true);
- }
-
- private boolean isConsentRequired() {
- return db.countSql("select count(*) from properties where prop_key = '" + PROP_KEY + "'") >= 1;
- }
-
- private void toggleGitlabProvisioning(boolean enabled) {
- db.executeInsert("properties", "prop_key", PROVISIONING_GITLAB_ENABLED_PROP_KEY, "text_value", String.valueOf(enabled), "is_empty", true, "created_at", 0, "uuid", "uuid");
- }
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTableIT.java
deleted file mode 100644
index 1c985989678..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTableIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.db.MigrationDbTester.createForMigrationStep;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.DESCRIPTION_SECTION_KEY_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-class CreateCveCweTableIT {
-
- private static final String TABLE_NAME = "cve_cwe";
-
- @RegisterExtension
- public final MigrationDbTester db = createForMigrationStep(CreateCveCweTable.class);
-
- private final DdlChange createCveCweTable = new CreateCveCweTable(db.database());
-
- @Test
- void execute_shouldCreateTable() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createCveCweTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "cve_uuid", VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "cwe", VARCHAR, DESCRIPTION_SECTION_KEY_SIZE, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_cve_cwe", "cve_uuid", "cwe");
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
- createCveCweTable.execute();
-
- createCveCweTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTableIT.java
deleted file mode 100644
index 54ed9aa5611..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTableIT.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static java.sql.Types.BIGINT;
-import static java.sql.Types.VARCHAR;
-import static org.sonar.db.MigrationDbTester.createForMigrationStep;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.DESCRIPTION_SECTION_KEY_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-class CreateCvesTableIT {
-
- private static final String TABLE_NAME = "cves";
-
- @RegisterExtension
- public final MigrationDbTester db = createForMigrationStep(CreateCvesTable.class);
-
- private final DdlChange createCvesTable = new CreateCvesTable(db.database());
-
- @Test
- void execute_shouldCreateTable() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createCvesTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "uuid", VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "id", VARCHAR, DESCRIPTION_SECTION_KEY_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "description", VARCHAR, MAX_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "cvss_score", Types.DOUBLE, null, true);
- db.assertColumnDefinition(TABLE_NAME, "epss_score", Types.DOUBLE, null, true);
- db.assertColumnDefinition(TABLE_NAME, "epss_percentile", Types.DOUBLE, null, true);
- db.assertColumnDefinition(TABLE_NAME, "published_at", BIGINT, null, false);
- db.assertColumnDefinition(TABLE_NAME, "last_modified_at", BIGINT, null, false);
- db.assertColumnDefinition(TABLE_NAME, "created_at", BIGINT, null, false);
- db.assertColumnDefinition(TABLE_NAME, "updated_at", BIGINT, null, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_cves", "uuid");
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
- createCvesTable.execute();
-
- createCvesTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTableIT.java
deleted file mode 100644
index e8ef6b79c97..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTableIT.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.db.MigrationDbTester.createForMigrationStep;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-class CreateIssuesDependencyTableIT {
-
- private static final String TABLE_NAME = "issues_dependency";
-
- @RegisterExtension
- public final MigrationDbTester db = createForMigrationStep(CreateIssuesDependencyTable.class);
-
- private final DdlChange createIssuesDependencyTable = new CreateIssuesDependencyTable(db.database());
-
- @Test
- void execute_shouldCreateTable() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- createIssuesDependencyTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertColumnDefinition(TABLE_NAME, "issue_uuid", VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "cve_uuid", VARCHAR, UUID_SIZE, false);
- db.assertPrimaryKey(TABLE_NAME, "pk_issues_dependency", "issue_uuid");
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
- createIssuesDependencyTable.execute();
-
- createIssuesDependencyTable.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTableIT.java
deleted file mode 100644
index ffce4c1536f..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v107.CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-class CreatePrimaryKeyConstraintOnDevopsPermsMappingTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.class);
- private final CreatePrimaryKeyConstraintOnDevopsPermsMappingTable underTest = new CreatePrimaryKeyConstraintOnDevopsPermsMappingTable(db.database());
- private static final String PK_DEVOPS_PERMS_MAPPING = "pk_devops_perms_mapping";
-
- @Test
- void execute_whenPrimaryKeyDoesNotExist_shouldCreateIt() throws Exception {
- db.assertNoPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- underTest.execute();
- db.assertPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME, PK_DEVOPS_PERMS_MAPPING, UUID_COLUMN_NAME);
- }
-
- @Test
- void execute_whenPrimaryKeyAlreadyExists_shouldDoNothing() throws Exception {
- underTest.execute();
- underTest.execute();
- db.assertPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME, PK_DEVOPS_PERMS_MAPPING, UUID_COLUMN_NAME);
- }
-
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTableIT.java
deleted file mode 100644
index c8c38227a3e..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTableIT.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateTelemetryMetricsSentTableIT {
-
- private static final String EXPECTED_TABLE_NAME = "telemetry_metrics_sent";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateTelemetryMetricsSentTable.class);
-
- private final DdlChange underTest = new CreateTelemetryMetricsSentTable(db.database());
-
- @Test
- void migration_should_create_a_table() throws SQLException {
- db.assertTableDoesNotExist(EXPECTED_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(EXPECTED_TABLE_NAME);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "metric_key", Types.VARCHAR, 40, false);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "dimension", Types.VARCHAR, 40, false);
- db.assertColumnDefinition(EXPECTED_TABLE_NAME, "last_sent", Types.BIGINT, null, false);
- db.assertPrimaryKey(EXPECTED_TABLE_NAME, null, "metric_key", "dimension");
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertTableDoesNotExist(EXPECTED_TABLE_NAME);
-
- underTest.execute();
- // re-entrant
- underTest.execute();
-
- db.assertTableExists(EXPECTED_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTableIT.java
deleted file mode 100644
index 6a0fa7f13d3..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTableIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.AddDevopsPlatformColumnInDevopsPermsMapping.DEVOPS_PLATFORM_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.CreateUniqueIndexOnDevopsPermsMappingTable.DEVOPS_ROLE_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.CreateUniqueIndexOnDevopsPermsMappingTable.INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.CreateUniqueIndexOnDevopsPermsMappingTable.SONARQUBE_PERMISSION_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-class CreateUniqueIndexOnDevopsPermsMappingTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateUniqueIndexOnDevopsPermsMappingTable.class);
- private final DdlChange underTest = new CreateUniqueIndexOnDevopsPermsMappingTable(db.database());
-
- @Test
- void execute_givenIndexDoNotExist_shouldCreateIndex() throws Exception {
- db.assertIndexDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, INDEX_NAME);
- underTest.execute();
- db.assertUniqueIndex(DEVOPS_PERMS_MAPPING_TABLE_NAME, INDEX_NAME, DEVOPS_ROLE_COLUMN_NAME, SONARQUBE_PERMISSION_COLUMN_NAME, DEVOPS_PLATFORM_COLUMN_NAME);
- }
-
- @Test
- void execute_givenIndexAlreadyExist_shouldBeReentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
- db.assertUniqueIndex(DEVOPS_PERMS_MAPPING_TABLE_NAME, INDEX_NAME, DEVOPS_ROLE_COLUMN_NAME, SONARQUBE_PERMISSION_COLUMN_NAME, DEVOPS_PLATFORM_COLUMN_NAME);
- }
-
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExistsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExistsIT.java
deleted file mode 100644
index cba780cbaf7..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExistsIT.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.GITHUB_PERMS_MAPPING_TABLE_NAME;
-
-class DropGithubPermsMappingTableIfDevopsPermsMappingTableExistsIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropGithubPermsMappingTableIfDevopsPermsMappingTableExists.class);
-
- private final DropGithubPermsMappingTableIfDevopsPermsMappingTableExists underTest = new DropGithubPermsMappingTableIfDevopsPermsMappingTableExists(db.database());
-
- @Test
- void execute_givenGithubDevopsPermsMappingTableExistsAndDevopsPermsMappingTableDoesNotExist_doNothing() throws SQLException {
- db.assertTableExists(GITHUB_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(GITHUB_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-
- @Test
- void execute_givenDevopsPermsMappingTableExistsAndGithubPermsMappingTableDoNotExist_doNothing() throws SQLException {
- db.executeDdl("CREATE TABLE " + DEVOPS_PERMS_MAPPING_TABLE_NAME + " (id INT PRIMARY KEY)");
- db.executeDdl("DROP TABLE " + GITHUB_PERMS_MAPPING_TABLE_NAME);
- db.assertTableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
- }
-
- @Test
- void execute_givenDevopsPermsMappingTableExistsAndGithubPermsMappingTableExist_dropGithubPermsMappingTable() throws SQLException {
- db.executeDdl("CREATE TABLE " + DEVOPS_PERMS_MAPPING_TABLE_NAME + " (id INT PRIMARY KEY)");
- db.assertTableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- db.assertTableExists(GITHUB_PERMS_MAPPING_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
- }
-
- @Test
- void execute_givenDevopsPermsMappingTableDoesNotExistsAndGithubPermsMappingTableDoesNotExist_doNothing() throws SQLException {
- db.executeDdl("DROP TABLE " + GITHUB_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
- }
-
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTableIT.java
deleted file mode 100644
index 417a5595530..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTableIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-class DropIndexUniqGithubPermsMappingInDevopsPermsMappingTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.class);
- private final DdlChange underTest = new DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable(db.database());
-
- @Test
- void execute_givenIndexExists_dropsIndex() throws Exception {
- db.assertUniqueIndex(DEVOPS_PERMS_MAPPING_TABLE_NAME, UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME, "devops_platform_role", "sonarqube_permission");
- underTest.execute();
- db.assertIndexDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME);
- }
-
- @Test
- void execute_is_reentrant() throws Exception {
- db.assertUniqueIndex(DEVOPS_PERMS_MAPPING_TABLE_NAME, UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME, "devops_platform_role", "sonarqube_permission");
- underTest.execute();
- underTest.execute();
- db.assertIndexDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME);
- }
-
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTableIT.java
deleted file mode 100644
index 13c8c62464a..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTableIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
-
-import static org.sonar.server.platform.db.migration.version.v107.DropPrimaryKeyOnDevopsPermsMappingTable.CONSTRAINT_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.DropPrimaryKeyOnDevopsPermsMappingTable.UUID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-class DropPrimaryKeyOnDevopsPermsMappingTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropPrimaryKeyOnDevopsPermsMappingTable.class);
-
- private final DbPrimaryKeyConstraintFinder dbPrimaryKeyConstraintFinder = new DbPrimaryKeyConstraintFinder(db.database());
- private final DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator = new DropPrimaryKeySqlGenerator(db.database(), dbPrimaryKeyConstraintFinder);
- private final DropPrimaryKeyOnDevopsPermsMappingTable underTest = new DropPrimaryKeyOnDevopsPermsMappingTable(db.database(), dropPrimaryKeySqlGenerator, dbPrimaryKeyConstraintFinder);
-
- @Test
- void execute_shouldRemoveExistingPrimaryKey() throws Exception {
- db.assertPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME, CONSTRAINT_NAME, UUID_COLUMN_NAME);
- underTest.execute();
- db.assertNoPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-
- @Test
- void execute_when_reentrant_shouldRemoveExistingPrimaryKey() throws Exception {
- db.assertPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME, CONSTRAINT_NAME, UUID_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertNoPrimaryKey(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfigurationIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfigurationIT.java
deleted file mode 100644
index d34b6053474..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfigurationIT.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.assertj.core.groups.Tuple;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.api.utils.System2;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static java.lang.Math.min;
-import static java.lang.String.format;
-import static java.util.stream.Collectors.joining;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_AUTH_METHOD;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_FROM;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_FROM_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_PREFIX;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_SMTP_HOST_SECURED;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_SMTP_PASSWORD_SECURED;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_SMTP_PORT_SECURED;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_SMTP_SECURE_CONNECTION_SECURED;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.EMAIL_SMTP_USERNAME_SECURED;
-import static org.sonar.server.platform.db.migration.version.v107.MigrateSmtpConfiguration.SMTP_LEGACY_CONFIG_PROP_KEYS;
-
-class MigrateSmtpConfigurationIT {
-
- public static final String RANDOM_PROPERTY_KEY = "random.property";
- public static final String RANDOM_PROPERTY_VALUE = "random value";
- public static final String RANDOM_INTERNAL_PROPERTY_KEY = "random.internal.property";
- public static final String RANDOM_INTERNAL_PROPERTY_VALUE = "random internal value";
-
- @RegisterExtension
- public final LogTesterJUnit5 logger = new LogTesterJUnit5();
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigrateSmtpConfiguration.class);
-
- private final System2 system2 = mock();
- private final DataChange underTest = new MigrateSmtpConfiguration(db.database(), system2);
-
- @BeforeEach
- public void before() {
- logger.clear();
- }
-
- @Test
- void execute_whenNoSmtpConfig_shouldDoNothing() throws SQLException {
- insertRandomProperty();
- insertRandomInternalProperty();
-
- underTest.execute();
-
- assertNoInternalPropertiesHadBeenAdded();
- assertOtherPropertiesLeftUntouched();
- }
-
- private void assertNoInternalPropertiesHadBeenAdded() {
- Map<String, String> dbRows = new HashMap<>();
- db.select(format("select kee, text_value from internal_properties where kee in (%s)", getPropertyKeysAsSqlList()))
- .forEach(map -> dbRows.put((String) map.get("kee"), (String) map.get("text_value")));
- assertThat(dbRows).isEmpty();
- }
-
- @Test
- void execute_whenPartialSmtpConfig_shouldMigrate() throws SQLException {
- Map<String, String> smtpProperties = new HashMap<>();
- smtpProperties.put(EMAIL_SMTP_HOST_SECURED, "host");
- smtpProperties.put(EMAIL_SMTP_USERNAME_SECURED, "username");
- smtpProperties.put(EMAIL_FROM, "from");
-
- insertProperties(smtpProperties);
- insertRandomProperty();
- insertRandomInternalProperty();
-
- underTest.execute();
-
- assertThatPropertiesAreMigrated(smtpProperties);
- assertOtherPropertiesLeftUntouched();
- }
-
- @Test
- void execute_whenFullSmtpConfig_shouldMigrate() throws SQLException {
- Map<String, String> smtpProperties = new HashMap<>();
- smtpProperties.put(EMAIL_SMTP_HOST_SECURED, "host");
- smtpProperties.put(EMAIL_SMTP_PORT_SECURED, "port");
- smtpProperties.put(EMAIL_SMTP_SECURE_CONNECTION_SECURED, "secure connection");
- smtpProperties.put(EMAIL_SMTP_USERNAME_SECURED, "username");
- smtpProperties.put(EMAIL_SMTP_PASSWORD_SECURED, "password");
- smtpProperties.put(EMAIL_FROM, "from");
- smtpProperties.put(EMAIL_FROM_NAME, "name");
- smtpProperties.put(EMAIL_PREFIX, "prefix");
-
- insertProperties(smtpProperties);
- insertRandomProperty();
- insertRandomInternalProperty();
-
- underTest.execute();
-
- assertThatPropertiesAreMigrated(smtpProperties);
- assertOtherPropertiesLeftUntouched();
- }
-
- @Test
- void execute_whenDefaultValuesUsed_shouldDefineThem() throws SQLException {
- Map<String, String> smtpProperties = new HashMap<>();
- smtpProperties.put(EMAIL_SMTP_HOST_SECURED, "host");
-
- insertProperties(smtpProperties);
-
- underTest.execute();
-
- // This method adds all default values to the properties list
- assertThatPropertiesAreMigrated(smtpProperties);
- }
-
- @ParameterizedTest
- @MethodSource("secureConnectionOldToNewValues")
- void execute_shouldMapSecureConnectionValues(String oldValue, String newValue) throws SQLException {
- Map<String, String> smtpProperties = new HashMap<>();
- smtpProperties.put(EMAIL_SMTP_SECURE_CONNECTION_SECURED, oldValue);
-
- insertProperties(smtpProperties);
-
- underTest.execute();
-
- assertSecureConnectionValuesIsCorrectlyMapped(newValue);
- }
-
- private void assertSecureConnectionValuesIsCorrectlyMapped(String newValue) {
- Map<String, String> dbRows = new HashMap<>();
- db.select(format("select kee, text_value from internal_properties where kee = '%s'", EMAIL_SMTP_SECURE_CONNECTION_SECURED))
- .forEach(map -> dbRows.put((String) map.get("kee"), (String) map.get("text_value")));
- assertThat(dbRows).containsEntry(EMAIL_SMTP_SECURE_CONNECTION_SECURED, newValue);
- }
-
- static Object[][] secureConnectionOldToNewValues() {
- return new Object[][]{
- {"ssl", "SSLTLS"},
- {"starttls", "STARTTLS"},
- {null, "NONE"},
- {"", "NONE"},
- {"null", "NONE"},
- {"random", "NONE"}
- };
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- Map<String, String> smtpProperties = new HashMap<>();
- smtpProperties.put(EMAIL_SMTP_HOST_SECURED, "host");
- smtpProperties.put(EMAIL_SMTP_PORT_SECURED, "port");
- smtpProperties.put(EMAIL_SMTP_SECURE_CONNECTION_SECURED, "secure connection");
- smtpProperties.put(EMAIL_SMTP_USERNAME_SECURED, "username");
- smtpProperties.put(EMAIL_SMTP_PASSWORD_SECURED, "password");
- smtpProperties.put(EMAIL_FROM, "from");
- smtpProperties.put(EMAIL_FROM_NAME, "name");
- smtpProperties.put(EMAIL_PREFIX, "prefix");
-
- insertProperties(smtpProperties);
- insertRandomProperty();
- insertRandomInternalProperty();
-
- underTest.execute();
- underTest.execute();
-
- assertThatPropertiesAreMigrated(smtpProperties);
- assertOtherPropertiesLeftUntouched();
- }
-
- private void insertRandomProperty() {
- insertProperty(RANDOM_PROPERTY_KEY, RANDOM_PROPERTY_VALUE);
- }
-
- private void insertRandomInternalProperty() {
- insertInternalProperty(RANDOM_INTERNAL_PROPERTY_KEY, RANDOM_INTERNAL_PROPERTY_VALUE);
- }
-
- private void assertThatPropertiesAreMigrated(Map<String, String> properties) {
- addDefaultProperties(properties);
- updatePropertyValues(properties);
- assertThatPropertiesAreInInternalProperties(properties);
- assertThatPropertiesAreNotInProperties();
- }
-
- private void updatePropertyValues(Map<String, String> properties) {
- String currentValue = properties.get(EMAIL_SMTP_SECURE_CONNECTION_SECURED);
- String newValue = switch (currentValue) {
- case "ssl" -> "SSLTLS";
- case "starttls" -> "STARTTLS";
- default -> "NONE";
- };
- properties.put(EMAIL_SMTP_SECURE_CONNECTION_SECURED, newValue);
- }
-
- private void addDefaultProperties(Map<String, String> properties) {
- Map<String, String> defaultPropertyValues = Map.of(
- EMAIL_SMTP_SECURE_CONNECTION_SECURED, "NONE",
- EMAIL_FROM, "noreply@nowhere",
- EMAIL_FROM_NAME, "SonarQube",
- EMAIL_PREFIX, "[SONARQUBE]",
- EMAIL_AUTH_METHOD, "BASIC"
- );
- defaultPropertyValues.forEach((key, value) -> {
- if (!properties.containsKey(key)) {
- properties.put(key, value);
- }
- });
- }
-
- private void assertThatPropertiesAreInInternalProperties(Map<String, String> properties) {
- Map<String, String> dbRows = new HashMap<>();
- db.select(format("select kee, text_value from internal_properties where kee in (%s)", getPropertyKeysAsSqlList()))
- .forEach(map -> dbRows.put((String) map.get("kee"), (String) map.get("text_value")));
- assertThat(dbRows).containsExactlyInAnyOrderEntriesOf(properties);
- }
-
- private void assertThatPropertiesAreNotInProperties() {
- assertThat(db.select(format("select * from properties where prop_key in (%s)", getPropertyKeysAsSqlList()))).isEmpty();
- }
-
- private static String getPropertyKeysAsSqlList() {
- return SMTP_LEGACY_CONFIG_PROP_KEYS.stream().map(key -> "'" + key + "'").collect(joining(","));
- }
-
- private void assertOtherPropertiesLeftUntouched() {
- assertRandomPropertyIsIntact();
- assertRandomInternalPropertyIsIntact();
- }
-
- private void assertRandomPropertyIsIntact() {
- List<Tuple> results = db.select("select * from properties")
- .stream().map(map -> new Tuple(map.get("prop_key"), map.get("text_value")))
- .toList();
- assertThat(results).containsExactly(new Tuple(RANDOM_PROPERTY_KEY, RANDOM_PROPERTY_VALUE));
- }
-
- private void assertRandomInternalPropertyIsIntact() {
- List<Tuple> resultsInternal = db.select(format("select kee, text_value from internal_properties where kee in ('%s')", RANDOM_INTERNAL_PROPERTY_KEY))
- .stream().map(map -> new Tuple(map.get("kee"), map.get("text_value")))
- .toList();
- assertThat(resultsInternal).containsExactly(new Tuple(RANDOM_INTERNAL_PROPERTY_KEY, RANDOM_INTERNAL_PROPERTY_VALUE));
- }
-
- private void insertProperties(Map<String, String> properties) {
- properties.forEach(this::insertProperty);
- }
-
- private void insertProperty(String key, String value) {
- db.executeInsert("properties", "uuid", "uuid_" + key.substring(0, min(key.length() - 1, 35)), "prop_key", key, "is_empty", false, "text_value", value, "created_at", 0);
- }
-
- private void insertInternalProperty(String key, String value) {
- db.executeInsert("internal_properties", "kee", key, "is_empty", false, "text_value", value, "created_at", 0);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevopsPermissionsMappingIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevopsPermissionsMappingIT.java
deleted file mode 100644
index f8b33c65931..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevopsPermissionsMappingIT.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-class PopulateGitlabDevopsPermissionsMappingIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(PopulateGitlabDevOpsPermissionsMapping.class);
- @RegisterExtension
- public final LogTesterJUnit5 logTester = new LogTesterJUnit5();
-
- private final PopulateGitlabDevOpsPermissionsMapping migration = new PopulateGitlabDevOpsPermissionsMapping(db.database(), UuidFactoryImpl.INSTANCE);
-
- @Test
- void execute_whenTableIsEmpty_shouldPopulate() throws SQLException {
- migration.execute();
-
- verifyMapping();
- }
-
- @Test
- void execute_isReentrant() throws SQLException {
- migration.execute();
- migration.execute();
-
- verifyMapping();
- }
-
- @Test
- void execute_whenTableAlreadyPopulated_doesNothing() throws SQLException {
- db.executeInsert(DEVOPS_PERMS_MAPPING_TABLE_NAME,
- "UUID", UuidFactoryImpl.INSTANCE.create(),
- "devops_platform", "gitlab",
- "devops_platform_role", "role1",
- "sonarqube_permission", "sq_perm");
-
- migration.execute();
-
- assertThat(db.select("select devops_platform_role, sonarqube_permission from devops_perms_mapping"))
- .extracting(stringObjectMap -> stringObjectMap.get("DEVOPS_PLATFORM_ROLE"), stringObjectMap -> stringObjectMap.get("SONARQUBE_PERMISSION"))
- .containsExactly(tuple("role1", "sq_perm"));
- }
-
- @Test
- void execute_whenTableAlreadyPopulatedWithGithub_appliesMigration() throws SQLException {
- db.executeInsert(DEVOPS_PERMS_MAPPING_TABLE_NAME,
- "UUID", UuidFactoryImpl.INSTANCE.create(),
- "devops_platform", "github",
- "devops_platform_role", "role1",
- "sonarqube_permission", "sq_perm");
-
- migration.execute();
-
- verifyMapping();
- }
-
- private void verifyMapping() {
- assertThat(db.select("select devops_platform_role, sonarqube_permission from devops_perms_mapping where devops_platform = 'gitlab'"))
- .extracting(stringObjectMap -> stringObjectMap.get("DEVOPS_PLATFORM_ROLE"), stringObjectMap -> stringObjectMap.get("SONARQUBE_PERMISSION"))
- .containsExactlyInAnyOrder(
- tuple("guest", "user"),
- tuple("reporter", "codeviewer"),
- tuple("reporter", "user"),
- tuple("developer", "codeviewer"),
- tuple("developer", "user"),
- tuple("developer", "issueadmin"),
- tuple("developer", "securityhotspotadmin"),
- tuple("developer", "scan"),
- tuple("maintainer", "codeviewer"),
- tuple("maintainer", "user"),
- tuple("maintainer", "issueadmin"),
- tuple("maintainer", "securityhotspotadmin"),
- tuple("maintainer", "scan"),
- tuple("maintainer", "admin"),
- tuple("owner", "codeviewer"),
- tuple("owner", "user"),
- tuple("owner", "issueadmin"),
- tuple("owner", "securityhotspotadmin"),
- tuple("owner", "scan"),
- tuple("owner", "admin")
- );
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTableIT.java
deleted file mode 100644
index 864f52924ee..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTableIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.RenameTableChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.GITHUB_PERMS_MAPPING_TABLE_NAME;
-
-class RenameGithubPermsMappingTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameGithubPermsMappingTable.class);
- private final RenameTableChange underTest = new RenameGithubPermsMappingTable(db.database());
-
- @Test
- void migration_shouldUpdateTableName() throws SQLException {
- db.assertTableExists(GITHUB_PERMS_MAPPING_TABLE_NAME);
- underTest.execute();
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
- db.assertTableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertTableExists(GITHUB_PERMS_MAPPING_TABLE_NAME);
- underTest.execute();
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
- underTest.execute();
- db.assertTableDoesNotExist(GITHUB_PERMS_MAPPING_TABLE_NAME);
- db.assertTableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMappingIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMappingIT.java
deleted file mode 100644
index 318a19427b0..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMappingIT.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubRoleInDevopsPermsMapping.OLD_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubRoleInDevopsPermsMapping.NEW_COLUMN_NAME;
-
-class RenameGithubRoleInDevopsPermsMappingIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameGithubRoleInDevopsPermsMapping.class);
-
- private final RenameGithubRoleInDevopsPermsMapping underTest = new RenameGithubRoleInDevopsPermsMapping(db.database());
-
- @Test
- void execute_renameColumn() throws SQLException {
- db.assertColumnDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, NEW_COLUMN_NAME);
- db.assertColumnDefinition(DEVOPS_PERMS_MAPPING_TABLE_NAME, OLD_COLUMN_NAME, VARCHAR, 100, false);
- underTest.execute();
- db.assertColumnDefinition(DEVOPS_PERMS_MAPPING_TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 100, false);
- db.assertColumnDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, OLD_COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunTwice_isReentrant() throws SQLException {
- db.assertColumnDoesNotExist(DEVOPS_PERMS_MAPPING_TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(DEVOPS_PERMS_MAPPING_TABLE_NAME, NEW_COLUMN_NAME, VARCHAR, 100, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTableTest.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTableTest.java
deleted file mode 100644
index 6ab38a2f22a..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTableTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-class AddManualSeverityColumnInIssuesImpactsTableTest {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddManualSeverityColumnInIssuesImpactsTable.class);
- private final AddManualSeverityColumnInIssuesImpactsTable underTest = new AddManualSeverityColumnInIssuesImpactsTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws Exception {
- db.assertColumnDoesNotExist(AddManualSeverityColumnInIssuesImpactsTable.TABLE_NAME, AddManualSeverityColumnInIssuesImpactsTable.MANUAL_SEVERITY);
- underTest.execute();
- db.assertColumnDefinition(AddManualSeverityColumnInIssuesImpactsTable.TABLE_NAME, AddManualSeverityColumnInIssuesImpactsTable.MANUAL_SEVERITY, java.sql.Types.BOOLEAN, null, false);
- }
-
- @Test
- void execute_whenColumnAlreadyExists_shouldNotFail() throws Exception {
- underTest.execute();
- assertDoesNotThrow(() -> underTest.execute());
- }
-
- @Test
- void execute_is_reentrant() throws Exception {
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(AddManualSeverityColumnInIssuesImpactsTable.TABLE_NAME, AddManualSeverityColumnInIssuesImpactsTable.MANUAL_SEVERITY, java.sql.Types.BOOLEAN, null, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTableIT.java
deleted file mode 100644
index e4db0e8f246..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v108.AddMeasuresMigratedColumnToPortfoliosTable.MIGRATION_FLAG_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.AddMeasuresMigratedColumnToPortfoliosTable.PORTFOLIOS_TABLE_NAME;
-
-class AddMeasuresMigratedColumnToPortfoliosTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddMeasuresMigratedColumnToPortfoliosTable.class);
- private final AddMeasuresMigratedColumnToPortfoliosTable underTest = new AddMeasuresMigratedColumnToPortfoliosTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(PORTFOLIOS_TABLE_NAME, MIGRATION_FLAG_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(PORTFOLIOS_TABLE_NAME, MIGRATION_FLAG_COLUMN_NAME, Types.BOOLEAN, null, false);
- }
-
- @Test
- void execute_whenColumnAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTableIT.java
deleted file mode 100644
index af76e852d06..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTableIT.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v108.AddMeasuresMigratedColumnToProjectBranchesTable.MIGRATION_FLAG_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.AddMeasuresMigratedColumnToProjectBranchesTable.PROJECT_BRANCHES_TABLE_NAME;
-
-class AddMeasuresMigratedColumnToProjectBranchesTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddMeasuresMigratedColumnToProjectBranchesTable.class);
- private final AddMeasuresMigratedColumnToProjectBranchesTable underTest = new AddMeasuresMigratedColumnToProjectBranchesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(PROJECT_BRANCHES_TABLE_NAME, MIGRATION_FLAG_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(PROJECT_BRANCHES_TABLE_NAME, MIGRATION_FLAG_COLUMN_NAME, Types.BOOLEAN, null, false);
- }
-
- @Test
- void execute_whenColumnAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullableIT.java
deleted file mode 100644
index f7f18ad1427..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullableIT.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static java.sql.Types.BIGINT;
-import static org.sonar.db.MigrationDbTester.createForMigrationStep;
-
-class AlterCveColumnsToNullableIT {
-
- private static final String TABLE_NAME = "cves";
-
- @RegisterExtension
- public final MigrationDbTester db = createForMigrationStep(AlterCveColumnsToNullable.class);
-
- private final DdlChange underTest = new AlterCveColumnsToNullable(db.database());
-
- @Test
- void execute_shouldUpdateConstraints() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, "published_at", BIGINT, null, false);
- db.assertColumnDefinition(TABLE_NAME, "last_modified_at", BIGINT, null, false);
-
- underTest.execute();
-
- db.assertColumnDefinition(TABLE_NAME, "published_at", BIGINT, null, true);
- db.assertColumnDefinition(TABLE_NAME, "last_modified_at", BIGINT, null, true);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, "published_at", BIGINT, null, false);
- db.assertColumnDefinition(TABLE_NAME, "last_modified_at", BIGINT, null, false);
- underTest.execute();
-
- underTest.execute();
-
- db.assertColumnDefinition(TABLE_NAME, "published_at", BIGINT, null, true);
- db.assertColumnDefinition(TABLE_NAME, "last_modified_at", BIGINT, null, true);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTableIT.java
deleted file mode 100644
index 60a14d350bc..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTableIT.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v108.CreateIndexOnMeasuresTable.INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_BRANCH_UUID;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.MEASURES_TABLE_NAME;
-
-
-class CreateIndexOnMeasuresTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexOnMeasuresTable.class);
-
- private final DdlChange underTest = new CreateIndexOnMeasuresTable(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(MEASURES_TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
-
- db.assertIndex(MEASURES_TABLE_NAME, INDEX_NAME, COLUMN_BRANCH_UUID);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- db.assertIndexDoesNotExist(MEASURES_TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertIndex(MEASURES_TABLE_NAME, INDEX_NAME, COLUMN_BRANCH_UUID);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigratedIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigratedIT.java
deleted file mode 100644
index eba18206b8d..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigratedIT.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v108.CreateIndexOnPortfoliosMeasuresMigrated.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.CreateIndexOnPortfoliosMeasuresMigrated.TABLE_NAME;
-
-class CreateIndexOnPortfoliosMeasuresMigratedIT {
-
- private static final String INDEX_NAME = "portfolios_measures_migrated";
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexOnPortfoliosMeasuresMigrated.class);
- private final CreateIndexOnPortfoliosMeasuresMigrated underTest = new CreateIndexOnPortfoliosMeasuresMigrated(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigratedIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigratedIT.java
deleted file mode 100644
index 75d1da955c0..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigratedIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.sonar.server.platform.db.migration.version.v108.CreateIndexOnProjectBranchesMeasuresMigrated.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.CreateIndexOnProjectBranchesMeasuresMigrated.TABLE_NAME;
-
-class CreateIndexOnProjectBranchesMeasuresMigratedIT {
-
- private static final String INDEX_NAME = "pb_measures_migrated";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateIndexOnProjectBranchesMeasuresMigrated.class);
- private final CreateIndexOnProjectBranchesMeasuresMigrated underTest = new CreateIndexOnProjectBranchesMeasuresMigrated(db.database());
-
- @Test
- void migration_should_create_index() throws SQLException {
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
-
- underTest.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_should_be_reentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
-
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTableIT.java
deleted file mode 100644
index 0edf5a3bb24..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTableIT.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_BRANCH_UUID;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_COMPONENT_UUID;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_CREATED_AT;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_JSON_VALUE;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_JSON_VALUE_HASH;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_UPDATED_AT;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.MEASURES_TABLE_NAME;
-
-class CreateMeasuresTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateMeasuresTable.class);
-
- private final DdlChange underTest = new CreateMeasuresTable(db.database());
-
- @Test
- void execute_shouldCreateTable() throws SQLException {
- db.assertTableDoesNotExist(MEASURES_TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(MEASURES_TABLE_NAME);
- db.assertNoPrimaryKey(MEASURES_TABLE_NAME);
- db.assertColumnDefinition(MEASURES_TABLE_NAME, COLUMN_COMPONENT_UUID, Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(MEASURES_TABLE_NAME, COLUMN_BRANCH_UUID, Types.VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(MEASURES_TABLE_NAME, COLUMN_JSON_VALUE, Types.CLOB, null, false);
- db.assertColumnDefinition(MEASURES_TABLE_NAME, COLUMN_JSON_VALUE_HASH, Types.BIGINT, null, false);
- db.assertColumnDefinition(MEASURES_TABLE_NAME, COLUMN_CREATED_AT, Types.BIGINT, null, false);
- db.assertColumnDefinition(MEASURES_TABLE_NAME, COLUMN_UPDATED_AT, Types.BIGINT, null, false);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(MEASURES_TABLE_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertTableExists(MEASURES_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetricsIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetricsIT.java
deleted file mode 100644
index 443aaabaf7f..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetricsIT.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.tuple;
-
-class CreateNewSoftwareQualityMetricsIT {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreateNewSoftwareQualityMetrics.class);
- private final CreateNewSoftwareQualityMetrics underTest = new CreateNewSoftwareQualityMetrics(db.database(), UuidFactoryImpl.INSTANCE);
-
- @Test
- void execute_shouldCreateMetrics() throws SQLException {
- assertThat(db.select("select name,direction,qualitative,enabled,best_value,optimized_best_value,delete_historical_data from metrics"))
- .isEmpty();
- underTest.execute();
- assertThat(db.select("select name,direction,qualitative,enabled,best_value,optimized_best_value,delete_historical_data from metrics"))
- .hasSize(6)
- .extracting(s -> s.get("name"), s -> s.get("direction"), s -> s.get("qualitative"), s -> s.get("enabled"), s -> ((Number) s.get("best_value")).longValue(),
- s -> s.get("optimized_best_value"),
- s -> s.get("delete_historical_data"))
-
- .containsExactlyInAnyOrder(
- tuple("software_quality_reliability_issues", -1L, false, true, 0L, true, false),
- tuple("software_quality_security_issues", -1L, false, true, 0L, true, false),
- tuple("new_software_quality_reliability_issues", -1L, true, true, 0L, true, true),
- tuple("new_software_quality_security_issues", -1L, true, true, 0L, true, true),
- tuple("new_software_quality_maintainability_issues", -1L, true, true, 0L, true, true),
- tuple("software_quality_maintainability_issues", -1L, false, true, 0L, true, false));
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- underTest.execute();
- underTest.execute();
- assertThat(db.select("select name,direction,qualitative,enabled,best_value,optimized_best_value,delete_historical_data from metrics"))
- .hasSize(6);
- }
-
- @Test
- void execute_whenOnlyOneMetricExists_shouldCreateOtherOnes() throws SQLException {
- String existingMetricUuid = insertMetric("software_quality_security_issues");
- underTest.execute();
-
- assertThat(db.select("select uuid from metrics"))
- .hasSize(6)
- .extracting(e -> e.get("uuid"))
- .contains(existingMetricUuid);
- }
-
- private String insertMetric(String key) {
- String uuid = UuidFactoryImpl.INSTANCE.create();
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("NAME", key));
- db.executeInsert("metrics", map);
- return uuid;
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTableIT.java
deleted file mode 100644
index 7cb6287b855..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTableIT.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_COMPONENT_UUID;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.MEASURES_TABLE_NAME;
-
-class CreatePrimaryKeyOnMeasuresTableIT {
-
- private static final String PK_NAME = "pk_measures";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(CreatePrimaryKeyOnMeasuresTable.class);
-
- private final DdlChange underTest = new CreatePrimaryKeyOnMeasuresTable(db.database());
-
- @Test
- void execute_shouldCreatePrimaryKey() throws SQLException {
- db.assertNoPrimaryKey(MEASURES_TABLE_NAME);
-
- underTest.execute();
-
- db.assertPrimaryKey(MEASURES_TABLE_NAME, PK_NAME, COLUMN_COMPONENT_UUID);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertNoPrimaryKey(MEASURES_TABLE_NAME);
-
- underTest.execute();
- underTest.execute();
-
- db.assertPrimaryKey(MEASURES_TABLE_NAME, PK_NAME, COLUMN_COMPONENT_UUID);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTableIT.java
deleted file mode 100644
index 63d49ea7682..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTableIT.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static java.sql.Types.BIGINT;
-import static java.sql.Types.CLOB;
-import static java.sql.Types.VARCHAR;
-import static org.sonar.db.MigrationDbTester.createForMigrationStep;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-class CreateProjectDependenciesTableIT {
-
- private static final String TABLE_NAME = "project_dependencies";
-
- @RegisterExtension
- public final MigrationDbTester db = createForMigrationStep(CreateProjectDependenciesTable.class);
-
- private final DdlChange underTest = new CreateProjectDependenciesTable(db.database());
-
- @Test
- void execute_shouldCreateTable() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- db.assertPrimaryKey(TABLE_NAME, "pk_project_dependencies", "uuid");
- db.assertColumnDefinition(TABLE_NAME, "uuid", VARCHAR, UUID_SIZE, false);
- db.assertColumnDefinition(TABLE_NAME, "version", CLOB, null, true);
- db.assertColumnDefinition(TABLE_NAME, "include_paths", CLOB, null, true);
- db.assertColumnDefinition(TABLE_NAME, "package_manager", VARCHAR, 50, true);
- db.assertColumnDefinition(TABLE_NAME, "created_at", BIGINT, null, false);
- db.assertColumnDefinition(TABLE_NAME, "updated_at", BIGINT, null, false);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- db.assertTableDoesNotExist(TABLE_NAME);
- underTest.execute();
-
- underTest.execute();
-
- db.assertTableExists(TABLE_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasuresIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasuresIT.java
deleted file mode 100644
index 843a379f046..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasuresIT.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.util.Map;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.mockito.Mockito;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.es.MigrationEsClient;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class DeleteSoftwareQualityRatingFromProjectMeasuresIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DeleteSoftwareQualityRatingFromProjectMeasures.class);
-
- private final MigrationEsClient migrationEsClient = Mockito.mock(MigrationEsClient.class);
-
- private final DeleteSoftwareQualityRatingFromProjectMeasures underTest = new DeleteSoftwareQualityRatingFromProjectMeasures(db.database(), migrationEsClient);
-
- @Test
- void execute_whenMeasuresExists_shouldDeleteMeasures() throws SQLException {
- DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.forEach(key -> {
- String metricUUid = insertMetric(key);
- insertProjectMeasure(metricUUid);
- });
-
- assertThat(db.countSql("select count(1) from project_measures"))
- .isEqualTo(DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.size());
-
- underTest.execute();
-
- assertThat(db.countSql("select count(1) from project_measures")).isZero();
- Mockito.verify(migrationEsClient, Mockito.times(1)).deleteIndexes("projectmeasures");
- }
-
- @Test
- void execute_whenOtherMeasuresExists_shouldNotDeleteMeasures() throws SQLException {
- String metricUUid = insertMetric("other_metric");
- insertProjectMeasure(metricUUid);
-
- assertThat(db.countSql("select count(1) from project_measures")).isEqualTo(1);
-
- underTest.execute();
-
- assertThat(db.countSql("select count(1) from project_measures")).isEqualTo(1);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.forEach(key -> {
- String metricUUid = insertMetric(key);
- insertProjectMeasure(metricUUid);
- });
-
- String metricUUid = insertMetric("other_metric");
- insertProjectMeasure(metricUUid);
-
- assertThat(db.countSql("select count(1) from project_measures"))
- .isEqualTo(DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.size() + 1);
-
- underTest.execute();
- underTest.execute();
-
- assertThat(db.countSql("select count(1) from project_measures")).isOne();
- }
-
- private String insertMetric(String key) {
- String uuid = UuidFactoryImpl.INSTANCE.create();
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("NAME", key));
- db.executeInsert("metrics", map);
- return uuid;
- }
-
- private void insertProjectMeasure(String metricUuid) {
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", UuidFactoryImpl.INSTANCE.create()),
- Map.entry("METRIC_UUID", metricUuid),
- Map.entry("COMPONENT_UUID", UuidFactoryImpl.INSTANCE.create()),
- Map.entry("ANALYSIS_UUID", UuidFactoryImpl.INSTANCE.create()));
- db.executeInsert("project_measures", map);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssuesIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssuesIT.java
deleted file mode 100644
index 9b29bb41d14..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssuesIT.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class DropColumnFromHotspotInIssuesIT {
- private static final String TABLE_NAME = "issues";
- private static final String COLUMN_NAME = "from_hotspot";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropColumnFromHotspotInIssues.class);
- private final DdlChange underTest = new DropColumnFromHotspotInIssues(db.database());
-
- @Test
- void drops_column() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BOOLEAN, null, true);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BOOLEAN, null, true);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigratedIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigratedIT.java
deleted file mode 100644
index 6a35dcb10bd..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigratedIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-
-class DropIndexOnPortfoliosMeasuresMigratedIT {
-
- private static final String TABLE_NAME = "portfolios";
- private static final String COLUMN_NAME = "measures_migrated";
- private static final String INDEX_NAME = "portfolios_measures_migrated";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexOnPortfoliosMeasuresMigrated.class);
- private final DdlChange underTest = new DropIndexOnPortfoliosMeasuresMigrated(db.database());
-
- @Test
- void execute_givenIndexExists_dropsIndex() throws Exception {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-
- @Test
- void execute_is_reentrant() throws Exception {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigratedIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigratedIT.java
deleted file mode 100644
index b1f20641335..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigratedIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-
-class DropIndexOnProjectBranchesMeasuresMigratedIT {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String COLUMN_NAME = "measures_migrated";
- private static final String INDEX_NAME = "pb_measures_migrated";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropIndexOnProjectBranchesMeasuresMigrated.class);
- private final DdlChange underTest = new DropIndexOnProjectBranchesMeasuresMigrated(db.database());
-
- @Test
- void execute_givenIndexExists_dropsIndex() throws Exception {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-
- @Test
- void execute_is_reentrant() throws Exception {
- db.assertIndex(TABLE_NAME, INDEX_NAME, COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertIndexDoesNotExist(TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTableIT.java
deleted file mode 100644
index 0b874c17dd2..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTableIT.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-
-class DropLiveMeasuresTableIT {
- public static final String TABLE_NAME = "live_measures";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropLiveMeasuresTable.class);
- private final DropLiveMeasuresTable underTest = new DropLiveMeasuresTable(db.database());
-
- @Test
- void execute_shouldDropTable() throws SQLException {
- db.assertTableExists(TABLE_NAME);
- underTest.execute();
- db.assertTableDoesNotExist(TABLE_NAME);
- }
-
- @Test
- void execute_shouldSupportReentrantMigrationExecution() throws SQLException {
- db.assertTableExists(TABLE_NAME);
- underTest.execute();
- underTest.execute();
- db.assertTableDoesNotExist(TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInPortfoliosTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInPortfoliosTableIT.java
deleted file mode 100644
index 397ac28b71d..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInPortfoliosTableIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v108.DropMeasuresMigratedColumnInPortfoliosTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.DropMeasuresMigratedColumnInPortfoliosTable.TABLE_NAME;
-
-class DropMeasuresMigratedInPortfoliosTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropMeasuresMigratedColumnInPortfoliosTable.class);
- private final DdlChange underTest = new DropMeasuresMigratedColumnInPortfoliosTable(db.database());
-
- @Test
- void executed_whenRun_shouldDropSystemTagsColumn() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BOOLEAN, null, false);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BOOLEAN, null, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInProjectBranchesTableIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInProjectBranchesTableIT.java
deleted file mode 100644
index d48cedb7e29..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedInProjectBranchesTableIT.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v108.DropMeasuresMigratedColumnInProjectBranchesTable.COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.DropMeasuresMigratedColumnInProjectBranchesTable.TABLE_NAME;
-
-class DropMeasuresMigratedInProjectBranchesTableIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(DropMeasuresMigratedColumnInProjectBranchesTable.class);
- private final DdlChange underTest = new DropMeasuresMigratedColumnInProjectBranchesTable(db.database());
-
- @Test
- void executed_whenRun_shouldDropSystemTagsColumn() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BOOLEAN, null, false);
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-
- @Test
- void execute_whenRunMoreThanOnce_shouldBeReentrant() throws SQLException {
- db.assertColumnDefinition(TABLE_NAME, COLUMN_NAME, Types.BOOLEAN, null, false);
- underTest.execute();
- underTest.execute();
- db.assertColumnDoesNotExist(TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrModeIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrModeIT.java
deleted file mode 100644
index a5b01c86a08..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrModeIT.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Stream;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.sonar.api.impl.utils.TestSystem2;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.SequenceUuidFactory;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.history.MigrationHistory;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
-
-class EnableSpecificMqrModeIT {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(EnableSpecificMqrMode.class);
-
- private final UuidFactory uuidFactory = new SequenceUuidFactory();
- private final MigrationHistory migrationHistory = mock(MigrationHistory.class);
- private final System2 system2 = new TestSystem2().setNow(2_000_000_000L);
-
- private final DataChange underTest = new EnableSpecificMqrMode(db.database(), migrationHistory, uuidFactory, system2);
-
- @ParameterizedTest
- @MethodSource("versions")
- void execute_correctlyInsertsProperty(long version, String expectedResult) throws SQLException {
- when(migrationHistory.getInitialDbVersion()).thenReturn(version);
- underTest.execute();
-
- assertThat(getPropertyFromDB()).hasSize(1);
- assertThat(getPropertyFromDB().get(0))
- .containsEntry("text_value", expectedResult)
- .containsEntry("is_empty", false)
- .containsEntry("created_at", 2_000_000_000L)
- .containsEntry("uuid", "00000000-0000-0000-0000-000000000001");
- }
-
- @ParameterizedTest
- @MethodSource("versions")
- void execute_doesNothingIfPropertyAlreadyExists(long version) throws SQLException {
- when(migrationHistory.getInitialDbVersion()).thenReturn(version);
-
- String uuid = uuidFactory.create();
- db.executeInsert("properties",
- "prop_key", MULTI_QUALITY_MODE_ENABLED,
- "text_value", "false",
- "is_empty", false,
- "created_at", 1_000_000_000L,
- "uuid", uuid);
- underTest.execute();
-
- assertThat(getPropertyFromDB()).hasSize(1);
- assertThat(getPropertyFromDB().get(0))
- .containsEntry("text_value", "false")
- .containsEntry("is_empty", false)
- .containsEntry("created_at", 1_000_000_000L)
- .containsEntry("uuid", uuid);
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- when(migrationHistory.getInitialDbVersion()).thenReturn(102_000L);
- underTest.execute();
- underTest.execute();
-
- assertThat(getPropertyFromDB()).hasSize(1);
- assertThat(getPropertyFromDB().get(0))
- .containsEntry("text_value", "true")
- .containsEntry("is_empty", false)
- .containsEntry("created_at", 2_000_000_000L)
- .containsEntry("uuid", "00000000-0000-0000-0000-000000000001");
- }
-
- private List<Map<String, Object>> getPropertyFromDB() {
- String sql = "SELECT text_value, is_empty, created_at, uuid FROM properties WHERE prop_key = '" + MULTI_QUALITY_MODE_ENABLED + "'";
- return db.select(sql);
- }
-
- private static Stream<Arguments> versions() {
- return Stream.of(
- Arguments.of(102_000L, "true"),
- Arguments.of(-1L, "true"),
- Arguments.of(101_990L, "false"));
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java
deleted file mode 100644
index 1989467a7cd..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValuesTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.server.platform.db.migration.version.v108.MigrateAiSuggestionEnabledValues.AI_CODEFIX_ENABLED_PROP_KEY;
-import static org.sonar.server.platform.db.migration.version.v108.MigrateAiSuggestionEnabledValues.DISABLED;
-import static org.sonar.server.platform.db.migration.version.v108.MigrateAiSuggestionEnabledValues.ENABLED_FOR_ALL_PROJECTS;
-
-class MigrateAiSuggestionEnabledValuesTest {
- @RegisterExtension
- private final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigrateAiSuggestionEnabledValues.class);
- private final MigrateAiSuggestionEnabledValues underTest = new MigrateAiSuggestionEnabledValues(db.database());
-
- @BeforeEach
- void init() {
- insertProjects();
- }
-
- @Test
- void execute_shouldNotUpdateAnything_whenThePropertyDoesNotExists() throws SQLException {
- underTest.execute();
-
- assertThat(db.countSql(String.format("select count(*) from properties where prop_key = '%s'", AI_CODEFIX_ENABLED_PROP_KEY))).isZero();
- assertThat(db.countSql("select count(*) from projects where ai_code_fix_enabled = " + getBool(true))).isZero();
- }
-
- @Test
- void execute_shouldUpdatePropertyToDisabled_whenThePropertyIsFalse() throws SQLException {
- addAISuggestionEnabledProperty(false);
- underTest.execute();
-
- assertThat(db.select(String.format("select text_value from properties where prop_key = '%s'", AI_CODEFIX_ENABLED_PROP_KEY)))
- .extracting(r -> r.get("TEXT_VALUE"))
- .containsExactly(DISABLED);
-
- assertThat(db.countSql("select count(*) from projects where ai_code_fix_enabled = " + getBool(true))).isZero();
- }
-
- @Test
- void execute_shouldUpdatePropertyAndProjects_whenThePropertyIsTrue() throws SQLException {
- addAISuggestionEnabledProperty(true);
- underTest.execute();
-
- assertThat(db.select(String.format("select text_value from properties where prop_key = '%s'", AI_CODEFIX_ENABLED_PROP_KEY)))
- .extracting(r -> r.get("TEXT_VALUE"))
- .containsExactly(ENABLED_FOR_ALL_PROJECTS);
-
- assertThat(db.countSql("select count(*) from projects where ai_code_fix_enabled = " + getBool(true))).isEqualTo(2);
- assertThat(db.countSql("select count(*) from projects where ai_code_fix_enabled = " + getBool(false))).isZero();
- }
-
- private void insertProjects() {
- db.executeInsert("projects",
- "kee", "proj1",
- "qualifier", "TRK",
- "uuid", "uuid1",
- "private", false,
- "creation_method", "LOCAL_BROWSER",
- "ai_code_fix_enabled", false,
- "created_at", 1L,
- "updated_at", 1L);
- db.executeInsert("projects",
- "kee", "proj2",
- "qualifier", "TRK",
- "uuid", "uuid2",
- "private", false,
- "creation_method", "LOCAL_BROWSER",
- "ai_code_fix_enabled", false,
- "created_at", 1L,
- "updated_at", 1L);
- }
-
- private void addAISuggestionEnabledProperty(boolean enabled) {
- db.executeInsert("properties",
- "prop_key", AI_CODEFIX_ENABLED_PROP_KEY,
- "is_empty", false,
- "uuid", "uuid2",
- "text_value", enabled,
- "created_at", 1L);
- }
-
- private String getBool(boolean isTrue) {
- var dialect = db.database().getDialect();
- return isTrue ? dialect.getTrueSqlValue() : dialect.getFalseSqlValue();
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasuresIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasuresIT.java
deleted file mode 100644
index c7764dc3a45..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasuresIT.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import com.google.gson.Gson;
-import java.nio.charset.StandardCharsets;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.slf4j.event.Level;
-import org.sonar.api.measures.CoreMetrics;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.api.utils.System2;
-import org.sonar.core.metric.SoftwareQualitiesMetrics;
-import org.sonar.core.util.SequenceUuidFactory;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static java.lang.String.format;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.Assertions.tuple;
-import static org.mockito.Mockito.mock;
-
-class MigrateBranchesLiveMeasuresToMeasuresIT {
-
- private static final String MEASURES_MIGRATED_COLUMN = "measures_migrated";
- public static final String SELECT_MEASURE = "select component_uuid, branch_uuid, json_value, json_value_hash, created_at, updated_at " +
- "from measures where component_uuid = '%s'";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigrateBranchesLiveMeasuresToMeasures.class);
-
- @RegisterExtension
- private final LogTesterJUnit5 logTester = new LogTesterJUnit5();
-
- private final SequenceUuidFactory uuidFactory = new SequenceUuidFactory();
- private final System2 system2 = mock();
- private final DataChange underTest = new MigrateBranchesLiveMeasuresToMeasures(db.database(), system2);
-
- @Test
- void shall_complete_when_tables_are_empty() throws SQLException {
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isZero();
- }
-
- @Test
- void migration_does_nothing_if_live_measures_table_is_missing() {
- db.executeDdl("drop table live_measures");
- db.assertTableDoesNotExist("live_measures");
- String branch = "branch_3";
- insertNotMigratedBranch(branch);
-
- assertThatCode(underTest::execute)
- .doesNotThrowAnyException();
- }
-
- @Test
- void log_the_item_uuid_when_the_migration_fails() {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String branch1 = "branch_1";
- insertNotMigratedBranch(branch1);
- insertMeasure(branch1, nclocMetricUuid, Map.of("value", 120));
-
- db.executeDdl("drop table measures");
- db.assertTableDoesNotExist("measures");
-
- assertThatExceptionOfType(SQLException.class)
- .isThrownBy(underTest::execute);
-
- assertThat(logTester.logs(Level.ERROR))
- .contains("Migration of branch branch_1 failed");
- }
-
- @Test
- void shall_not_migrate_when_branch_is_already_flagged() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String qgStatusMetricUuid = insertMetric("quality_gate_status", "STRING");
- String metricWithDataUuid = insertMetric("metric_with_data", "DATA");
- String branch1 = "branch_1";
- insertMigratedBranch(branch1);
- insertMeasure(branch1, nclocMetricUuid, Map.of("value", 120));
- insertMeasure(branch1, qgStatusMetricUuid, Map.of("text_value", "ok"));
- insertMeasure(branch1, metricWithDataUuid, Map.of("measure_data", "some data".getBytes(StandardCharsets.UTF_8)));
-
- insertMigratedBranch("branch_2");
- insertMeasure("branch_2", nclocMetricUuid, Map.of("value", 14220));
-
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isZero();
- }
-
- @Test
- void should_flag_branch_with_no_measures() throws SQLException {
- String branch = "branch_3";
- insertNotMigratedBranch(branch);
-
- underTest.execute();
-
- assertBranchMigrated(branch);
- assertThat(db.countRowsOfTable("measures")).isZero();
- }
-
- @Test
- void should_migrate_branch_with_measures() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String qgStatusMetricUuid = insertMetric("quality_gate_status", "STRING");
- String metricWithDataUuid = insertMetric("metric_with_data", "DATA");
-
- String branch1 = "branch_4";
- insertNotMigratedBranch(branch1);
- String component1 = uuidFactory.create();
- String component2 = uuidFactory.create();
- insertMeasure(branch1, component1, nclocMetricUuid, Map.of("value", 120));
- insertMeasure(branch1, component1, qgStatusMetricUuid, Map.of("text_value", "ok"));
- insertMeasure(branch1, component2, metricWithDataUuid, Map.of("measure_data", "some data".getBytes(StandardCharsets.UTF_8)));
-
- String branch2 = "branch_5";
- insertNotMigratedBranch(branch2);
- insertMeasure(branch2, nclocMetricUuid, Map.of("value", 64));
-
- String migratedBranch = "branch_6";
- insertMigratedBranch(migratedBranch);
- insertMeasure(migratedBranch, nclocMetricUuid, Map.of("value", 3684));
-
- underTest.execute();
-
- assertBranchMigrated(branch1);
- assertBranchMigrated(branch2);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(3);
-
- assertThat(db.select(format(SELECT_MEASURE, component1)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"), t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component1, branch1, "{\"ncloc\":120.0,\"quality_gate_status\":\"ok\"}", 6033012287291512746L));
-
- assertThat(db.select(format(SELECT_MEASURE, component2)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"), t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component2, branch1, "{\"metric_with_data\":\"some data\"}", -4524184678167636687L));
- }
-
- @Test
- void should_duplicate_measures_on_reentry_when_index_does_not_exist() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
-
- String branch1 = "branch_1";
- insertNotMigratedBranch(branch1);
- String component1 = uuidFactory.create();
- insertMeasure(branch1, component1, nclocMetricUuid, Map.of("value", 120));
-
- insertMigratedMeasure(branch1, component1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isEqualTo(2);
- }
-
- @Test
- void should_remove_migrated_measures_on_reentry_when_index_exists() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
-
- String branch1 = "branch_1";
- insertNotMigratedBranch(branch1);
- String component1 = uuidFactory.create();
- insertMeasure(branch1, component1, nclocMetricUuid, Map.of("value", 120));
-
- insertMigratedMeasure(branch1, component1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- var createIndexMigration = new CreateIndexOnMeasuresTable(db.database());
- createIndexMigration.execute();
-
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
- }
-
- @Test
- void should_not_migrate_measures_planned_for_deletion() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- Set<String> deletedMetricUuid = DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.stream().map(e -> insertMetric(e, "INT"))
- .collect(Collectors.toSet());
-
- String branch1 = "branch_4";
- insertNotMigratedBranch(branch1);
- String component1 = uuidFactory.create();
- String component2 = uuidFactory.create();
- insertMeasure(branch1, component1, nclocMetricUuid, Map.of("value", 120));
- deletedMetricUuid.forEach(metricUuid -> insertMeasure(branch1, component1, metricUuid, Map.of("value", 120)));
- deletedMetricUuid.forEach(metricUuid -> insertMeasure(branch1, component2, metricUuid, Map.of("value", 120)));
-
- underTest.execute();
-
- assertBranchMigrated(branch1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- assertThat(db.select(format(SELECT_MEASURE, component1)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"), t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component1, branch1, "{\"ncloc\":120.0}", -1557106439558598045L));
-
- assertThat(db.select(format(SELECT_MEASURE, component2)))
- .isEmpty();
- }
-
- @Test
- void should_include_new_measures_based_on_previous_available_measures() throws SQLException {
- Set<String> metricsToMigrate = MeasureMigration.MIGRATION_MAP.keySet().stream().map(e -> insertMetric(e, "DATA"))
- .collect(Collectors.toSet());
-
- String branch = "branch_4";
- insertNotMigratedBranch(branch);
- String component1 = uuidFactory.create();
- metricsToMigrate.forEach(metricUuid -> insertMeasure(branch, component1, metricUuid,
- Map.of("measure_data", "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":7}".getBytes(StandardCharsets.UTF_8))));
-
- underTest.execute();
-
- assertBranchMigrated(branch);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- List<Map<String, Object>> measuresFromDB = db.select(format(SELECT_MEASURE, component1));
- assertThat(measuresFromDB).hasSize(1);
-
- Gson gson = new Gson();
- Map<String, Object> jsonValue = gson.fromJson((String) measuresFromDB.get(0).get("json_value"), Map.class);
-
- Map<String, Object> expectedExistingMetrics = MeasureMigration.MIGRATION_MAP.keySet().stream().collect(
- Collectors.toMap(s -> s, s -> "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":7}"));
-
- Map<String, Object> expectedNewMetrics = MeasureMigration.MIGRATION_MAP.values().stream().collect(
- Collectors.toMap(s -> s, s -> 7.0));
-
- assertThat(jsonValue).containsAllEntriesOf(expectedExistingMetrics).containsAllEntriesOf(expectedNewMetrics);
- }
-
- @Test
- void should_migrate_other_measures_when_there_is_an_error_converting_previous_measures() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String maintainabilityMetricUuid = insertMetric(CoreMetrics.MAINTAINABILITY_ISSUES_KEY, "DATA");
- String reliabilityMetricUuid = insertMetric(CoreMetrics.RELIABILITY_ISSUES_KEY, "DATA");
- String securityMetricUuid = insertMetric(CoreMetrics.SECURITY_ISSUES_KEY, "DATA");
-
- String branch = "branch_4";
- insertNotMigratedBranch(branch);
- String component1 = uuidFactory.create();
- insertMeasure(branch, component1, nclocMetricUuid, Map.of("value", 120));
- // total is not a number
- insertMeasure(branch, component1, maintainabilityMetricUuid, Map.of("measure_data", "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":\"ABC\"}"
- .getBytes(StandardCharsets.UTF_8)));
- // total cannot fit in a long
- insertMeasure(branch, component1, reliabilityMetricUuid, Map.of("measure_data", "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":98723987498723987429874928748748}"
- .getBytes(StandardCharsets.UTF_8)));
- insertMeasure(branch, component1, securityMetricUuid, Map.of("measure_data", "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":37}".getBytes(StandardCharsets.UTF_8)));
-
- logTester.setLevel(Level.DEBUG);
- underTest.execute();
-
- assertBranchMigrated(branch);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- List<Map<String, Object>> measuresFromDB = db.select(format(SELECT_MEASURE, component1));
- assertThat(measuresFromDB).hasSize(1);
-
- Gson gson = new Gson();
- Map<String, Object> jsonValue = gson.fromJson((String) measuresFromDB.get(0).get("json_value"), Map.class);
-
- Map<String, Object> expectedExistingMetrics = Map.of(
- "ncloc", 120.0,
- CoreMetrics.MAINTAINABILITY_ISSUES_KEY, "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":\"ABC\"}",
- CoreMetrics.RELIABILITY_ISSUES_KEY, "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":98723987498723987429874928748748}",
- CoreMetrics.SECURITY_ISSUES_KEY, "{\"LOW\":3,\"MEDIUM\":0,\"HIGH\":4,\"total\":37}");
-
- Map<String, Object> expectedNewMetrics = Map.of(SoftwareQualitiesMetrics.SOFTWARE_QUALITY_SECURITY_ISSUES_KEY, 37.0);
-
- assertThat(jsonValue).hasSize(5).containsAllEntriesOf(expectedExistingMetrics).containsAllEntriesOf(expectedNewMetrics);
- assertThat(logTester.logs(Level.DEBUG)).contains("Failed to migrate metric reliability_issues with value {\"LOW\":3,\"MEDIUM\":0," +
- "\"HIGH\":4,\"total\":98723987498723987429874928748748}");
- }
-
- @Test
- void should_not_migrate_large_measures() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String metricWithDataUuid = insertMetric("metric_with_data", "DATA");
- String metricWithLargeDataUuid = insertMetric("metric_with_large_data", "DATA");
- String duplicationsDataMetricUuid = insertMetric(CoreMetrics.DUPLICATIONS_DATA_KEY, "DATA");
-
- String branch1 = "branch_1";
- insertNotMigratedBranch(branch1);
- String component1 = uuidFactory.create();
- insertMeasure(branch1, component1, nclocMetricUuid, Map.of("value", 120));
- byte[] largeValue = createLargeValue(99_999);
- byte[] veryLargeValue = createLargeValue(100_000);
- insertMeasure(branch1, component1, metricWithDataUuid, Map.of("measure_data", largeValue));
- insertMeasure(branch1, component1, metricWithLargeDataUuid, Map.of("measure_data", veryLargeValue));
- insertMeasure(branch1, component1, duplicationsDataMetricUuid, Map.of("measure_data", veryLargeValue));
-
- underTest.execute();
-
- assertBranchMigrated(branch1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- assertThat(db.select(format(SELECT_MEASURE, component1)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"),
- t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component1, branch1, "{\"ncloc\":120.0,\"metric_with_data\":\"" +
- new String(largeValue, StandardCharsets.UTF_8) + "\",\"duplications_data\":\"" +
- new String(veryLargeValue, StandardCharsets.UTF_8) + "\"}", 3796772412311633189L));
- }
-
- @Test
- void should_not_migrate_not_persisted_metrics() throws SQLException {
- String devCostMetricUuid = insertMetric(CoreMetrics.DEVELOPMENT_COST_KEY, "STRING");
- String nclocDataMetricUuid = insertMetric(CoreMetrics.NCLOC_DATA_KEY, "STRING");
- String executableLinesDataMetricUuid = insertMetric(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, "STRING");
-
- String branch1 = "branch_1";
- insertNotMigratedBranch(branch1);
- String component1 = uuidFactory.create();
- insertMeasure(branch1, component1, devCostMetricUuid, Map.of("text_value", "123"));
- insertMeasure(branch1, component1, nclocDataMetricUuid, Map.of("text_value", "456"));
- insertMeasure(branch1, component1, executableLinesDataMetricUuid, Map.of("text_value", "789"));
-
- underTest.execute();
-
- assertBranchMigrated(branch1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- assertThat(db.select(format(SELECT_MEASURE, component1)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"),
- t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component1, branch1, "{\"development_cost\":\"123\"}", -4081454374503046534L));
- }
-
- private byte[] createLargeValue(int size) {
- byte[] value = new byte[size];
- Arrays.fill(value, (byte) 'a');
- return value;
- }
-
- private void assertBranchMigrated(String branch) {
- List<Map<String, Object>> result = db.select(format("select %s as \"MIGRATED\" from project_branches where uuid = '%s'", MEASURES_MIGRATED_COLUMN, branch));
- assertThat(result)
- .hasSize(1)
- .extracting(t -> t.get("MIGRATED"))
- .containsOnly(true);
- }
-
- private String insertMetric(String metricName, String valueType) {
- String metricUuid = uuidFactory.create();
- db.executeInsert("metrics",
- "uuid", metricUuid,
- "name", metricName,
- "val_type", valueType);
- return metricUuid;
- }
-
- private void insertMeasure(String branchUuid, String metricUuid, Map<String, Object> data) {
- insertMeasure(branchUuid, uuidFactory.create(), metricUuid, data);
- }
-
- private void insertMeasure(String branchUuid, String componentUuid, String metricUuid, Map<String, Object> data) {
- Map<String, Object> dataMap = new HashMap<>(data);
- dataMap.put("uuid", uuidFactory.create());
- dataMap.put("component_uuid", componentUuid);
- dataMap.put("project_uuid", branchUuid);
- dataMap.put("metric_uuid", metricUuid);
- dataMap.put("created_at", 12L);
- dataMap.put("updated_at", 12L);
-
- db.executeInsert("live_measures", dataMap);
- }
-
- private void insertNotMigratedBranch(String branchUuid) {
- insertBranch(branchUuid, false);
- }
-
- private void insertMigratedBranch(String branchUuid) {
- insertBranch(branchUuid, true);
- }
-
- private void insertBranch(String branchUuid, boolean migrated) {
- db.executeInsert("project_branches",
- "uuid", branchUuid,
- "kee", branchUuid,
- "branch_type", "LONG",
- "project_uuid", uuidFactory.create(),
- MEASURES_MIGRATED_COLUMN, migrated,
- "need_issue_sync", false,
- "is_main", true,
- "created_at", 12L,
- "updated_at", 12L);
- }
-
- private void insertMigratedMeasure(String branch, String componentUuid) {
- db.executeInsert("measures",
- "component_uuid", componentUuid,
- "branch_uuid", branch,
- "json_value", "{\"any\":\"thing\"}",
- "json_value_hash", 1234,
- "created_at", 12,
- "updated_at", 12);
- }
-
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasuresIT.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasuresIT.java
deleted file mode 100644
index 56acc2f70f9..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasuresIT.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.nio.charset.StandardCharsets;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.slf4j.event.Level;
-import org.sonar.api.testfixtures.log.LogTesterJUnit5;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.SequenceUuidFactory;
-import org.sonar.db.MigrationDbTester;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-import static java.lang.String.format;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.Assertions.tuple;
-import static org.mockito.Mockito.mock;
-
-class MigratePortfoliosLiveMeasuresToMeasuresIT {
-
- private static final String MEASURES_MIGRATED_COLUMN = "measures_migrated";
- public static final String SELECT_MEASURE = "select component_uuid, branch_uuid, json_value, json_value_hash, created_at, updated_at " +
- "from measures where component_uuid = '%s'";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigratePortfoliosLiveMeasuresToMeasures.class);
-
- @RegisterExtension
- private final LogTesterJUnit5 logTester = new LogTesterJUnit5();
-
- private final SequenceUuidFactory uuidFactory = new SequenceUuidFactory();
- private final System2 system2 = mock();
- private final DataChange underTest = new MigratePortfoliosLiveMeasuresToMeasures(db.database(), system2);
-
- @Test
- void shall_complete_when_tables_are_empty() throws SQLException {
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isZero();
- }
-
- @Test
- void migration_does_nothing_if_live_measures_table_is_missing() {
- db.executeDdl("drop table live_measures");
- db.assertTableDoesNotExist("live_measures");
- String branch = "portfolio_1";
- insertNotMigratedPortfolio(branch);
-
- assertThatCode(underTest::execute)
- .doesNotThrowAnyException();
- }
-
- @Test
- void log_the_item_uuid_when_the_migration_fails() {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String portfolio = "portfolio_1";
- insertNotMigratedPortfolio(portfolio);
- insertMeasure(portfolio, nclocMetricUuid, Map.of("value", 120));
-
- db.executeDdl("drop table measures");
- db.assertTableDoesNotExist("measures");
-
- assertThatExceptionOfType(SQLException.class)
- .isThrownBy(underTest::execute);
-
- assertThat(logTester.logs(Level.ERROR))
- .contains("Migration of portfolio portfolio_1 failed");
- }
-
- @Test
- void shall_not_migrate_when_portfolio_is_already_flagged() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String qgStatusMetricUuid = insertMetric("quality_gate_status", "STRING");
- String metricWithDataUuid = insertMetric("metric_with_data", "DATA");
- String portfolio1 = "portfolio_1";
- insertMigratedPortfolio(portfolio1);
- insertMeasure(portfolio1, nclocMetricUuid, Map.of("value", 120));
- insertMeasure(portfolio1, qgStatusMetricUuid, Map.of("text_value", "ok"));
- insertMeasure(portfolio1, metricWithDataUuid, Map.of("measure_data", "some data".getBytes(StandardCharsets.UTF_8)));
-
- insertMigratedPortfolio("portfolio_2");
- insertMeasure("portfolio_2", nclocMetricUuid, Map.of("value", 14220));
-
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isZero();
- }
-
- @Test
- void should_flag_portfolio_with_no_measures() throws SQLException {
- String portfolio = "portfolio_3";
- insertNotMigratedPortfolio(portfolio);
-
- underTest.execute();
-
- assertPortfolioMigrated(portfolio);
- assertThat(db.countRowsOfTable("measures")).isZero();
- }
-
- @Test
- void should_migrate_portfolio_with_measures() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- String qgStatusMetricUuid = insertMetric("quality_gate_status", "STRING");
- String metricWithDataUuid = insertMetric("metric_with_data", "DATA");
-
- String portfolio1 = "portfolio_4";
- insertNotMigratedPortfolio(portfolio1);
- String component1 = uuidFactory.create();
- String component2 = uuidFactory.create();
- insertMeasure(portfolio1, component1, nclocMetricUuid, Map.of("value", 120));
- insertMeasure(portfolio1, component1, qgStatusMetricUuid, Map.of("text_value", "ok"));
- insertMeasure(portfolio1, component2, metricWithDataUuid, Map.of("measure_data", "some data".getBytes(StandardCharsets.UTF_8)));
-
- String portfolio2 = "portfolio_5";
- insertNotMigratedPortfolio(portfolio2);
- insertMeasure(portfolio2, nclocMetricUuid, Map.of("value", 64));
-
- String migratedPortfolio = "portfolio_6";
- insertMigratedPortfolio(migratedPortfolio);
- insertMeasure(migratedPortfolio, nclocMetricUuid, Map.of("value", 3684));
-
- underTest.execute();
-
- assertPortfolioMigrated(portfolio1);
- assertPortfolioMigrated(portfolio2);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(3);
-
- assertThat(db.select(format(SELECT_MEASURE, component1)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"), t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component1, portfolio1, "{\"ncloc\":120.0,\"quality_gate_status\":\"ok\"}", 6033012287291512746L));
-
- assertThat(db.select(format(SELECT_MEASURE, component2)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"), t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component2, portfolio1, "{\"metric_with_data\":\"some data\"}", -4524184678167636687L));
- }
-
- @Test
- void should_not_migrate_measures_planned_for_deletion() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
- Set<String> deletedMetricUuid = DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.stream().map(e -> insertMetric(e, "INT"))
- .collect(Collectors.toSet());
-
- String portfolio1 = "portfolio_4";
- insertNotMigratedPortfolio(portfolio1);
- String component1 = uuidFactory.create();
- String component2 = uuidFactory.create();
- insertMeasure(portfolio1, component1, nclocMetricUuid, Map.of("value", 120));
- deletedMetricUuid.forEach(metricUuid -> insertMeasure(portfolio1, component1, metricUuid, Map.of("value", 120)));
- deletedMetricUuid.forEach(metricUuid -> insertMeasure(portfolio1, component2, metricUuid, Map.of("value", 120)));
-
- underTest.execute();
-
- assertPortfolioMigrated(portfolio1);
-
- assertThat(db.select(format(SELECT_MEASURE, component1)))
- .hasSize(1)
- .extracting(t -> t.get("component_uuid"), t -> t.get("branch_uuid"), t -> t.get("json_value"), t -> t.get("json_value_hash"))
- .containsOnly(tuple(component1, portfolio1, "{\"ncloc\":120.0}", -1557106439558598045L));
- }
-
- @Test
- void should_duplicate_measures_on_reentry_when_index_does_not_exist() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
-
- String portfolio1 = "portfolio_1";
- insertNotMigratedPortfolio(portfolio1);
- String component1 = uuidFactory.create();
- insertMeasure(portfolio1, component1, nclocMetricUuid, Map.of("value", 120));
-
- insertMigratedMeasure(portfolio1, component1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isEqualTo(2);
- }
-
- @Test
- void should_remove_migrated_measures_on_reentry_when_index_exists() throws SQLException {
- String nclocMetricUuid = insertMetric("ncloc", "INT");
-
- String portfolio1 = "portfolio_1";
- insertNotMigratedPortfolio(portfolio1);
- String component1 = uuidFactory.create();
- insertMeasure(portfolio1, component1, nclocMetricUuid, Map.of("value", 120));
-
- insertMigratedMeasure(portfolio1, component1);
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
-
- var createIndexMigration = new CreateIndexOnMeasuresTable(db.database());
- createIndexMigration.execute();
-
- underTest.execute();
-
- assertThat(db.countRowsOfTable("measures")).isEqualTo(1);
- }
-
- private void assertPortfolioMigrated(String portfolio) {
- List<Map<String, Object>> result = db.select(format("select %s as \"MIGRATED\" from portfolios where uuid = '%s'", MEASURES_MIGRATED_COLUMN, portfolio));
- assertThat(result)
- .hasSize(1)
- .extracting(t -> t.get("MIGRATED"))
- .containsOnly(true);
- }
-
- private String insertMetric(String metricName, String valueType) {
- String metricUuid = uuidFactory.create();
- db.executeInsert("metrics",
- "uuid", metricUuid,
- "name", metricName,
- "val_type", valueType);
- return metricUuid;
- }
-
- private void insertMeasure(String portfolioUuid, String metricUuid, Map<String, Object> data) {
- insertMeasure(portfolioUuid, uuidFactory.create(), metricUuid, data);
- }
-
- private void insertMeasure(String portfolioUuid, String componentUuid, String metricUuid, Map<String, Object> data) {
- Map<String, Object> dataMap = new HashMap<>(data);
- dataMap.put("uuid", uuidFactory.create());
- dataMap.put("component_uuid", componentUuid);
- dataMap.put("project_uuid", portfolioUuid);
- dataMap.put("metric_uuid", metricUuid);
- dataMap.put("created_at", 12L);
- dataMap.put("updated_at", 12L);
-
- db.executeInsert("live_measures", dataMap);
- }
-
- private void insertNotMigratedPortfolio(String portfolioUuid) {
- insertPortfolio(portfolioUuid, false);
- }
-
- private void insertMigratedPortfolio(String portfolioUuid) {
- insertPortfolio(portfolioUuid, true);
- }
-
- private void insertPortfolio(String portfolioUuid, boolean migrated) {
- db.executeInsert("portfolios",
- "uuid", portfolioUuid,
- "kee", portfolioUuid,
- "name", portfolioUuid,
- "private", true,
- "root_uuid", portfolioUuid,
- "selection_mode", "MANUAL",
- MEASURES_MIGRATED_COLUMN, migrated,
- "created_at", 12L,
- "updated_at", 12L);
- }
-
- private void insertMigratedMeasure(String branch, String componentUuid) {
- db.executeInsert("measures",
- "component_uuid", componentUuid,
- "branch_uuid", branch,
- "json_value", "{\"any\":\"thing\"}",
- "json_value_hash", 1234,
- "created_at", 12,
- "updated_at", 12);
- }
-}
diff --git a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetricsTest.java b/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetricsTest.java
deleted file mode 100644
index a38a693cb3f..00000000000
--- a/server/sonar-db-migration/src/it/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetricsTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.MigrationDbTester;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.api.measures.CoreMetrics.MAINTAINABILITY_ISSUES_KEY;
-import static org.sonar.api.measures.CoreMetrics.NEW_MAINTAINABILITY_ISSUES_KEY;
-import static org.sonar.api.measures.CoreMetrics.NEW_RELIABILITY_ISSUES_KEY;
-import static org.sonar.api.measures.CoreMetrics.NEW_SECURITY_ISSUES_KEY;
-import static org.sonar.api.measures.CoreMetrics.RELIABILITY_ISSUES_KEY;
-import static org.sonar.api.measures.CoreMetrics.SECURITY_ISSUES_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_ISSUES_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_SECURITY_ISSUES_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_RELIABILITY_ISSUES_KEY;
-import static org.sonar.core.metric.SoftwareQualitiesMetrics.SOFTWARE_QUALITY_SECURITY_ISSUES_KEY;
-import static org.sonar.server.platform.db.migration.version.v108.MeasureMigration.MIGRATION_MAP;
-
-class MigrateProjectMeasuresDeprecatedMetricsTest {
- private static final String ANALYSIS_UUID_1 = UuidFactoryImpl.INSTANCE.create();
- private static final String ANALYSIS_UUID_2 = UuidFactoryImpl.INSTANCE.create();
- @RegisterExtension
- private final MigrationDbTester db = MigrationDbTester.createForMigrationStep(MigrateProjectMeasuresDeprecatedMetrics.class);
- private final MigrateProjectMeasuresDeprecatedMetrics underTest = new MigrateProjectMeasuresDeprecatedMetrics(db.database(),
- UuidFactoryImpl.INSTANCE);
- private Map<String, String> metricsToMigrate;
- private Map<String, String> replacementMetrics;
-
- @BeforeEach
- void init() {
- metricsToMigrate = insertMetricsToMigrate();
- replacementMetrics = insertReplacementMetrics();
- }
-
- @Test
- void execute_shouldCreateNewMetrics() throws SQLException {
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "1");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(RELIABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "3");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(SECURITY_ISSUES_KEY), ANALYSIS_UUID_1, "5");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(NEW_MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "11");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(NEW_RELIABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "13");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(NEW_SECURITY_ISSUES_KEY), ANALYSIS_UUID_1, "15");
- underTest.execute();
-
- assertThat(db.select("select metric_uuid, value from project_measures where metric_uuid in (%s)"
- .formatted(replacementMetrics.values().stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")))))
- .hasSize(6)
- .map(m -> Map.of("metric_uuid", m.get("metric_uuid"), "value", ((Number) m.get("value")).longValue()))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY), "value", 1L)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_RELIABILITY_ISSUES_KEY), "value", 3L)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_SECURITY_ISSUES_KEY), "value", 5L)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(NEW_SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY), "value", 11L)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(NEW_SOFTWARE_QUALITY_RELIABILITY_ISSUES_KEY), "value", 13L)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(NEW_SOFTWARE_QUALITY_SECURITY_ISSUES_KEY), "value", 15L)));
- }
-
- @Test
- void execute_shouldBeReentrant() throws SQLException {
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "1");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(RELIABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "3");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(SECURITY_ISSUES_KEY), ANALYSIS_UUID_1, "5");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(NEW_MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "11");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(NEW_RELIABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "13");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(NEW_SECURITY_ISSUES_KEY), ANALYSIS_UUID_1, "15");
- underTest.execute();
- underTest.execute();
- assertThat(db.select("select * from project_measures"))
- .hasSize(MIGRATION_MAP.size() * 2);
- }
-
- @Test
- void execute_whenValueCannotBeConverted_shouldCreateOtherNewMetrics() throws SQLException {
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "1");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(RELIABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "NOT_VALID_NUMBER");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(SECURITY_ISSUES_KEY), ANALYSIS_UUID_1, "5");
- underTest.execute();
-
- assertThat(db.select("select metric_uuid, value from project_measures where metric_uuid in (%s)"
- .formatted(replacementMetrics.values().stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")))))
- .hasSize(2)
- .map(m -> Map.of("metric_uuid", m.get("metric_uuid"), "value", ((Number) m.get("value")).longValue()))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY), "value", 1L)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_SECURITY_ISSUES_KEY), "value", 5L)));
- }
-
- @Test
- void execute_whenWasPartiallyMigrated_shouldContinueWithOtherAnalysis() throws SQLException {
-
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, "1");
- createProjectMeasureForNewMetric(replacementMetrics.get(SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_1, 1);
-
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(MAINTAINABILITY_ISSUES_KEY), ANALYSIS_UUID_2, "4");
- createProjectMeasureForDeprecatedMetric(metricsToMigrate.get(SECURITY_ISSUES_KEY), ANALYSIS_UUID_2, "5");
- underTest.execute();
-
- assertThat(db.select("select metric_uuid, value, analysis_uuid from project_measures where metric_uuid in (%s)"
- .formatted(replacementMetrics.values().stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")))))
- .hasSize(3)
- .map(m -> Map.of("metric_uuid", m.get("metric_uuid"), "value", ((Number) m.get("value")).longValue(), "analysis_uuid", m.get("analysis_uuid")))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY), "value", 1L, "analysis_uuid", ANALYSIS_UUID_1)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY), "value", 4L, "analysis_uuid", ANALYSIS_UUID_2)))
- .contains((Map.of("metric_uuid", replacementMetrics.get(SOFTWARE_QUALITY_SECURITY_ISSUES_KEY), "value", 5L, "analysis_uuid",
- ANALYSIS_UUID_2)));
- }
-
- private void createProjectMeasureForDeprecatedMetric(String metricUuid, String analysisUuid, String totalIssues) {
- String uuid = UuidFactoryImpl.INSTANCE.create();
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("TEXT_VALUE", "{\"LOW\":X,\"MEDIUM\":Y,\"HIGH\":Z,\"total\":" + totalIssues + "}"),
- Map.entry("ANALYSIS_UUID", analysisUuid),
- Map.entry("METRIC_UUID", metricUuid),
- Map.entry("COMPONENT_UUID", UuidFactoryImpl.INSTANCE.create()));
- db.executeInsert("project_measures", map);
- }
-
- private void createProjectMeasureForNewMetric(String metricUuid, String analysisUuid, int totalIssues) {
- String uuid = UuidFactoryImpl.INSTANCE.create();
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("VALUE", totalIssues),
- Map.entry("ANALYSIS_UUID", analysisUuid),
- Map.entry("METRIC_UUID", metricUuid),
- Map.entry("COMPONENT_UUID", UuidFactoryImpl.INSTANCE.create()));
- db.executeInsert("project_measures", map);
- }
-
- private Map<String, String> insertMetricsToMigrate() {
- Map<String, String> createdMetrics = new HashMap<>();
- MIGRATION_MAP.keySet().forEach(metricKey -> createdMetrics.put(metricKey, insertMetric(metricKey)));
- return createdMetrics;
- }
-
- private Map<String, String> insertReplacementMetrics() {
- Map<String, String> createdMetrics = new HashMap<>();
- MIGRATION_MAP.values().forEach(metricKey -> createdMetrics.put(metricKey, insertMetric(metricKey)));
- return createdMetrics;
- }
-
- private String insertMetric(String key) {
- String uuid = UuidFactoryImpl.INSTANCE.create();
- Map<String, Object> map = Map.ofEntries(
- Map.entry("UUID", uuid),
- Map.entry("NAME", key));
- db.executeInsert("metrics", map);
- return uuid;
- }
-}
diff --git a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT/schema.sql b/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT/schema.sql
deleted file mode 100644
index 28453ffd067..00000000000
--- a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRolesIT/schema.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE "GROUP_ROLES"(
- "UUID" CHARACTER VARYING(40) NOT NULL,
- "ROLE" CHARACTER VARYING(64) NOT NULL,
- "COMPONENT_UUID" CHARACTER VARYING(40),
- "GROUP_UUID" CHARACTER VARYING(40)
-);
-ALTER TABLE "GROUP_ROLES" ADD CONSTRAINT "PK_GROUP_ROLES" PRIMARY KEY("UUID");
-CREATE INDEX "GROUP_ROLES_COMPONENT_UUID" ON "GROUP_ROLES"("COMPONENT_UUID" NULLS FIRST);
-CREATE UNIQUE INDEX "UNIQ_GROUP_ROLES" ON "GROUP_ROLES"("GROUP_UUID" NULLS FIRST, "COMPONENT_UUID" NULLS FIRST, "ROLE" NULLS FIRST);
diff --git a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT/schema.sql b/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT/schema.sql
deleted file mode 100644
index f19732423ab..00000000000
--- a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRolesIT/schema.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE "USER_ROLES"(
- "UUID" CHARACTER VARYING(40) NOT NULL,
- "ROLE" CHARACTER VARYING(64) NOT NULL,
- "COMPONENT_UUID" CHARACTER VARYING(40),
- "USER_UUID" CHARACTER VARYING(255)
-);
-ALTER TABLE "USER_ROLES" ADD CONSTRAINT "PK_USER_ROLES" PRIMARY KEY("UUID");
-CREATE INDEX "USER_ROLES_COMPONENT_UUID" ON "USER_ROLES"("COMPONENT_UUID" NULLS FIRST);
-CREATE INDEX "USER_ROLES_USER" ON "USER_ROLES"("USER_UUID" NULLS FIRST);
diff --git a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT/schema.sql b/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT/schema.sql
deleted file mode 100644
index 9b4b255b6e5..00000000000
--- a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveriesIT/schema.sql
+++ /dev/null
@@ -1,19 +0,0 @@
-CREATE TABLE "WEBHOOK_DELIVERIES"(
- "UUID" CHARACTER VARYING(40) NOT NULL,
- "WEBHOOK_UUID" CHARACTER VARYING(40) NOT NULL,
- "PROJECT_UUID" CHARACTER VARYING(40) NOT NULL,
- "CE_TASK_UUID" CHARACTER VARYING(40),
- "ANALYSIS_UUID" CHARACTER VARYING(40),
- "NAME" CHARACTER VARYING(100) NOT NULL,
- "URL" CHARACTER VARYING(2000) NOT NULL,
- "SUCCESS" BOOLEAN NOT NULL,
- "HTTP_STATUS" INTEGER,
- "DURATION_MS" BIGINT NOT NULL,
- "PAYLOAD" CHARACTER LARGE OBJECT NOT NULL,
- "ERROR_STACKTRACE" CHARACTER LARGE OBJECT,
- "CREATED_AT" BIGINT NOT NULL
-);
-ALTER TABLE "WEBHOOK_DELIVERIES" ADD CONSTRAINT "PK_WEBHOOK_DELIVERIES" PRIMARY KEY("UUID");
-CREATE INDEX "CE_TASK_UUID" ON "WEBHOOK_DELIVERIES"("CE_TASK_UUID" NULLS FIRST);
-CREATE INDEX "WD_PROJECT_UUID" ON "WEBHOOK_DELIVERIES"("PROJECT_UUID" NULLS FIRST);
-CREATE INDEX "WD_WEBHOOK_UUID_CREATED_AT" ON "WEBHOOK_DELIVERIES"("WEBHOOK_UUID", "CREATED_AT" NULLS FIRST);
diff --git a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT/schema.sql b/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT/schema.sql
deleted file mode 100644
index ed4f3118592..00000000000
--- a/server/sonar-db-migration/src/it/resources/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTableIT/schema.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-CREATE TABLE "RULE_TAGS"(
- "RULE_UUID" CHARACTER VARYING(40) NOT NULL,
- "IS_SYSTEM_TAG" BOOLEAN NOT NULL,
- "VALUE" CHARACTER VARYING(40) NOT NULL
-); \ No newline at end of file
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
index f844369bf02..a4ea57f9d35 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/MigrationConfigurationModule.java
@@ -28,15 +28,6 @@ import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
import org.sonar.server.platform.db.migration.step.MigrationStepRegistryImpl;
import org.sonar.server.platform.db.migration.step.MigrationStepsProvider;
import org.sonar.server.platform.db.migration.version.v00.DbVersion00;
-import org.sonar.server.platform.db.migration.version.v100.DbVersion100;
-import org.sonar.server.platform.db.migration.version.v101.DbVersion101;
-import org.sonar.server.platform.db.migration.version.v102.DbVersion102;
-import org.sonar.server.platform.db.migration.version.v103.DbVersion103;
-import org.sonar.server.platform.db.migration.version.v104.DbVersion104;
-import org.sonar.server.platform.db.migration.version.v105.DbVersion105;
-import org.sonar.server.platform.db.migration.version.v106.DbVersion106;
-import org.sonar.server.platform.db.migration.version.v107.DbVersion107;
-import org.sonar.server.platform.db.migration.version.v108.DbVersion108;
import org.sonar.server.platform.db.migration.version.v202501.DbVersion202501;
import org.sonar.server.platform.db.migration.version.v202502.DbVersion202502;
@@ -47,15 +38,6 @@ public class MigrationConfigurationModule extends Module {
MigrationHistoryTableImpl.class,
// DbVersion implementations
DbVersion00.class,
- DbVersion100.class,
- DbVersion101.class,
- DbVersion102.class,
- DbVersion103.class,
- DbVersion104.class,
- DbVersion105.class,
- DbVersion106.class,
- DbVersion107.class,
- DbVersion108.class,
DbVersion202501.class,
DbVersion202502.class,
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java
index a1222487b07..409f4d7c039 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/DatabaseVersion.java
@@ -30,8 +30,11 @@ public class DatabaseVersion {
* versions must be previously upgraded to LTA version.
* Note that the value can't be less than current LTA version.
*/
- public static final long MIN_UPGRADE_VERSION = 6_802;
- public static final String MIN_UPGRADE_VERSION_HUMAN_READABLE = "9.9";
+ public static final long MIN_UPGRADE_VERSION = 108026;
+
+ // In reality user is required to upgrade just to 10.8 but we want to 'market' 2025.1
+ public static final String MIN_UPGRADE_VERSION_HUMAN_READABLE = "2025.1";
+ public static final String MIN_UPGRADE_VERSION_COMMUNITY_BUILD_READABLE = "24.12";
private final MigrationSteps migrationSteps;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java
index 4328a19367f..c162ae2c79c 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/CreateInitialSchema.java
@@ -24,10 +24,12 @@ import org.sonar.db.Database;
import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
import org.sonar.server.platform.db.migration.def.ColumnDef;
+import org.sonar.server.platform.db.migration.def.DecimalColumnDef;
import org.sonar.server.platform.db.migration.def.IntegerColumnDef;
import org.sonar.server.platform.db.migration.def.TimestampColumnDef;
import org.sonar.server.platform.db.migration.def.TinyIntColumnDef;
import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
+import org.sonar.server.platform.db.migration.sql.AddPrimaryKeyBuilder;
import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
import org.sonar.server.platform.db.migration.step.DdlChange;
@@ -103,6 +105,7 @@ public class CreateInitialSchema extends DdlChange {
createActiveRules(context);
createAlmPats(context);
createAlmSettings(context);
+ createAnticipatedTransitions(context);
createProjectAlmSettings(context);
createAnalysisProperties(context);
createAppBranchProjectBranch(context);
@@ -115,22 +118,30 @@ public class CreateInitialSchema extends DdlChange {
createCeTaskInput(context);
createCeTaskMessage(context);
createComponents(context);
+ createCves(context);
+ createCveCwe(context);
createDefaultQProfiles(context);
createDeprecatedRuleKeys(context);
createDuplicationsIndex(context);
+ createDevopsPermsMapping(context);
createEsQueue(context);
createEventComponentChanges(context);
createEvents(context);
+ createExternalGroups(context);
createFileSources(context);
+ createGithubOrganizationGroups(context);
createGroupRoles(context);
createGroups(context);
createGroupsUsers(context);
createInternalComponentProps(context);
createInternalProperties(context);
createIssueChanges(context);
+ createIssueImpacts(context);
createIssues(context);
- createLiveMeasures(context);
+ createIssuesDependency(context);
+ createIssuesFixed(context);
createMetrics(context);
+ createMeasures(context);
createNewCodePeriods(context);
createNewCodeReferenceIssues(context);
createNotifications(context);
@@ -146,14 +157,16 @@ public class CreateInitialSchema extends DdlChange {
createPortfolios(context);
createProjectBadgeToken(context);
createProjectBranches(context);
+ createProjectDependencies(context);
createProjectLinks(context);
- createProjectMappings(context);
createProjectMeasures(context);
createProjectQprofiles(context);
createProjects(context);
createProjectQGates(context);
createProperties(context);
createPushEvents(context);
+ createReportSchedules(context);
+ createReportSubscriptions(context);
createQGateGroupPermissions(context);
createQGateUserPermissions(context);
createQProfileChanges(context);
@@ -161,11 +174,18 @@ public class CreateInitialSchema extends DdlChange {
createQProfileEditUsers(context);
createQualityGateConditions(context);
createQualityGates(context);
+ createRuleChanges(context);
+ createRuleImpactChanges(context);
+ createRuleTags(context);
+ createScimGroups(context);
createScimUsers(context);
+ createScmAccounts(context);
createSessionTokens(context);
+ createTelemetryMetricsSent(context);
createRulesRepository(context);
createRuleDescSections(context);
createRules(context);
+ createRulesDefaultImpacts(context);
createRulesParameters(context);
createRulesProfiles(context);
createSamlMessageIds(context);
@@ -179,6 +199,22 @@ public class CreateInitialSchema extends DdlChange {
createWebhooks(context);
}
+ private void createAnticipatedTransitions(Context context) {
+ context.execute(new CreateTableBuilder(getDialect(), "anticipated_transitions")
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("project_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("user_uuid").setIsNullable(false).setLimit(USER_UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("transition").setIsNullable(false).setLimit(20).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("transition_comment").setLimit(MAX_SIZE).build())
+ .addColumn(newIntegerColumnDefBuilder().setColumnName("line").build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("message").setLimit(MAX_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("line_hash").setLimit(255).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_key").setIsNullable(false).setLimit(200).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("file_path").setIsNullable(false).setLimit(1500).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
+ .build());
+ }
+
private void createActiveRuleParameters(Context context) {
String tableName = "active_rule_parameters";
VarcharColumnDef activeRuleUuidColumnDef = newVarcharColumnDefBuilder("active_rule_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
@@ -206,6 +242,8 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(NULLABLE_TECHNICAL_UPDATED_AT_COL)
.addColumn(profileUuidCol)
.addColumn(ruleUuidCol)
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("prioritized_rule").setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("impacts").setIsNullable(true).setLimit(500).build())
.build());
addIndex(context, "active_rules", "uniq_profile_rule_uuids", true, profileUuidCol, ruleUuidCol);
}
@@ -349,20 +387,19 @@ public class CreateInitialSchema extends DdlChange {
private void createCeActivity(Context context) {
String tableName = "ce_activity";
- VarcharColumnDef uuidCol = UUID_COL;
- VarcharColumnDef mainComponentUuidCol = newVarcharColumnDefBuilder("main_component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
- VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(true).build();
+ VarcharColumnDef componentUuidColumn = newVarcharColumnDefBuilder("component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+ VarcharColumnDef entityUuidColumn = newVarcharColumnDefBuilder("entity_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
VarcharColumnDef statusCol = newVarcharColumnDefBuilder(STATUS_COL_NAME).setLimit(15).setIsNullable(false).build();
BooleanColumnDef mainIsLastCol = newBooleanColumnDefBuilder().setColumnName("main_is_last").setIsNullable(false).build();
- VarcharColumnDef mainIsLastKeyCol = newVarcharColumnDefBuilder("main_is_last_key").setLimit(55).setIsNullable(false).build();
+ VarcharColumnDef mainIsLastKeyCol = newVarcharColumnDefBuilder("main_is_last_key").setLimit(80).setIsNullable(false).build();
BooleanColumnDef isLastCol = newBooleanColumnDefBuilder().setColumnName("is_last").setIsNullable(false).build();
- VarcharColumnDef isLastKeyCol = newVarcharColumnDefBuilder("is_last_key").setLimit(55).setIsNullable(false).build();
+ VarcharColumnDef isLastKeyCol = newVarcharColumnDefBuilder("is_last_key").setLimit(80).setIsNullable(false).build();
context.execute(
newTableBuilder(tableName)
- .addPkColumn(uuidCol)
- .addColumn(newVarcharColumnDefBuilder("task_type").setLimit(15).setIsNullable(false).build())
- .addColumn(mainComponentUuidCol)
- .addColumn(componentUuidCol)
+ .addPkColumn(UUID_COL)
+ .addColumn(newVarcharColumnDefBuilder("task_type").setLimit(40).setIsNullable(false).build())
+ .addColumn(entityUuidColumn)
+ .addColumn(componentUuidColumn)
.addColumn(statusCol)
.addColumn(mainIsLastCol)
.addColumn(mainIsLastKeyCol)
@@ -383,24 +420,23 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(TECHNICAL_UPDATED_AT_COL)
.addColumn(newVarcharColumnDefBuilder("node_name").setLimit(100).setIsNullable(true).build())
.build());
- addIndex(context, tableName, "ce_activity_component", false, componentUuidCol);
+ addIndex(context, tableName, "ce_activity_component", false, componentUuidColumn);
addIndex(context, tableName, "ce_activity_islast", false, isLastCol, statusCol);
addIndex(context, tableName, "ce_activity_islast_key", false, isLastKeyCol);
- addIndex(context, tableName, "ce_activity_main_component", false, mainComponentUuidCol);
addIndex(context, tableName, "ce_activity_main_islast", false, mainIsLastCol, statusCol);
addIndex(context, tableName, "ce_activity_main_islast_key", false, mainIsLastKeyCol);
+ addIndex(context, tableName, "ce_activity_entity_uuid", false, entityUuidColumn);
}
private void createCeQueue(Context context) {
String tableName = "ce_queue";
- VarcharColumnDef uuidCol = UUID_COL;
- VarcharColumnDef mainComponentUuidCol = newVarcharColumnDefBuilder("main_component_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
+ VarcharColumnDef entityUuidColumn = newVarcharColumnDefBuilder("entity_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(true).build();
context.execute(
newTableBuilder(tableName)
- .addPkColumn(uuidCol)
- .addColumn(newVarcharColumnDefBuilder("task_type").setLimit(15).setIsNullable(false).build())
- .addColumn(mainComponentUuidCol)
+ .addPkColumn(UUID_COL)
+ .addColumn(newVarcharColumnDefBuilder("task_type").setLimit(40).setIsNullable(false).build())
+ .addColumn(entityUuidColumn)
.addColumn(componentUuidCol)
.addColumn(newVarcharColumnDefBuilder(STATUS_COL_NAME).setLimit(15).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("submitter_uuid").setLimit(USER_UUID_SIZE).setIsNullable(true).build())
@@ -410,8 +446,8 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(TECHNICAL_CREATED_AT_COL)
.addColumn(TECHNICAL_UPDATED_AT_COL)
.build());
- addIndex(context, tableName, "ce_queue_main_component", false, mainComponentUuidCol);
addIndex(context, tableName, "ce_queue_component", false, componentUuidCol);
+ addIndex(context, tableName, "ce_queue_entity_uuid", false, entityUuidColumn);
}
private void createCeScannerContext(Context context) {
@@ -469,12 +505,9 @@ public class CreateInitialSchema extends DdlChange {
private void createComponents(Context context) {
String tableName = "components";
VarcharColumnDef keeCol = newVarcharColumnDefBuilder("kee").setIsNullable(true).setLimit(1000).build();
- VarcharColumnDef moduleUuidCol = newVarcharColumnDefBuilder("module_uuid").setIsNullable(true).setLimit(50).build();
VarcharColumnDef branchUuidCol = newVarcharColumnDefBuilder(BRANCH_UUID_COL_NAME).setIsNullable(false).setLimit(50).build();
VarcharColumnDef qualifierCol = newVarcharColumnDefBuilder("qualifier").setIsNullable(true).setLimit(10).build();
- VarcharColumnDef rootUuidCol = newVarcharColumnDefBuilder("root_uuid").setIsNullable(false).setLimit(50).build();
VarcharColumnDef uuidCol = newVarcharColumnDefBuilder("uuid").setIsNullable(false).setLimit(50).build();
- VarcharColumnDef mainBranchProjectUuidCol = newVarcharColumnDefBuilder("main_branch_project_uuid").setIsNullable(true).setLimit(50).build();
context.execute(newTableBuilder(tableName)
.addColumn(uuidCol)
@@ -487,15 +520,11 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder("scope").setIsNullable(true).setLimit(3).build())
.addColumn(qualifierCol)
.addColumn(newBooleanColumnDefBuilder().setColumnName(PRIVATE_COL_NAME).setIsNullable(false).build())
- .addColumn(rootUuidCol)
.addColumn(newVarcharColumnDefBuilder(LANGUAGE_COL_NAME).setIsNullable(true).setLimit(20).build())
.addColumn(newVarcharColumnDefBuilder("copy_component_uuid").setIsNullable(true).setLimit(50).build())
.addColumn(newVarcharColumnDefBuilder("path").setIsNullable(true).setLimit(2000).build())
.addColumn(newVarcharColumnDefBuilder("uuid_path").setIsNullable(false).setLimit(1500).build())
.addColumn(branchUuidCol)
- .addColumn(moduleUuidCol)
- .addColumn(newVarcharColumnDefBuilder("module_uuid_path").setIsNullable(true).setLimit(1500).build())
- .addColumn(mainBranchProjectUuidCol)
.addColumn(newBooleanColumnDefBuilder().setColumnName("b_changed").setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("b_name").setIsNullable(true).setLimit(500).build())
.addColumn(newVarcharColumnDefBuilder("b_long_name").setIsNullable(true).setLimit(500).build())
@@ -506,20 +535,65 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder("b_copy_component_uuid").setIsNullable(true).setLimit(50).build())
.addColumn(newVarcharColumnDefBuilder("b_path").setIsNullable(true).setLimit(2000).build())
.addColumn(newVarcharColumnDefBuilder("b_uuid_path").setIsNullable(true).setLimit(1500).build())
- .addColumn(newVarcharColumnDefBuilder("b_module_uuid").setIsNullable(true).setLimit(50).build())
- .addColumn(newVarcharColumnDefBuilder("b_module_uuid_path").setIsNullable(true).setLimit(1500).build())
.addColumn(newTimestampColumnDefBuilder().setColumnName(CREATED_AT_COL_NAME).setIsNullable(true).build())
.build());
- addIndex(context, tableName, "projects_module_uuid", false, moduleUuidCol);
addIndex(context, tableName, "projects_qualifier", false, qualifierCol);
- addIndex(context, tableName, "projects_root_uuid", false, rootUuidCol);
- addIndex(context, tableName, "idx_main_branch_prj_uuid", false, mainBranchProjectUuidCol);
addIndex(context, tableName, "components_uuid", true, uuidCol);
addIndex(context, tableName, "components_branch_uuid", false, branchUuidCol);
addIndex(context, tableName, "components_kee_branch_uuid", true, keeCol, branchUuidCol);
}
+
+ private void createCves(Context context) {
+ String tableName = "cves";
+
+ VarcharColumnDef uuidColumn = newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+ VarcharColumnDef idColumn = newVarcharColumnDefBuilder().setColumnName("id").setIsNullable(false).setLimit(DESCRIPTION_SECTION_KEY_SIZE).build();
+ VarcharColumnDef descriptionColumn = newVarcharColumnDefBuilder().setColumnName("description").setIsNullable(false).setLimit(MAX_SIZE).build();
+ BigIntegerColumnDef updatedAtColumn = newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build();
+ BigIntegerColumnDef createdAtColumn = newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build();
+ BigIntegerColumnDef lastModifiedColumn = newBigIntegerColumnDefBuilder().setColumnName("last_modified_at").setIsNullable(true).build();
+ BigIntegerColumnDef publishedColumn = newBigIntegerColumnDefBuilder().setColumnName("published_at").setIsNullable(true).build();
+ DecimalColumnDef cvssScoreColumn = newDecimalColumnDefBuilder().setColumnName("cvss_score").setIsNullable(true).build();
+ DecimalColumnDef epssScoreColumn = newDecimalColumnDefBuilder().setColumnName("epss_score").setIsNullable(true).build();
+ DecimalColumnDef epssPercentileColumn = newDecimalColumnDefBuilder().setColumnName("epss_percentile").setIsNullable(true).build();
+
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(uuidColumn)
+ .addColumn(idColumn)
+ .addColumn(descriptionColumn)
+ .addColumn(cvssScoreColumn)
+ .addColumn(epssScoreColumn)
+ .addColumn(epssPercentileColumn)
+ .addColumn(publishedColumn)
+ .addColumn(lastModifiedColumn)
+ .addColumn(createdAtColumn)
+ .addColumn(updatedAtColumn)
+ .build());
+ }
+
+ private void createCveCwe(Context context) {
+ String tableName = "cve_cwe";
+
+ VarcharColumnDef cveUuidColumn = newVarcharColumnDefBuilder().setColumnName("cve_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+ VarcharColumnDef cweColumn = newVarcharColumnDefBuilder().setColumnName("cwe").setIsNullable(false).setLimit(DESCRIPTION_SECTION_KEY_SIZE).build();
+
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(cveUuidColumn)
+ .addPkColumn(cweColumn)
+ .build());
+ }
+
+ private void createIssuesDependency(Context context) {
+ String tableName = "issues_dependency";
+
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("issue_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("cve_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .build());
+ }
+
private void createDefaultQProfiles(Context context) {
String tableName = "default_qprofiles";
VarcharColumnDef profileUuidColumn = newVarcharColumnDefBuilder(QPROFILE_UUID_COL_NAME)
@@ -633,6 +707,19 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "events_component_uuid", false, componentUuid);
}
+ private void createExternalGroups(Context context) {
+ String tableName = "external_groups";
+ ColumnDef externalIdentityColumn = newVarcharColumnDefBuilder().setColumnName("external_identity_provider").setIsNullable(false).setLimit(100).build();
+ ColumnDef externalGroupIdColumn = newVarcharColumnDefBuilder().setColumnName("external_group_id").setIsNullable(false).setLimit(255).build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("group_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(externalGroupIdColumn)
+ .addColumn(externalIdentityColumn)
+ .build());
+
+ addIndex(context, tableName, "uniq_ext_grp_ext_id_provider", true, externalIdentityColumn, externalGroupIdColumn);
+ }
+
private void createFileSources(Context context) {
String tableName = "file_sources";
VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder(PROJECT_UUID_COL_NAME).setLimit(OLD_UUID_VARCHAR_SIZE).setIsNullable(false).build();
@@ -658,10 +745,34 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "file_sources_updated_at", false, updatedAtCol);
}
+
+ private void createGithubOrganizationGroups(Context context) {
+ String tableName = "github_orgs_groups";
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("group_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("organization_name").setIsNullable(false).setLimit(100).build())
+ .build());
+ }
+
+ private void createDevopsPermsMapping(Context context) {
+ String tableName = "devops_perms_mapping";
+ VarcharColumnDef devopsPlatformRoleColumn = newVarcharColumnDefBuilder().setColumnName("devops_platform_role").setIsNullable(false).setLimit(100).build();
+ VarcharColumnDef sonarqubePermissionColumn = newVarcharColumnDefBuilder().setColumnName("sonarqube_permission").setIsNullable(false).setLimit(64).build();
+ VarcharColumnDef devopsPlatformColumn = newVarcharColumnDefBuilder().setColumnName("devops_platform").setLimit(40).setIsNullable(false).setDefaultValue("github").build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(devopsPlatformRoleColumn)
+ .addColumn(sonarqubePermissionColumn)
+ .addColumn(devopsPlatformColumn)
+ .build());
+
+ addIndex(context, tableName, "uniq_devops_perms_mapping", true, devopsPlatformColumn, devopsPlatformRoleColumn, sonarqubePermissionColumn);
+ }
+
private void createGroupRoles(Context context) {
String tableName = "group_roles";
VarcharColumnDef roleCol = newVarcharColumnDefBuilder("role").setLimit(64).setIsNullable(false).build();
- VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setIsNullable(true).setLimit(UUID_SIZE).build();
+ VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder("entity_uuid").setIsNullable(true).setLimit(UUID_SIZE).build();
VarcharColumnDef groupUuidCol = newVarcharColumnDefBuilder(GROUP_UUID_COL_NAME).setIsNullable(true).setLimit(UUID_SIZE).build();
context.execute(
newTableBuilder(tableName)
@@ -670,8 +781,8 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(componentUuidCol)
.addColumn(groupUuidCol)
.build());
- addIndex(context, tableName, "group_roles_component_uuid", false, componentUuidCol);
addIndex(context, tableName, "uniq_group_roles", true, groupUuidCol, componentUuidCol, roleCol);
+ addIndex(context, tableName, "group_roles_entity_uuid", false, componentUuidCol);
}
private void createGroups(Context context) {
@@ -696,6 +807,7 @@ public class CreateInitialSchema extends DdlChange {
newTableBuilder(tableName)
.addColumn(groupUuidCol)
.addColumn(userUuidCol)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setLimit(UUID_SIZE).setIsNullable(false).build())
.build());
addIndex(context, tableName, "index_groups_users_group_uuid", false, groupUuidCol);
addIndex(context, tableName, "index_groups_users_user_uuid", false, userUuidCol);
@@ -720,7 +832,7 @@ public class CreateInitialSchema extends DdlChange {
private void createInternalProperties(Context context) {
context.execute(
newTableBuilder("internal_properties")
- .addPkColumn(newVarcharColumnDefBuilder("kee").setLimit(20).setIsNullable(false).build())
+ .addPkColumn(newVarcharColumnDefBuilder("kee").setLimit(40).setIsNullable(false).build())
.addColumn(newBooleanColumnDefBuilder().setColumnName(IS_EMPTY_COL_NAME).setIsNullable(false).build())
.addColumn(newVarcharColumnDefBuilder().setColumnName(TEXT_VALUE_COL_NAME).setLimit(MAX_SIZE).setIgnoreOracleUnit(true).build())
.addColumn(newClobColumnDefBuilder().setColumnName(CLOB_VALUE_COL_NAME).setIsNullable(true).build())
@@ -753,6 +865,31 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "issue_changes_issue_key_type", false, issueKeyCol, changeTypeCol);
}
+ private void createIssuesFixed(Context context) {
+ String tableName = "issues_fixed";
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("pull_request_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("issue_key").setIsNullable(false).setLimit(50).build())
+ .build());
+ }
+
+ private void createIssueImpacts(Context context) {
+ String tableName = "issues_impacts";
+
+ VarcharColumnDef issueKeyColumn = newVarcharColumnDefBuilder().setColumnName("issue_key").setIsNullable(false).setLimit(UUID_SIZE).build();
+ VarcharColumnDef softwareQualityColumn = newVarcharColumnDefBuilder().setColumnName("software_quality").setIsNullable(false).setLimit(40).build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addColumn(issueKeyColumn)
+ .addColumn(softwareQualityColumn)
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("severity").setIsNullable(false).setLimit(40).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("manual_severity").setIsNullable(false).setDefaultValue(false).build())
+ .build());
+
+ addIndex(context, tableName, "uniq_iss_key_sof_qual", true, issueKeyColumn, softwareQualityColumn);
+
+ context.execute(new AddPrimaryKeyBuilder(tableName, "issue_key", "software_quality").build());
+ }
+
private void createIssues(Context context) {
var tableName = "issues";
VarcharColumnDef assigneeCol = newVarcharColumnDefBuilder("assignee").setLimit(USER_UUID_SIZE).build();
@@ -789,10 +926,12 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(projectUuidCol)
.addColumn(newBlobColumnDefBuilder().setColumnName("locations").build())
.addColumn(new TinyIntColumnDef.Builder().setColumnName("issue_type").build())
- .addColumn(newBooleanColumnDefBuilder().setColumnName("from_hotspot").setIsNullable(true).build())
.addColumn(newBooleanColumnDefBuilder().setColumnName("quick_fix_available").setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("rule_description_context_key").setLimit(50).build())
.addColumn(newBlobColumnDefBuilder().setColumnName("message_formattings").build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("code_variants").setLimit(4000).setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("clean_code_attribute").setLimit(40).setIsNullable(true).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("prioritized_rule").setIsNullable(true).build())
.build());
addIndex(context, tableName, "issues_assignee", false, assigneeCol);
@@ -804,25 +943,27 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "issues_rule_uuid", false, ruleUuidCol);
}
- private void createLiveMeasures(Context context) {
- String tableName = "live_measures";
- VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder(PROJECT_UUID_COL_NAME).setIsNullable(false).setLimit(OLD_UUID_VARCHAR_SIZE).build();
- VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setIsNullable(false).setLimit(OLD_UUID_VARCHAR_SIZE).build();
- VarcharColumnDef metricUuidCol = newVarcharColumnDefBuilder(METRIC_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(false).build();
- context.execute(newTableBuilder(tableName)
- .addPkColumn(UUID_COL)
- .addColumn(projectUuidCol)
- .addColumn(componentUuidCol)
- .addColumn(metricUuidCol)
- .addColumn(newDecimalColumnDefBuilder().setColumnName(VALUE_COL_NAME).setPrecision(38).setScale(20).build())
- .addColumn(newVarcharColumnDefBuilder(TEXT_VALUE_COL_NAME).setIsNullable(true).setLimit(MAX_SIZE).build())
- .addColumn(newBlobColumnDefBuilder().setColumnName("measure_data").setIsNullable(true).build())
- .addColumn(newVarcharColumnDefBuilder("update_marker").setIsNullable(true).setLimit(UUID_SIZE).build())
- .addColumn(TECHNICAL_CREATED_AT_COL)
- .addColumn(TECHNICAL_UPDATED_AT_COL)
+ private void createMeasures(Context context) {
+ String columnComponentUuid = "component_uuid";
+ String columnBranchUuid = "branch_uuid";
+ String columnJsonValue = "json_value";
+ String columnJsonValueHash = "json_value_hash";
+ String columnCreatedAt = "created_at";
+ String columnUpdatedAt = "updated_at";
+
+ String tableName = "measures";
+
+ VarcharColumnDef branchUuidColumnDef = newVarcharColumnDefBuilder().setColumnName(columnBranchUuid).setIsNullable(false).setLimit(UUID_SIZE).build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName(columnComponentUuid).setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(branchUuidColumnDef)
+ .addColumn(newClobColumnDefBuilder().setColumnName(columnJsonValue).setIsNullable(false).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName(columnJsonValueHash).setIsNullable(false).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName(columnCreatedAt).setIsNullable(false).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName(columnUpdatedAt).setIsNullable(false).build())
.build());
- addIndex(context, tableName, "live_measures_project", false, projectUuidCol);
- addIndex(context, tableName, "live_measures_component", true, componentUuidCol, metricUuidCol);
+
+ addIndex(context, tableName, "measures_branch_uuid", false, branchUuidColumnDef);
}
private void createMetrics(Context context) {
@@ -864,6 +1005,7 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(valueCol)
.addColumn(TECHNICAL_UPDATED_AT_COL)
.addColumn(TECHNICAL_CREATED_AT_COL)
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("previous_non_compliant_value").setLimit(255).setIsNullable(true).build())
.build());
addIndex(context, tableName, "uniq_new_code_periods", true, projectUuidCol, branchUuidCol);
@@ -1073,8 +1215,30 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(TECHNICAL_UPDATED_AT_COL)
.addColumn(newBooleanColumnDefBuilder("exclude_from_purge").setDefaultValue(false).setIsNullable(false).build())
.addColumn(newBooleanColumnDefBuilder("need_issue_sync").setIsNullable(false).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("is_main").setIsNullable(false).build())
.build());
addIndex(context, tableName, "uniq_project_branches", true, branchTypeCol, projectUuidCol, keeCol);
+ addIndex(context, tableName, "project_branches_project_uuid", false, projectUuidCol);
+ }
+
+ private void createProjectDependencies(Context context) {
+ String tableName = "project_dependencies";
+
+ String columnUuidName = "uuid";
+ String columnVersionName = "version";
+ String columnIncludePathsName = "include_paths";
+ String columnPackageManagerName = "package_manager";
+ String columnCreatedAtName = "created_at";
+ String columnUpdatedAtName = "updated_at";
+
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName(columnUuidName).setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newClobColumnDefBuilder().setColumnName(columnVersionName).setIsNullable(true).build())
+ .addColumn(newClobColumnDefBuilder().setColumnName(columnIncludePathsName).setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName(columnPackageManagerName).setIsNullable(true).setLimit(50).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName(columnCreatedAtName).setIsNullable(false).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName(columnUpdatedAtName).setIsNullable(false).build())
+ .build());
}
private void createProjectLinks(Context context) {
@@ -1092,22 +1256,6 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "project_links_project", false, projectUuidCol);
}
- private void createProjectMappings(Context context) {
- String tableName = "project_mappings";
- VarcharColumnDef keyTypeCol = newVarcharColumnDefBuilder("key_type").setIsNullable(false).setLimit(200).build();
- VarcharColumnDef keyCol = newVarcharColumnDefBuilder("kee").setIsNullable(false).setLimit(MAX_SIZE).build();
- VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder(PROJECT_UUID_COL_NAME).setIsNullable(false).setLimit(UUID_SIZE).build();
- context.execute(newTableBuilder(tableName)
- .addPkColumn(UUID_COL)
- .addColumn(keyTypeCol)
- .addColumn(keyCol)
- .addColumn(projectUuidCol)
- .addColumn(TECHNICAL_CREATED_AT_COL)
- .build());
- addIndex(context, tableName, "key_type_kee", true, keyTypeCol, keyCol);
- addIndex(context, tableName, PROJECT_UUID_COL_NAME, false, projectUuidCol);
- }
-
private void createProjectMeasures(Context context) {
String tableName = "project_measures";
IntegerColumnDef personIdCol = newIntegerColumnDefBuilder().setColumnName("person_id").build();
@@ -1147,12 +1295,11 @@ public class CreateInitialSchema extends DdlChange {
private void createProjects(Context context) {
String tableName = "projects";
- VarcharColumnDef uuidCol = UUID_COL;
VarcharColumnDef keeCol = newVarcharColumnDefBuilder("kee").setLimit(400).setIsNullable(false).build();
VarcharColumnDef qualifierCol = newVarcharColumnDefBuilder("qualifier").setLimit(10).setIsNullable(false).build();
context.execute(
newTableBuilder(tableName)
- .addPkColumn(uuidCol)
+ .addPkColumn(UUID_COL)
.addColumn(keeCol)
.addColumn(qualifierCol)
.addColumn(newVarcharColumnDefBuilder("name").setLimit(2_000).setIsNullable(true).build())
@@ -1161,6 +1308,10 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder("tags").setLimit(500).setIsNullable(true).build())
.addColumn(NULLABLE_TECHNICAL_CREATED_AT_COL)
.addColumn(TECHNICAL_UPDATED_AT_COL)
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName("ncloc").setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("creation_method").setLimit(50).setIsNullable(false).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("contains_ai_code").setIsNullable(false).setDefaultValue(false).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("ai_code_fix_enabled").setIsNullable(false).setDefaultValue(false).build())
.withPkConstraintName("pk_new_projects")
.build());
addIndex(context, tableName, "uniq_projects_kee", true, keeCol);
@@ -1182,6 +1333,8 @@ public class CreateInitialSchema extends DdlChange {
private void createProperties(Context context) {
String tableName = "properties";
VarcharColumnDef propKey = newVarcharColumnDefBuilder("prop_key").setLimit(512).setIsNullable(false).build();
+ VarcharColumnDef entityUuidColumn = newVarcharColumnDefBuilder().setColumnName("entity_uuid").setIsNullable(true).setLimit(UUID_SIZE).build();
+ VarcharColumnDef userUuidColumn = newVarcharColumnDefBuilder().setColumnName(USER_UUID_COL_NAME).setIsNullable(true).setLimit(USER_UUID_SIZE).build();
context.execute(newTableBuilder(tableName)
.addPkColumn(UUID_COL)
.addColumn(propKey)
@@ -1189,12 +1342,13 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder(TEXT_VALUE_COL_NAME).setLimit(MAX_SIZE).build())
.addColumn(newClobColumnDefBuilder().setColumnName(CLOB_VALUE_COL_NAME).setIsNullable(true).build())
.addColumn(TECHNICAL_CREATED_AT_COL)
- .addColumn(newVarcharColumnDefBuilder().setColumnName(COMPONENT_UUID_COL_NAME).setIsNullable(true).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(USER_UUID_COL_NAME).setIsNullable(true).setLimit(USER_UUID_SIZE).build())
+ .addColumn(entityUuidColumn)
+ .addColumn(userUuidColumn)
// table with be renamed to properties in following migration, use final constraint name right away
.withPkConstraintName("pk_properties")
.build());
addIndex(context, tableName, "properties_key", false, propKey);
+ addIndex(context, tableName, "uniq_properties", true, propKey, entityUuidColumn, userUuidColumn);
}
private void createPushEvents(Context context) {
@@ -1211,6 +1365,59 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "idx_push_even_crea_uuid_proj", false, TECHNICAL_CREATED_AT_COL, UUID_COL, projectUuidCol);
}
+ private void createReportSchedules(Context context) {
+ String tableName = "report_schedules";
+ VarcharColumnDef portfolioUuidColumn = newVarcharColumnDefBuilder().setColumnName("portfolio_uuid").setIsNullable(true).setLimit(UUID_SIZE).build();
+ VarcharColumnDef branchUuidColumn = newVarcharColumnDefBuilder().setColumnName("branch_uuid").setIsNullable(true).setLimit(UUID_SIZE).build();
+ context.execute(new CreateTableBuilder(getDialect(), "report_schedules")
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(portfolioUuidColumn)
+ .addColumn(branchUuidColumn)
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_send_time_in_ms").setIsNullable(false).build())
+ .build());
+
+ addIndex(context, tableName, "uniq_report_schedules", true, portfolioUuidColumn, branchUuidColumn);
+ }
+
+ private void createReportSubscriptions(Context context) {
+ String tableName = "report_subscriptions";
+ VarcharColumnDef portfolioUuidColumn = newVarcharColumnDefBuilder().setColumnName("portfolio_uuid").setIsNullable(true).setLimit(UUID_SIZE).build();
+ VarcharColumnDef branchUuidColumn = newVarcharColumnDefBuilder().setColumnName("branch_uuid").setIsNullable(true).setLimit(UUID_SIZE).build();
+ VarcharColumnDef userUuidColumn = newVarcharColumnDefBuilder().setColumnName("user_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(portfolioUuidColumn)
+ .addColumn(branchUuidColumn)
+ .addColumn(userUuidColumn)
+ .build());
+
+ addIndex(context, tableName, "uniq_report_subscriptions", true, portfolioUuidColumn, branchUuidColumn, userUuidColumn);
+ }
+
+ private void createRuleChanges(Context context) {
+ String tableName = "rule_changes";
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("new_clean_code_attribute").setIsNullable(true).setLimit(40).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("old_clean_code_attribute").setIsNullable(true).setLimit(40).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .build());
+ }
+
+ private void createRuleImpactChanges(Context context) {
+ String tableName = "rule_impact_changes";
+ VarcharColumnDef ruleChangeUuidColumn = newVarcharColumnDefBuilder().setColumnName("rule_change_uuid").setIsNullable(false).setLimit(40).build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("new_software_quality").setIsNullable(true).setLimit(40).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("old_software_quality").setIsNullable(true).setLimit(40).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("new_severity").setIsNullable(true).setLimit(40).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("old_severity").setIsNullable(true).setLimit(40).build())
+ .addColumn(ruleChangeUuidColumn)
+ .build());
+
+ addIndex(context, tableName, "rule_impact_changes_r_c_uuid", false, ruleChangeUuidColumn);
+ }
+
private void createQGateGroupPermissions(Context context) {
String tableName = "qgate_group_permissions";
VarcharColumnDef qualityGateUuidColumn = newVarcharColumnDefBuilder(QUALITY_GATE_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(false).build();
@@ -1245,6 +1452,8 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder(USER_UUID_COL_NAME).setLimit(USER_UUID_SIZE).setIsNullable(true).build())
.addColumn(newClobColumnDefBuilder().setColumnName("change_data").setIsNullable(true).build())
.addColumn(TECHNICAL_CREATED_AT_COL)
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_change_uuid").setLimit(40).setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("sq_version").setLimit(40).setIsNullable(true).build())
.build());
addIndex(context, tableName, "qp_changes_rules_profile_uuid", false, rulesProfileUuidCol);
}
@@ -1298,9 +1507,22 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newBooleanColumnDefBuilder().setColumnName("is_built_in").setIsNullable(false).build())
.addColumn(DEPRECATED_TECHNICAL_CREATED_AT_COL)
.addColumn(DEPRECATED_TECHNICAL_UPDATED_AT_COL)
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("ai_code_supported").setIsNullable(false).setDefaultValue(false).build())
.build());
}
+
+ private void createScimGroups(Context context) {
+ String tableName = "scim_groups";
+ VarcharColumnDef groupUuidColumn = newVarcharColumnDefBuilder().setColumnName("group_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("scim_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(groupUuidColumn)
+ .build());
+
+ addIndex(context, tableName, "uniq_scim_group_uuid", true, groupUuidColumn);
+ }
+
private void createScimUsers(Context context) {
String tableName = "scim_users";
VarcharColumnDef userUuidCol = newVarcharColumnDefBuilder(USER_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(false).build();
@@ -1313,6 +1535,18 @@ public class CreateInitialSchema extends DdlChange {
addIndex(context, tableName, "uniq_scim_users_user_uuid", true, userUuidCol);
}
+ private void createScmAccounts(Context context) {
+ String tableName = "scm_accounts";
+ ColumnDef scmAccountColumn = newVarcharColumnDefBuilder().setColumnName("scm_account").setIsNullable(false).setLimit(255).build();
+
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName(USER_UUID_COL_NAME).setIsNullable(false).setLimit(USER_UUID_SIZE).build())
+ .addPkColumn(scmAccountColumn)
+ .build());
+
+ addIndex(context, tableName, "scm_accounts_scm_account", false, scmAccountColumn);
+ }
+
private void createSessionTokens(Context context) {
String tableName = "session_tokens";
VarcharColumnDef userUuidCol = newVarcharColumnDefBuilder(USER_UUID_COL_NAME).setLimit(255).setIsNullable(false).build();
@@ -1374,7 +1608,6 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder("def_remediation_gap_mult").setLimit(20).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("def_remediation_base_effort").setLimit(20).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("gap_description").setLimit(MAX_SIZE).setIsNullable(true).build())
- .addColumn(newVarcharColumnDefBuilder("system_tags").setLimit(MAX_SIZE).setIsNullable(true).build())
.addColumn(newBooleanColumnDefBuilder().setColumnName("is_template").setIsNullable(false).setDefaultValue(false).build())
.addColumn(newVarcharColumnDefBuilder("description_format").setLimit(20).setIsNullable(true).build())
.addColumn(new TinyIntColumnDef.Builder().setColumnName("rule_type").setIsNullable(true).build())
@@ -1391,16 +1624,31 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newVarcharColumnDefBuilder("remediation_function").setLimit(20).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("remediation_gap_mult").setLimit(20).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("remediation_base_effort").setLimit(20).setIsNullable(true).build())
- .addColumn(newVarcharColumnDefBuilder("tags").setLimit(4_000).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("ad_hoc_name").setLimit(200).setIsNullable(true).build())
.addColumn(newClobColumnDefBuilder().setColumnName("ad_hoc_description").setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("ad_hoc_severity").setLimit(10).setIsNullable(true).build())
.addColumn(newTinyIntColumnDefBuilder().setColumnName("ad_hoc_type").setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("education_principles").setLimit(255).setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("clean_code_attribute").setLimit(40).setIsNullable(true).build())
.build());
addIndex(context, "rules", "rules_repo_key", true, pluginRuleKeyCol, pluginNameCol);
}
+ private void createRulesDefaultImpacts(Context context) {
+ String tableName = "rules_default_impacts";
+ VarcharColumnDef ruleUuidColumn = newVarcharColumnDefBuilder().setColumnName("rule_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
+ VarcharColumnDef softwareQualityColumn = newVarcharColumnDefBuilder().setColumnName("software_quality").setIsNullable(false).setLimit(40).build();
+ context.execute(new CreateTableBuilder(getDialect(), "rules_default_impacts")
+ .addColumn(ruleUuidColumn)
+ .addColumn(softwareQualityColumn)
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("severity").setIsNullable(false).setLimit(40).build())
+ .build());
+
+ addIndex(context, tableName, "uniq_rul_uuid_sof_qual", true, ruleUuidColumn, softwareQualityColumn);
+
+ context.execute(new AddPrimaryKeyBuilder(tableName, "rule_uuid", "software_quality").build());
+ }
+
private void createRulesParameters(Context context) {
String tableName = "rules_parameters";
VarcharColumnDef ruleUuidCol = newVarcharColumnDefBuilder(RULE_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(false).build();
@@ -1432,6 +1680,15 @@ public class CreateInitialSchema extends DdlChange {
.build());
}
+ private void createRuleTags(Context context) {
+ String tableName = "rule_tags";
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("value").setIsNullable(false).setLimit(400).build())
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("rule_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("is_system_tag").setIsNullable(false).build())
+ .build());
+ }
+
private void createSamlMessageIds(Context context) {
String tableName = "saml_message_ids";
VarcharColumnDef messageIdCol = newVarcharColumnDefBuilder("message_id").setLimit(255).setIsNullable(false).build();
@@ -1457,29 +1714,40 @@ public class CreateInitialSchema extends DdlChange {
private void createSnapshots(Context context) {
String tableName = "snapshots";
VarcharColumnDef uuidCol = newVarcharColumnDefBuilder("uuid").setLimit(OLD_UUID_VARCHAR_SIZE).setIsNullable(false).build();
- VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setLimit(OLD_UUID_VARCHAR_SIZE).setIsNullable(false).build();
+ VarcharColumnDef rootComponentUuidColumn = newVarcharColumnDefBuilder("root_component_uuid").setLimit(OLD_UUID_VARCHAR_SIZE).setIsNullable(false).build();
context.execute(
newTableBuilder(tableName)
.addPkColumn(uuidCol)
- .addColumn(componentUuidCol)
+ .addColumn(rootComponentUuidColumn)
.addColumn(newVarcharColumnDefBuilder(STATUS_COL_NAME).setLimit(4).setIsNullable(false).setDefaultValue("U").build())
.addColumn(newBooleanColumnDefBuilder().setColumnName("islast").setIsNullable(false).setDefaultValue(false).build())
.addColumn(newVarcharColumnDefBuilder("version").setLimit(500).setIsNullable(true).build())
- .addColumn(newIntegerColumnDefBuilder().setColumnName("purge_status").setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("build_string").setLimit(100).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("revision").setLimit(100).setIsNullable(true).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName("build_date").setIsNullable(true).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName("analysis_date").setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("period1_mode").setLimit(100).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("period1_param").setLimit(100).setIsNullable(true).build())
.addColumn(newBigIntegerColumnDefBuilder().setColumnName("period1_date").setIsNullable(true).build())
.addColumn(NULLABLE_TECHNICAL_CREATED_AT_COL)
+ .addColumn(newBooleanColumnDefBuilder("purged").setIsNullable(false).build())
.build());
- addIndex(context, tableName, "snapshot_component", false, componentUuidCol);
+ addIndex(context, tableName, "snapshots_root_component_uuid", false, rootComponentUuidColumn);
+ }
+
+ private void createTelemetryMetricsSent(Context context) {
+ String tableName = "telemetry_metrics_sent";
+ context.execute(new CreateTableBuilder(getDialect(), tableName)
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("metric_key").setIsNullable(false)
+ .setLimit(40).build())
+ .addPkColumn(newVarcharColumnDefBuilder().setColumnName("dimension").setIsNullable(false)
+ .setLimit(40).build())
+ .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_sent").setIsNullable(false).build())
+ .build());
}
private void createUserRoles(Context context) {
String tableName = "user_roles";
- VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(true).build();
+ VarcharColumnDef componentUuidCol = newVarcharColumnDefBuilder("entity_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
VarcharColumnDef userUuidCol = newVarcharColumnDefBuilder(USER_UUID_COL_NAME).setLimit(USER_UUID_SIZE).setIsNullable(true).build();
context.execute(
newTableBuilder(tableName)
@@ -1488,14 +1756,14 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(componentUuidCol)
.addColumn(userUuidCol)
.build());
- addIndex(context, tableName, "user_roles_component_uuid", false, componentUuidCol);
addIndex(context, tableName, "user_roles_user", false, userUuidCol);
+ addIndex(context, tableName, "user_roles_entity_uuid", false, componentUuidCol);
}
private void createUserDismissedMessage(Context context) {
String tableName = "user_dismissed_messages";
VarcharColumnDef userUuidCol = newVarcharColumnDefBuilder(USER_UUID_COL_NAME).setLimit(USER_UUID_SIZE).setIsNullable(false).build();
- VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder(PROJECT_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(false).build();
+ VarcharColumnDef projectUuidCol = newVarcharColumnDefBuilder(PROJECT_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(true).build();
VarcharColumnDef messageTypeCol = newVarcharColumnDefBuilder("message_type").setLimit(255).setIsNullable(false).build();
context.execute(
newTableBuilder(tableName)
@@ -1515,7 +1783,6 @@ public class CreateInitialSchema extends DdlChange {
VarcharColumnDef userUuidCol = newVarcharColumnDefBuilder(USER_UUID_COL_NAME).setLimit(USER_UUID_SIZE).setIsNullable(false).build();
VarcharColumnDef nameCol = newVarcharColumnDefBuilder("name").setLimit(100).setIsNullable(false).build();
VarcharColumnDef tokenHashCol = newVarcharColumnDefBuilder("token_hash").setLimit(255).setIsNullable(false).build();
- VarcharColumnDef projectKeyCol = newVarcharColumnDefBuilder("project_key").setLimit(255).setIsNullable(true).build();
VarcharColumnDef typeCol = newVarcharColumnDefBuilder("type").setLimit(100).setIsNullable(false).build();
context.execute(
newTableBuilder(tableName)
@@ -1525,9 +1792,9 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(tokenHashCol)
.addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_connection_date").setIsNullable(true).build())
.addColumn(TECHNICAL_CREATED_AT_COL)
- .addColumn(projectKeyCol)
.addColumn(typeCol)
.addColumn(newBigIntegerColumnDefBuilder().setColumnName(EXPIRATION_DATE_COL_NAME).setIsNullable(true).build())
+ .addColumn(newVarcharColumnDefBuilder().setColumnName("project_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
.build());
addIndex(context, tableName, "user_tokens_user_uuid_name", true, userUuidCol, nameCol);
addIndex(context, tableName, "user_tokens_token_hash", true, tokenHashCol);
@@ -1539,21 +1806,21 @@ public class CreateInitialSchema extends DdlChange {
VarcharColumnDef externalLoginCol = newVarcharColumnDefBuilder("external_login").setLimit(255).setIsNullable(false).build();
VarcharColumnDef externalIdentityProviderCol = newVarcharColumnDefBuilder("external_identity_provider").setLimit(100).setIsNullable(false).build();
VarcharColumnDef externalIdCol = newVarcharColumnDefBuilder("external_id").setLimit(255).setIsNullable(false).build();
+ VarcharColumnDef emailColumn = newVarcharColumnDefBuilder("email").setLimit(100).setIsNullable(true).build();
context.execute(
newTableBuilder(tableName)
.addPkColumn(newVarcharColumnDefBuilder("uuid").setLimit(USER_UUID_SIZE).setIsNullable(false).build())
.addColumn(loginCol)
.addColumn(newVarcharColumnDefBuilder("name").setLimit(200).setIsNullable(true).build())
- .addColumn(newVarcharColumnDefBuilder("email").setLimit(100).setIsNullable(true).build())
+ .addColumn(emailColumn)
.addColumn(newVarcharColumnDefBuilder("crypted_password").setLimit(100).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("salt").setLimit(40).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("hash_method").setLimit(10).setIsNullable(true).build())
.addColumn(newBooleanColumnDefBuilder().setColumnName("active").setDefaultValue(true).setIsNullable(true).build())
- .addColumn(newVarcharColumnDefBuilder("scm_accounts").setLimit(MAX_SIZE).build())
.addColumn(externalLoginCol)
.addColumn(externalIdentityProviderCol)
.addColumn(externalIdCol)
- .addColumn(newBooleanColumnDefBuilder().setColumnName("user_local").setIsNullable(true).build())
+ .addColumn(newBooleanColumnDefBuilder().setColumnName("user_local").setIsNullable(false).build())
.addColumn(newVarcharColumnDefBuilder("homepage_type").setLimit(40).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("homepage_parameter").setLimit(40).setIsNullable(true).build())
.addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_connection_date").setIsNullable(true).build())
@@ -1562,21 +1829,23 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newBooleanColumnDefBuilder().setColumnName("reset_password").setIsNullable(false).build())
.addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_sonarlint_connection").setIsNullable(true).build())
.build());
+
addIndex(context, tableName, "users_login", true, loginCol);
addIndex(context, tableName, "users_updated_at", false, NULLABLE_TECHNICAL_UPDATED_AT_COL);
addIndex(context, tableName, "uniq_external_id", true, externalIdentityProviderCol, externalIdCol);
addIndex(context, tableName, "uniq_external_login", true, externalIdentityProviderCol, externalLoginCol);
+ addIndex(context, tableName, "users_email", false, emailColumn);
}
private void createWebhookDeliveries(Context context) {
String tableName = "webhook_deliveries";
- VarcharColumnDef componentUuidColumn = newVarcharColumnDefBuilder(COMPONENT_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(false).build();
+ VarcharColumnDef projectUuidColumn = newVarcharColumnDefBuilder("project_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
VarcharColumnDef ceTaskUuidColumn = newVarcharColumnDefBuilder("ce_task_uuid").setLimit(UUID_SIZE).setIsNullable(true).build();
VarcharColumnDef webhookUuidColumn = newVarcharColumnDefBuilder("webhook_uuid").setLimit(UUID_SIZE).setIsNullable(false).build();
context.execute(newTableBuilder(tableName)
.addPkColumn(UUID_COL)
.addColumn(webhookUuidColumn)
- .addColumn(componentUuidColumn)
+ .addColumn(projectUuidColumn)
.addColumn(ceTaskUuidColumn)
.addColumn(newVarcharColumnDefBuilder(ANALYSIS_UUID_COL_NAME).setLimit(UUID_SIZE).setIsNullable(true).build())
.addColumn(newVarcharColumnDefBuilder("name").setLimit(100).setIsNullable(false).build())
@@ -1588,9 +1857,11 @@ public class CreateInitialSchema extends DdlChange {
.addColumn(newClobColumnDefBuilder().setColumnName("error_stacktrace").setIsNullable(true).build())
.addColumn(TECHNICAL_CREATED_AT_COL)
.build());
- addIndex(context, tableName, COMPONENT_UUID_COL_NAME, false, componentUuidColumn);
- addIndex(context, tableName, "ce_task_uuid", false, ceTaskUuidColumn);
- addIndex(context, tableName, "idx_wbhk_dlvrs_wbhk_uuid", false, webhookUuidColumn);
+
+ addIndex(context, tableName, "wd_webhook_uuid_created_at", false, webhookUuidColumn, TECHNICAL_CREATED_AT_COL);
+ addIndex(context, tableName, "wd_project_uuid_created_at", false, projectUuidColumn, TECHNICAL_CREATED_AT_COL);
+ addIndex(context, tableName, "wd_ce_task_uuid_created_at", false, ceTaskUuidColumn, TECHNICAL_CREATED_AT_COL);
+ addIndex(context, tableName, "wd_created_at", false, TECHNICAL_CREATED_AT_COL);
}
private void createWebhooks(Context context) {
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java
index 67a25b6dbbd..d1326657d87 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java
+++ b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v00/PopulateInitialSchema.java
@@ -19,15 +19,21 @@
*/
package org.sonar.server.platform.db.migration.version.v00;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.sonar.api.utils.System2;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.platform.SonarQubeVersion;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.Database;
+import org.sonar.server.platform.db.migration.history.MigrationHistory;
import org.sonar.server.platform.db.migration.step.DataChange;
import org.sonar.server.platform.db.migration.step.Upsert;
@@ -36,6 +42,13 @@ import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Stream.concat;
import static java.util.stream.Stream.of;
+import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.api.web.UserRole.CODEVIEWER;
+import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.api.web.UserRole.SCAN;
+import static org.sonar.api.web.UserRole.SECURITYHOTSPOT_ADMIN;
+import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
public class PopulateInitialSchema extends DataChange {
@@ -49,12 +62,15 @@ public class PopulateInitialSchema extends DataChange {
private final System2 system2;
private final UuidFactory uuidFactory;
private final SonarQubeVersion sonarQubeVersion;
+ private final MigrationHistory migrationHistory;
- public PopulateInitialSchema(Database db, System2 system2, UuidFactory uuidFactory, SonarQubeVersion sonarQubeVersion) {
+ public PopulateInitialSchema(Database db, System2 system2, UuidFactory uuidFactory, SonarQubeVersion sonarQubeVersion,
+ MigrationHistory migrationHistory) {
super(db);
this.system2 = system2;
this.uuidFactory = uuidFactory;
this.sonarQubeVersion = sonarQubeVersion;
+ this.migrationHistory = migrationHistory;
}
@Override
@@ -66,6 +82,46 @@ public class PopulateInitialSchema extends DataChange {
insertProperties(context, defaultQGUuid);
insertGroupRoles(context, groups);
insertGroupUsers(context, adminUserUuid, groups);
+ insertDevopsPermissionMapping(context);
+ insertGitlabPermissionMapping(context);
+ enableSpecificMqrMode(context);
+ }
+
+ private void insertGitlabPermissionMapping(Context context) throws SQLException {
+ String insertQuery = """
+ insert into devops_perms_mapping (uuid, devops_platform, devops_platform_role, sonarqube_permission)
+ values (?, ?, ?, ?)
+ """;
+
+ Map<String, Set<String>> gitlabRoleToSqPermissions = Map.of(
+ "guest", Set.of(USER),
+ "reporter", Set.of(USER, CODEVIEWER),
+ "developer", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN),
+ "maintainer", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN, ADMIN),
+ "owner", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN, ADMIN)
+ );
+
+ try (Upsert upsert = context.prepareUpsert(insertQuery)) {
+ gitlabRoleToSqPermissions.forEach((role, permissions) -> insertGitlabRoleToSonarqubePermissionMapping(upsert, role, permissions));
+ upsert.commit();
+ }
+ }
+
+ private void insertGitlabRoleToSonarqubePermissionMapping(Upsert upsert, String role, Set<String> sonarqubePermissions) {
+ sonarqubePermissions.forEach(permission -> insertGitlabRoleToSonarqubePermissionMapping(upsert, role, permission));
+ }
+
+ private void insertGitlabRoleToSonarqubePermissionMapping(Upsert upsert, String role, String sonarqubePermission) {
+ try {
+ upsert
+ .setString(1, uuidFactory.create())
+ .setString(2, "gitlab")
+ .setString(3, role)
+ .setString(4, sonarqubePermission)
+ .execute();
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
}
private String insertAdminUser(Context context) throws SQLException {
@@ -237,17 +293,84 @@ public class PopulateInitialSchema extends DataChange {
.commit();
}
- private static void insertGroupUsers(Context context, String adminUserUuid, Groups groups) throws SQLException {
+ private void insertDevopsPermissionMapping(Context context) throws SQLException {
+ Map<String, Set<String>> devopsRoleToSqPermissions = Map.of(
+ "read", Set.of(USER, CODEVIEWER),
+ "triage", Set.of(USER, CODEVIEWER),
+ "write", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN),
+ "maintain", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN),
+ "admin", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN, ADMIN));
+
+ String insertQuery = """
+ insert into devops_perms_mapping (uuid, devops_platform_role, sonarqube_permission)
+ values (?, ?, ?)
+ """;
+ try (Upsert upsert = context.prepareUpsert(insertQuery)) {
+ devopsRoleToSqPermissions.forEach((key, value) -> insertGithubRoleToSonarqubePermissionMapping(upsert, key, value));
+ upsert.commit();
+ }
+ }
+
+ private void insertGithubRoleToSonarqubePermissionMapping(Upsert upsert, String githubRole, Set<String> sonarqubePermissions) {
+ sonarqubePermissions.forEach(permission -> insertGithubRoleToSonarqubePermissionMapping(upsert, githubRole, permission));
+ }
+
+ private void insertGithubRoleToSonarqubePermissionMapping(Upsert upsert, String githubRole, String sonarqubePermission) {
+ try {
+ upsert
+ .setString(1, uuidFactory.create())
+ .setString(2, githubRole)
+ .setString(3, sonarqubePermission)
+ .execute();
+ } catch (SQLException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+
+ private void enableSpecificMqrMode(Context context) throws SQLException {
+ try (Connection connection = getDatabase().getDataSource().getConnection()) {
+ if (!paramExists(connection)) {
+ long version = migrationHistory.getInitialDbVersion();
+ boolean mqrModeEnabled = version >= 102_000L || version == -1L;
+ Upsert upsert = context.prepareUpsert(
+ createInsertStatement("properties",
+ "uuid",
+ "prop_key",
+ "is_empty",
+ "text_value",
+ "created_at"));
+ upsert.setString(1, uuidFactory.create())
+ .setString(2, MULTI_QUALITY_MODE_ENABLED)
+ .setBoolean(3, false)
+ .setString(4, String.valueOf(mqrModeEnabled))
+ .setLong(5, system2.now());
+ upsert.execute().commit();
+ }
+ }
+ }
+
+ private static boolean paramExists(Connection connection) throws SQLException {
+ String sql = "SELECT count(1) FROM properties WHERE prop_key = '" + MULTI_QUALITY_MODE_ENABLED + "'";
+ try (PreparedStatement statement = connection.prepareStatement(sql)) {
+ ResultSet result = statement.executeQuery();
+ return result.next() && result.getInt(1) > 0;
+ }
+ }
+
+ private void insertGroupUsers(Context context, String adminUserUuid, Groups groups) throws SQLException {
truncateTable(context, "groups_users");
- Upsert upsert = context.prepareUpsert(createInsertStatement("groups_users", "user_uuid", "group_uuid"));
+ Upsert upsert = context.prepareUpsert(createInsertStatement("groups_users", "uuid", "user_uuid", "group_uuid"));
upsert
- .setString(1, adminUserUuid)
- .setString(2, groups.userGroupUuid())
+ .setString(1, uuidFactory.create())
+ .setString(2, adminUserUuid)
+ .setString(3, groups.userGroupUuid())
.addBatch();
upsert
- .setString(1, adminUserUuid)
- .setString(2, groups.adminGroupUuid())
+ .setString(1, uuidFactory.create())
+ .setString(2, adminUserUuid)
+ .setString(3, groups.adminGroupUuid())
.addBatch();
upsert
.execute()
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjects.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjects.java
deleted file mode 100644
index 35be11c30b7..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/AddNclocToProjects.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddNclocToProjects extends DdlChange {
-
- public static final String PROJECT_TABLE_NAME = "projects";
- public static final String NCLOC_COLUMN_NAME = "ncloc";
-
- public AddNclocToProjects(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- if (checkIfColumnExists()) {
- return;
- }
- BigIntegerColumnDef columnDef = BigIntegerColumnDef.newBigIntegerColumnDefBuilder().setColumnName(NCLOC_COLUMN_NAME).setIsNullable(true).build();
- String request = new AddColumnsBuilder(getDialect(), PROJECT_TABLE_NAME).addColumn(columnDef).build();
- context.execute(request);
- }
-
- public boolean checkIfColumnExists() throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, PROJECT_TABLE_NAME, NCLOC_COLUMN_NAME)) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTable.java
deleted file mode 100644
index 3b3a1c540e0..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateScimGroupsTable.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateScimGroupsTable extends CreateTableChange {
- static final String TABLE_NAME = "scim_groups";
-
- public CreateScimGroupsTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("scim_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("group_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuid.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuid.java
deleted file mode 100644
index 5613db0d398..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/CreateUniqueIndexForScimGroupsUuid.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v100.CreateScimGroupsTable.TABLE_NAME;
-
-public class CreateUniqueIndexForScimGroupsUuid extends DdlChange {
-
- @VisibleForTesting
- static final String COLUMN_NAME = "group_uuid";
-
- @VisibleForTesting
- static final String INDEX_NAME = "uniq_scim_group_uuid";
-
- public CreateUniqueIndexForScimGroupsUuid(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUserUuidUniqueIndex(context, connection);
- }
- }
-
- private void createUserUuidUniqueIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(COLUMN_NAME, false)
- .setUnique(true)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100.java
deleted file mode 100644
index 3b42c43444f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion100 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_0_000, "Remove orphan rules in Quality Profiles", RemoveOrphanRulesFromQualityProfiles.class)
- .add(10_0_001, "Drop index 'projects_module_uuid' in the 'Components' table", DropIndexProjectsModuleUuidInComponents.class)
- .add(10_0_002, "Drop column 'module_uuid' in the 'Components' table", DropModuleUuidInComponents.class)
- .add(10_0_003, "Drop column 'module_uuid_path' in the 'Components' table", DropModuleUuidPathInComponents.class)
- .add(10_0_004, "Drop column 'b_module_uuid' in the 'Components' table", DropBModuleUuidInComponents.class)
- .add(10_0_005, "Drop column 'b_module_uuid_path' in the 'Components' table", DropBModuleUuidPathInComponents.class)
- .add(10_0_006, "Drop index 'projects_root_uuid' in the 'Components' table", DropIndexProjectsRootUuidInComponents.class)
- .add(10_0_007, "Drop column 'root_uuid' in the 'Components' table", DropRootUuidInComponents.class)
- .add(10_0_008, "Update value of 'user_local' in the 'users' table", UpdateUserLocalValueInUsers.class)
- .add(10_0_009, "Make column 'user_local' not nullable in the 'users' table", MakeColumnUserLocalNotNullableInUsers.class)
- .add(10_0_010, "Create 'scim_groups' table", CreateScimGroupsTable.class)
- .add(10_0_011, "Create unique index on scim_groups.group_uuid", CreateUniqueIndexForScimGroupsUuid.class)
- .add(10_0_012, "Log a warning message if 'sonar.scim.enabled' is used", LogMessageIfSonarScimEnabledPresentProperty.class)
- .add(10_0_013, "Drop 'sonar.scim.enabled' property", DropSonarScimEnabledProperty.class)
- .add(10_0_014, "Drop any SCIM User provisioning, turning all users local", DropScimUserProvisioning.class)
- .add(10_0_015, "Add ncloc to 'Projects' table", AddNclocToProjects.class)
- .add(10_0_016, "Populate ncloc in 'Projects' table", PopulateNclocForForProjects.class)
- ;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponents.java
deleted file mode 100644
index bf6ed5b9184..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropBModuleUuidInComponents extends DropColumnChange {
- private static final String COLUMN_NAME = "b_module_uuid";
- private static final String TABLE_NAME = "components";
-
- public DropBModuleUuidInComponents(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponents.java
deleted file mode 100644
index b309dd7dff8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropBModuleUuidPathInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropBModuleUuidPathInComponents extends DropColumnChange {
- private static final String COLUMN_NAME = "b_module_uuid_path";
- private static final String TABLE_NAME = "components";
-
- public DropBModuleUuidPathInComponents(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponents.java
deleted file mode 100644
index 1e17a225b38..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsModuleUuidInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexProjectsModuleUuidInComponents extends DropIndexChange {
- private static final String INDEX_NAME = "projects_module_uuid";
- private static final String TABLE_NAME = "components";
-
- public DropIndexProjectsModuleUuidInComponents(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponents.java
deleted file mode 100644
index d95fe0d6bec..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropIndexProjectsRootUuidInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexProjectsRootUuidInComponents extends DropIndexChange {
- private static final String INDEX_NAME = "projects_root_uuid";
- private static final String TABLE_NAME = "components";
-
- public DropIndexProjectsRootUuidInComponents(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponents.java
deleted file mode 100644
index 683f8bfb89f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropModuleUuidInComponents extends DropColumnChange {
- private static final String COLUMN_NAME = "module_uuid";
- private static final String TABLE_NAME = "components";
-
- public DropModuleUuidInComponents(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponents.java
deleted file mode 100644
index 9a4e3c8778f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropModuleUuidPathInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropModuleUuidPathInComponents extends DropColumnChange {
- private static final String COLUMN_NAME = "module_uuid_path";
- private static final String TABLE_NAME = "components";
-
- public DropModuleUuidPathInComponents(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponents.java
deleted file mode 100644
index 0556df3679a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropRootUuidInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropRootUuidInComponents extends DropColumnChange {
- private static final String COLUMN_NAME = "root_uuid";
- private static final String TABLE_NAME = "components";
-
- protected DropRootUuidInComponents(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioning.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioning.java
deleted file mode 100644
index 49a29886f4d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropScimUserProvisioning.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-public class DropScimUserProvisioning extends DataChange {
-
- public DropScimUserProvisioning(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- context.prepareUpsert("delete from scim_users").execute().commit();
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledProperty.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledProperty.java
deleted file mode 100644
index 8395bb55ee4..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/DropSonarScimEnabledProperty.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-public class DropSonarScimEnabledProperty extends DataChange {
-
- public DropSonarScimEnabledProperty(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- context.prepareUpsert("delete from properties where prop_key = ?")
- .setString(1, "sonar.scim.enabled")
- .execute()
- .commit();
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentProperty.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentProperty.java
deleted file mode 100644
index 23fc107fe3a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/LogMessageIfSonarScimEnabledPresentProperty.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-public class LogMessageIfSonarScimEnabledPresentProperty extends DataChange {
-
- private static final Logger LOG = LoggerFactory.getLogger(LogMessageIfSonarScimEnabledPresentProperty.class);
- public static final String SONAR_SCIM_ENABLED = "sonar.scim.enabled";
- private static final String SCIM_DOC_URL = "https://docs.sonarsource.com/sonarqube/10.1/instance-administration/authentication/saml/scim/overview/";
-
- public LogMessageIfSonarScimEnabledPresentProperty(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- context.prepareSelect("select * from properties where prop_key = ?")
- .setString(1, SONAR_SCIM_ENABLED)
- .scroll(row -> LOG.warn("'{}' property is defined but not read anymore." +
- " Please read the upgrade notes for the instruction to upgrade. User provisioning is deactivated until reactivated" +
- " from the SonarQube Administration Interface (\"General->Authentication\"). See documentation: {}", SONAR_SCIM_ENABLED,
- SCIM_DOC_URL));
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsers.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsers.java
deleted file mode 100644
index c4bd9eaad10..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/MakeColumnUserLocalNotNullableInUsers.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class MakeColumnUserLocalNotNullableInUsers extends DdlChange {
- private static final String TABLE_NAME = "users";
- private static final String COLUMN_NAME = "user_local";
-
- private static final BooleanColumnDef columnDefinition = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setIsNullable(false)
- .build();
-
- public MakeColumnUserLocalNotNullableInUsers(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME)
- .updateColumn(columnDefinition)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjects.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjects.java
deleted file mode 100644
index fb4bcee8bef..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/PopulateNclocForForProjects.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class PopulateNclocForForProjects extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT b.project_uuid AS projectUuid, max(lm.value) AS maxncloc
- FROM live_measures lm
- INNER JOIN metrics m ON m.uuid = lm.metric_uuid
- INNER JOIN project_branches b ON b.uuid = lm.component_uuid
- INNER JOIN projects p on p.uuid = b.project_uuid and p.qualifier = 'TRK'
- WHERE m.name = 'ncloc'
- GROUP BY b.project_uuid
- """;
-
- public PopulateNclocForForProjects(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- // the table is deleted in 10.8, this check ensures the migration re-entrance
- if (!DatabaseUtils.tableExists("live_measures", c)) {
- return;
- }
- }
-
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("update projects set ncloc = ? where uuid = ?");
- massUpdate.execute((row, update) -> {
- String uuid = row.getString(1);
- Long ncloc = row.getLong(2);
- update.setLong(1, ncloc);
- update.setString(2, uuid);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfiles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfiles.java
deleted file mode 100644
index 22693377d98..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/RemoveOrphanRulesFromQualityProfiles.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.SqlStatement;
-
-public class RemoveOrphanRulesFromQualityProfiles extends DataChange {
-
- private final UuidFactory uuidFactory;
- private final System2 system2;
-
- public RemoveOrphanRulesFromQualityProfiles(Database db, UuidFactory uuidFactory, System2 system2) {
- super(db);
- this.uuidFactory = uuidFactory;
- this.system2 = system2;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- final String SELECT_QUERY = "select ar.uuid, ar.profile_uuid, ar.rule_uuid from rules_profiles rp " +
- "inner join active_rules ar on ar.profile_uuid = rp.uuid " +
- "inner join rules r on r.uuid = ar.rule_uuid " +
- "where rp.language != r.language";
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
-
- final String UPDATE_QUERY = """
- INSERT INTO qprofile_changes
- (kee, rules_profile_uuid, change_type, created_at, user_uuid, change_data)
- VALUES(?, ?, ?, ?, ?, ?)
- """;
- massUpdate.update(UPDATE_QUERY);
- massUpdate.update("delete from active_rules where uuid = ?");
-
- massUpdate.execute((row, update, index) -> {
- if (index == 0) {
- prepareUpdateForQProfileChanges(row, update);
- }
- if (index == 1) {
- update.setString(1, row.getString(1));
- }
- return true;
- });
- }
-
- private void prepareUpdateForQProfileChanges(Select.Row selectedRow, SqlStatement update) throws SQLException {
- update.setString(1, uuidFactory.create())
- .setString(2, selectedRow.getString(2))
- .setString(3, "DEACTIVATED")
- .setLong(4, system2.now())
- .setString(5, null)
- .setString(6, "ruleUuid=" + selectedRow.getString(3));
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsers.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsers.java
deleted file mode 100644
index 81bbeca7108..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/UpdateUserLocalValueInUsers.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class UpdateUserLocalValueInUsers extends DataChange {
-
- public UpdateUserLocalValueInUsers(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select("select uuid from users where user_local is null");
- massUpdate.update("update users set user_local = ? where uuid = ?");
- massUpdate.execute((row, update) -> {
- String uuid = row.getString(1);
- update.setBoolean(1, true);
- update.setString(2, uuid);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/package-info.java
deleted file mode 100644
index 58ad7e44d71..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v100/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v100;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTable.java
deleted file mode 100644
index edffe2da451..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddCodeVariantsColumnInIssuesTable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddCodeVariantsColumnInIssuesTable extends DdlChange {
-
- private static final String TABLE_NAME = "issues";
- private static final String COLUMN_NAME = "code_variants";
- private static final int COLUMN_SIZE = 4000;
-
- public AddCodeVariantsColumnInIssuesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(COLUMN_SIZE)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranches.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranches.java
deleted file mode 100644
index 7cb20f6702b..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddIsMainColumnInProjectBranches.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddIsMainColumnInProjectBranches extends DdlChange {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String COLUMN_NAME = "is_main";
-
- public AddIsMainColumnInProjectBranches(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(c, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
-
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTable.java
deleted file mode 100644
index d9f852f18fc..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSchedulesTable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class AddReportSchedulesTable extends CreateTableChange {
-
- static final String TABLE_NAME = "report_schedules";
-
- public AddReportSchedulesTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("portfolio_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("branch_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_send_time_in_ms").setIsNullable(false).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTable.java
deleted file mode 100644
index 5e0e2d4af40..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AddReportSubscriptionsTable.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class AddReportSubscriptionsTable extends CreateTableChange {
-
- static final String TABLE_NAME = "report_subscriptions";
-
- public AddReportSubscriptionsTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("portfolio_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("branch_uuid").setIsNullable(true).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("user_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranches.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranches.java
deleted file mode 100644
index 7d6030cdf1a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/AlterIsMainColumnInProjectBranches.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AlterIsMainColumnInProjectBranches extends DdlChange {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String COLUMN_NAME = "is_main";
-
- public AlterIsMainColumnInProjectBranches(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- BooleanColumnDef newColumnDef = new BooleanColumnDef.Builder()
- .setColumnName(COLUMN_NAME)
- .setIsNullable(false)
- .build();
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME).updateColumn(newColumnDef).build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTable.java
deleted file mode 100644
index 8db848e63cf..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateExternalGroupsTable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateExternalGroupsTable extends CreateTableChange {
-
- static final String TABLE_NAME = "external_groups";
- @VisibleForTesting
- static final String GROUP_UUID_COLUMN_NAME = "group_uuid";
- static final String EXTERNAL_GROUP_ID_COLUMN_NAME = "external_group_id";
- static final String EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME = "external_identity_provider";
-
- public CreateExternalGroupsTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(GROUP_UUID_COLUMN_NAME).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(EXTERNAL_GROUP_ID_COLUMN_NAME).setIsNullable(false).setLimit(255).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME).setIsNullable(false).setLimit(100).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTable.java
deleted file mode 100644
index bacb55e7455..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForEmailOnUsersTable.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-class CreateIndexForEmailOnUsersTable extends DdlChange {
-
- @VisibleForTesting
- static final String INDEX_NAME = "users_email";
- @VisibleForTesting
- static final String TABLE_NAME = "users";
- @VisibleForTesting
- static final String COLUMN_NAME = "email";
-
- public CreateIndexForEmailOnUsersTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createIndex(context, connection);
- }
- }
-
- private void createIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(COLUMN_NAME)
- .setUnique(false)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTable.java
deleted file mode 100644
index 4c421ff3628..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexForScmAccountOnScmAccountsTable.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNT_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateScmAccountsTable.SCM_ACCOUNTS_TABLE_NAME;
-
-class CreateIndexForScmAccountOnScmAccountsTable extends DdlChange {
-
- @VisibleForTesting
- static final String INDEX_NAME = "scm_accounts_scm_account";
-
- public CreateIndexForScmAccountOnScmAccountsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createIndex(context, connection);
- }
- }
-
- private void createIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(SCM_ACCOUNTS_TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(SCM_ACCOUNTS_TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(SCM_ACCOUNT_COLUMN_NAME, false)
- .setUnique(false)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.java
deleted file mode 100644
index 61a49e3143c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.EXTERNAL_GROUP_ID_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v101.CreateExternalGroupsTable.TABLE_NAME;
-
-public class CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable extends DdlChange {
-
- @VisibleForTesting
- static final String INDEX_NAME = "uniq_ext_grp_ext_id_provider";
-
- public CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createIndex(context, connection);
- }
- }
-
- private void createIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(EXTERNAL_IDENTITY_PROVIDER_COLUMN_NAME, false)
- .addColumn(EXTERNAL_GROUP_ID_COLUMN_NAME, false)
- .setUnique(true)
- .build());
- }
-
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokens.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokens.java
deleted file mode 100644
index b8d62a3a04b..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateProjectUuidInUserTokens.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-public class CreateProjectUuidInUserTokens extends DdlChange {
-
- private static final String TABLE_NAME = "user_tokens";
- private static final String COLUMN_NAME = "project_uuid";
-
- public CreateProjectUuidInUserTokens(Database db) {
- super(db);
- }
-
- @Override
- public void execute(DdlChange.Context context) throws SQLException {
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(c, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setIsNullable(true)
- .setLimit(UUID_SIZE)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTable.java
deleted file mode 100644
index f74d6b2ed08..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateScmAccountsTable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.USER_UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-class CreateScmAccountsTable extends CreateTableChange {
- static final String SCM_ACCOUNTS_TABLE_NAME = "scm_accounts";
- static final String SCM_ACCOUNT_COLUMN_NAME = "scm_account";
- @VisibleForTesting
- static final String USER_UUID_COLUMN_NAME = "user_uuid";
-
- @VisibleForTesting
- static final int SCM_ACCOUNT_SIZE = 255;
-
- public CreateScmAccountsTable(Database db) {
- super(db, SCM_ACCOUNTS_TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(USER_UUID_COLUMN_NAME).setIsNullable(false).setLimit(USER_UUID_SIZE).build())
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(SCM_ACCOUNT_COLUMN_NAME).setIsNullable(false).setLimit(SCM_ACCOUNT_SIZE).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTable.java
deleted file mode 100644
index 84cb2766d2d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSchedulesTable.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v101.AddReportSchedulesTable.TABLE_NAME;
-
-public class CreateUniqueIndexForReportSchedulesTable extends DdlChange {
-
- @VisibleForTesting
- static final String COLUMN_NAME_PORTFOLIO = "portfolio_uuid";
- @VisibleForTesting
- static final String COLUMN_NAME_BRANCH = "branch_uuid";
-
- @VisibleForTesting
- static final String INDEX_NAME = "uniq_report_schedules";
-
-
- public CreateUniqueIndexForReportSchedulesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
-
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUserUuidUniqueIndex(context, connection);
- }
- }
-
- private void createUserUuidUniqueIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(COLUMN_NAME_PORTFOLIO, true)
- .addColumn(COLUMN_NAME_BRANCH, true)
- .setUnique(true)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTable.java
deleted file mode 100644
index f2ab4199379..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/CreateUniqueIndexForReportSubscriptionsTable.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v101.AddReportSubscriptionsTable.TABLE_NAME;
-
-
-public class CreateUniqueIndexForReportSubscriptionsTable extends DdlChange {
-
- @VisibleForTesting
- static final String COLUMN_NAME_PORTFOLIO = "portfolio_uuid";
- @VisibleForTesting
- static final String COLUMN_NAME_BRANCH = "branch_uuid";
- @VisibleForTesting
- static final String COLUMN_NAME_USER = "user_uuid";
-
- @VisibleForTesting
- static final String INDEX_NAME = "uniq_report_subscriptions";
-
-
- public CreateUniqueIndexForReportSubscriptionsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(DdlChange.Context context) throws SQLException {
-
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUserUuidUniqueIndex(context, connection);
- }
- }
-
- private void createUserUuidUniqueIndex(DdlChange.Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(COLUMN_NAME_PORTFOLIO, true)
- .addColumn(COLUMN_NAME_BRANCH, true)
- .addColumn(COLUMN_NAME_USER, false)
- .setUnique(true)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101.java
deleted file mode 100644
index e4d928c20fa..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion101 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_1_000, "Add 'scm_accounts' table", CreateScmAccountsTable.class)
- .add(10_1_001, "Migrate scm accounts from 'users' to 'scm_accounts' table", MigrateScmAccountsFromUsersToScmAccounts.class)
- .add(10_1_002, "Add index on 'scm_accounts.scm_account'", CreateIndexForScmAccountOnScmAccountsTable.class)
- .add(10_1_003, "Add index on 'users.email'", CreateIndexForEmailOnUsersTable.class)
- .add(10_1_004, "Drop 'scm_accounts' column in 'users' table", DropScmAccountsInUsers.class)
- .add(10_1_005, "Add column 'is_main' to 'project_branches' table", AddIsMainColumnInProjectBranches.class)
- .add(10_1_006, "Update value of 'is_main' in 'project_branches' table", UpdateIsMainColumnInProjectBranches.class)
- .add(10_1_007, "Alter column 'is_main' in 'project_branches' table - make it not nullable", AlterIsMainColumnInProjectBranches.class)
- .add(10_1_008, "Increase size of 'internal_properties.kee' from 20 to 40 characters", IncreaseKeeColumnSizeInInternalProperties.class)
- .add(10_1_009, "Create column 'project_uuid' in 'user_tokens", CreateProjectUuidInUserTokens.class)
- .add(10_1_010, "Remove user tokens linked to unexistent project", RemoveOrphanUserTokens.class)
- .add(10_1_011, "Populate 'project_key' in 'user_tokens'", PopulateProjectUuidInUserTokens.class)
- .add(10_1_012, "Drop column 'project_key' in 'user_tokens", DropProjectKeyInUserTokens.class)
- .add(10_1_013, "Increase size of 'ce_queue.task_type' from 15 to 40 characters", IncreaseTaskTypeColumnSizeInCeQueue.class)
- .add(10_1_014, "Increase size of 'ce_activity.task_type' from 15 to 40 characters", IncreaseTaskTypeColumnSizeInCeActivity.class)
- .add(10_1_015, "Add 'external_groups' table.", CreateExternalGroupsTable.class)
- .add(10_1_016, "Add index on 'external_groups(external_identity_provider, external_id).", CreateIndexOnExternalIdAndIdentityOnExternalGroupsTable.class)
- .add(10_1_017, "Add 'code_variants' column in 'issues' table", AddCodeVariantsColumnInIssuesTable.class)
- .add(10_1_018, "Fix different uuids for subportfolios", FixDifferentUuidsForSubportfolios.class)
- .add(10_1_019, "Add report_schedules table", AddReportSchedulesTable.class)
- .add(10_1_020, "Add report_subscriptions table", AddReportSubscriptionsTable.class)
- .add(10_1_021, "Add report_schedules unique index", CreateUniqueIndexForReportSchedulesTable.class)
- .add(10_1_022, "Add report_subscriptions unique index", CreateUniqueIndexForReportSubscriptionsTable.class)
- .add(10_1_023, "Rename column 'component_uuid' to 'entity_uuid' in the 'properties' table", RenameColumnComponentUuidInProperties.class)
- .add(10_1_024, "Populate report_schedules table", PopulateReportSchedules.class)
- .add(10_1_025, "Populate report_subscriptions table", PopulateReportSubscriptions.class)
- .add(10_1_026, "Remove report properties", RemoveReportProperties.class)
- ;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokens.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokens.java
deleted file mode 100644
index bfa60525602..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropProjectKeyInUserTokens.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-class DropProjectKeyInUserTokens extends DropColumnChange {
- static final String TABLE_NAME = "user_tokens";
- static final String COLUMN_NAME = "project_key";
-
- public DropProjectKeyInUserTokens(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsers.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsers.java
deleted file mode 100644
index 48b875b97b4..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/DropScmAccountsInUsers.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-class DropScmAccountsInUsers extends DropColumnChange {
- static final String TABLE_NAME = "users";
- static final String COLUMN_NAME = "scm_accounts";
-
- public DropScmAccountsInUsers(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfolios.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfolios.java
deleted file mode 100644
index 78621d88931..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/FixDifferentUuidsForSubportfolios.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class FixDifferentUuidsForSubportfolios extends DataChange {
- private static final String SELECT_QUERY = """
- SELECT p.uuid, c.uuid
- FROM portfolios p
- INNER join components c on p.kee = c.kee AND p.uuid != c.uuid
- and p.parent_uuid IS NOT NULL and p.root_uuid = c.branch_uuid and c.qualifier = 'SVW'
- """;
-
- public FixDifferentUuidsForSubportfolios(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("update portfolios set parent_uuid=? where parent_uuid=?");
- massUpdate.update("update portfolios set uuid=? where uuid=?");
- massUpdate.update("update portfolio_projects set portfolio_uuid=? where portfolio_uuid=?");
- massUpdate.update("update portfolio_references set portfolio_uuid=? where portfolio_uuid=?");
-
- massUpdate.execute((row, update, index) -> {
- String portfolioUuid = row.getString(1);
- String componentUuid = row.getString(2);
- update.setString(1, componentUuid);
- update.setString(2, portfolioUuid);
- return true;
- });
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalProperties.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalProperties.java
deleted file mode 100644
index 22be1e2a78e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseKeeColumnSizeInInternalProperties.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class IncreaseKeeColumnSizeInInternalProperties extends DdlChange {
- @VisibleForTesting
- static final String TABLE_NAME = "internal_properties";
- @VisibleForTesting
- static final String COLUMN_NAME = "kee";
- @VisibleForTesting
- static final int NEW_COLUMN_SIZE = 40;
-
- private static final VarcharColumnDef COLUMN_DEFINITION = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(false)
- .build();
-
- public IncreaseKeeColumnSizeInInternalProperties(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME)
- .updateColumn(COLUMN_DEFINITION)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivity.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivity.java
deleted file mode 100644
index 69518021b42..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeActivity.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class IncreaseTaskTypeColumnSizeInCeActivity extends DdlChange {
- @VisibleForTesting
- static final String TABLE_NAME = "ce_activity";
- @VisibleForTesting
- static final String COLUMN_NAME = "task_type";
- @VisibleForTesting
- static final int NEW_COLUMN_SIZE = 40;
-
- private static final VarcharColumnDef COLUMN_DEFINITION = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(false)
- .build();
-
- public IncreaseTaskTypeColumnSizeInCeActivity(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME)
- .updateColumn(COLUMN_DEFINITION)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueue.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueue.java
deleted file mode 100644
index 7d0d59aac4c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/IncreaseTaskTypeColumnSizeInCeQueue.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class IncreaseTaskTypeColumnSizeInCeQueue extends DdlChange {
- @VisibleForTesting
- static final String TABLE_NAME = "ce_queue";
- @VisibleForTesting
- static final String COLUMN_NAME = "task_type";
- @VisibleForTesting
- static final int NEW_COLUMN_SIZE = 40;
-
- private static final VarcharColumnDef COLUMN_DEFINITION = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(false)
- .build();
-
- public IncreaseTaskTypeColumnSizeInCeQueue(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME)
- .updateColumn(COLUMN_DEFINITION)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccounts.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccounts.java
deleted file mode 100644
index f67bada71bc..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/MigrateScmAccountsFromUsersToScmAccounts.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Set;
-import org.apache.commons.lang3.StringUtils;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassRowSplitter;
-import org.sonar.server.platform.db.migration.step.Select;
-
-import static java.util.Collections.emptySet;
-import static java.util.stream.Collectors.toSet;
-
-class MigrateScmAccountsFromUsersToScmAccounts extends DataChange {
-
- @VisibleForTesting
- static final char SCM_ACCOUNTS_SEPARATOR_CHAR = '\n';
-
- public MigrateScmAccountsFromUsersToScmAccounts(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (isScmColumnDropped()) {
- return;
- }
- migrateData(context);
- }
-
- private boolean isScmColumnDropped() throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- return !DatabaseUtils.tableColumnExists(connection, DropScmAccountsInUsers.TABLE_NAME, DropScmAccountsInUsers.COLUMN_NAME);
- }
- }
-
- private static void migrateData(Context context) throws SQLException {
- MassRowSplitter<ScmAccountRow> massRowSplitter = context.prepareMassRowSplitter();
-
- massRowSplitter.select("select u.uuid, lower(u.scm_accounts) from users u where u.active=? and not exists (select 1 from scm_accounts sa where sa.user_uuid = u.uuid)")
- .setBoolean(1, true);
-
- massRowSplitter.insert("insert into scm_accounts (user_uuid, scm_account) values (?, ?)");
-
- massRowSplitter.splitRow(MigrateScmAccountsFromUsersToScmAccounts::toScmAccountRows);
-
- massRowSplitter.execute((scmAccountRow, insert) -> {
- insert.setString(1, scmAccountRow.userUuid());
- insert.setString(2, scmAccountRow.scmAccount());
- return true;
- });
- }
-
- private static Set<ScmAccountRow> toScmAccountRows(Select.Row row) {
- try {
- String userUuid = row.getString(1);
- String[] scmAccounts = StringUtils.split(row.getString(2), SCM_ACCOUNTS_SEPARATOR_CHAR);
- if (scmAccounts == null) {
- return emptySet();
- }
- return Arrays.stream(scmAccounts)
- .map(scmAccount -> new ScmAccountRow(userUuid, scmAccount))
- .collect(toSet());
- } catch (SQLException sqlException) {
- throw new RuntimeException(sqlException);
- }
- }
-
- @VisibleForTesting
- record ScmAccountRow(String userUuid, String scmAccount) {
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokens.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokens.java
deleted file mode 100644
index 297a8106975..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateProjectUuidInUserTokens.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class PopulateProjectUuidInUserTokens extends DataChange {
- private static final String SELECT_QUERY = """
- SELECT ut.uuid as tokenUuid, p.uuid as projectUuid
- FROM user_tokens ut
- INNER JOIN projects p ON ut.project_key = p.kee and ut.project_key is not null
- """;
-
- public PopulateProjectUuidInUserTokens(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, "user_tokens", "project_key")) {
- return;
- }
- }
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("update user_tokens set project_uuid = ? where uuid = ?");
- massUpdate.execute((row, update) -> {
- String uuid = row.getString(1);
- String projectUuid = row.getString(2);
- update.setString(1, projectUuid);
- update.setString(2, uuid);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedules.java
deleted file mode 100644
index 88dac773119..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSchedules.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class PopulateReportSchedules extends DataChange {
- private static final String SELECT_QUERY = """
- SELECT port.uuid as portfolioUuid, pb.uuid as branchUuid, p.text_value as value
- FROM properties p
- LEFT JOIN portfolios port ON p.entity_uuid = port.uuid
- LEFT JOIN project_branches pb ON p.entity_uuid = pb.uuid
- WHERE p.prop_key = 'sonar.governance.report.lastSendTimeInMs' or p.prop_key = 'sonar.governance.report.project.branch.lastSendTimeInMs'
- AND NOT EXISTS (
- SELECT * FROM report_schedules rs
- WHERE rs.branch_uuid = p.entity_uuid or rs.portfolio_uuid = p.entity_uuid
- )
- """;
-
- public PopulateReportSchedules(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("insert into report_schedules (uuid, branch_uuid, portfolio_uuid, last_send_time_in_ms) values (?, ?, ?, ?)");
- massUpdate.execute((row, update) -> {
- String portfolioUuid = row.getString(1);
- String branchUuid = row.getString(2);
-
- // one and only one needs to be null
- if ((portfolioUuid == null) == (branchUuid == null)) {
- return false;
- }
-
- String value = row.getString(3);
- long ms = Long.parseLong(value);
-
- update.setString(1, UuidFactoryImpl.INSTANCE.create());
- update.setString(2, branchUuid);
- update.setString(3, portfolioUuid);
- update.setLong(4, ms);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptions.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptions.java
deleted file mode 100644
index e9c00891375..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/PopulateReportSubscriptions.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.sonar.core.util.UuidFactoryImpl;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class PopulateReportSubscriptions extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT port.uuid as portfolioUuid, pb.uuid as branchUuid, p.user_uuid as userUuid
- FROM properties p
- LEFT JOIN portfolios port ON p.entity_uuid = port.uuid
- LEFT JOIN project_branches pb ON p.entity_uuid = pb.uuid
- WHERE p.prop_key = 'sonar.governance.report.userNotification' or p.prop_key = 'sonar.governance.report.project.branch.userNotification'
- AND NOT EXISTS (
- SELECT * FROM report_subscriptions rs
- WHERE (rs.branch_uuid = p.entity_uuid or rs.portfolio_uuid = p.entity_uuid) and rs.user_uuid = p.user_uuid
- )
- """;
-
- public PopulateReportSubscriptions(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("insert into report_subscriptions (uuid, branch_uuid, portfolio_uuid, user_uuid) values (?, ?, ?, ?)");
- massUpdate.execute((row, update) -> {
- String portfolioUuid = row.getString(1);
- String branchUuid = row.getString(2);
-
- // one and only one needs to be null
- if ((portfolioUuid == null) == (branchUuid == null)) {
- return false;
- }
-
- String userUuid = row.getString(3);
- update.setString(1, UuidFactoryImpl.INSTANCE.create());
- update.setString(2, branchUuid);
- update.setString(3, portfolioUuid);
- update.setString(4, userUuid);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokens.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokens.java
deleted file mode 100644
index 9a9231d406b..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveOrphanUserTokens.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class RemoveOrphanUserTokens extends DataChange {
- private static final String SELECT_QUERY = """
- SELECT ut.uuid as tokenUuid
- FROM user_tokens ut
- LEFT OUTER JOIN projects p ON ut.project_key = p.kee
- WHERE p.uuid is null and ut.project_key IS NOT NULL
- """;
-
- public RemoveOrphanUserTokens(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, "user_tokens", "project_key")) {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("delete from user_tokens where uuid = ?");
- massUpdate.execute((row, update) -> {
- String uuid = row.getString(1);
- update.setString(1, uuid);
- return true;
- });
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportProperties.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportProperties.java
deleted file mode 100644
index 3bd753cc4a8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RemoveReportProperties.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class RemoveReportProperties extends DataChange {
- private static final String SELECT_QUERY = """
- SELECT p.uuid as uuid from properties p
- WHERE p.prop_key = 'sonar.governance.report.lastSendTimeInMs' or p.prop_key = 'sonar.governance.report.project.branch.lastSendTimeInMs'
- or p.prop_key = 'sonar.governance.report.userNotification' or p.prop_key = 'sonar.governance.report.project.branch.userNotification'
- """;
-
- public RemoveReportProperties(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("delete from properties where uuid = ?");
- massUpdate.execute((row, delete) -> {
- String uuid = row.getString(1);
- delete.setString(1, uuid);
- return true;
- });
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInProperties.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInProperties.java
deleted file mode 100644
index 4b3a29566d6..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/RenameColumnComponentUuidInProperties.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.RenameColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class RenameColumnComponentUuidInProperties extends DdlChange {
-
- public static final String TABLE_NAME = "properties";
- public static final String OLD_COLUMN_NAME = "component_uuid";
- public static final String NEW_COLUMN_NAME = "entity_uuid";
-
- public RenameColumnComponentUuidInProperties(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(c, TABLE_NAME, NEW_COLUMN_NAME)) {
- ColumnDef newColumnDef = new VarcharColumnDef.Builder()
- .setColumnName(NEW_COLUMN_NAME)
- .setIsNullable(true)
- .setLimit(40)
- .build();
-
- context.execute(new RenameColumnsBuilder(getDialect(), TABLE_NAME).renameColumn(OLD_COLUMN_NAME, newColumnDef).build());
- }
- }
-
- }
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranches.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranches.java
deleted file mode 100644
index a416b8eeaed..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/UpdateIsMainColumnInProjectBranches.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class UpdateIsMainColumnInProjectBranches extends DataChange {
-
- public UpdateIsMainColumnInProjectBranches(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
-
- // we need to use case/when/then because Oracle doesn't accept simple solution uuid = project_uuid here
- massUpdate.select("select uuid, case when uuid = project_uuid then 'true' else 'false' end from project_branches");
- massUpdate.update("update project_branches set is_main = ? where uuid = ?");
- massUpdate.execute((row, update) -> {
- String uuid = row.getString(1);
- boolean isMain = row.getBoolean(2);
- update.setBoolean(1, isMain);
- update.setString(2, uuid);
- return true;
- });
-
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/package-info.java
deleted file mode 100644
index 935cf26a2c4..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v101/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v101;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRules.java
deleted file mode 100644
index 1fd69e453ce..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddCleanCodeAttributeInRules.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddCleanCodeAttributeInRules extends DdlChange {
- private static final String TABLE_NAME = "rules";
- private static final String COLUMN_NAME = "clean_code_attribute";
- private static final int NEW_COLUMN_SIZE = 40;
-
-
- public AddCleanCodeAttributeInRules(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabled.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabled.java
deleted file mode 100644
index f142ada943e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/AddUserConsentRequiredIfGithubAutoProvisioningEnabled.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class AddUserConsentRequiredIfGithubAutoProvisioningEnabled extends DataChange {
-
- private static final Logger LOG = LoggerFactory.getLogger(AddUserConsentRequiredIfGithubAutoProvisioningEnabled.class);
- @VisibleForTesting
- static final String PROVISIONING_GITHUB_ENABLED_PROP_KEY = "provisioning.github.enabled";
-
- @VisibleForTesting
- static final String PROP_KEY = "sonar.auth.github.userConsentForPermissionProvisioningRequired";
-
- private static final String INSERT_QUERY = """
- insert into properties (uuid, prop_key, is_empty, created_at)
- values (?, ?, ?, ?)
- """;
-
- private final System2 system2;
- private final UuidFactory uuidFactory;
-
- public AddUserConsentRequiredIfGithubAutoProvisioningEnabled(Database db, System2 system2, UuidFactory uuidFactory) {
- super(db);
- this.system2 = system2;
- this.uuidFactory = uuidFactory;
- }
- @Override
- protected void execute(DataChange.Context context) throws SQLException {
- if (!isGithubAutoProvisioningEnabled(context)) {
- return;
- }
- if (isUserConsentAlreadyRequired(context)) {
- return;
- }
- LOG.warn("Automatic synchronization was previously activated for GitHub. It requires user consent to continue working as new " +
- " features were added with the synchronization. Please read the upgrade notes.");
- Upsert upsert = context.prepareUpsert(INSERT_QUERY);
- upsert
- .setString(1, uuidFactory.create())
- .setString(2, PROP_KEY)
- .setBoolean(3, true)
- .setLong(4, system2.now())
- .execute()
- .commit();
- }
-
- private static boolean isUserConsentAlreadyRequired(Context context) throws SQLException {
- return Optional.ofNullable(context.prepareSelect("select count(*) from properties where prop_key = ?")
- .setString(1, PROP_KEY)
- .get(t -> 1 == t.getInt(1)))
- .orElseThrow();
- }
-
- private static boolean isGithubAutoProvisioningEnabled(Context context) throws SQLException {
- return Optional.ofNullable(context.prepareSelect("select count(*) from internal_properties where kee = ? and text_value = ?")
- .setString(1, PROVISIONING_GITHUB_ENABLED_PROP_KEY)
- .setString(2, "true")
- .get(t -> 1 == t.getInt(1)))
- .orElseThrow();
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTable.java
deleted file mode 100644
index e43d94da692..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateAnticipatedTransitionsTable.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.IntegerColumnDef.newIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.USER_UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateAnticipatedTransitionsTable extends CreateTableChange {
- static final String ANTICIPATED_TRANSITIONS_TABLE_NAME = "anticipated_transitions";
-
- public CreateAnticipatedTransitionsTable(Database db) {
- super(db, ANTICIPATED_TRANSITIONS_TABLE_NAME);
- }
-
- @Override
- public void execute(DdlChange.Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("project_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("user_uuid").setIsNullable(false).setLimit(USER_UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("transition").setIsNullable(false).setLimit(20).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("transition_comment").setLimit(MAX_SIZE).build())
- .addColumn(newIntegerColumnDefBuilder().setColumnName("line").build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("message").setLimit(MAX_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("line_hash").setLimit(255).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_key").setIsNullable(false).setLimit(200).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("file_path").setIsNullable(false).setLimit(1500).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshots.java
deleted file mode 100644
index 48e758fe25c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateBooleanPurgedColumnInSnapshots.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreateBooleanPurgedColumnInSnapshots extends DdlChange {
- private static final String COLUMN_NAME = "purged";
- private static final String TABLE_NAME = "snapshots";
-
- public CreateBooleanPurgedColumnInSnapshots(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- if (checkIfColumnExists()) {
- return;
- }
- BooleanColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder(COLUMN_NAME).setIsNullable(true).build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
-
- public boolean checkIfColumnExists() throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTable.java
deleted file mode 100644
index b37fe068dc2..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateGithubOrganizationsGroupsTable.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateGithubOrganizationsGroupsTable extends CreateTableChange {
- @VisibleForTesting
- static final String TABLE_NAME = "github_orgs_groups";
- @VisibleForTesting
- static final String GROUP_UUID_COLUMN_NAME = "group_uuid";
- @VisibleForTesting
- static final String ORGANIZATION_COLUMN_NAME = "organization_name";
-
- public CreateGithubOrganizationsGroupsTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(GROUP_UUID_COLUMN_NAME).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(ORGANIZATION_COLUMN_NAME).setIsNullable(false).setLimit(100).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveries.java
deleted file mode 100644
index 2850b199519..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexCreatedAtInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumns;
-
-public class CreateIndexCreatedAtInWebhookDeliveries extends CreateIndexOnColumns {
- protected CreateIndexCreatedAtInWebhookDeliveries(Database db) {
- super(db, "webhook_deliveries", "wd", false, "created_at");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivity.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivity.java
deleted file mode 100644
index 048f618f4d3..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumn;
-
-public class CreateIndexEntityUuidInCeActivity extends CreateIndexOnColumn {
-
- private static final String TABLE_NAME = "ce_activity";
- private static final String COLUMN_NAME = "entity_uuid";
-
- public CreateIndexEntityUuidInCeActivity(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME, false);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueue.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueue.java
deleted file mode 100644
index 686b3a52569..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInCeQueue.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumn;
-
-public class CreateIndexEntityUuidInCeQueue extends CreateIndexOnColumn {
-
- private static final String TABLE_NAME = "ce_queue";
- private static final String COLUMN_NAME = "entity_uuid";
-
- public CreateIndexEntityUuidInCeQueue(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME, false);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRoles.java
deleted file mode 100644
index cf967f5a72e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInGroupRoles.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumn;
-
-public class CreateIndexEntityUuidInGroupRoles extends CreateIndexOnColumn {
-
- private static final String TABLE_NAME = "group_roles";
- private static final String COLUMN_NAME = "entity_uuid";
-
- public CreateIndexEntityUuidInGroupRoles(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME, false);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRoles.java
deleted file mode 100644
index b206d6e4c33..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexEntityUuidInUserRoles.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumn;
-
-public class CreateIndexEntityUuidInUserRoles extends CreateIndexOnColumn {
-
- private static final String TABLE_NAME = "user_roles";
- private static final String COLUMN_NAME = "entity_uuid";
-
- public CreateIndexEntityUuidInUserRoles(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME, false);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveries.java
deleted file mode 100644
index 999518b76f8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidCreatedAtInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumns;
-
-public class CreateIndexProjectUuidCreatedAtInWebhookDeliveries extends CreateIndexOnColumns {
- protected CreateIndexProjectUuidCreatedAtInWebhookDeliveries(Database db) {
- super(db, "webhook_deliveries", "wd", false, "project_uuid", "created_at");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranches.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranches.java
deleted file mode 100644
index 2e898b0c2f0..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexProjectUuidInProjectBranches.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumn;
-
-class CreateIndexProjectUuidInProjectBranches extends CreateIndexOnColumn {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String COLUMN_NAME = "project_uuid";
-
- public CreateIndexProjectUuidInProjectBranches(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME, false);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshots.java
deleted file mode 100644
index 89f2baa5fd8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexRootComponentUuidInSnapshots.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumn;
-
-public class CreateIndexRootComponentUuidInSnapshots extends CreateIndexOnColumn {
-
- private static final String TABLE_NAME = "snapshots";
- private static final String COLUMN_NAME = "root_component_uuid";
-
- public CreateIndexRootComponentUuidInSnapshots(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME, false);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveries.java
deleted file mode 100644
index d08538b4540..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexTaskUuidCreatedAtInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumns;
-
-public class CreateIndexTaskUuidCreatedAtInWebhookDeliveries extends CreateIndexOnColumns {
- protected CreateIndexTaskUuidCreatedAtInWebhookDeliveries(Database db) {
- super(db, "webhook_deliveries", "wd", false, "ce_task_uuid", "created_at");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveries.java
deleted file mode 100644
index cc0bd1fc0d3..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIndexWebhookUuidCreatedAtInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.CreateIndexOnColumns;
-
-public class CreateIndexWebhookUuidCreatedAtInWebhookDeliveries extends CreateIndexOnColumns {
- protected CreateIndexWebhookUuidCreatedAtInWebhookDeliveries(Database db) {
- super(db, "webhook_deliveries", "wd", false, "webhook_uuid", "created_at");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTable.java
deleted file mode 100644
index 86ecf33fa01..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateIssueImpactsTable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateIssueImpactsTable extends CreateTableChange {
- static final String TABLE_NAME = "issues_impacts";
-
- public CreateIssueImpactsTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(VarcharColumnDef.UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("issue_key").setIsNullable(false).setLimit(VarcharColumnDef.UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("software_quality").setIsNullable(false).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("severity").setIsNullable(false).setLimit(40).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriods.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriods.java
deleted file mode 100644
index 4c1340a5b9c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreatePreviousNonCompliantValueInNewCodePeriods.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreatePreviousNonCompliantValueInNewCodePeriods extends DdlChange {
-
- private static final String COLUMN_NAME= "previous_non_compliant_value";
-
- private static final String TABLE_NAME = "new_code_periods";
-
- public CreatePreviousNonCompliantValueInNewCodePeriods(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- if (checkIfColumnExists()) {
- return;
- }
- VarcharColumnDef columnDef = newVarcharColumnDefBuilder().setColumnName(COLUMN_NAME).setLimit(255).setIsNullable(true).build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
-
- public boolean checkIfColumnExists() throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTable.java
deleted file mode 100644
index ef43270c0a8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateRulesDefaultImpactsTable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateRulesDefaultImpactsTable extends CreateTableChange {
- static final String TABLE_NAME = "rules_default_impacts";
-
- public CreateRulesDefaultImpactsTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(VarcharColumnDef.UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_uuid").setIsNullable(false).setLimit(VarcharColumnDef.UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("software_quality").setIsNullable(false).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("severity").setIsNullable(false).setLimit(40).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpacts.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpacts.java
deleted file mode 100644
index 59775043799..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnIssuesImpacts.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreateUniqueConstraintOnIssuesImpacts extends DdlChange {
- private static final String TABLE_NAME = "issues_impacts";
- private static final String INDEX_NAME = "uniq_iss_key_sof_qual";
-
- public CreateUniqueConstraintOnIssuesImpacts(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createIndex(context, connection);
- }
- }
-
- private void createIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn("issue_key", false)
- .addColumn("software_quality", false)
- .setUnique(true)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpacts.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpacts.java
deleted file mode 100644
index 17f265dd8af..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/CreateUniqueConstraintOnRulesDefaultImpacts.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreateUniqueConstraintOnRulesDefaultImpacts extends DdlChange {
- private static final String TABLE_NAME = "rules_default_impacts";
- private static final String INDEX_NAME = "uniq_rul_uuid_sof_qual";
-
- public CreateUniqueConstraintOnRulesDefaultImpacts(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createIndex(context, connection);
- }
- }
-
- private void createIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn("rule_uuid", false)
- .addColumn("software_quality", false)
- .setUnique(true)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102.java
deleted file mode 100644
index 9f3431ded32..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion102 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_2_000, "Rename 'component_uuid' in 'user_roles' table to 'entity_uuid'", RenameComponentUuidInUserRoles.class)
- .add(10_2_001, "Rename 'component_uuid' in 'group_roles' table to 'entity_uuid'", RenameComponentUuidInGroupRoles.class)
-
- .add(10_2_002, "Drop index 'group_roles_component_uuid' in 'group_roles'", DropIndexComponentUuidInGroupRoles.class)
- .add(10_2_003, "Create index 'entity_uuid_user_roles' in 'group_roles' table", CreateIndexEntityUuidInGroupRoles.class)
-
- .add(10_2_004, "Drop index 'user_roles_component_uuid' in 'user_roles' table", DropIndexComponentUuidInUserRoles.class)
- .add(10_2_005, "Create index 'user_roles_entity_uuid' in 'user_roles'", CreateIndexEntityUuidInUserRoles.class)
-
- .add(10_2_006, "Drop index 'ce_activity_component' in 'ce_activity'", DropIndexMainComponentUuidInCeActivity.class)
- .add(10_2_007, "Rename 'main_component_uuid' in 'ce_activity' table to 'entity_uuid'", RenameMainComponentUuidInCeActivity.class)
- .add(10_2_008, "Create index 'ce_activity_entity_uuid' in 'ce_activity' table'", CreateIndexEntityUuidInCeActivity.class)
-
- .add(10_2_009, "Drop index 'ce_queue_main_component' in 'ce_queue' table", DropIndexMainComponentUuidInCeQueue.class)
- .add(10_2_010, "Rename 'main_component_uuid' in 'ce_queue' table to 'entity_uuid'", RenameMainComponentUuidInCeQueue.class)
- .add(10_2_011, "Create index 'ce_queue_entity_uuid' in 'ce_queue' table", CreateIndexEntityUuidInCeQueue.class)
-
- .add(10_2_012, "Drop 'project_mappings' table", DropTableProjectMappings.class)
-
- .add(10_2_013, "Drop index on 'components.main_branch_project_uuid", DropIndexOnMainBranchProjectUuid.class)
- .add(10_2_014, "Drop column 'main_branch_project_uuid' in the components table", DropMainBranchProjectUuidInComponents.class)
-
- .add(10_2_015, "Drop index 'component_uuid' in 'webhook_deliveries' table", DropIndexComponentUuidInWebhookDeliveries.class)
- .add(10_2_016, "Rename 'component_uuid' in 'webhook_deliveries' table to 'project_uuid'", RenameComponentUuidInWebhookDeliveries.class)
-
- .add(10_2_018, "Drop index 'component_uuid' in 'snapshots' table", DropIndexComponentUuidInSnapshots.class)
- .add(10_2_019, "Rename 'component_uuid' in 'snapshots' table to 'root_component_uuid'", RenameComponentUuidInSnapshots.class)
- .add(10_2_020, "Create index 'snapshots_root_component_uuid' in 'snapshots' table", CreateIndexRootComponentUuidInSnapshots.class)
-
- .add(10_2_021, "Create 'purged' column in 'snapshots' table", CreateBooleanPurgedColumnInSnapshots.class)
- .add(10_2_022, "Populate 'purged' column in 'snapshots' table", PopulatePurgedColumnInSnapshots.class)
- .add(10_2_023, "Make 'purged' column not nullable in 'snapshots' table", MakePurgedColumnNotNullableInSnapshots.class)
- .add(10_2_024, "Drop 'purge_status' column in 'snapshots' table", DropPurgeStatusColumnInSnapshots.class)
-
- .add(10_2_025, "Rename 'build_date' in 'snapshots' table to 'analysis_date", RenameBuildDateInSnapshots.class)
-
- // Versions 10_2_026 to 10_2_029 were used by a migration that has been rolled back. See SONAR-7704
-
- .add(10_2_030, "Create table 'anticipated_transitions'", CreateAnticipatedTransitionsTable.class)
-
- .add(10_2_031, "Increase size of 'ce_queue.is_last_key' from 55 to 80 characters", IncreaseIsLastKeyInCeActivity.class)
- .add(10_2_032, "Increase size of 'ce_queue.main_is_last_key' from 55 to 80 characters", IncreaseMainIsLastKeyInCeActivity.class)
- .add(10_2_033, "Add column 'clean_code_attribute' in 'rules' table", AddCleanCodeAttributeInRules.class)
- .add(10_2_034, "Populate 'clean_code_attribute' column in 'rules' table", PopulateCleanCodeAttributeColumnInRules.class)
- //TODO SONAR-20073
- //.add(10_2_035, "Make 'clean_code_attribute' column not nullable in 'rules' table", MakeCleanCodeAttributeColumnNotNullableInRules.class);
-
- .add(10_2_036, "Create 'rules_default_impacts' table", CreateRulesDefaultImpactsTable.class)
- .add(10_2_037, "Create unique constraint index on 'rules_default_impacts' table", CreateUniqueConstraintOnRulesDefaultImpacts.class)
- .add(10_2_038, "Create 'issues_impacts' table", CreateIssueImpactsTable.class)
- .add(10_2_039, "Create unique constraint index on 'issues_impacts' table", CreateUniqueConstraintOnIssuesImpacts.class)
- .add(10_2_040, "Populate default impacts for existing rules", PopulateDefaultImpactsInRules.class)
- .add(10_2_041, "Fix sqale_index metric description in 'metrics' table", FixSqaleIndexMetricDescription.class)
-
- .add(10_2_042, "Create table 'github_orgs_groups'", CreateGithubOrganizationsGroupsTable.class)
- .add(10_2_043, "Create 'previous_non_compliant_value' in 'new_code_periods' table", CreatePreviousNonCompliantValueInNewCodePeriods.class)
- .add(10_2_044, "Update column 'value' and populate column 'previous_non_compliant_value' in 'new_code_periods' table",
- UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods.class)
- .add(10_2_045, "Alter 'project_uuid' in 'user_dismissed_messages' - make it nullable", MakeProjectUuidNullableInUserDismissedMessages.class)
- .add(10_2_046, "Create index 'project_branches_project_uuid' in 'project_branches' table", CreateIndexProjectUuidInProjectBranches.class)
-
- .add(10_2_047, "Drop index 'idx_wbhk_dlvrs_wbhk_uuid' in 'webhook_deliveries'", DropIndexWebhookUuidInWebhookDeliveries.class)
- .add(10_2_048, "Create index 'wb_webhook_uuid_created_at' in 'webhook_deliveries'", CreateIndexWebhookUuidCreatedAtInWebhookDeliveries.class)
- .add(10_2_049, "Drop index 'wd_project_uuid' in 'webhook_deliveries'", DropIndexProjectUuidInWebhookDeliveries.class)
- .add(10_2_050, "Create index 'wd_project_uuid_created_at' in 'webhook_deliveries'", CreateIndexProjectUuidCreatedAtInWebhookDeliveries.class)
- .add(10_2_051, "Drop index 'ce_task_uuid' in 'webhook_deliveries'", DropIndexTaskUuidInWebhookDeliveries.class)
- .add(10_2_052, "Create index 'wd_task_uuid_created_at' in 'webhook_deliveries'", CreateIndexTaskUuidCreatedAtInWebhookDeliveries.class)
- .add(10_2_053, "Create index 'wd_created_at' in 'webhook_deliveries'", CreateIndexCreatedAtInWebhookDeliveries.class)
-
- .add(10_2_054, "Insert property github.userConsentementForPermissionProvisioningRequired", AddUserConsentRequiredIfGithubAutoProvisioningEnabled.class)
- ;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRoles.java
deleted file mode 100644
index 4deacfe069f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInGroupRoles.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexComponentUuidInGroupRoles extends DropIndexChange {
-
- private static final String TABLE_NAME = "group_roles";
- private static final String INDEX_NAME = "group_roles_component_uuid";
-
- public DropIndexComponentUuidInGroupRoles(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshots.java
deleted file mode 100644
index acb1bb3e3a8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInSnapshots.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexComponentUuidInSnapshots extends DropIndexChange {
-
- private static final String TABLE_NAME = "snapshots";
- private static final String INDEX_NAME = "snapshot_component";
-
- public DropIndexComponentUuidInSnapshots(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRoles.java
deleted file mode 100644
index f9b0460efe4..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInUserRoles.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexComponentUuidInUserRoles extends DropIndexChange {
-
- private static final String TABLE_NAME = "user_roles";
- private static final String INDEX_NAME = "user_roles_component_uuid";
-
- public DropIndexComponentUuidInUserRoles(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveries.java
deleted file mode 100644
index fc0edb92381..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexComponentUuidInWebhookDeliveries.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexComponentUuidInWebhookDeliveries extends DropIndexChange {
-
- private static final String TABLE_NAME = "webhook_deliveries";
- private static final String INDEX_NAME = "component_uuid";
-
- public DropIndexComponentUuidInWebhookDeliveries(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivity.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivity.java
deleted file mode 100644
index 55458705285..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeActivity.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexMainComponentUuidInCeActivity extends DropIndexChange {
-
- private static final String TABLE_NAME = "ce_activity";
- private static final String INDEX_NAME = "ce_activity_main_component";
-
- public DropIndexMainComponentUuidInCeActivity(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueue.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueue.java
deleted file mode 100644
index ae5d47f052e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexMainComponentUuidInCeQueue.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexMainComponentUuidInCeQueue extends DropIndexChange {
-
- private static final String TABLE_NAME = "ce_queue";
- private static final String INDEX_NAME = "ce_queue_main_component";
-
- public DropIndexMainComponentUuidInCeQueue(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuid.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuid.java
deleted file mode 100644
index daa15db5691..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexOnMainBranchProjectUuid.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexOnMainBranchProjectUuid extends DropIndexChange {
- private static final String INDEX_NAME = "idx_main_branch_prj_uuid";
- private static final String TABLE_NAME = "components";
-
- public DropIndexOnMainBranchProjectUuid(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveries.java
deleted file mode 100644
index 7824163142c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexProjectUuidInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexProjectUuidInWebhookDeliveries extends DropIndexChange {
- public DropIndexProjectUuidInWebhookDeliveries(Database db) {
- super(db, "wd_project_uuid", "webhook_deliveries");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveries.java
deleted file mode 100644
index e547e7ebc60..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexTaskUuidInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexTaskUuidInWebhookDeliveries extends DropIndexChange {
- public DropIndexTaskUuidInWebhookDeliveries(Database db) {
- super(db, "ce_task_uuid", "webhook_deliveries");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveries.java
deleted file mode 100644
index 772d5b3c611..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropIndexWebhookUuidInWebhookDeliveries.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexWebhookUuidInWebhookDeliveries extends DropIndexChange {
- public DropIndexWebhookUuidInWebhookDeliveries(Database db) {
- super(db, "idx_wbhk_dlvrs_wbhk_uuid", "webhook_deliveries");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponents.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponents.java
deleted file mode 100644
index cae1c8d4001..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropMainBranchProjectUuidInComponents.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-class DropMainBranchProjectUuidInComponents extends DropColumnChange {
- static final String TABLE_NAME = "components";
- static final String COLUMN_NAME = "main_branch_project_uuid";
-
- public DropMainBranchProjectUuidInComponents(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshots.java
deleted file mode 100644
index a75dee801df..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropPurgeStatusColumnInSnapshots.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropPurgeStatusColumnInSnapshots extends DropColumnChange {
- private static final String COLUMN_NAME = "purge_status";
- private static final String TABLE_NAME = "snapshots";
-
- public DropPurgeStatusColumnInSnapshots(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappings.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappings.java
deleted file mode 100644
index 30b3f744dc0..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/DropTableProjectMappings.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.DropTableBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class DropTableProjectMappings extends DdlChange {
-
- private static final String TABLE_NAME = "project_mappings";
-
- public DropTableProjectMappings(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableExists(TABLE_NAME, c)) {
- context.execute(new DropTableBuilder(getDialect(), TABLE_NAME).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescription.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescription.java
deleted file mode 100644
index 915ac32e6f1..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/FixSqaleIndexMetricDescription.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class FixSqaleIndexMetricDescription extends DataChange {
-
- public FixSqaleIndexMetricDescription(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- try (Upsert upsert = context.prepareUpsert("update metrics set description = ? where name = ?")) {
- upsert.setString(1, "Total effort (in minutes) to fix all the issues on the component and therefore to comply to all the requirements.");
- upsert.setString(2, "sqale_index");
- upsert.execute();
- upsert.commit();
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivity.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivity.java
deleted file mode 100644
index 98fb8c6bf58..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseIsLastKeyInCeActivity.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class IncreaseIsLastKeyInCeActivity extends DdlChange {
- @VisibleForTesting
- static final String TABLE_NAME = "ce_activity";
- @VisibleForTesting
- static final String COLUMN_NAME = "is_last_key";
- @VisibleForTesting
- static final int NEW_COLUMN_SIZE = 80;
-
- private static final VarcharColumnDef COLUMN_DEFINITION = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(false)
- .build();
-
- public IncreaseIsLastKeyInCeActivity(Database db) {
- super(db);
- }
-
- @Override
- public void execute(DdlChange.Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME)
- .updateColumn(COLUMN_DEFINITION)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivity.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivity.java
deleted file mode 100644
index eb851b4442d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/IncreaseMainIsLastKeyInCeActivity.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class IncreaseMainIsLastKeyInCeActivity extends DdlChange {
-
- @VisibleForTesting
- static final String TABLE_NAME = "ce_activity";
- @VisibleForTesting
- static final String COLUMN_NAME = "main_is_last_key";
- @VisibleForTesting
- static final int NEW_COLUMN_SIZE = 80;
-
- private static final VarcharColumnDef COLUMN_DEFINITION = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(false)
- .build();
-
- public IncreaseMainIsLastKeyInCeActivity(Database db) {
- super(db);
- }
-
- @Override
- public void execute(DdlChange.Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME)
- .updateColumn(COLUMN_DEFINITION)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessages.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessages.java
deleted file mode 100644
index e2e4309cb2e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakeProjectUuidNullableInUserDismissedMessages.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class MakeProjectUuidNullableInUserDismissedMessages extends DdlChange {
-
- private static final String TABLE_NAME = "user_dismissed_messages";
- private static final String COLUMN_NAME = "project_uuid";
-
- public MakeProjectUuidNullableInUserDismissedMessages(Database db) {
- super(db);
- }
-
- @Override
- public void execute(DdlChange.Context context) throws SQLException {
- VarcharColumnDef newColumnDef = new VarcharColumnDef.Builder()
- .setColumnName(COLUMN_NAME)
- .setIsNullable(true)
- .setLimit(40)
- .build();
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME).updateColumn(newColumnDef).build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshots.java
deleted file mode 100644
index 6db65f66999..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/MakePurgedColumnNotNullableInSnapshots.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class MakePurgedColumnNotNullableInSnapshots extends DdlChange {
- private static final String COLUMN_NAME = "purged";
- private static final String TABLE_NAME = "snapshots";
- public MakePurgedColumnNotNullableInSnapshots(Database db) {
- super(db);
- }
- @Override
- public void execute(Context context) throws SQLException {
- BooleanColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder(COLUMN_NAME).setIsNullable(false).build();
- context.execute(new AlterColumnsBuilder(getDialect(), TABLE_NAME).updateColumn(columnDef).build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRules.java
deleted file mode 100644
index 46e7b69d811..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateCleanCodeAttributeColumnInRules.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-
-public class PopulateCleanCodeAttributeColumnInRules extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT uuid, clean_code_attribute
- FROM rules
- WHERE clean_code_attribute is null and (rule_type <> %1$s or ad_hoc_type <> %1$s)
- """.formatted(SECURITY_HOTSPOT.getDbConstant());
-
- private static final String UPDATE_QUERY = """
- UPDATE rules
- SET clean_code_attribute=?
- WHERE uuid=?
- """;
-
- public PopulateCleanCodeAttributeColumnInRules(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update(UPDATE_QUERY);
-
- massUpdate.execute((row, update, index) -> {
- String ruleUuid = row.getString(1);
- update.setString(1, CleanCodeAttribute.CONVENTIONAL.name())
- .setString(2, ruleUuid);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRules.java
deleted file mode 100644
index 413ff7f4e4f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulateDefaultImpactsInRules.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.issue.impact.Severity;
-import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
-import org.sonar.api.server.rule.internal.ImpactMapper;
-import org.sonar.core.util.Uuids;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-import org.sonar.server.platform.db.migration.step.Select;
-
-public class PopulateDefaultImpactsInRules extends DataChange {
-
- private static final Logger LOG = LoggerFactory.getLogger(PopulateDefaultImpactsInRules.class);
-
- private static final String SELECT_COUNT_QUERY = """
- SELECT COUNT(*) FROM rules_default_impacts
- """;
- private static final String SELECT_QUERY = """
- SELECT r.uuid, rule_type, priority, ad_hoc_type, ad_hoc_severity, is_ad_hoc
- FROM rules r
- LEFT JOIN rules_default_impacts rdi ON rdi.rule_uuid = r.uuid
- WHERE rdi.uuid IS NULL
- """;
-
- private static final String INSERT_QUERY = """
- INSERT INTO rules_default_impacts (uuid, rule_uuid, software_quality, severity)
- VALUES (?, ?, ?, ?)
- """;
-
- public PopulateDefaultImpactsInRules(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (hasImpactsRecords(context)) {
- return;
- }
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update(INSERT_QUERY);
-
- massUpdate.execute((row, update, index) -> {
- String ruleUuid = row.getString(1);
- String ruleType = row.getString(2);
- String severity = row.getString(3);
- String adhocType = row.getString(4);
- String adhocSeverity = row.getString(5);
- boolean isAdhoc = row.getBoolean(6);
-
- SoftwareQuality softwareQuality;
- Severity impactSeverity;
-
- try {
- RuleType effectiveType = null;
- String effectiveSeverity = null;
- if (isAdhoc && adhocType != null && adhocSeverity != null) {
- effectiveType = RuleType.valueOf(Integer.valueOf(adhocType));
- effectiveSeverity = adhocSeverity;
- } else if (!isAdhoc && ruleType != null && !ruleType.equals("0") && severity != null) {
- effectiveType = RuleType.valueOf(Integer.valueOf(ruleType));
- effectiveSeverity = org.sonar.api.rule.Severity.ALL.get(Integer.valueOf(severity));
- } else if (!isAdhoc) {
- //When type and severity are missing, we are in the case of a "placeholder" adhoc_rule that was created as default with an external issue.
- //In that case, we want to set default values for the impact. Otherwise, we don't populate the impact
- return false;
- }
- if (effectiveType == RuleType.SECURITY_HOTSPOT) {
- return false;
- }
- if (effectiveType != null && effectiveSeverity != null) {
- softwareQuality = ImpactMapper.convertToSoftwareQuality(effectiveType);
- impactSeverity = ImpactMapper.convertToImpactSeverity(effectiveSeverity);
- } else {
- softwareQuality = SoftwareQuality.MAINTAINABILITY;
- impactSeverity = Severity.MEDIUM;
- }
- } catch (Exception e) {
- LOG.warn("Error while mapping type to impact for rule '%s'".formatted(ruleUuid));
- LOG.debug("Error while mapping type to impact for rule '%s'".formatted(ruleUuid), e);
- return false;
- }
-
- update.setString(1, Uuids.create())
- .setString(2, ruleUuid)
- .setString(3, softwareQuality.name())
- .setString(4, impactSeverity.name());
- return true;
- });
- }
-
- private static boolean hasImpactsRecords(Context context) throws SQLException {
- Long recordNumber = context.prepareSelect(SELECT_COUNT_QUERY).get(Select.LONG_READER);
- return recordNumber != null && recordNumber > 0;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshots.java
deleted file mode 100644
index f18d07f824d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/PopulatePurgedColumnInSnapshots.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class PopulatePurgedColumnInSnapshots extends DataChange {
- private static final String SELECT_QUERY = """
- SELECT s.uuid, s.purge_status
- FROM snapshots s
- WHERE s.purged is null
- """;
-
- private static final String UPDATE_QUERY = """
- UPDATE snapshots
- SET purged=?
- WHERE uuid=?
- """;
-
- public PopulatePurgedColumnInSnapshots(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (!checkIfColumnExists()) {
- return;
- }
-
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update(UPDATE_QUERY);
-
- massUpdate.execute((row, update, index) -> {
- String snapshotUuid = row.getString(1);
- Integer purgedStatus = row.getNullableInt(2);
- update.setBoolean(1, purgedStatus != null && purgedStatus == 1)
- .setString(2, snapshotUuid);
- return true;
- });
- }
-
- public boolean checkIfColumnExists() throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, "snapshots", "purge_status")) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshots.java
deleted file mode 100644
index ba0fa3a1b35..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameBuildDateInSnapshots.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
-import org.sonar.server.platform.db.migration.sql.RenameColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class RenameBuildDateInSnapshots extends DdlChange {
- private static final String TABLE_NAME = "snapshots";
-
- private static final BigIntegerColumnDef columnDefinition = BigIntegerColumnDef.newBigIntegerColumnDefBuilder()
- .setColumnName("analysis_date")
- .setIsNullable(true)
- .build();
-
- public RenameBuildDateInSnapshots(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, TABLE_NAME, "analysis_date")
- && DatabaseUtils.tableColumnExists(connection, TABLE_NAME, "build_date")) {
- context.execute(new RenameColumnsBuilder(getDialect(), TABLE_NAME)
- .renameColumn("build_date", columnDefinition)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRoles.java
deleted file mode 100644
index 7e7b108142c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInGroupRoles.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-
-public class RenameComponentUuidInGroupRoles extends RenameVarcharColumnChange {
-
- private static final String TABLE_NAME = "group_roles";
- private static final String OLD_COLUMN_NAME = "component_uuid";
- private static final String NEW_COLUMN_NAME = "entity_uuid";
-
- public RenameComponentUuidInGroupRoles(Database db) {
- super(db, TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshots.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshots.java
deleted file mode 100644
index 9084b02ac51..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInSnapshots.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-
-public class RenameComponentUuidInSnapshots extends RenameVarcharColumnChange {
-
- private static final String TABLE_NAME = "snapshots";
- private static final String OLD_COLUMN_NAME = "component_uuid";
- private static final String NEW_COLUMN_NAME = "root_component_uuid";
-
- public RenameComponentUuidInSnapshots(Database db) {
- super(db, TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
- }
-
-} \ No newline at end of file
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRoles.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRoles.java
deleted file mode 100644
index 742599ae498..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInUserRoles.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-
-public class RenameComponentUuidInUserRoles extends RenameVarcharColumnChange {
-
- private static final String TABLE_NAME = "user_roles";
- private static final String OLD_COLUMN_NAME = "component_uuid";
- private static final String NEW_COLUMN_NAME = "entity_uuid";
-
- public RenameComponentUuidInUserRoles(Database db) {
- super(db, TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveries.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveries.java
deleted file mode 100644
index 4ececf8662c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameComponentUuidInWebhookDeliveries.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-
-public class RenameComponentUuidInWebhookDeliveries extends RenameVarcharColumnChange {
-
- private static final String TABLE_NAME = "webhook_deliveries";
- private static final String OLD_COLUMN_NAME = "component_uuid";
- private static final String NEW_COLUMN_NAME = "project_uuid";
-
- public RenameComponentUuidInWebhookDeliveries(Database db) {
- super(db, TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivity.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivity.java
deleted file mode 100644
index 0a94e598baa..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-
-public class RenameMainComponentUuidInCeActivity extends RenameVarcharColumnChange {
-
- private static final String TABLE_NAME = "ce_activity";
- private static final String OLD_COLUMN_NAME = "main_component_uuid";
- private static final String NEW_COLUMN_NAME = "entity_uuid";
-
- public RenameMainComponentUuidInCeActivity(Database db) {
- super(db, TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueue.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueue.java
deleted file mode 100644
index 9be8f1ad55e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/RenameMainComponentUuidInCeQueue.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
-
-public class RenameMainComponentUuidInCeQueue extends RenameVarcharColumnChange {
-
- private static final String TABLE_NAME = "ce_queue";
- private static final String OLD_COLUMN_NAME = "main_component_uuid";
- private static final String NEW_COLUMN_NAME = "entity_uuid";
-
- public RenameMainComponentUuidInCeQueue(Database db) {
- super(db, TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods.java
deleted file mode 100644
index 63351727502..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT uuid, value
- FROM new_code_periods
- WHERE type = 'NUMBER_OF_DAYS'
- """;
- private static final String UPDATE_QUERY = """
- UPDATE new_code_periods
- SET previous_non_compliant_value=?, value='90', updated_at=?
- where uuid=?
- """;
-
- private static final String COLUMN_NAME= "previous_non_compliant_value";
-
- private static final String TABLE_NAME = "new_code_periods";
-
- public UpdateValueAndPopulatePreviousNonCompliantValueInNewCodePeriods(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (!checkIfColumnExists()) {
- return;
- }
- Long updatedAt = System.currentTimeMillis();
-
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update(UPDATE_QUERY);
-
- massUpdate.execute((row, update, index) -> {
- String newCodeDefinitionId = row.getString(1);
- String previousNewCodeDefinitionValue = row.getString(2);
- if(Integer.parseInt(previousNewCodeDefinitionValue) > 90) {
- update.setString(1, previousNewCodeDefinitionValue)
- .setLong(2, updatedAt)
- .setString(3, newCodeDefinitionId);
- return true;
- }
- return false;
- });
- }
-
- public boolean checkIfColumnExists() throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/package-info.java
deleted file mode 100644
index 9d00b4e4061..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v102/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v102;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTable.java
deleted file mode 100644
index c325805e2a6..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCleanCodeAttributeColumnInIssuesTable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddCleanCodeAttributeColumnInIssuesTable extends DdlChange {
- private static final String TABLE_NAME = "issues";
- private static final String COLUMN_NAME = "clean_code_attribute";
- private static final int NEW_COLUMN_SIZE = 40;
-
-
- public AddCleanCodeAttributeColumnInIssuesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTable.java
deleted file mode 100644
index 31bc8ff640a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddCreationMethodColumnInProjectsTable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddCreationMethodColumnInProjectsTable extends DdlChange {
- static final String PROJECTS_TABLE_NAME = "projects";
- static final String PROJECTS_CREATION_METHOD_COLUMN_NAME = "creation_method";
- static final int PROJECTS_CREATION_METHOD_COLUMN_SIZE = 50;
-
- public AddCreationMethodColumnInProjectsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, PROJECTS_TABLE_NAME, PROJECTS_CREATION_METHOD_COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(PROJECTS_CREATION_METHOD_COLUMN_NAME)
- .setLimit(PROJECTS_CREATION_METHOD_COLUMN_SIZE)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), PROJECTS_TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChanges.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChanges.java
deleted file mode 100644
index b6981bb446d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddRuleChangesUuidColumnInQProfileChanges.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddRuleChangesUuidColumnInQProfileChanges extends DdlChange {
- private static final String TABLE_NAME = "qprofile_changes";
- private static final String COLUMN_NAME = "rule_change_uuid";
-
- private static final int NEW_COLUMN_SIZE = 40;
-
- public AddRuleChangesUuidColumnInQProfileChanges(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(true)
- .build();
-
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTable.java
deleted file mode 100644
index af5687ad539..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/AddSqVersionColumnInQprofileChangesTable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddSqVersionColumnInQprofileChangesTable extends DdlChange {
- private static final String TABLE_NAME = "qprofile_changes";
- private static final String COLUMN_NAME = "sq_version";
- private static final int NEW_COLUMN_SIZE = 40;
-
-
- public AddSqVersionColumnInQprofileChangesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(COLUMN_NAME)
- .setLimit(NEW_COLUMN_SIZE)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTable.java
deleted file mode 100644
index 1e6ec4387cf..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateGithubPermissionsMappingTable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateGithubPermissionsMappingTable extends CreateTableChange {
- static final String GITHUB_PERMISSIONS_MAPPING_TABLE_NAME = "github_perms_mapping";
- static final String GITHUB_ROLE_COLUMN = "github_role";
- static final String SONARQUBE_PERMISSION_COLUMN = "sonarqube_permission";
-
- public CreateGithubPermissionsMappingTable(Database db) {
- super(db, GITHUB_PERMISSIONS_MAPPING_TABLE_NAME);
- }
-
- @Override
- public void execute(DdlChange.Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(GITHUB_ROLE_COLUMN).setIsNullable(false).setLimit(100).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(SONARQUBE_PERMISSION_COLUMN).setIsNullable(false).setLimit(64).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTable.java
deleted file mode 100644
index 41ac645d795..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateIndexForRuleImpactChangesTable.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreateIndexForRuleImpactChangesTable extends DdlChange {
-
- static final String INDEX_NAME = "rule_impact_changes_r_c_uuid";
- static final String TABLE_NAME = "rule_impact_changes";
-
- public CreateIndexForRuleImpactChangesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUniqueIndex(context, connection);
- }
- }
-
- private void createUniqueIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn("rule_change_uuid", false)
- .setUnique(false)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTable.java
deleted file mode 100644
index f0be252f3c8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleChangesTable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateRuleChangesTable extends CreateTableChange {
-
- static final String TABLE_NAME = "rule_changes";
-
- public CreateRuleChangesTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(DdlChange.Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("new_clean_code_attribute").setIsNullable(true).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("old_clean_code_attribute").setIsNullable(true).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTable.java
deleted file mode 100644
index c316af76c52..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateRuleImpactChangesTable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateRuleImpactChangesTable extends CreateTableChange {
-
- static final String TABLE_NAME = "rule_impact_changes";
-
- public CreateRuleImpactChangesTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(DdlChange.Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addColumn(newVarcharColumnDefBuilder().setColumnName("new_software_quality").setIsNullable(true).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("old_software_quality").setIsNullable(true).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("new_severity").setIsNullable(true).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("old_severity").setIsNullable(true).setLimit(40).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("rule_change_uuid").setIsNullable(false).setLimit(40).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTable.java
deleted file mode 100644
index 38ec8f70118..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForGithubPermissionsMappingTable.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.GITHUB_PERMISSIONS_MAPPING_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.GITHUB_ROLE_COLUMN;
-import static org.sonar.server.platform.db.migration.version.v103.CreateGithubPermissionsMappingTable.SONARQUBE_PERMISSION_COLUMN;
-
-public class CreateUniqueIndexForGithubPermissionsMappingTable extends DdlChange {
-
- @VisibleForTesting
- static final String INDEX_NAME = "uniq_github_perm_mappings";
-
- public CreateUniqueIndexForGithubPermissionsMappingTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUniqueIndex(context, connection);
- }
- }
-
- private void createUniqueIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(GITHUB_PERMISSIONS_MAPPING_TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(GITHUB_ROLE_COLUMN, false)
- .addColumn(SONARQUBE_PERMISSION_COLUMN, false)
- .setUnique(true)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTable.java
deleted file mode 100644
index 437a8fb7c4d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/CreateUniqueIndexForPropertiesTable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreateUniqueIndexForPropertiesTable extends DdlChange {
-
- public static final String INDEX_NAME = "uniq_properties";
- public static final String PROPERTIES_TABLE_NAME = "properties";
-
- public CreateUniqueIndexForPropertiesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.indexExistsIgnoreCase(PROPERTIES_TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(PROPERTIES_TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn("prop_key", false)
- .addColumn("entity_uuid", true)
- .addColumn("user_uuid", true)
- .setUnique(true)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103.java
deleted file mode 100644
index 0a9dea8ca78..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion103 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_3_000, "Set 'sonar.qualityProfiles.allowDisableInheritedRules' to false for upgraded instances", SetAllowQualityProfileDisableInheritedRules.class)
- .add(10_3_001, "Add table 'github_perms_mapping'", CreateGithubPermissionsMappingTable.class)
- .add(10_3_002, "Create unique index on 'github_perms_mapping'", CreateUniqueIndexForGithubPermissionsMappingTable.class)
- .add(10_3_003, "Add default mappings to 'github_perms_mapping'", PopulateGithubPermissionsMapping.class)
- .add(10_3_004, "Add 'clean_code_attribute' column in 'issues' table", AddCleanCodeAttributeColumnInIssuesTable.class)
- .add(10_3_005, "Add 'creation_method' column in 'projects' table", AddCreationMethodColumnInProjectsTable.class)
- .add(10_3_006, "Populate 'creation_method' column in 'projects' table", PopulateCreationMethodColumnInProjectsTable.class)
- .add(10_3_007, "Make 'creation_method' column in 'projects' table non-nullable", MakeCreationMethodColumnInProjectsNotNullable.class)
- .add(10_3_008, "Add 'rule_changes_uuid' column in 'qprofile_changes'", AddRuleChangesUuidColumnInQProfileChanges.class)
- .add(10_3_009, "Create table 'rule_changes'", CreateRuleChangesTable.class)
- .add(10_3_010, "Create table 'rule_impact_changes'", CreateRuleImpactChangesTable.class)
- .add(10_3_011, "Create index for 'rule_impact_changes'", CreateIndexForRuleImpactChangesTable.class)
- .add(10_3_012, "Add 'sq_version' column in 'qprofile_changes' table", AddSqVersionColumnInQprofileChangesTable.class)
- .add(10_3_013, "Deduplicate potential records in 'properties' table", DeduplicatePropertiesTable.class)
- .add(10_3_014, "Create unique index to 'properties' table", CreateUniqueIndexForPropertiesTable.class);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTable.java
deleted file mode 100644
index e2d5abff08f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/DeduplicatePropertiesTable.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.util.List;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.DeduplicateTableBuilder;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-public class DeduplicatePropertiesTable extends DataChange {
- private static final String PROPERTIES_TABLE = "properties";
-
- public DeduplicatePropertiesTable(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- List<String> queries = new DeduplicateTableBuilder(PROPERTIES_TABLE)
- .addReferenceColumn("prop_key")
- .addReferenceColumn("entity_uuid")
- .addReferenceColumn("user_uuid")
- .setIdentityColumn("uuid")
- .build();
-
- for (String q : queries) {
- context.prepareUpsert(q)
- .execute()
- .commit();
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullable.java
deleted file mode 100644
index cf220f8a494..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/MakeCreationMethodColumnInProjectsNotNullable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_CREATION_METHOD_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_CREATION_METHOD_COLUMN_SIZE;
-import static org.sonar.server.platform.db.migration.version.v103.AddCreationMethodColumnInProjectsTable.PROJECTS_TABLE_NAME;
-
-public class MakeCreationMethodColumnInProjectsNotNullable extends DdlChange {
-
- public MakeCreationMethodColumnInProjectsNotNullable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- VarcharColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder(PROJECTS_CREATION_METHOD_COLUMN_NAME)
- .setIsNullable(false)
- .setLimit(PROJECTS_CREATION_METHOD_COLUMN_SIZE)
- .build();
- context.execute(new AlterColumnsBuilder(getDialect(), PROJECTS_TABLE_NAME).updateColumn(columnDef).build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTable.java
deleted file mode 100644
index fada6ccb11a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateCreationMethodColumnInProjectsTable.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class PopulateCreationMethodColumnInProjectsTable extends DataChange {
-
- private static final String UPDATE_QUERY = """
- update projects set creation_method='UNKNOWN'
- """;
-
- public PopulateCreationMethodColumnInProjectsTable(Database db) {
- super(db);
- }
- @Override
- protected void execute(Context context) throws SQLException {
- Upsert upsert = context.prepareUpsert(UPDATE_QUERY);
- upsert.execute().commit();
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMapping.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMapping.java
deleted file mode 100644
index 65aa311ba81..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/PopulateGithubPermissionsMapping.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.SCAN;
-import static org.sonar.api.web.UserRole.SECURITYHOTSPOT_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
-
-public class PopulateGithubPermissionsMapping extends DataChange {
-
- private static final Map<String, Set<String>> GITHUB_ROLE_TO_SQ_PERMISSIONS = Map.of(
- "read", Set.of(USER, CODEVIEWER),
- "triage", Set.of(USER, CODEVIEWER),
- "write", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN),
- "maintain", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN),
- "admin", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN, ADMIN)
- );
-
- private static final String INSERT_QUERY = """
- insert into github_perms_mapping (uuid, github_role, sonarqube_permission)
- values (?, ?, ?)
- """;
-
- private final UuidFactory uuidFactory;
-
- public PopulateGithubPermissionsMapping(Database db, UuidFactory uuidFactory) {
- super(db);
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (isDefaultMappingAlreadyDefined(context)) {
- return;
- }
- try (Upsert upsert = context.prepareUpsert(INSERT_QUERY)) {
- GITHUB_ROLE_TO_SQ_PERMISSIONS.forEach((key, value) -> insertGithubRoleToSonarqubePermissionMapping(upsert, key, value));
- upsert.commit();
- }
- }
-
- private void insertGithubRoleToSonarqubePermissionMapping(Upsert upsert, String githubRole, Set<String> sonarqubePermissions) {
- sonarqubePermissions.forEach(permission -> insertGithubRoleToSonarqubePermissionMapping(upsert, githubRole, permission));
- }
-
- private void insertGithubRoleToSonarqubePermissionMapping(Upsert upsert, String githubRole, String sonarqubePermission) {
- try {
- upsert
- .setString(1, uuidFactory.create())
- .setString(2, githubRole)
- .setString(3, sonarqubePermission)
- .execute();
- } catch (SQLException e) {
- throw new IllegalStateException(e);
- }
- }
-
- private static boolean isDefaultMappingAlreadyDefined(Context context) throws SQLException {
- try (Select select = context.prepareSelect("select count(*) from github_perms_mapping")) {
- return Optional.ofNullable(select.get(t -> t.getInt(1) > 0))
- .orElseThrow();
- }
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRules.java
deleted file mode 100644
index c14c2e09d82..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/SetAllowQualityProfileDisableInheritedRules.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import java.sql.SQLException;
-import org.sonar.api.utils.System2;
-import org.sonar.core.config.CorePropertyDefinitions;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Select;
-
-public class SetAllowQualityProfileDisableInheritedRules extends DataChange {
- private System2 system2;
- private UuidFactory uuidFactory;
-
- public SetAllowQualityProfileDisableInheritedRules(Database db, System2 system2, UuidFactory uuidFactory) {
- super(db);
- this.system2 = system2;
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (!propertyIsAlreadyDefined(context)) {
- insertPropertyWithValueAsFalse(context);
- }
- }
-
- private static boolean propertyIsAlreadyDefined(Context context) throws SQLException {
- Select select = context.prepareSelect("select p.text_value from properties p where p.prop_key = ?")
- .setString(1, CorePropertyDefinitions.ALLOW_DISABLE_INHERITED_RULES);
- String value = select.get(row -> row.getString(1));
- return value != null;
- }
-
- private void insertPropertyWithValueAsFalse(Context context) throws SQLException {
- context.prepareUpsert("INSERT INTO properties"
- + "(prop_key, is_empty, text_value, created_at, uuid) "
- + "VALUES(?, ?, ?, ?, ?)")
- .setString(1, CorePropertyDefinitions.ALLOW_DISABLE_INHERITED_RULES)
- .setBoolean(2, false)
- .setString(3, "false")
- .setLong(4, system2.now())
- .setString(5, uuidFactory.create())
- .execute()
- .commit();
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/package-info.java
deleted file mode 100644
index fd23746e2ce..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v103/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v103;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsers.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsers.java
deleted file mode 100644
index 9d29d1bd62c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/AddUuidColumnToGroupsUsers.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-
-public class AddUuidColumnToGroupsUsers extends DdlChange {
-
- public static final String GROUPS_USERS_TABLE_NAME = "groups_users";
- public static final String GROUPS_USERS_UUID_COLUMN_NAME = "uuid";
-
- public AddUuidColumnToGroupsUsers(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, GROUPS_USERS_TABLE_NAME, GROUPS_USERS_UUID_COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(GROUPS_USERS_UUID_COLUMN_NAME)
- .setLimit(UUID_SIZE)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), GROUPS_USERS_TABLE_NAME).addColumn(columnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTable.java
deleted file mode 100644
index 73f9b8e21df..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateIssuesFixedTable.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateIssuesFixedTable extends CreateTableChange {
-
- static final String TABLE_NAME = "issues_fixed";
- static final String COLUMN_PULL_REQUEST_UUID = "pull_request_uuid";
- static final String COLUMN_ISSUE_KEY = "issue_key";
-
- public CreateIssuesFixedTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(COLUMN_PULL_REQUEST_UUID).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(COLUMN_ISSUE_KEY).setIsNullable(false).setLimit(50).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTable.java
deleted file mode 100644
index 42bdd7fc18f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreatePrimaryKeyOnGroupsUsersTable.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.AddPrimaryKeyBuilder;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_UUID_COLUMN_NAME;
-
-public class CreatePrimaryKeyOnGroupsUsersTable extends DdlChange {
-
- @VisibleForTesting
- static final String PK_NAME = "pk_groups_users";
-
- public CreatePrimaryKeyOnGroupsUsersTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- createPrimaryKey(context);
- }
-
- private void createPrimaryKey(Context context) throws SQLException {
- boolean pkExists = new DbPrimaryKeyConstraintFinder(getDatabase()).findConstraintName(GROUPS_USERS_TABLE_NAME).isPresent();
- if (!pkExists) {
- context.execute(new AddPrimaryKeyBuilder(GROUPS_USERS_TABLE_NAME, GROUPS_USERS_UUID_COLUMN_NAME).build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTable.java
deleted file mode 100644
index 6cd00c87472..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/CreateRuleTagsTable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.BooleanColumnDef.newBooleanColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateRuleTagsTable extends CreateTableChange {
-
- static final String RULE_TAGS_TABLE_NAME = "rule_tags";
-
- static final String VALUE_COLUMN_NAME = "value";
- static final String IS_SYSTEM_TAG_COLUMN_NAME = "is_system_tag";
- static final String RULE_UUID_COLUMN_NAME = "rule_uuid";
- static final int VALUE_COLUMN_SIZE = 400;
-
- public CreateRuleTagsTable(Database db) {
- super(db, RULE_TAGS_TABLE_NAME);
- }
-
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(VALUE_COLUMN_NAME).setIsNullable(false).setLimit(VALUE_COLUMN_SIZE).build())
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(RULE_UUID_COLUMN_NAME).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newBooleanColumnDefBuilder().setColumnName(IS_SYSTEM_TAG_COLUMN_NAME).setIsNullable(false).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104.java
deleted file mode 100644
index 8ad36896a6d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion104 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_4_000, "Delete redundant Failed Alerts for Applications", DeleteRedundantFailedAlertsForApplications.class)
- .add(10_4_001, "Rename metric 'wont_fix_issues' to 'accepted_issues'", RenameWontFixIssuesMetric.class)
- .add(10_4_002, "Create table 'rules_tags'", CreateRuleTagsTable.class)
- .add(10_4_003, "Populate 'rule_tags' table", PopulateRuleTagsTable.class)
- .add(10_4_004, "Drop column 'tags' in the 'rules' table", DropTagsInRules.class)
- .add(10_4_005, "Drop column 'system_tags' in the 'rules' table", DropSystemTagsInRules.class)
- .add(10_4_006, "Add 'uuid' column to 'groups_users'", AddUuidColumnToGroupsUsers.class)
- .add(10_4_007, "Populate 'uuid' column in 'groups_users'", PopulateGroupsUsersUuid.class)
- .add(10_4_008, "Make 'uuid' column in 'groups_users' table non-nullable", MakeUuidInGroupsUsersNotNullable.class)
- .add(10_4_009, "Create primary key on 'groups_users.uuid'", CreatePrimaryKeyOnGroupsUsersTable.class)
- .add(10_4_010, "Set nulls in 'clean_code_attribute' column of 'rules' table for security hotspots",
- RemoveCleanCodeAttributeFromCustomHotspotRules.class)
- .add(10_4_011, "Create 'issues_fixed' table", CreateIssuesFixedTable.class);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplications.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplications.java
deleted file mode 100644
index bb869985f6d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DeleteRedundantFailedAlertsForApplications.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class DeleteRedundantFailedAlertsForApplications extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT E.uuid
- FROM events E
- JOIN components C ON E.component_uuid = C.uuid
- WHERE E.name = 'Failed'
- AND E.category = 'Alert'
- AND E.event_data = '{ stillFailing: false, status: "ERROR" }'
- AND C.qualifier = 'APP'""";
-
- private static final String DELETE_EVENTS_STATEMENT = "DELETE FROM events WHERE uuid = ?";
- private static final String DELETE_EVENTS_COMPONENT_CHANGES_STATEMENT = "DELETE FROM event_component_changes WHERE event_uuid = ?";
-
- public DeleteRedundantFailedAlertsForApplications(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- var select = massUpdate.select(SELECT_QUERY);
- var deleteEventComponentChanges = massUpdate.update(DELETE_EVENTS_COMPONENT_CHANGES_STATEMENT);
- var deleteEvents = massUpdate.update(DELETE_EVENTS_STATEMENT);
- try (select; deleteEventComponentChanges; deleteEvents) {
- massUpdate.execute((row, delete, index) -> {
- // both updates use the same select, so no need to differentiate for the 2 update indexes
- String uuid = row.getString(1);
- delete.setString(1, uuid);
- return true;
- });
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRules.java
deleted file mode 100644
index df45918c350..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropSystemTagsInRules.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropSystemTagsInRules extends DropColumnChange {
- static final String COLUMN_NAME = "system_tags";
- static final String TABLE_NAME = "rules";
-
- public DropSystemTagsInRules(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRules.java
deleted file mode 100644
index d4d50599439..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/DropTagsInRules.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropTagsInRules extends DropColumnChange {
- private static final String COLUMN_NAME = "tags";
- private static final String TABLE_NAME = "rules";
-
- public DropTagsInRules(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullable.java
deleted file mode 100644
index 9b7b1063376..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/MakeUuidInGroupsUsersNotNullable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v104.AddUuidColumnToGroupsUsers.GROUPS_USERS_UUID_COLUMN_NAME;
-
-public class MakeUuidInGroupsUsersNotNullable extends DdlChange {
-
- private static final VarcharColumnDef UUID_COLUMN_DEF = VarcharColumnDef.newVarcharColumnDefBuilder(GROUPS_USERS_UUID_COLUMN_NAME)
- .setIsNullable(false)
- .setLimit(UUID_SIZE)
- .build();
-
- public MakeUuidInGroupsUsersNotNullable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), GROUPS_USERS_TABLE_NAME).updateColumn(UUID_COLUMN_DEF).build());
-
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuid.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuid.java
deleted file mode 100644
index b25c8f49c7a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateGroupsUsersUuid.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.SqlStatement;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class PopulateGroupsUsersUuid extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT group_uuid, user_uuid
- FROM groups_users
- WHERE uuid IS NULL
- """;
-
- private static final String SET_UUID_STATEMENT = """
- UPDATE groups_users
- SET uuid=?
- WHERE group_uuid=? AND user_uuid=?
- """;
-
- private final UuidFactory uuidFactory;
-
- public PopulateGroupsUsersUuid(Database db, UuidFactory uuidFactory) {
- super(db);
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- SqlStatement<Select> select = massUpdate.select(SELECT_QUERY);
- Upsert setUuid = massUpdate.update(SET_UUID_STATEMENT);
- try (select; setUuid) {
- massUpdate.execute((row, update, index) -> {
- String groupUuid = row.getString(1);
- String userUuid = row.getString(2);
- String uuid = uuidFactory.create();
- update.setString(1, uuid);
- update.setString(2, groupUuid);
- update.setString(3, userUuid);
- return true;
- });
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTable.java
deleted file mode 100644
index 5b4b2fd5dcb..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/PopulateRuleTagsTable.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class PopulateRuleTagsTable extends DataChange {
-
- private static final String SELECT_QUERY = """
- SELECT uuid, system_tags AS tag, 1 as is_system_tag
- FROM rules
- WHERE system_tags IS NOT NULL
- UNION ALL
- SELECT uuid, tags AS tag, 0 as is_system_tag
- FROM rules
- WHERE tags IS NOT NULL
- """;
-
- private static final String INSERT_QUERY = """
- INSERT INTO rule_tags (rule_uuid, is_system_tag, value)
- VALUES (?, ?, ?)
- """;
-
- public PopulateRuleTagsTable(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (isTableAlreadyPopulated(context)) {
- return;
- }
-
- List<Tags> allTags = findAllTags(context);
- if (allTags.isEmpty()) {
- return;
- }
- allTags = removeDuplicatesForAllRule(allTags);
-
- Upsert insertTagsQuery = context.prepareUpsert(INSERT_QUERY);
- for (Tags tags : allTags) {
- insertEveryTag(insertTagsQuery, tags.ruleUuid(), tags.values(), tags.isSystemTag());
- }
- insertTagsQuery.execute().commit();
- }
-
- /**
- * System tags and custom tags can contain the same values. In this case, we keep only the system tag.
- */
- private static List<Tags> removeDuplicatesForAllRule(List<Tags> allTags) {
- Map<String, List<Tags>> tagsByRuleUuid = allTags.stream().collect(Collectors.groupingBy(Tags::ruleUuid));
- List<Tags> listWithoutDuplicates = new ArrayList<>();
-
- for (Map.Entry<String, List<Tags>> entry : tagsByRuleUuid.entrySet()) {
- listWithoutDuplicates.addAll(removeDuplicateForRule(entry.getValue()));
- }
- return listWithoutDuplicates;
- }
-
- private static List<Tags> removeDuplicateForRule(List<Tags> ruleTags) {
- Optional<Tags> systemTags = ruleTags.stream().filter(Tags::isSystemTag).findFirst();
- Optional<Tags> manualTags = ruleTags.stream().filter(t -> !t.isSystemTag()).findFirst();
-
- if (systemTags.isEmpty()) {
- return List.of(manualTags.orElseThrow());
- } else if (manualTags.isEmpty()) {
- return List.of(systemTags.orElseThrow());
- } else {
- Set<String> systemTagValues = systemTags.get().values();
- Set<String> manualTagValues = manualTags.get().values();
- Set<String> commonValues = new HashSet<>(systemTagValues);
- commonValues.retainAll(manualTagValues);
-
- if (commonValues.isEmpty()) {
- return List.of(manualTags.orElseThrow(), systemTags.orElseThrow());
- } else {
- manualTagValues.removeAll(commonValues);
- return List.of(systemTags.orElseThrow(), new Tags(manualTags.get().ruleUuid(), manualTagValues, false));
- }
- }
- }
-
- private static void insertEveryTag(Upsert insertRuleTags, String ruleUuid, Set<String> values, boolean isSystemTag) throws SQLException {
- for (String tag : values) {
- insertRuleTags
- .setString(1, ruleUuid)
- .setBoolean(2, isSystemTag)
- .setString(3, tag)
- .addBatch();
- }
- }
-
- private static List<Tags> findAllTags(Context context) throws SQLException {
- return context.prepareSelect(SELECT_QUERY)
- .list(r -> new Tags(r.getString(1), parseTagString(r.getString(2)), r.getBoolean(3)));
- }
-
- private static boolean isTableAlreadyPopulated(Context context) throws SQLException {
- try (Select select = context.prepareSelect("select count(*) from rule_tags")) {
- return Optional.ofNullable(select.get(t -> t.getInt(1) > 0))
- .orElseThrow();
- }
- }
-
- private static Set<String> parseTagString(String tagString) {
- return Arrays.stream(tagString.split(","))
- .filter(s -> !s.isEmpty())
- .collect(Collectors.toSet());
- }
-
- private record Tags(String ruleUuid, Set<String> values, boolean isSystemTag) {
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRules.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRules.java
deleted file mode 100644
index 1d94a0ddf90..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RemoveCleanCodeAttributeFromCustomHotspotRules.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class RemoveCleanCodeAttributeFromCustomHotspotRules extends DataChange {
-
- private static final String SELECT = """
- SELECT uuid
- FROM rules
- WHERE rule_type = 4
- AND clean_code_attribute IS NOT NULL
- """;
- private static final String UPDATE = """
- UPDATE rules SET clean_code_attribute = NULL, updated_at = ? WHERE uuid = ?
- """;
-
- public RemoveCleanCodeAttributeFromCustomHotspotRules(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- Long updatedAt = System.currentTimeMillis();
- massUpdate.select(SELECT);
- massUpdate.update(UPDATE);
- massUpdate.execute((row, update) -> {
- String uuid = row.getString(1);
- update.setLong(1, updatedAt);
- update.setString(2, uuid);
- return true;
- });
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetric.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetric.java
deleted file mode 100644
index e04f182e68f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/RenameWontFixIssuesMetric.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class RenameWontFixIssuesMetric extends DataChange {
-
- private static final String UPDATE_QUERY = """
- update metrics set name='accepted_issues', description='Accepted issues', short_name='Accepted issues' where name='wont_fix_issues'
- """;
-
- public RenameWontFixIssuesMetric(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- Upsert upsert = context.prepareUpsert(UPDATE_QUERY);
- upsert.execute().commit();
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/package-info.java
deleted file mode 100644
index 89b67fc58f5..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v104/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v104;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTable.java
deleted file mode 100644
index f1e42169f6f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnIssuesImpactsTable.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.AddPrimaryKeyBuilder;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreatePrimaryKeyOnIssuesImpactsTable extends DdlChange {
- @VisibleForTesting
- static final String PK_NAME = "pk_issues_impacts";
- @VisibleForTesting
- static final String TABLE_NAME = "issues_impacts";
- @VisibleForTesting
- static final String ISSUE_KEY_COLUMN_NAME = "issue_key";
- @VisibleForTesting
- static final String SOFTWARE_QUALITY_COLUMN = "software_quality";
-
-
- public CreatePrimaryKeyOnIssuesImpactsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(DdlChange.Context context) throws SQLException {
- createPrimaryKey(context);
- }
-
- private void createPrimaryKey(DdlChange.Context context) throws SQLException {
- boolean pkExists = new DbPrimaryKeyConstraintFinder(getDatabase()).findConstraintName(TABLE_NAME).isPresent();
- if (!pkExists) {
- context.execute(new AddPrimaryKeyBuilder(TABLE_NAME, ISSUE_KEY_COLUMN_NAME, SOFTWARE_QUALITY_COLUMN).build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTable.java
deleted file mode 100644
index bcd27f1b1dd..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/CreatePrimaryKeyOnRulesDefaultImpactsTable.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.AddPrimaryKeyBuilder;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class CreatePrimaryKeyOnRulesDefaultImpactsTable extends DdlChange {
- @VisibleForTesting
- static final String PK_NAME = "pk_rules_default_impacts";
- @VisibleForTesting
- static final String TABLE_NAME = "rules_default_impacts";
- @VisibleForTesting
- static final String RULE_UUID_COLUMN_NAME = "rule_uuid";
- @VisibleForTesting
- static final String SOFTWARE_QUALITY_COLUMN = "software_quality";
-
-
- public CreatePrimaryKeyOnRulesDefaultImpactsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- createPrimaryKey(context);
- }
-
- private void createPrimaryKey(Context context) throws SQLException {
- boolean pkExists = new DbPrimaryKeyConstraintFinder(getDatabase()).findConstraintName(TABLE_NAME).isPresent();
- if (!pkExists) {
- context.execute(new AddPrimaryKeyBuilder(TABLE_NAME, RULE_UUID_COLUMN_NAME, SOFTWARE_QUALITY_COLUMN).build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105.java
deleted file mode 100644
index 39c6cea8d13..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion105 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_5_000, "Drop constraint on 'uuid' from 'issues_impacts' table", DropPrimaryKeyConstraintInIssuesImpactsTable.class)
- .add(10_5_001, "Drop constraint on 'uuid' from 'rules_default_impacts' table", DropPrimaryKeyConstraintInRulesDefaultImpactsTable.class)
- .add(10_5_002, "Drop column 'uuid' from 'issues_impacts' table", DropUuidColumnInIssuesImpactsTable.class)
- .add(10_5_003, "Drop column 'uuid' from 'rules_default_impacts' table", DropUuidColumnInRulesDefaultImpactsTable.class)
- .add(10_5_004, "Create primary key on 'issues_impacts' table", CreatePrimaryKeyOnIssuesImpactsTable.class)
- .add(10_5_005, "Create primary key on 'rules_default_impacts' table", CreatePrimaryKeyOnRulesDefaultImpactsTable.class)
- .add(10_5_006, "Delete 'languageSpecificParameters' property set from 'properties' table", DeleteLanguageSpecificParametersPropertySet.class);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySet.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySet.java
deleted file mode 100644
index 417edadd0a2..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DeleteLanguageSpecificParametersPropertySet.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-public class DeleteLanguageSpecificParametersPropertySet extends DataChange {
-
- public DeleteLanguageSpecificParametersPropertySet(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- context.prepareUpsert("delete from properties where prop_key like ?")
- .setString(1, "languageSpecificParameters%")
- .execute()
- .commit();
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTable.java
deleted file mode 100644
index c1b203bf9bd..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInIssuesImpactsTable.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class DropPrimaryKeyConstraintInIssuesImpactsTable extends DdlChange {
- @VisibleForTesting
- static final String TABLE_NAME = "issues_impacts";
- @VisibleForTesting
- static final String COLUMN_NAME = "uuid";
- @VisibleForTesting
- static final String CONSTRAINT_NAME = "pk_issues_impacts";
- private final DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator;
- private final DbPrimaryKeyConstraintFinder dbConstraintFinder;
-
- public DropPrimaryKeyConstraintInIssuesImpactsTable(Database db, DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator, DbPrimaryKeyConstraintFinder dbConstraintFinder) {
- super(db);
- this.dropPrimaryKeySqlGenerator = dropPrimaryKeySqlGenerator;
- this.dbConstraintFinder = dbConstraintFinder;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- Optional<String> constraintName = dbConstraintFinder.findConstraintName(TABLE_NAME);
- if (constraintName.isPresent() && constraintName.get().equalsIgnoreCase(CONSTRAINT_NAME)) {
- List<String> statements = dropPrimaryKeySqlGenerator.generate(TABLE_NAME, COLUMN_NAME, false);
- context.execute(statements);
- }
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTable.java
deleted file mode 100644
index a33791c7420..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropPrimaryKeyConstraintInRulesDefaultImpactsTable.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class DropPrimaryKeyConstraintInRulesDefaultImpactsTable extends DdlChange {
- @VisibleForTesting
- static final String TABLE_NAME = "rules_default_impacts";
- @VisibleForTesting
- static final String COLUMN_NAME = "uuid";
- @VisibleForTesting
- static final String CONSTRAINT_NAME = "pk_rules_default_impacts";
- private final DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator;
- private final DbPrimaryKeyConstraintFinder dbConstraintFinder;
-
- public DropPrimaryKeyConstraintInRulesDefaultImpactsTable(Database db, DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator, DbPrimaryKeyConstraintFinder dbConstraintFinder) {
- super(db);
- this.dropPrimaryKeySqlGenerator = dropPrimaryKeySqlGenerator;
- this.dbConstraintFinder = dbConstraintFinder;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableColumnExists(connection, TABLE_NAME, COLUMN_NAME)) {
- Optional<String> constraintName = dbConstraintFinder.findConstraintName(TABLE_NAME);
- if (constraintName.isPresent() && constraintName.get().equalsIgnoreCase(CONSTRAINT_NAME)) {
- List<String> statements = dropPrimaryKeySqlGenerator.generate(TABLE_NAME, COLUMN_NAME, false);
- context.execute(statements);
- }
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTable.java
deleted file mode 100644
index 845e74c859c..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInIssuesImpactsTable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropUuidColumnInIssuesImpactsTable extends DropColumnChange {
- @VisibleForTesting
- static final String COLUMN_NAME = "uuid";
- @VisibleForTesting
- static final String TABLE_NAME = "issues_impacts";
-
- protected DropUuidColumnInIssuesImpactsTable(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTable.java
deleted file mode 100644
index 1069cb68d45..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/DropUuidColumnInRulesDefaultImpactsTable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropUuidColumnInRulesDefaultImpactsTable extends DropColumnChange {
- private static final String COLUMN_NAME = "uuid";
- private static final String TABLE_NAME = "rules_default_impacts";
-
- protected DropUuidColumnInRulesDefaultImpactsTable(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/package-info.java
deleted file mode 100644
index 3491e99a7a1..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v105/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v105;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTable.java
deleted file mode 100644
index 36b09b4eabf..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToActiveRulesTable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddPrioritizedRuleColumnToActiveRulesTable extends DdlChange {
-
- public static final String ACTIVE_RULES_TABLE_NAME = "active_rules";
- public static final String PRIORITIZED_RULE_COLUMN_NAME = "prioritized_rule";
-
- public AddPrioritizedRuleColumnToActiveRulesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, ACTIVE_RULES_TABLE_NAME, PRIORITIZED_RULE_COLUMN_NAME)) {
- ColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(PRIORITIZED_RULE_COLUMN_NAME)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), ACTIVE_RULES_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTable.java
deleted file mode 100644
index afb2585ba3a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/AddPrioritizedRuleColumnToIssuesTable.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddPrioritizedRuleColumnToIssuesTable extends DdlChange {
-
- public static final String ISSUES_TABLE_NAME = "issues";
- public static final String PRIORITIZED_RULE_COLUMN_NAME = "prioritized_rule";
-
- public AddPrioritizedRuleColumnToIssuesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, ISSUES_TABLE_NAME, PRIORITIZED_RULE_COLUMN_NAME)) {
- ColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(PRIORITIZED_RULE_COLUMN_NAME)
- .setIsNullable(true)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), ISSUES_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/DbVersion106.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/DbVersion106.java
deleted file mode 100644
index b532c9478ed..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/DbVersion106.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion106 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
-
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_6_000, "Add 'prioritized_rule' column to 'issues' table", AddPrioritizedRuleColumnToIssuesTable.class)
- .add(10_6_001, "Add 'prioritized_rule' column to 'active_rules' table", AddPrioritizedRuleColumnToActiveRulesTable.class)
- .add(10_6_002, "Ensure 'value' column is resized to 400 in 'rule_tags' table", ResizeValueColumnInRuleTagsTable.class);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTable.java
deleted file mode 100644
index 8f971188e3d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/ResizeValueColumnInRuleTagsTable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v106;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class ResizeValueColumnInRuleTagsTable extends DdlChange {
-
- private static final VarcharColumnDef columnDefinition = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName("value")
- .setIsNullable(false)
- .setLimit(400)
- .build();
-
- public ResizeValueColumnInRuleTagsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), "rule_tags")
- .updateColumn(columnDefinition)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/package-info.java
deleted file mode 100644
index ced70eace78..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v106/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v106;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTable.java
deleted file mode 100644
index f1b9c78baf5..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddAiCodeAssuranceColumnInProjectsTable.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AddAiCodeAssuranceColumnInProjectsTable extends DdlChange {
- static final String PROJECTS_TABLE_NAME = "projects";
- static final String AI_CODE_ASSURANCE = "ai_code_assurance";
- @VisibleForTesting
- static final Boolean DEFAULT_COLUMN_VALUE = false;
-
- public AddAiCodeAssuranceColumnInProjectsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, PROJECTS_TABLE_NAME, AI_CODE_ASSURANCE)) {
- ColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(AI_CODE_ASSURANCE)
- .setIsNullable(false)
- .setDefaultValue(DEFAULT_COLUMN_VALUE)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), PROJECTS_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMapping.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMapping.java
deleted file mode 100644
index 22d35c835e4..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddDevopsPlatformColumnInDevopsPermsMapping.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-public class AddDevopsPlatformColumnInDevopsPermsMapping extends DdlChange {
-
- static final String DEVOPS_PLATFORM_COLUMN_NAME = "devops_platform";
- @VisibleForTesting
- static final String DEFAULT_COLUMN_VALUE = "github";
-
- public AddDevopsPlatformColumnInDevopsPermsMapping(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, DEVOPS_PERMS_MAPPING_TABLE_NAME, DEVOPS_PLATFORM_COLUMN_NAME)) {
- ColumnDef columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(DEVOPS_PLATFORM_COLUMN_NAME)
- .setLimit(40)
- .setIsNullable(false)
- .setDefaultValue(DEFAULT_COLUMN_VALUE)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), DEVOPS_PERMS_MAPPING_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.java
deleted file mode 100644
index b7a5acfdb73..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import java.util.Optional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-public class AddUserConsentRequiredIfGitlabAutoProvisioningEnabled extends DataChange {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.class.getName());
-
- @VisibleForTesting
- static final String PROVISIONING_GITLAB_ENABLED_PROP_KEY = "provisioning.gitlab.enabled";
-
- @VisibleForTesting
- static final String PROP_KEY = "sonar.auth.gitlab.userConsentForPermissionProvisioningRequired";
-
- private static final String INSERT_QUERY = """
- insert into properties (uuid, prop_key, is_empty, created_at)
- values (?, ?, ?, ?)
- """;
-
- private final System2 system2;
- private final UuidFactory uuidFactory;
-
- public AddUserConsentRequiredIfGitlabAutoProvisioningEnabled(Database db, System2 system2, UuidFactory uuidFactory) {
- super(db);
- this.system2 = system2;
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- protected void execute(DataChange.Context context) throws SQLException {
- if (!isGitlabAutoProvisioningEnabled(context)) {
- return;
- }
- if (isUserConsentAlreadyRequired(context)) {
- return;
- }
- LOGGER.warn("Automatic synchronization was previously activated for Gitlab. It requires user consent to continue working as new" +
- " features were added with the synchronization. Please read the upgrade notes.");
- Upsert upsert = context.prepareUpsert(INSERT_QUERY);
- upsert
- .setString(1, uuidFactory.create())
- .setString(2, PROP_KEY)
- .setBoolean(3, true)
- .setLong(4, system2.now())
- .execute()
- .commit();
- }
-
- private static boolean isUserConsentAlreadyRequired(Context context) throws SQLException {
- return Optional.ofNullable(context.prepareSelect("select count(*) from properties where prop_key = ?")
- .setString(1, PROP_KEY)
- .get(t -> 1 == t.getInt(1)))
- .orElseThrow();
- }
-
- private static boolean isGitlabAutoProvisioningEnabled(Context context) throws SQLException {
- return Optional.ofNullable(context.prepareSelect("select count(*) from properties where prop_key = ? and text_value = ?")
- .setString(1, PROVISIONING_GITLAB_ENABLED_PROP_KEY)
- .setString(2, "true")
- .get(t -> 1 == t.getInt(1)))
- .orElseThrow();
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTable.java
deleted file mode 100644
index 49e09da2250..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCveCweTable.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.DESCRIPTION_SECTION_KEY_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateCveCweTable extends CreateTableChange {
-
- private static final String TABLE_NAME = "cve_cwe";
-
- public static final VarcharColumnDef CVE_UUID_COLUMN = newVarcharColumnDefBuilder().setColumnName("cve_uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
- public static final VarcharColumnDef CWE_COLUMN = newVarcharColumnDefBuilder().setColumnName("cwe").setIsNullable(false).setLimit(DESCRIPTION_SECTION_KEY_SIZE).build();
-
- protected CreateCveCweTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(CVE_UUID_COLUMN)
- .addPkColumn(CWE_COLUMN)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTable.java
deleted file mode 100644
index ddb5d81a3a2..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateCvesTable.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
-import org.sonar.server.platform.db.migration.def.DecimalColumnDef;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.DecimalColumnDef.newDecimalColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.DESCRIPTION_SECTION_KEY_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.MAX_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateCvesTable extends CreateTableChange {
-
- private static final String TABLE_NAME = "cves";
-
- private static final VarcharColumnDef UUID_COLUMN = newVarcharColumnDefBuilder().setColumnName("uuid").setIsNullable(false).setLimit(UUID_SIZE).build();
- private static final VarcharColumnDef ID_COLUMN = newVarcharColumnDefBuilder().setColumnName("id").setIsNullable(false).setLimit(DESCRIPTION_SECTION_KEY_SIZE).build();
- private static final VarcharColumnDef DESCRIPTION_COLUMN = newVarcharColumnDefBuilder().setColumnName("description").setIsNullable(false).setLimit(MAX_SIZE).build();
- public static final BigIntegerColumnDef UPDATED_AT_COLUMN = newBigIntegerColumnDefBuilder().setColumnName("updated_at").setIsNullable(false).build();
- public static final BigIntegerColumnDef CREATED_AT_COLUMN = newBigIntegerColumnDefBuilder().setColumnName("created_at").setIsNullable(false).build();
- public static final BigIntegerColumnDef LAST_MODIFIED_COLUMN = newBigIntegerColumnDefBuilder().setColumnName("last_modified_at").setIsNullable(false).build();
- public static final BigIntegerColumnDef PUBLISHED_COLUMN = newBigIntegerColumnDefBuilder().setColumnName("published_at").setIsNullable(false).build();
- public static final DecimalColumnDef CVSS_SCORE_COLUMN = newDecimalColumnDefBuilder().setColumnName("cvss_score").setIsNullable(true).build();
- public static final DecimalColumnDef EPSS_SCORE_COLUMN = newDecimalColumnDefBuilder().setColumnName("epss_score").setIsNullable(true).build();
- public static final DecimalColumnDef EPSS_PERCENTILE_COLUMN = newDecimalColumnDefBuilder().setColumnName("epss_percentile").setIsNullable(true).build();
-
- protected CreateCvesTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(UUID_COLUMN)
- .addColumn(ID_COLUMN)
- .addColumn(DESCRIPTION_COLUMN)
- .addColumn(CVSS_SCORE_COLUMN)
- .addColumn(EPSS_SCORE_COLUMN)
- .addColumn(EPSS_PERCENTILE_COLUMN)
- .addColumn(PUBLISHED_COLUMN)
- .addColumn(LAST_MODIFIED_COLUMN)
- .addColumn(CREATED_AT_COLUMN)
- .addColumn(UPDATED_AT_COLUMN)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTable.java
deleted file mode 100644
index db662abfd8a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateIssuesDependencyTable.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateIssuesDependencyTable extends CreateTableChange {
-
- private static final String TABLE_NAME = "issues_dependency";
-
- protected CreateIssuesDependencyTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("issue_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName("cve_uuid").setIsNullable(false).setLimit(UUID_SIZE).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.java
deleted file mode 100644
index a2b2c3e4491..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.AddPrimaryKeyBuilder;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-public class CreatePrimaryKeyConstraintOnDevopsPermsMappingTable extends DdlChange {
-
- @VisibleForTesting
- static final String UUID_COLUMN_NAME = "uuid";
-
- public CreatePrimaryKeyConstraintOnDevopsPermsMappingTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- createPrimaryKey(context);
- }
-
- private void createPrimaryKey(Context context) throws SQLException {
- boolean pkExists = new DbPrimaryKeyConstraintFinder(getDatabase()).findConstraintName(DEVOPS_PERMS_MAPPING_TABLE_NAME).isPresent();
- if (!pkExists) {
- context.execute(new AddPrimaryKeyBuilder(DEVOPS_PERMS_MAPPING_TABLE_NAME, UUID_COLUMN_NAME).build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTable.java
deleted file mode 100644
index b6c2864e32d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateTelemetryMetricsSentTable.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateTelemetryMetricsSentTable extends CreateTableChange {
-
- private static final String TABLE_NAME = "telemetry_metrics_sent";
- private static final int LENGTH_OF_METRIC_KEY_AND_DIMENSION = 40;
-
- protected CreateTelemetryMetricsSentTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("metric_key").setIsNullable(false)
- .setLimit(LENGTH_OF_METRIC_KEY_AND_DIMENSION).build())
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName("dimension").setIsNullable(false)
- .setLimit(LENGTH_OF_METRIC_KEY_AND_DIMENSION).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName("last_sent").setIsNullable(false).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTable.java
deleted file mode 100644
index 00ca39d0757..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/CreateUniqueIndexOnDevopsPermsMappingTable.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.AddDevopsPlatformColumnInDevopsPermsMapping.DEVOPS_PLATFORM_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-public class CreateUniqueIndexOnDevopsPermsMappingTable extends DdlChange {
-
- @VisibleForTesting
- static final String DEVOPS_ROLE_COLUMN_NAME = "devops_platform_role";
- @VisibleForTesting
- static final String SONARQUBE_PERMISSION_COLUMN_NAME = "sonarqube_permission";
- @VisibleForTesting
- static final String INDEX_NAME = "uniq_devops_perms_mapping";
-
- public CreateUniqueIndexOnDevopsPermsMappingTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUserUuidUniqueIndex(context, connection);
- }
- }
-
- private void createUserUuidUniqueIndex(DdlChange.Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(DEVOPS_PERMS_MAPPING_TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(DEVOPS_PERMS_MAPPING_TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(DEVOPS_PLATFORM_COLUMN_NAME, false)
- .addColumn(DEVOPS_ROLE_COLUMN_NAME, false)
- .addColumn(SONARQUBE_PERMISSION_COLUMN_NAME, false)
- .setUnique(true)
- .build());
- }
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107.java
deleted file mode 100644
index 43f0d7253d6..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion107 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_7_000, "Create 'telemetry_metrics_sent' table", CreateTelemetryMetricsSentTable.class)
- .add(10_7_001, "sonar.auth.gitlab.userConsentForPermissionProvisioningRequired", AddUserConsentRequiredIfGitlabAutoProvisioningEnabled.class)
- .add(10_7_002, "Migrate SMTP configuration into internal_properties", MigrateSmtpConfiguration.class)
- .add(10_7_003, "Drop 'github_perms_mapping' table if exists and 'devops_perms_mapping' table exists", DropGithubPermsMappingTableIfDevopsPermsMappingTableExists.class)
- .add(10_7_004, "Rename 'github_perms_mapping' table to 'devops_perms_mapping'", RenameGithubPermsMappingTable.class)
- .add(10_7_005, "Rename 'github_role' column to 'devops_platform_role' in devops_perms_mapping", RenameGithubRoleInDevopsPermsMapping.class)
- .add(10_7_006, "Add 'devops_platform' column to 'devops_perms_mapping' table", AddDevopsPlatformColumnInDevopsPermsMapping.class)
- .add(10_7_007, "Drop constraint on 'uuid' for 'devops_perms_mapping' table", DropPrimaryKeyOnDevopsPermsMappingTable.class)
- .add(10_7_008, "Create primary key on 'devops_perms_mapping.uuid'", CreatePrimaryKeyConstraintOnDevopsPermsMappingTable.class)
- .add(10_7_009, "Drop index 'uniq_github_perm_mappings' in the 'devops_perms_mapping' table", DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.class)
- .add(10_7_010, "Create uniq index on 'devops_perms_mapping' table for columns 'devops_platform_role', 'sonarqube_permission' and 'devops_platform'",
- CreateUniqueIndexOnDevopsPermsMappingTable.class)
- .add(10_7_011, "Add default permissions for GitLab in 'devops_perms_mapping'", PopulateGitlabDevOpsPermissionsMapping.class)
- .add(10_7_012, "Create 'cves' table", CreateCvesTable.class)
- .add(10_7_013, "Create 'cve_cwe' table", CreateCveCweTable.class)
- .add(10_7_014, "Create 'issues_dependency' table", CreateIssuesDependencyTable.class)
- .add(10_7_015, "Add 'ai_code_assurance' column to 'projects' table", AddAiCodeAssuranceColumnInProjectsTable.class);
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExists.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExists.java
deleted file mode 100644
index 43296d8bf8e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropGithubPermsMappingTableIfDevopsPermsMappingTableExists.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.DropTableBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.GITHUB_PERMS_MAPPING_TABLE_NAME;
-
-/**
- * Migration should be reentrant.
- * If migration is rerun from version 103, a new table github_perms_mapping will be created while the table devops_perms_mapping will exist,
- * the rename from github_perms_mapping to devops_perms_mapping will fail and we will be in an inconstant state with the two tables.
- * To avoid this state, we need to drop the table github_perms_mapping if the table devops_perms_mapping exists.
- */
-public class DropGithubPermsMappingTableIfDevopsPermsMappingTableExists extends DdlChange {
-
- public DropGithubPermsMappingTableIfDevopsPermsMappingTableExists(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- boolean devopsPermsMappingTableExists = DatabaseUtils.tableExists(DEVOPS_PERMS_MAPPING_TABLE_NAME, connection);
- boolean githubPermsMappingTableExists = DatabaseUtils.tableExists(GITHUB_PERMS_MAPPING_TABLE_NAME, connection);
- if (devopsPermsMappingTableExists && githubPermsMappingTableExists) {
- context.execute(new DropTableBuilder(getDialect(), GITHUB_PERMS_MAPPING_TABLE_NAME).build());
- }
- }
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.java
deleted file mode 100644
index 4ac2eb5c1fd..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-public class DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable extends DropIndexChange {
-
- @VisibleForTesting
- static final String UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME = "uniq_github_perm_mappings";
-
- public DropIndexUniqGithubPermsMappingInDevopsPermsMappingTable(Database db) {
- super(db, UNIQ_GITHUB_PERM_MAPPINGS_INDEX_NAME, DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTable.java
deleted file mode 100644
index 665d2e3168d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/DropPrimaryKeyOnDevopsPermsMappingTable.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Optional;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.sql.DropPrimaryKeySqlGenerator;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-public class DropPrimaryKeyOnDevopsPermsMappingTable extends DdlChange {
-
- @VisibleForTesting
- static final String UUID_COLUMN_NAME = "uuid";
- @VisibleForTesting
- static final String CONSTRAINT_NAME = "pk_github_perms_mapping";
-
- private final DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator;
- private final DbPrimaryKeyConstraintFinder dbConstraintFinder;
-
- public DropPrimaryKeyOnDevopsPermsMappingTable(Database db, DropPrimaryKeySqlGenerator dropPrimaryKeySqlGenerator, DbPrimaryKeyConstraintFinder dbConstraintFinder) {
- super(db);
- this.dropPrimaryKeySqlGenerator = dropPrimaryKeySqlGenerator;
- this.dbConstraintFinder = dbConstraintFinder;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- Optional<String> constraintName = dbConstraintFinder.findConstraintName(DEVOPS_PERMS_MAPPING_TABLE_NAME);
- if (constraintName.isPresent() && constraintName.get().equalsIgnoreCase(CONSTRAINT_NAME)) {
- List<String> statements = dropPrimaryKeySqlGenerator.generate(DEVOPS_PERMS_MAPPING_TABLE_NAME, UUID_COLUMN_NAME, false);
- context.execute(statements);
- }
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfiguration.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfiguration.java
deleted file mode 100644
index 7a2f2f15db8..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/MigrateSmtpConfiguration.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import com.google.common.annotations.VisibleForTesting;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.System2;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-import static java.util.stream.Collectors.joining;
-
-public class MigrateSmtpConfiguration extends DataChange {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(MigrateSmtpConfiguration.class.getName());
-
- @VisibleForTesting
- static final String EMAIL_SMTP_HOST_SECURED = "email.smtp_host.secured";
- static final String EMAIL_SMTP_PORT_SECURED = "email.smtp_port.secured";
- static final String EMAIL_SMTP_SECURE_CONNECTION_SECURED = "email.smtp_secure_connection.secured";
- static final String EMAIL_SMTP_USERNAME_SECURED = "email.smtp_username.secured";
- static final String EMAIL_SMTP_PASSWORD_SECURED = "email.smtp_password.secured";
- static final String EMAIL_FROM = "email.from";
- static final String EMAIL_FROM_NAME = "email.fromName";
- static final String EMAIL_PREFIX = "email.prefix";
- static final String EMAIL_AUTH_METHOD = "email.smtp.auth.method";
-
- @VisibleForTesting
- static final List<String> SMTP_LEGACY_CONFIG_PROP_KEYS = List.of(
- EMAIL_SMTP_HOST_SECURED,
- EMAIL_SMTP_PORT_SECURED,
- EMAIL_SMTP_SECURE_CONNECTION_SECURED,
- EMAIL_SMTP_USERNAME_SECURED,
- EMAIL_SMTP_PASSWORD_SECURED,
- EMAIL_FROM,
- EMAIL_FROM_NAME,
- EMAIL_PREFIX,
- EMAIL_AUTH_METHOD
- );
-
- private static final Map<String, String> defaultPropertyValues = Map.of(
- EMAIL_SMTP_SECURE_CONNECTION_SECURED, "NONE",
- EMAIL_FROM, "noreply@nowhere",
- EMAIL_FROM_NAME, "SonarQube",
- EMAIL_PREFIX, "[SONARQUBE]",
- EMAIL_AUTH_METHOD, "BASIC"
- );
-
- private static final String PLACEHOLDER = "LIST_PLACEHOLDER";
- private static final String SELECT_PROPERTIES_QUERY = """
- select prop_key, is_empty, text_value, created_at from properties
- where prop_key in (LIST_PLACEHOLDER)
- """;
- private static final String DELETE_PROPERTIES_QUERY = """
- delete from properties
- where prop_key in (LIST_PLACEHOLDER)
- """;
-
- private static final String INSERT_INTERNAL_PROPERTIES_QUERY = """
- insert into internal_properties (kee, is_empty, text_value, created_at)
- values (?, ?, ?, ?)
- """;
-
- private final System2 system2;
-
- public MigrateSmtpConfiguration(Database db, System2 system2) {
- super(db);
- this.system2 = system2;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- Map<String, PropertyDb> keyToProperties = new HashMap<>();
- String selectQuery = getQueryWithResolvedPlaceholder(SELECT_PROPERTIES_QUERY);
- context.prepareSelect(selectQuery).scroll(row -> keyToProperties.put(row.getString(1), getPropertyFromRow(row)));
- if (!keyToProperties.isEmpty()) {
- insertPropertiesIntoInternal(context, keyToProperties);
- deleteOriginalProperties(context);
- LOGGER.info("SMTP configuration properties successfully migrated into internal_properties");
- }
- }
-
- private static PropertyDb getPropertyFromRow(Select.Row row) throws SQLException {
- return new PropertyDb(
- row.getString(1),
- row.getBoolean(2),
- row.getString(3),
- row.getLong(4)
- );
- }
-
- private void insertPropertiesIntoInternal(Context context, Map<String, PropertyDb> properties) throws SQLException {
- addDefaultPropertiesIfNeeded(properties);
- properties.put(EMAIL_SMTP_SECURE_CONNECTION_SECURED, getSecureConnectionWithNewValues(properties.get(EMAIL_SMTP_SECURE_CONNECTION_SECURED)));
- Upsert insertInternalProperties = context.prepareUpsert(INSERT_INTERNAL_PROPERTIES_QUERY);
- for (PropertyDb property : properties.values()) {
- insertInternalProperties
- .setString(1, property.key)
- .setBoolean(2, property.isEmpty)
- .setString(3, property.value)
- .setLong(4, property.createdAt)
- .addBatch();
- LOGGER.debug("Migrated property: {}", property.key);
- }
- insertInternalProperties.execute().commit();
- }
-
- private void addDefaultPropertiesIfNeeded(Map<String, PropertyDb> keyToProperties) {
- defaultPropertyValues.forEach((key, value) -> {
- if (!keyToProperties.containsKey(key)) {
- keyToProperties.put(key, new PropertyDb(key, false, value, system2.now()));
- }
- });
- }
-
- private static PropertyDb getSecureConnectionWithNewValues(PropertyDb currentProperty) {
- String newValue = switch (currentProperty.value == null ? "" : currentProperty.value) {
- case "ssl" -> "SSLTLS";
- case "starttls" -> "STARTTLS";
- default -> "NONE";
- };
- return new PropertyDb(currentProperty.key, currentProperty.isEmpty, newValue, currentProperty.createdAt);
- }
-
- private static void deleteOriginalProperties(Context context) throws SQLException {
- context.prepareUpsert(getQueryWithResolvedPlaceholder(DELETE_PROPERTIES_QUERY))
- .execute()
- .commit();
- }
-
- private static String getQueryWithResolvedPlaceholder(String query) {
- return query.replace(PLACEHOLDER, SMTP_LEGACY_CONFIG_PROP_KEYS.stream().map(key -> "'" + key + "'").collect(joining(",")));
- }
-
- private record PropertyDb(
- String key,
- boolean isEmpty,
- String value,
- long createdAt
- ) {}
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevOpsPermissionsMapping.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevOpsPermissionsMapping.java
deleted file mode 100644
index 8d124b8c03a..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/PopulateGitlabDevOpsPermissionsMapping.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.SCAN;
-import static org.sonar.api.web.UserRole.SECURITYHOTSPOT_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
-
-public class PopulateGitlabDevOpsPermissionsMapping extends DataChange {
-
- private static final Map<String, Set<String>> GITLAB_ROLE_TO_SQ_PERMISSIONS = Map.of(
- "guest", Set.of(USER),
- "reporter", Set.of(USER, CODEVIEWER),
- "developer", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN),
- "maintainer", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN, ADMIN),
- "owner", Set.of(USER, CODEVIEWER, ISSUE_ADMIN, SECURITYHOTSPOT_ADMIN, SCAN, ADMIN)
- );
-
- private static final String INSERT_QUERY = """
- insert into devops_perms_mapping (uuid, devops_platform, devops_platform_role, sonarqube_permission)
- values (?, ?, ?, ?)
- """;
-
- private final UuidFactory uuidFactory;
-
- public PopulateGitlabDevOpsPermissionsMapping(Database db, UuidFactory uuidFactory) {
- super(db);
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- if (isDefaultMappingAlreadyDefined(context)) {
- return;
- }
- try (Upsert upsert = context.prepareUpsert(INSERT_QUERY)) {
- GITLAB_ROLE_TO_SQ_PERMISSIONS.forEach((role, permissions) -> insertGitlabRoleToSonarqubePermissionMapping(upsert, role, permissions));
- upsert.commit();
- }
- }
-
- private void insertGitlabRoleToSonarqubePermissionMapping(Upsert upsert, String role, Set<String> sonarqubePermissions) {
- sonarqubePermissions.forEach(permission -> insertGitlabRoleToSonarqubePermissionMapping(upsert, role, permission));
- }
-
- private void insertGitlabRoleToSonarqubePermissionMapping(Upsert upsert, String role, String sonarqubePermission) {
- try {
- upsert
- .setString(1, uuidFactory.create())
- .setString(2, "gitlab")
- .setString(3, role)
- .setString(4, sonarqubePermission)
- .execute();
- } catch (SQLException e) {
- throw new IllegalStateException(e);
- }
- }
-
- private static boolean isDefaultMappingAlreadyDefined(Context context) throws SQLException {
- try (Select select = context.prepareSelect("select count(*) from devops_perms_mapping where devops_platform='gitlab'")) {
- return Optional.ofNullable(select.get(t -> t.getInt(1) > 0))
- .orElseThrow();
- }
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTable.java
deleted file mode 100644
index 585e9119ebb..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubPermsMappingTable.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameTableChange;
-
-public class RenameGithubPermsMappingTable extends RenameTableChange {
-
- static final String DEVOPS_PERMS_MAPPING_TABLE_NAME = "devops_perms_mapping";
-
- static final String GITHUB_PERMS_MAPPING_TABLE_NAME = "github_perms_mapping";
-
- protected RenameGithubPermsMappingTable(Database db) {
- super(db, GITHUB_PERMS_MAPPING_TABLE_NAME, DEVOPS_PERMS_MAPPING_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/package-info.java
deleted file mode 100644
index 126cd906600..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v107;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractAddMeasuresMigratedColumnToTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractAddMeasuresMigratedColumnToTable.java
deleted file mode 100644
index c1be035ec7e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractAddMeasuresMigratedColumnToTable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AbstractAddMeasuresMigratedColumnToTable extends DdlChange {
-
- public static final String MIGRATION_FLAG_COLUMN_NAME = "measures_migrated";
- private final String tableName;
-
- public AbstractAddMeasuresMigratedColumnToTable(Database db, String tableName) {
- super(db);
- this.tableName = tableName;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.tableColumnExists(connection, tableName, MIGRATION_FLAG_COLUMN_NAME)) {
- ColumnDef columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(MIGRATION_FLAG_COLUMN_NAME)
- .setIsNullable(false)
- .setDefaultValue(false)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), tableName)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractCreateIndexOnMeasuresMigrated.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractCreateIndexOnMeasuresMigrated.java
deleted file mode 100644
index f51c0aef8a7..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractCreateIndexOnMeasuresMigrated.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class AbstractCreateIndexOnMeasuresMigrated extends DdlChange {
-
- static final String COLUMN_NAME = "measures_migrated";
- private final String tableName;
- private final String indexName;
-
- public AbstractCreateIndexOnMeasuresMigrated(Database db, String tableName, String indexName) {
- super(db);
- this.tableName = tableName;
- this.indexName = indexName;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!DatabaseUtils.indexExistsIgnoreCase(tableName, indexName, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(tableName)
- .setName(indexName)
- .addColumn(COLUMN_NAME, false)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractMigrateLiveMeasuresToMeasures.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractMigrateLiveMeasuresToMeasures.java
deleted file mode 100644
index 2ba2df82c0b..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AbstractMigrateLiveMeasuresToMeasures.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import com.google.gson.Gson;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import javax.annotation.Nullable;
-import org.apache.commons.codec.digest.MurmurHash3;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.System2;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.db.dialect.H2;
-import org.sonar.db.dialect.MsSql;
-import org.sonar.db.dialect.Oracle;
-import org.sonar.db.dialect.PostgreSql;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-import org.sonar.server.platform.db.migration.step.Select;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-import static java.lang.String.format;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.sonar.server.platform.db.migration.version.v108.CreateIndexOnMeasuresTable.INDEX_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.MEASURES_TABLE_NAME;
-
-public abstract class AbstractMigrateLiveMeasuresToMeasures extends DataChange {
- private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMigrateLiveMeasuresToMeasures.class);
-
- private static final Set<String> TEXT_VALUE_TYPES = Set.of("STRING", "LEVEL", "DATA", "DISTRIB");
- private static final Gson GSON = new Gson();
-
- private static final String CLEANUP_QUERY = """
- DELETE FROM measures
- WHERE branch_uuid = ?
- """;
-
- private static final String SELECT_QUERY = """
- SELECT lm.component_uuid,
- m.name,
- m.val_type,
- lm.value,
- lm.text_value,
- lm.measure_data
- FROM live_measures lm
- INNER JOIN metrics m ON m.uuid = lm.metric_uuid
- WHERE lm.project_uuid = ?
- AND (lm.measure_data is null OR %s(lm.measure_data) < 100000 OR m.name = 'duplications_data')
- AND m.name NOT IN ('executable_lines_data', 'ncloc_data')
- ORDER BY lm.component_uuid
- """;
-
- private static final String INSERT_QUERY = """
- insert into measures (component_uuid, branch_uuid, json_value, json_value_hash, created_at, updated_at)
- values ( ?, ?, ?, ?, ?, ?)
- """;
-
- private final String tableName;
- private final String item;
- private final System2 system2;
-
- protected AbstractMigrateLiveMeasuresToMeasures(Database db, System2 system2, String tableName, String item) {
- super(db);
- this.system2 = system2;
- this.tableName = tableName;
- this.item = item;
- }
-
- private String getSelectUuidQuery() {
- return format("""
- SELECT uuid
- FROM %s
- WHERE measures_migrated = ?
- """, tableName);
- }
-
- private String getCountQuery() {
- return format("""
- SELECT count(uuid)
- FROM %s
- """, tableName);
- }
-
- private String getUpdateFlagQuery() {
- return format("""
- UPDATE %s
- SET measures_migrated = ?
- WHERE uuid = ?
- """, tableName);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- boolean measuresIndexExists;
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- // the table is later deleted, this check ensures the migration re-entrance
- if (!DatabaseUtils.tableExists("live_measures", c)) {
- return;
- }
-
- measuresIndexExists = DatabaseUtils.indexExistsIgnoreCase(MEASURES_TABLE_NAME, INDEX_NAME, c);
- }
-
- List<String> uuids = context.prepareSelect(getSelectUuidQuery())
- .setBoolean(1, false)
- .list(row -> row.getString(1));
-
- Long total = context.prepareSelect(getCountQuery())
- .get(row -> row.getLong(1));
-
- LOGGER.info("Starting the migration of {} {}s (total number of {}s: {})", uuids.size(), item, item, total);
- int migrated = 0;
-
- String selectQuery = String.format(SELECT_QUERY, getByteLengthFunction());
-
- for (String uuid : uuids) {
- try {
- migrateItem(uuid, context, selectQuery, measuresIndexExists);
- } catch (Exception e) {
- LOGGER.error(format("Migration of %s %s failed", item, uuid));
- throw e;
- }
-
- migrated++;
- if (migrated % 100 == 0) {
- LOGGER.info("{} {}s migrated", migrated, item);
- }
- }
- }
-
- private String getByteLengthFunction() {
- return switch (getDialect().getId()) {
- case PostgreSql.ID -> "OCTET_LENGTH";
- case MsSql.ID -> "DATALENGTH";
- case Oracle.ID -> "DBMS_LOB.GETLENGTH";
- case H2.ID -> "LENGTH";
- default -> throw new IllegalStateException("Unsupported dialect: " + getDialect().getId());
- };
- }
-
- private void migrateItem(String uuid, Context context, String selectQuery, boolean measuresIndexExists) throws SQLException {
- LOGGER.debug("Migrating {} {}...", item, uuid);
-
- if (measuresIndexExists) {
- context.prepareUpsert(CLEANUP_QUERY)
- .setString(1, uuid)
- .execute()
- .commit();
- }
-
- Map<String, Object> measureValues = new HashMap<>();
- AtomicReference<String> componentUuid = new AtomicReference<>(null);
-
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(selectQuery).setString(1, uuid);
- massUpdate.update(INSERT_QUERY);
- massUpdate.execute((row, update) -> {
- boolean shouldUpdate = false;
- String rowComponentUuid = row.getString(1);
- if (componentUuid.get() == null || !rowComponentUuid.equals(componentUuid.get())) {
- if (!measureValues.isEmpty()) {
- preparePersistMeasure(uuid, update, componentUuid, measureValues);
- shouldUpdate = true;
- }
-
- LOGGER.debug("Starting processing of component {}...", rowComponentUuid);
- componentUuid.set(rowComponentUuid);
- measureValues.clear();
- readMeasureValue(row, measureValues);
- } else {
- readMeasureValue(row, measureValues);
- }
- return shouldUpdate;
- });
- // insert the last component
- if (!measureValues.isEmpty()) {
- try (Upsert measureInsert = context.prepareUpsert(INSERT_QUERY)) {
- preparePersistMeasure(uuid, measureInsert, componentUuid, measureValues);
- measureInsert
- .execute()
- .commit();
- }
- }
-
- LOGGER.debug("Flagging migration done for {} {}...", item, uuid);
-
- try (Upsert flagUpdate = context.prepareUpsert(getUpdateFlagQuery())) {
- flagUpdate
- .setBoolean(1, true)
- .setString(2, uuid)
- .execute()
- .commit();
- }
-
- LOGGER.debug("Migration finished for {} {}", item, uuid);
- }
-
- private void preparePersistMeasure(String uuid, Upsert update, AtomicReference<String> componentUuid, Map<String, Object> measureValues) throws SQLException {
- LOGGER.debug("Persisting measures for component {}...", componentUuid.get());
- String jsonValue = GSON.toJson(measureValues);
-
- long jsonHash = MurmurHash3.hash128(jsonValue.getBytes(UTF_8))[0];
-
- update.setString(1, componentUuid.get());
- update.setString(2, uuid);
- update.setString(3, jsonValue);
- update.setLong(4, jsonHash);
- update.setLong(5, system2.now());
- update.setLong(6, system2.now());
- }
-
- private static void readMeasureValue(Select.Row row, Map<String, Object> measureValues) throws SQLException {
- String metricName = row.getString(2);
- String valueType = row.getString(3);
- Double numericValue = row.getDouble(4);
- String textValue = row.getString(5);
- byte[] data = row.getBytes(6);
-
- Object metricValue = getMetricValue(data, textValue, valueType, numericValue);
- if (metricValue != null
- && !MeasureMigration.isMetricPlannedForDeletion(metricName)) {
- measureValues.put(metricName, metricValue);
- migrateMeasureIfNeeded(measureValues, metricName, metricValue);
- }
- }
-
- private static void migrateMeasureIfNeeded(Map<String, Object> measureValues, String metricName, Object metricValue) {
- String migratedMetricKey = MeasureMigration.getMigrationMetricKey(metricName);
- if (migratedMetricKey != null) {
- try {
- Long migratedValue = MeasureMigration.migrate(metricValue);
- if (migratedValue != null) {
- measureValues.put(migratedMetricKey, migratedValue);
- }
- } catch (Exception e) {
- LOGGER.debug("Failed to migrate metric {} with value {}", metricName, metricValue);
- }
- }
- }
-
- private static Object getMetricValue(@Nullable byte[] data, @Nullable String textValue, String valueType, Double numericValue) {
- return TEXT_VALUE_TYPES.contains(valueType) ? getTextValue(data, textValue) : numericValue;
- }
-
- private static String getTextValue(@Nullable byte[] data, @Nullable String textValue) {
- return data != null ? new String(data, UTF_8) : textValue;
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTable.java
deleted file mode 100644
index 95611cc2700..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.db.DatabaseUtils.tableColumnExists;
-
-public class AddAICodeFixEnabledColumnToProjectsTable extends DdlChange {
- static final String PROJECTS_TABLE_NAME = "projects";
- static final String AI_CODE_FIX_ENABLED_COLUMN_NAME = "ai_code_fix_enabled";
-
- public AddAICodeFixEnabledColumnToProjectsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (!tableColumnExists(connection, PROJECTS_TABLE_NAME, AI_CODE_FIX_ENABLED_COLUMN_NAME)) {
- var columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(AI_CODE_FIX_ENABLED_COLUMN_NAME)
- .setIsNullable(false)
- .setDefaultValue(false)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), PROJECTS_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTable.java
deleted file mode 100644
index 7af09037f59..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.db.DatabaseUtils.tableColumnExists;
-
-public class AddAICodeSupportedColumnToQualityGatesTable extends DdlChange {
- private static final String QUALITY_GATE_TABLE_NAME = "quality_gates";
- private static final String SUPPORTS_AI_CODE_COLUMN_NAME = "ai_code_supported";
-
- public AddAICodeSupportedColumnToQualityGatesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (!tableColumnExists(connection, QUALITY_GATE_TABLE_NAME, SUPPORTS_AI_CODE_COLUMN_NAME)) {
- var columnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(SUPPORTS_AI_CODE_COLUMN_NAME)
- .setIsNullable(false)
- .setDefaultValue(false)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), QUALITY_GATE_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTable.java
deleted file mode 100644
index f4655a2b9b1..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTable.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.VarcharColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.db.DatabaseUtils.tableColumnExists;
-
-public class AddImpactsColumnInActiveRulesTable extends DdlChange {
- static final String ACTIVE_RULES_TABLE_NAME = "active_rules";
- static final String IMPACTS = "impacts";
-
- public AddImpactsColumnInActiveRulesTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (!tableColumnExists(connection, ACTIVE_RULES_TABLE_NAME, IMPACTS)) {
- var columnDef = VarcharColumnDef.newVarcharColumnDefBuilder()
- .setColumnName(IMPACTS)
- .setIsNullable(true)
- .setLimit(500)
- .build();
- context.execute(new AddColumnsBuilder(getDialect(), ACTIVE_RULES_TABLE_NAME)
- .addColumn(columnDef)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTable.java
deleted file mode 100644
index cda1af8103d..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddManualSeverityColumnInIssuesImpactsTable.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.sql.AddColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.db.DatabaseUtils.tableColumnExists;
-
-public class AddManualSeverityColumnInIssuesImpactsTable extends DdlChange {
-
- public static final String TABLE_NAME = "issues_impacts";
- public static final String MANUAL_SEVERITY = "manual_severity";
-
-
- public AddManualSeverityColumnInIssuesImpactsTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (var connection = getDatabase().getDataSource().getConnection()) {
- if (!tableColumnExists(connection, TABLE_NAME, MANUAL_SEVERITY)) {
- var manualSeverity = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(MANUAL_SEVERITY)
- .setIsNullable(false)
- .setDefaultValue(false)
- .build();
-
- context.execute(new AddColumnsBuilder(getDialect(), TABLE_NAME)
- .addColumn(manualSeverity)
- .build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTable.java
deleted file mode 100644
index 72564514f70..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToPortfoliosTable.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-
-public class AddMeasuresMigratedColumnToPortfoliosTable extends AbstractAddMeasuresMigratedColumnToTable {
-
- static final String PORTFOLIOS_TABLE_NAME = "portfolios";
-
- public AddMeasuresMigratedColumnToPortfoliosTable(Database db) {
- super(db, PORTFOLIOS_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTable.java
deleted file mode 100644
index cd7758356c9..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AddMeasuresMigratedColumnToProjectBranchesTable.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-
-public class AddMeasuresMigratedColumnToProjectBranchesTable extends AbstractAddMeasuresMigratedColumnToTable {
-
- public static final String PROJECT_BRANCHES_TABLE_NAME = "project_branches";
-
- public AddMeasuresMigratedColumnToProjectBranchesTable(Database db) {
- super(db, PROJECT_BRANCHES_TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullable.java
deleted file mode 100644
index 2611e917f53..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/AlterCveColumnsToNullable.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.def.BigIntegerColumnDef;
-import org.sonar.server.platform.db.migration.sql.AlterColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-
-public class AlterCveColumnsToNullable extends DdlChange {
-
- public static final BigIntegerColumnDef LAST_MODIFIED_COLUMN = newBigIntegerColumnDefBuilder().setColumnName("last_modified_at").setIsNullable(true).build();
- public static final BigIntegerColumnDef PUBLISHED_COLUMN = newBigIntegerColumnDefBuilder().setColumnName("published_at").setIsNullable(true).build();
-
-
- public AlterCveColumnsToNullable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- context.execute(new AlterColumnsBuilder(getDialect(), "cves")
- .updateColumn(LAST_MODIFIED_COLUMN)
- .build());
- context.execute(new AlterColumnsBuilder(getDialect(), "cves")
- .updateColumn(PUBLISHED_COLUMN)
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTable.java
deleted file mode 100644
index f2b3c1ae115..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnMeasuresTable.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.CreateIndexBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_BRANCH_UUID;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.MEASURES_TABLE_NAME;
-
-public class CreateIndexOnMeasuresTable extends DdlChange {
-
- static final String INDEX_NAME = "measures_branch_uuid";
-
- public CreateIndexOnMeasuresTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- createUniqueIndex(context, connection);
- }
- }
-
- private void createUniqueIndex(Context context, Connection connection) {
- if (!DatabaseUtils.indexExistsIgnoreCase(MEASURES_TABLE_NAME, INDEX_NAME, connection)) {
- context.execute(new CreateIndexBuilder(getDialect())
- .setTable(MEASURES_TABLE_NAME)
- .setName(INDEX_NAME)
- .addColumn(COLUMN_BRANCH_UUID, false)
- .setUnique(false)
- .build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigrated.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigrated.java
deleted file mode 100644
index 086a24abd5e..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnPortfoliosMeasuresMigrated.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-
-public class CreateIndexOnPortfoliosMeasuresMigrated extends AbstractCreateIndexOnMeasuresMigrated {
-
- static final String TABLE_NAME = "portfolios";
- static final String INDEX_NAME = "portfolios_measures_migrated";
-
- public CreateIndexOnPortfoliosMeasuresMigrated(Database db) {
- super(db, TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigrated.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigrated.java
deleted file mode 100644
index 6fba6d297ec..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateIndexOnProjectBranchesMeasuresMigrated.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-
-public class CreateIndexOnProjectBranchesMeasuresMigrated extends AbstractCreateIndexOnMeasuresMigrated {
-
- static final String TABLE_NAME = "project_branches";
- static final String INDEX_NAME = "pb_measures_migrated";
-
- public CreateIndexOnProjectBranchesMeasuresMigrated(Database db) {
- super(db, TABLE_NAME, INDEX_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTable.java
deleted file mode 100644
index db7154b72a4..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateMeasuresTable.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.ClobColumnDef.newClobColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateMeasuresTable extends CreateTableChange {
-
- static final String MEASURES_TABLE_NAME = "measures";
- static final String COLUMN_COMPONENT_UUID = "component_uuid";
- static final String COLUMN_BRANCH_UUID = "branch_uuid";
- static final String COLUMN_JSON_VALUE = "json_value";
- static final String COLUMN_JSON_VALUE_HASH = "json_value_hash";
- static final String COLUMN_CREATED_AT = "created_at";
- static final String COLUMN_UPDATED_AT = "updated_at";
-
- protected CreateMeasuresTable(Database db) {
- super(db, MEASURES_TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addColumn(newVarcharColumnDefBuilder().setColumnName(COLUMN_COMPONENT_UUID).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(COLUMN_BRANCH_UUID).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newClobColumnDefBuilder().setColumnName(COLUMN_JSON_VALUE).setIsNullable(false).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName(COLUMN_JSON_VALUE_HASH).setIsNullable(false).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName(COLUMN_CREATED_AT).setIsNullable(false).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName(COLUMN_UPDATED_AT).setIsNullable(false).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetrics.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetrics.java
deleted file mode 100644
index 413107b6b34..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateNewSoftwareQualityMetrics.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-import org.sonar.server.platform.db.migration.version.v00.PopulateInitialSchema;
-
-public class CreateNewSoftwareQualityMetrics extends DataChange {
- private final UuidFactory uuidFactory;
-
- public CreateNewSoftwareQualityMetrics(Database db, UuidFactory uuidFactory) {
- super(db);
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- for (String metric : MeasureMigration.MIGRATION_MAP.values()) {
- if (!metricExists(connection, metric)) {
- Upsert upsert = context.prepareUpsert(PopulateInitialSchema.createInsertStatement("metrics",
- "name",
- "direction",
- "qualitative",
- "enabled",
- "best_value",
- "optimized_best_value",
- "delete_historical_data",
- "uuid"
- ));
- upsert
- .setString(1, metric)
- .setInt(2, -1)
- .setBoolean(3, metric.startsWith("new_"))
- .setBoolean(4, true)
- .setDouble(5, 0.0)
- .setBoolean(6, true)
- .setBoolean(7, metric.startsWith("new_"))
- .setString(8, uuidFactory.create());
- upsert.execute().commit();
- }
- }
- }
- }
-
- private static boolean metricExists(Connection connection, String metric) throws SQLException {
- String sql = "SELECT count(1) FROM metrics WHERE name = ?";
- try (PreparedStatement statement = connection.prepareStatement(sql)) {
- statement.setString(1, metric);
- ResultSet result = statement.executeQuery();
- return result.next() && result.getInt(1) > 0;
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTable.java
deleted file mode 100644
index 8ded1b39336..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreatePrimaryKeyOnMeasuresTable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.AddPrimaryKeyBuilder;
-import org.sonar.server.platform.db.migration.sql.DbPrimaryKeyConstraintFinder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.COLUMN_COMPONENT_UUID;
-import static org.sonar.server.platform.db.migration.version.v108.CreateMeasuresTable.MEASURES_TABLE_NAME;
-
-public class CreatePrimaryKeyOnMeasuresTable extends DdlChange {
-
- public CreatePrimaryKeyOnMeasuresTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- createPrimaryKey(context);
- }
-
- private void createPrimaryKey(Context context) throws SQLException {
- boolean pkExists = new DbPrimaryKeyConstraintFinder(getDatabase()).findConstraintName(MEASURES_TABLE_NAME).isPresent();
- if (!pkExists) {
- context.execute(new AddPrimaryKeyBuilder(MEASURES_TABLE_NAME, COLUMN_COMPONENT_UUID).build());
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTable.java
deleted file mode 100644
index 3420f3edc80..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/CreateProjectDependenciesTable.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.sql.CreateTableBuilder;
-import org.sonar.server.platform.db.migration.step.CreateTableChange;
-
-import static org.sonar.server.platform.db.migration.def.BigIntegerColumnDef.newBigIntegerColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.ClobColumnDef.newClobColumnDefBuilder;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.UUID_SIZE;
-import static org.sonar.server.platform.db.migration.def.VarcharColumnDef.newVarcharColumnDefBuilder;
-
-public class CreateProjectDependenciesTable extends CreateTableChange {
-
- private static final String TABLE_NAME = "project_dependencies";
- private static final String COLUMN_UUID_NAME = "uuid";
- private static final String COLUMN_VERSION_NAME = "version";
- private static final String COLUMN_INCLUDE_PATHS_NAME = "include_paths";
- private static final String COLUMN_PACKAGE_MANAGER_NAME = "package_manager";
- private static final int COLUMN_PACKAGE_MANAGER_SIZE = 50;
- private static final String COLUMN_CREATED_AT_NAME = "created_at";
- private static final String COLUMN_UPDATED_AT_NAME = "updated_at";
-
- protected CreateProjectDependenciesTable(Database db) {
- super(db, TABLE_NAME);
- }
-
- @Override
- public void execute(Context context, String tableName) throws SQLException {
- context.execute(new CreateTableBuilder(getDialect(), tableName)
- .addPkColumn(newVarcharColumnDefBuilder().setColumnName(COLUMN_UUID_NAME).setIsNullable(false).setLimit(UUID_SIZE).build())
- .addColumn(newClobColumnDefBuilder().setColumnName(COLUMN_VERSION_NAME).setIsNullable(true).build())
- .addColumn(newClobColumnDefBuilder().setColumnName(COLUMN_INCLUDE_PATHS_NAME).setIsNullable(true).build())
- .addColumn(newVarcharColumnDefBuilder().setColumnName(COLUMN_PACKAGE_MANAGER_NAME).setIsNullable(true).setLimit(COLUMN_PACKAGE_MANAGER_SIZE).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName(COLUMN_CREATED_AT_NAME).setIsNullable(false).build())
- .addColumn(newBigIntegerColumnDefBuilder().setColumnName(COLUMN_UPDATED_AT_NAME).setIsNullable(false).build())
- .build());
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java
deleted file mode 100644
index 8ea4cbc1d2f..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.server.platform.db.migration.step.MigrationStepRegistry;
-import org.sonar.server.platform.db.migration.version.DbVersion;
-
-// ignoring bad number formatting, as it's indented that we align the migration numbers to SQ versions
-@SuppressWarnings("java:S3937")
-public class DbVersion108 implements DbVersion {
-
- /**
- * We use the start of the 10.X cycle as an opportunity to align migration numbers with the SQ version number.
- * Please follow this pattern:
- * 10_0_000
- * 10_0_001
- * 10_0_002
- * 10_1_000
- * 10_1_001
- * 10_1_002
- * 10_2_000
- */
- @Override
- public void addSteps(MigrationStepRegistry registry) {
- registry
- .add(10_8_000, "Create 'measures' table", CreateMeasuresTable.class)
- .add(10_8_001, "Add 'measures_migrated' column on 'project_branches' table", AddMeasuresMigratedColumnToProjectBranchesTable.class)
- .add(10_8_002, "Create index on 'project_branches.measures_migrated'", CreateIndexOnProjectBranchesMeasuresMigrated.class)
- .add(10_8_003, "Migrate the content of 'live_measures' to 'measures' for branches", MigrateBranchesLiveMeasuresToMeasures.class)
- .add(10_8_004, "Add 'measures_migrated' column on 'portfolios' table", AddMeasuresMigratedColumnToPortfoliosTable.class)
- .add(10_8_005, "Create index on 'portfolios.measures_migrated'", CreateIndexOnPortfoliosMeasuresMigrated.class)
- .add(10_8_006, "Migrate the content of 'live_measures' to 'measures' for portfolios", MigratePortfoliosLiveMeasuresToMeasures.class)
- .add(10_8_007, "Create primary key on 'measures' table", CreatePrimaryKeyOnMeasuresTable.class)
- .add(10_8_008, "Create index on column 'branch_uuid' in 'measures' table", CreateIndexOnMeasuresTable.class)
- .add(10_8_009, "Drop column 'from_hotspot' in the 'issues' table", DropColumnFromHotspotInIssues.class)
- .add(10_8_010, "Drop 'live_measures' table", DropLiveMeasuresTable.class)
- .add(10_8_011, "Drop index on 'portfolios.measures_migrated'", DropIndexOnPortfoliosMeasuresMigrated.class)
- .add(10_8_012, "Drop 'measures_migrated' column on 'portfolios' table", DropMeasuresMigratedColumnInPortfoliosTable.class)
- .add(10_8_013, "Drop index on 'project_branches.measures_migrated'", DropIndexOnProjectBranchesMeasuresMigrated.class)
- .add(10_8_014, "Drop 'measures_migrated' column on 'project_branches' table", DropMeasuresMigratedColumnInProjectBranchesTable.class)
- .add(10_8_015, "Add column 'impacts' in 'active_rules' table", AddImpactsColumnInActiveRulesTable.class)
- .add(10_8_016, "Create 'project_dependencies' table", CreateProjectDependenciesTable.class)
- .add(10_8_017, "Enable specific MQR mode", EnableSpecificMqrMode.class)
- .add(10_8_018, "Make columns 'published_at' and 'last_modified_at' nullable on the 'cves' table", AlterCveColumnsToNullable.class)
- .add(10_8_019, "Delete Software Quality ratings from project_measures", DeleteSoftwareQualityRatingFromProjectMeasures.class)
- .add(10_8_020, "Create new software quality metrics", CreateNewSoftwareQualityMetrics.class)
- .add(10_8_021, "Migrate deprecated project_measures to replacement metrics", MigrateProjectMeasuresDeprecatedMetrics.class)
- .add(10_8_022, "Add 'manual_severity' column in 'issues_impacts' table", AddManualSeverityColumnInIssuesImpactsTable.class)
- .add(10_8_023, "Add 'ai_code_fix_enabled' column to 'projects' table", AddAICodeFixEnabledColumnToProjectsTable.class)
- .add(10_8_024, "Migrate boolean values of 'sonar.ai.suggestions.enabled' property to new enum values", MigrateAiSuggestionEnabledValues.class)
- .add(10_8_025, "Add 'ai_code_supported' column in 'quality_gates' table", AddAICodeSupportedColumnToQualityGatesTable.class)
- .add(10_8_026, "Rename 'ai_code_assurance' column in 'projects' table to 'contains_ai_code", RenameAiCodeAssuranceColumnInProjects.class)
- ;
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasures.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasures.java
deleted file mode 100644
index 6d4fd1ddf52..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DeleteSoftwareQualityRatingFromProjectMeasures.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.sonar.core.metric.SoftwareQualitiesMetrics;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.es.MigrationEsClient;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class DeleteSoftwareQualityRatingFromProjectMeasures extends DataChange {
-
- public static final Set<String> SOFTWARE_QUALITY_METRICS_TO_DELETE = Set.of(
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_RATING_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_RATING_KEY,
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_RELIABILITY_RATING_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_RATING_KEY,
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_SECURITY_RATING_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_SECURITY_RATING_KEY,
- SoftwareQualitiesMetrics.EFFORT_TO_REACH_SOFTWARE_QUALITY_MAINTAINABILITY_RATING_A_KEY,
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_REMEDIATION_EFFORT_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_REMEDIATION_EFFORT_KEY,
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_SECURITY_REMEDIATION_EFFORT_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_SECURITY_REMEDIATION_EFFORT_KEY,
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_RELIABILITY_REMEDIATION_EFFORT_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_REMEDIATION_EFFORT_KEY,
- SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_DEBT_RATIO_KEY,
- SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_DEBT_RATIO_KEY,
-
- // Portfolios
- "software_quality_reliability_rating_distribution",
- "software_quality_security_rating_distribution",
- "software_quality_maintainability_rating_distribution",
- "new_software_quality_maintainability_rating_distribution",
- "new_software_quality_reliability_rating_distribution",
- "new_software_quality_security_rating_distribution",
-
- // Views
- "last_change_on_software_quality_security_rating",
- "last_change_on_software_quality_reliability_rating",
- "last_change_on_software_quality_maintainability_rating",
- "software_quality_security_rating_effort",
- "software_quality_reliability_rating_effort",
- "software_quality_maintainability_rating_effort");
-
- private static final String SELECT_QUERY = """
- select pm.uuid from project_measures pm
- inner join metrics m on pm.metric_uuid = m.uuid
- where m.name in (%s)
- """.formatted(SOFTWARE_QUALITY_METRICS_TO_DELETE.stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")));
-
- private final MigrationEsClient migrationEsClient;
-
- public DeleteSoftwareQualityRatingFromProjectMeasures(Database db, MigrationEsClient migrationEsClient) {
- super(db);
- this.migrationEsClient = migrationEsClient;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("delete from project_measures where uuid = ?");
-
- massUpdate.execute((row, update, index) -> {
- update.setString(1, row.getString(1));
- return true;
- });
-
- // Reindexation of project measures is required to align with removed values
- migrationEsClient.deleteIndexes("projectmeasures");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssues.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssues.java
deleted file mode 100644
index f5a92f8d092..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropColumnFromHotspotInIssues.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropColumnFromHotspotInIssues extends DropColumnChange {
- private static final String COLUMN_NAME = "from_hotspot";
- private static final String TABLE_NAME = "issues";
-
- public DropColumnFromHotspotInIssues(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigrated.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigrated.java
deleted file mode 100644
index 817e8f7639b..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnPortfoliosMeasuresMigrated.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexOnPortfoliosMeasuresMigrated extends DropIndexChange {
-
- private static final String TABLE_NAME = "portfolios";
- private static final String INDEX_NAME = "portfolios_measures_migrated";
-
- public DropIndexOnPortfoliosMeasuresMigrated(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigrated.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigrated.java
deleted file mode 100644
index ccea53e9711..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropIndexOnProjectBranchesMeasuresMigrated.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropIndexChange;
-
-public class DropIndexOnProjectBranchesMeasuresMigrated extends DropIndexChange {
-
- private static final String TABLE_NAME = "project_branches";
- private static final String INDEX_NAME = "pb_measures_migrated";
-
- public DropIndexOnProjectBranchesMeasuresMigrated(Database db) {
- super(db, INDEX_NAME, TABLE_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTable.java
deleted file mode 100644
index 80c9ec52a99..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropLiveMeasuresTable.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.sql.DropTableBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class DropLiveMeasuresTable extends DdlChange {
-
- private static final String TABLE_NAME = "live_measures";
-
- public DropLiveMeasuresTable(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection c = getDatabase().getDataSource().getConnection()) {
- if (DatabaseUtils.tableExists(TABLE_NAME, c)) {
- context.execute(new DropTableBuilder(getDialect(), TABLE_NAME).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInPortfoliosTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInPortfoliosTable.java
deleted file mode 100644
index 8983a3c0fa1..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInPortfoliosTable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropMeasuresMigratedColumnInPortfoliosTable extends DropColumnChange {
- @VisibleForTesting
- static final String COLUMN_NAME = "measures_migrated";
- @VisibleForTesting
- static final String TABLE_NAME = "portfolios";
-
- protected DropMeasuresMigratedColumnInPortfoliosTable(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInProjectBranchesTable.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInProjectBranchesTable.java
deleted file mode 100644
index 95450311d91..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/DropMeasuresMigratedColumnInProjectBranchesTable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DropColumnChange;
-
-public class DropMeasuresMigratedColumnInProjectBranchesTable extends DropColumnChange {
- @VisibleForTesting
- static final String COLUMN_NAME = "measures_migrated";
- @VisibleForTesting
- static final String TABLE_NAME = "project_branches";
-
- protected DropMeasuresMigratedColumnInProjectBranchesTable(Database db) {
- super(db, TABLE_NAME, COLUMN_NAME);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrMode.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrMode.java
deleted file mode 100644
index 44927c7c6dd..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/EnableSpecificMqrMode.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.sonar.api.utils.System2;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.history.MigrationHistory;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.Upsert;
-
-import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
-import static org.sonar.server.platform.db.migration.version.v00.PopulateInitialSchema.createInsertStatement;
-
-public class EnableSpecificMqrMode extends DataChange {
- private final MigrationHistory migrationHistory;
- private final UuidFactory uuidFactory;
- private final System2 system2;
-
- public EnableSpecificMqrMode(Database db, MigrationHistory migrationHistory, UuidFactory uuidFactory, System2 system2) {
- super(db);
- this.migrationHistory = migrationHistory;
- this.uuidFactory = uuidFactory;
- this.system2 = system2;
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- if (!paramExists(connection)) {
- long version = migrationHistory.getInitialDbVersion();
- boolean mqrModeEnabled = version >= 102_000L || version == -1L;
- Upsert upsert = context.prepareUpsert(
- createInsertStatement("properties",
- "uuid",
- "prop_key",
- "is_empty",
- "text_value",
- "created_at"));
- upsert.setString(1, uuidFactory.create())
- .setString(2, MULTI_QUALITY_MODE_ENABLED)
- .setBoolean(3, false)
- .setString(4, String.valueOf(mqrModeEnabled))
- .setLong(5, system2.now());
- upsert.execute().commit();
- }
- }
- }
-
- private static boolean paramExists(Connection connection) throws SQLException {
- String sql = "SELECT count(1) FROM properties WHERE prop_key = '" + MULTI_QUALITY_MODE_ENABLED + "'";
- try (PreparedStatement statement = connection.prepareStatement(sql)) {
- ResultSet result = statement.executeQuery();
- return result.next() && result.getInt(1) > 0;
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MeasureMigration.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MeasureMigration.java
deleted file mode 100644
index 2815f0331c0..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MeasureMigration.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.annotation.CheckForNull;
-import org.sonar.api.measures.CoreMetrics;
-import org.sonar.core.metric.SoftwareQualitiesMetrics;
-
-public class MeasureMigration {
-
- static final Pattern VALUE_EXTRACTION_PATTERN = Pattern.compile("\"total\":(\\d+)");
-
- static final Map<String, String> MIGRATION_MAP = Map.of(
- CoreMetrics.MAINTAINABILITY_ISSUES_KEY, SoftwareQualitiesMetrics.SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY,
- CoreMetrics.NEW_MAINTAINABILITY_ISSUES_KEY, SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_MAINTAINABILITY_ISSUES_KEY,
- CoreMetrics.RELIABILITY_ISSUES_KEY, SoftwareQualitiesMetrics.SOFTWARE_QUALITY_RELIABILITY_ISSUES_KEY,
- CoreMetrics.NEW_RELIABILITY_ISSUES_KEY, SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_RELIABILITY_ISSUES_KEY,
- CoreMetrics.SECURITY_ISSUES_KEY, SoftwareQualitiesMetrics.SOFTWARE_QUALITY_SECURITY_ISSUES_KEY,
- CoreMetrics.NEW_SECURITY_ISSUES_KEY, SoftwareQualitiesMetrics.NEW_SOFTWARE_QUALITY_SECURITY_ISSUES_KEY);
-
- private MeasureMigration() {
- //Only static methods
- }
-
- @CheckForNull
- public static String getMigrationMetricKey(String metricKey) {
- return MIGRATION_MAP.get(metricKey);
- }
-
- @CheckForNull
- public static Long migrate(Object value) {
- Matcher matcher = VALUE_EXTRACTION_PATTERN.matcher(value.toString());
- if (matcher.find()) {
- return Long.valueOf(matcher.group(1));
- }
- return null;
- }
-
- public static boolean isMetricPlannedForDeletion(String metricKey) {
- return DeleteSoftwareQualityRatingFromProjectMeasures.SOFTWARE_QUALITY_METRICS_TO_DELETE.contains(metricKey);
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java
deleted file mode 100644
index 98fe4cef1e0..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateAiSuggestionEnabledValues.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import java.util.Optional;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-
-public class MigrateAiSuggestionEnabledValues extends DataChange {
-
- static final String AI_CODEFIX_ENABLED_PROP_KEY = "sonar.ai.suggestions.enabled";
- static final String ENABLED_FOR_ALL_PROJECTS = "ENABLED_FOR_ALL_PROJECTS";
- static final String DISABLED = "DISABLED";
-
- public MigrateAiSuggestionEnabledValues(Database db) {
- super(db);
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
- var isAiCodeFixEnabledOptional = Optional.ofNullable(context.prepareSelect("select text_value from properties where prop_key=?")
- .setString(1, AI_CODEFIX_ENABLED_PROP_KEY)
- .get(r -> r.getBoolean(1)));
-
- if (isAiCodeFixEnabledOptional.isPresent()) {
- boolean isAiCodeFixEnabled = isAiCodeFixEnabledOptional.get();
- context.prepareUpsert("update properties set text_value=? where prop_key=?")
- .setString(1, isAiCodeFixEnabled ? ENABLED_FOR_ALL_PROJECTS : DISABLED)
- .setString(2, AI_CODEFIX_ENABLED_PROP_KEY)
- .execute()
- .commit();
- if (isAiCodeFixEnabled) {
- context.prepareUpsert("update projects set ai_code_fix_enabled = ?")
- .setBoolean(1, true)
- .execute()
- .commit();
- }
- }
- }
-
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasures.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasures.java
deleted file mode 100644
index 5b259da9437..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateBranchesLiveMeasuresToMeasures.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.api.utils.System2;
-import org.sonar.db.Database;
-
-public class MigrateBranchesLiveMeasuresToMeasures extends AbstractMigrateLiveMeasuresToMeasures {
-
- public MigrateBranchesLiveMeasuresToMeasures(Database db, System2 system2) {
- super(db, system2, "project_branches", "branch");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasures.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasures.java
deleted file mode 100644
index 326a515e2bb..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigratePortfoliosLiveMeasuresToMeasures.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.sonar.api.utils.System2;
-import org.sonar.db.Database;
-
-public class MigratePortfoliosLiveMeasuresToMeasures extends AbstractMigrateLiveMeasuresToMeasures {
-
- protected MigratePortfoliosLiveMeasuresToMeasures(Database db, System2 system2) {
- super(db, system2, "portfolios", "portfolio");
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetrics.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetrics.java
deleted file mode 100644
index fdb83f908ff..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/MigrateProjectMeasuresDeprecatedMetrics.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.stream.Collectors;
-import org.sonar.core.util.UuidFactory;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.DataChange;
-import org.sonar.server.platform.db.migration.step.MassUpdate;
-
-public class MigrateProjectMeasuresDeprecatedMetrics extends DataChange {
-
- private static final String SELECT_QUERY = """
- select m.name, pm.component_uuid , pm.analysis_uuid, pm.text_value
- from project_measures pm
- join metrics m
- on pm.metric_uuid = m.uuid
- and m.name in (%s)
- and not exists (
- select 1
- from project_measures pm2
- join metrics m2
- on pm2.metric_uuid = m2.uuid
- and pm.analysis_uuid = pm2.analysis_uuid
- and m2.name in ('software_quality_maintainability_issues')
- )
- order by pm.analysis_uuid
- """.formatted(MeasureMigration.MIGRATION_MAP.keySet().stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")));
-
- private static final String SELECT_NEW_METRICS_UUID = """
- select m.name, m.uuid
- from metrics m
- where m.name in (%s)
- """.formatted(MeasureMigration.MIGRATION_MAP.values().stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")));
-
- private final UuidFactory uuidFactory;
-
- public MigrateProjectMeasuresDeprecatedMetrics(Database db, UuidFactory uuidFactory) {
- super(db);
- this.uuidFactory = uuidFactory;
- }
-
- @Override
- protected void execute(Context context) throws SQLException {
-
- Map<String, String> newMetricsUuid = getNewMetricsUuid();
-
- MassUpdate massUpdate = context.prepareMassUpdate();
- massUpdate.select(SELECT_QUERY);
- massUpdate.update("INSERT INTO project_measures (value, component_uuid, analysis_uuid, uuid, metric_uuid) VALUES (?, ?, ?, ?, ?)");
-
- massUpdate.execute((row, update, index) -> {
- String metricName = row.getString(1);
- String componentUuid = row.getString(2);
- String analysisUuid = row.getString(3);
- String textValue = row.getString(4);
-
- Long migratedValue = MeasureMigration.migrate(textValue);
- if (migratedValue != null) {
- update.setDouble(1, migratedValue.doubleValue());
- update.setString(2, componentUuid);
- update.setString(3, analysisUuid);
- update.setString(4, uuidFactory.create());
- String newMetricName = MeasureMigration.MIGRATION_MAP.get(metricName);
- update.setString(5, newMetricsUuid.get(newMetricName));
- return true;
- } else {
- return false;
- }
- });
- }
-
- private Map<String, String> getNewMetricsUuid() throws SQLException{
- Map<String, String> map = new HashMap<>();
- try (Connection connection = getDatabase().getDataSource().getConnection()) {
- try (PreparedStatement statement = connection.prepareStatement(SELECT_NEW_METRICS_UUID)) {
- ResultSet result = statement.executeQuery();
- while (result.next()) {
- map.put(result.getString(1), result.getString(2));
- }
- return map;
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjects.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjects.java
deleted file mode 100644
index e66fe3c0caa..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjects.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import org.sonar.db.ColumnMetadata;
-import org.sonar.db.Database;
-import org.sonar.db.DatabaseUtils;
-import org.sonar.server.platform.db.migration.def.BooleanColumnDef;
-import org.sonar.server.platform.db.migration.def.ColumnDef;
-import org.sonar.server.platform.db.migration.sql.RenameColumnsBuilder;
-import org.sonar.server.platform.db.migration.step.DdlChange;
-
-public class RenameAiCodeAssuranceColumnInProjects extends DdlChange {
-
- private static final String TABLE_NAME = "projects";
- private static final String OLD_COLUMN_NAME = "ai_code_assurance";
- private static final String NEW_COLUMN_NAME = "contains_ai_code";
-
- public RenameAiCodeAssuranceColumnInProjects(Database db) {
- super(db);
- }
-
- @Override
- public void execute(Context context) throws SQLException {
- try (
- Connection c = getDatabase().getDataSource().getConnection()) {
- ColumnMetadata oldColumnMetadata = DatabaseUtils.getColumnMetadata(c, TABLE_NAME, OLD_COLUMN_NAME);
- if (!DatabaseUtils.tableColumnExists(c, TABLE_NAME, NEW_COLUMN_NAME) && oldColumnMetadata != null) {
- ColumnDef newColumnDef = BooleanColumnDef.newBooleanColumnDefBuilder()
- .setColumnName(NEW_COLUMN_NAME)
- .build();
-
- context.execute(new RenameColumnsBuilder(getDialect(), TABLE_NAME).renameColumn(OLD_COLUMN_NAME, newColumnDef).build());
- }
- }
- }
-}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/package-info.java b/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/package-info.java
deleted file mode 100644
index ae9847707cb..00000000000
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v108/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.server.platform.db.migration.version.v108;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100Test.java
deleted file mode 100644
index 261783f5a23..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v100/DbVersion100Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v100;
-
-import org.junit.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion100Test {
- private final DbVersion100 underTest = new DbVersion100();
-
- @Test
- public void migrationNumber_starts_at_10_0_000() {
- verifyMinimumMigrationNumber(underTest, 10_0_000);
- }
-
- @Test
- public void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101Test.java
deleted file mode 100644
index 40862058dad..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v101/DbVersion101Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v101;
-
-import org.junit.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion101Test {
- private final DbVersion101 underTest = new DbVersion101();
-
- @Test
- public void migrationNumber_starts_at_10_1_000() {
- verifyMinimumMigrationNumber(underTest, 10_1_000);
- }
-
- @Test
- public void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102Test.java
deleted file mode 100644
index 428e48b9273..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v102/DbVersion102Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v102;
-
-import org.junit.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion102Test {
- private final DbVersion102 underTest = new DbVersion102();
-
- @Test
- public void migrationNumber_starts_at_10_2_000() {
- verifyMinimumMigrationNumber(underTest, 10_2_000);
- }
-
- @Test
- public void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103Test.java
deleted file mode 100644
index 0e2f1b08088..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v103/DbVersion103Test.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v103;
-
-import org.junit.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion103Test {
-
- private final DbVersion103 underTest = new DbVersion103();
-
- @Test
- public void migrationNumber_starts_at_10_3_000() {
- verifyMinimumMigrationNumber(underTest, 10_3_000);
- }
-
- @Test
- public void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104Test.java
deleted file mode 100644
index 206323283e3..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v104/DbVersion104Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v104;
-
-import org.junit.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion104Test {
-
- private final DbVersion104 underTest = new DbVersion104();
-
- @Test
- public void migrationNumber_starts_at_10_4_000() {
- verifyMinimumMigrationNumber(underTest, 10_4_000);
- }
-
- @Test
- public void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105Test.java
deleted file mode 100644
index dff7dfeef1b..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v105/DbVersion105Test.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v105;
-
-import org.junit.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-public class DbVersion105Test {
-
- private final DbVersion105 underTest = new DbVersion105();
-
- @Test
- public void migrationNumber_starts_at_10_5_000() {
- verifyMinimumMigrationNumber(underTest, 10_5_000);
- }
-
- @Test
- public void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107Test.java
deleted file mode 100644
index 74c6d6eab13..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v107/DbVersion107Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v107;
-
-import org.junit.jupiter.api.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-class DbVersion107Test {
-
- private final DbVersion107 underTest = new DbVersion107();
-
- @Test
- void migrationNumber_starts_at_107_000() {
- verifyMinimumMigrationNumber(underTest, 107_000);
- }
-
- @Test
- void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTableTest.java
deleted file mode 100644
index 2ffb4b56396..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeFixEnabledColumnToProjectsTableTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v108.AddAICodeFixEnabledColumnToProjectsTable.AI_CODE_FIX_ENABLED_COLUMN_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.AddAICodeFixEnabledColumnToProjectsTable.PROJECTS_TABLE_NAME;
-
-class AddAICodeFixEnabledColumnToProjectsTableTest {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddImpactsColumnInActiveRulesTable.class);
-
- private final AddAICodeFixEnabledColumnToProjectsTable underTest = new AddAICodeFixEnabledColumnToProjectsTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(PROJECTS_TABLE_NAME, AI_CODE_FIX_ENABLED_COLUMN_NAME);
- underTest.execute();
- assertColumnExists();
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertColumnExists();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
- private void assertColumnExists() {
- db.assertColumnDefinition(PROJECTS_TABLE_NAME, AI_CODE_FIX_ENABLED_COLUMN_NAME, BOOLEAN, null, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTableTest.java
deleted file mode 100644
index cf8b79a99f7..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddAICodeSupportedColumnToQualityGatesTableTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-
-class AddAICodeSupportedColumnToQualityGatesTableTest {
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddAICodeSupportedColumnToQualityGatesTable.class);
-
- private final AddAICodeSupportedColumnToQualityGatesTable underTest = new AddAICodeSupportedColumnToQualityGatesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist("quality_gates", "ai_code_supported");
- underTest.execute();
- assertColumnExists();
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertColumnExists();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
- private void assertColumnExists() {
- db.assertColumnDefinition("quality_gates", "ai_code_supported", BOOLEAN, null, false);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTableTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTableTest.java
deleted file mode 100644
index 27edad2832b..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/AddImpactsColumnInActiveRulesTableTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.VARCHAR;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
-import static org.sonar.server.platform.db.migration.version.v108.AddImpactsColumnInActiveRulesTable.ACTIVE_RULES_TABLE_NAME;
-import static org.sonar.server.platform.db.migration.version.v108.AddImpactsColumnInActiveRulesTable.IMPACTS;
-
-class AddImpactsColumnInActiveRulesTableTest {
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(AddImpactsColumnInActiveRulesTable.class);
-
- private final AddImpactsColumnInActiveRulesTable underTest = new AddImpactsColumnInActiveRulesTable(db.database());
-
- @Test
- void execute_whenColumnDoesNotExist_shouldCreateColumn() throws SQLException {
- db.assertColumnDoesNotExist(ACTIVE_RULES_TABLE_NAME, IMPACTS);
- underTest.execute();
- assertColumnExists();
- }
-
- @Test
- void execute_whenColumnsAlreadyExists_shouldNotFail() throws SQLException {
- underTest.execute();
- assertColumnExists();
- assertThatCode(underTest::execute).doesNotThrowAnyException();
- }
-
- private void assertColumnExists() {
- db.assertColumnDefinition(ACTIVE_RULES_TABLE_NAME, IMPACTS, VARCHAR, 500, true);
- }
-
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108Test.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108Test.java
deleted file mode 100644
index 5a9fa0b0b82..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/DbVersion108Test.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import org.junit.jupiter.api.Test;
-
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMigrationNotEmpty;
-import static org.sonar.server.platform.db.migration.version.DbVersionTestUtils.verifyMinimumMigrationNumber;
-
-class DbVersion108Test {
-
- private final DbVersion108 underTest = new DbVersion108();
-
- @Test
- void migrationNumber_starts_at_108_000() {
- verifyMinimumMigrationNumber(underTest, 108_000);
- }
-
- @Test
- void verify_migration_is_not_empty() {
- verifyMigrationNotEmpty(underTest);
- }
-}
diff --git a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjectsTest.java b/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjectsTest.java
deleted file mode 100644
index 3536a135eab..00000000000
--- a/server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v108/RenameAiCodeAssuranceColumnInProjectsTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2025 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.db.migration.version.v108;
-
-import java.sql.SQLException;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.db.MigrationDbTester;
-
-import static java.sql.Types.BOOLEAN;
-
-public class RenameAiCodeAssuranceColumnInProjectsTest {
- public static final String TABLE_NAME = "projects";
- public static final String NEW_COLUMN_NAME = "contains_ai_code";
-
- @RegisterExtension
- public final MigrationDbTester db = MigrationDbTester.createForMigrationStep(RenameAiCodeAssuranceColumnInProjects.class);
- private final RenameAiCodeAssuranceColumnInProjects underTest = new RenameAiCodeAssuranceColumnInProjects(db.database());
-
- @Test
- void columnIsRenamed() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, BOOLEAN, 1, false);
- }
-
- @Test
- void migration_is_reentrant() throws SQLException {
- db.assertColumnDoesNotExist(TABLE_NAME, NEW_COLUMN_NAME);
- underTest.execute();
- underTest.execute();
- db.assertColumnDefinition(TABLE_NAME, NEW_COLUMN_NAME, BOOLEAN, 1, false);
- }
-}
diff --git a/server/sonar-server-common/src/it/java/org/sonar/server/issue/notification/NewIssuesNotificationIT.java b/server/sonar-server-common/src/it/java/org/sonar/server/issue/notification/NewIssuesNotificationIT.java
index 5ff60803404..aa69e44aa0d 100644
--- a/server/sonar-server-common/src/it/java/org/sonar/server/issue/notification/NewIssuesNotificationIT.java
+++ b/server/sonar-server-common/src/it/java/org/sonar/server/issue/notification/NewIssuesNotificationIT.java
@@ -39,8 +39,8 @@ import static org.apache.commons.lang3.RandomStringUtils.secure;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.db.component.ComponentTesting.newDirectory;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.server.issue.notification.NewIssuesStatistics.Metric.ASSIGNEE;
diff --git a/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexIT.java b/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexIT.java
index 20f90793e08..c218b8759d7 100644
--- a/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexIT.java
+++ b/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexIT.java
@@ -74,10 +74,10 @@ import static org.sonar.api.rule.Severity.BLOCKER;
import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
import static org.sonar.db.rule.RuleDescriptionSectionDto.createDefaultRuleDescriptionSection;
import static org.sonar.db.rule.RuleTesting.newRule;
diff --git a/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexerIT.java b/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexerIT.java
index 29660645356..fc405598bf8 100644
--- a/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexerIT.java
+++ b/server/sonar-server-common/src/it/java/org/sonar/server/rule/index/RuleIndexerIT.java
@@ -34,7 +34,7 @@ import org.junit.runner.RunWith;
import org.slf4j.event.Level;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/IssueFieldsSetter.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/IssueFieldsSetter.java
index a6a78237d8c..3e126f4cfdc 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/IssueFieldsSetter.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/IssueFieldsSetter.java
@@ -34,7 +34,6 @@ import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.api.server.rule.RuleTagFormat;
import org.sonar.api.utils.Duration;
@@ -43,6 +42,7 @@ import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.DefaultIssueComment;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.core.rule.ImpactSeverityMapper;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.protobuf.DbIssues;
import org.sonar.db.user.UserDto;
import org.sonar.db.user.UserIdDto;
@@ -51,6 +51,7 @@ import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Strings.isNullOrEmpty;
import static java.util.Objects.requireNonNull;
import static org.sonar.api.server.rule.internal.ImpactMapper.convertToSoftwareQuality;
+import static org.sonar.core.rule.RuleTypeMapper.toApiRuleType;
/**
* Updates issue fields and chooses if changes must be kept in history.
@@ -505,7 +506,7 @@ public class IssueFieldsSetter {
&& issue.getImpacts().stream().noneMatch(DefaultImpact::manualSeverity)) {
issue.getImpacts()
.stream()
- .filter(i -> convertToSoftwareQuality(issue.type()).equals(i.softwareQuality()))
+ .filter(i -> convertToSoftwareQuality(toApiRuleType(issue.type())).equals(i.softwareQuality()))
.forEach(i -> {
Severity newSeverity = ImpactSeverityMapper.mapImpactSeverity(issue.severity());
issue.addImpact(i.softwareQuality(), newSeverity, true);
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/TaintChecker.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/TaintChecker.java
index d30043dfc8c..972f06e0366 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/TaintChecker.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/TaintChecker.java
@@ -27,7 +27,7 @@ import java.util.Map;
import java.util.function.Predicate;
import org.jetbrains.annotations.NotNull;
import org.sonar.api.config.Configuration;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.issue.IssueDto;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueDoc.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueDoc.java
index 732cf909e76..4f044ecc2e0 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueDoc.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueDoc.java
@@ -28,7 +28,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.server.es.BaseDoc;
import org.sonar.server.permission.index.AuthorizationDoc;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java
index 13753a919e4..676a6284b61 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java
@@ -32,7 +32,7 @@ import org.apache.ibatis.cursor.Cursor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition.StigVersion;
import org.sonar.db.DatabaseUtils;
import org.sonar.db.DbClient;
@@ -126,7 +126,7 @@ class IssueIteratorForSingleChunk implements IssueIterator {
doc.setProjectUuid(projectUuid);
String tags = indexedIssueDto.getTags();
doc.setTags(STRING_LIST_SPLITTER.splitToList(tags == null ? "" : tags));
- doc.setType(RuleType.valueOf(indexedIssueDto.getIssueType()));
+ doc.setType(RuleType.fromDbConstant(indexedIssueDto.getIssueType()));
doc.setImpacts(indexedIssueDto.getEffectiveImpacts());
SecurityStandards securityStandards = fromSecurityStandards(deserializeSecurityStandardsString(indexedIssueDto.getSecurityStandards()));
SecurityStandards.SQCategory sqCategory = securityStandards.getSqCategory();
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/PrStatistics.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/PrStatistics.java
index ffb6621ce11..4ff2e9439ac 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/PrStatistics.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/index/PrStatistics.java
@@ -20,11 +20,11 @@
package org.sonar.server.issue.index;
import java.util.Map;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
public class PrStatistics {
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssueChangesEmailTemplate.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssueChangesEmailTemplate.java
index 45dd3cf054e..4fa964f5a83 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssueChangesEmailTemplate.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssueChangesEmailTemplate.java
@@ -37,7 +37,7 @@ import java.util.function.BiConsumer;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import org.sonar.api.platform.Server;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.i18n.I18n;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.ChangedIssue;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.Project;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilder.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilder.java
index c0abb5da858..5976c611b8e 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilder.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilder.java
@@ -28,7 +28,7 @@ import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/RuleGroup.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/RuleGroup.java
index 2727b76d224..9eb28474e79 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/RuleGroup.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/notification/RuleGroup.java
@@ -21,9 +21,9 @@ package org.sonar.server.issue.notification;
import java.util.Collection;
import javax.annotation.Nullable;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
enum RuleGroup {
SECURITY_HOTSPOTS,
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Function.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Function.java
index 36ce293b74a..7db3488f20e 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Function.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Function.java
@@ -21,7 +21,7 @@ package org.sonar.server.issue.workflow;
import javax.annotation.Nullable;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.user.UserDto;
@FunctionalInterface
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/FunctionExecutor.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/FunctionExecutor.java
index 6f9aad9e28a..bfd542fcb76 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/FunctionExecutor.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/FunctionExecutor.java
@@ -22,7 +22,7 @@ package org.sonar.server.issue.workflow;
import javax.annotation.Nullable;
import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/HasType.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/HasType.java
index bd8b985dd32..89984133395 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/HasType.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/HasType.java
@@ -22,7 +22,7 @@ package org.sonar.server.issue.workflow;
import java.util.EnumSet;
import java.util.Set;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import static java.util.Arrays.asList;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsHotspot.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsHotspot.java
index c9e9e1dca4b..c7f35c31532 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsHotspot.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsHotspot.java
@@ -20,7 +20,7 @@
package org.sonar.server.issue.workflow;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
enum IsHotspot implements Condition {
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsNotHotspot.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsNotHotspot.java
index ca8245cfbb5..a0eed3b6aad 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsNotHotspot.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsNotHotspot.java
@@ -20,7 +20,7 @@
package org.sonar.server.issue.workflow;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
enum IsNotHotspot implements Condition {
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IssueWorkflow.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IssueWorkflow.java
index 11716fb7196..5252e2b422c 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IssueWorkflow.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IssueWorkflow.java
@@ -25,9 +25,9 @@ import org.sonar.api.ce.ComputeEngineSide;
import org.sonar.api.issue.DefaultTransitions;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.IssueStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.DefaultIssueComment;
import org.sonar.core.issue.IssueChangeContext;
@@ -84,19 +84,19 @@ public class IssueWorkflow implements Startable {
.from(STATUS_OPEN).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_WONT_FIX), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.ACCEPT)
.from(STATUS_REOPENED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_WONT_FIX), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.ACCEPT)
.from(STATUS_CONFIRMED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_WONT_FIX), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
// resolve as false-positive
@@ -104,19 +104,19 @@ public class IssueWorkflow implements Startable {
.from(STATUS_OPEN).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_FALSE_POSITIVE), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE)
.from(STATUS_REOPENED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_FALSE_POSITIVE), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.FALSE_POSITIVE)
.from(STATUS_CONFIRMED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_FALSE_POSITIVE), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
// reopen
@@ -148,19 +148,19 @@ public class IssueWorkflow implements Startable {
.from(STATUS_OPEN).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_FIXED))
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.RESOLVE)
.from(STATUS_REOPENED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_FIXED))
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.RESOLVE)
.from(STATUS_CONFIRMED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_FIXED))
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
// resolve as won't fix, deprecated
@@ -168,19 +168,19 @@ public class IssueWorkflow implements Startable {
.from(STATUS_OPEN).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_WONT_FIX), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.WONT_FIX)
.from(STATUS_REOPENED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_WONT_FIX), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build())
.transition(Transition.builder(DefaultTransitions.WONT_FIX)
.from(STATUS_CONFIRMED).to(STATUS_RESOLVED)
.conditions(IsNotHotspot.INSTANCE)
.functions(new SetResolution(RESOLUTION_WONT_FIX), UnsetAssignee.INSTANCE)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build());
}
@@ -191,7 +191,7 @@ public class IssueWorkflow implements Startable {
.to(STATUS_REVIEWED)
.conditions(new HasType(RuleType.SECURITY_HOTSPOT))
.functions(new SetResolution(RESOLUTION_FIXED))
- .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN);
+ .requiredProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN);
builder
.transition(reviewedAsFixedBuilder
.from(STATUS_TO_REVIEW)
@@ -206,7 +206,7 @@ public class IssueWorkflow implements Startable {
Transition.TransitionBuilder resolveAsSafeTransitionBuilder = Transition.builder(DefaultTransitions.RESOLVE_AS_SAFE)
.to(STATUS_REVIEWED)
.functions(new SetResolution(RESOLUTION_SAFE))
- .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN);
+ .requiredProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN);
builder
.transition(resolveAsSafeTransitionBuilder
.from(STATUS_TO_REVIEW)
@@ -221,7 +221,7 @@ public class IssueWorkflow implements Startable {
Transition.TransitionBuilder resolveAsAcknowledgedTransitionBuilder = Transition.builder(DefaultTransitions.RESOLVE_AS_ACKNOWLEDGED)
.to(STATUS_REVIEWED)
.functions(new SetResolution(RESOLUTION_ACKNOWLEDGED))
- .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN);
+ .requiredProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN);
builder
.transition(resolveAsAcknowledgedTransitionBuilder
.from(STATUS_TO_REVIEW)
@@ -238,7 +238,7 @@ public class IssueWorkflow implements Startable {
.from(STATUS_REVIEWED).to(STATUS_TO_REVIEW)
.conditions(new HasType(RuleType.SECURITY_HOTSPOT), new HasResolution(RESOLUTION_FIXED, RESOLUTION_SAFE, RESOLUTION_ACKNOWLEDGED))
.functions(new SetResolution(null))
- .requiredProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN)
+ .requiredProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN)
.build());
}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/SetType.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/SetType.java
index bbfb1440182..865fe452ffb 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/SetType.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/SetType.java
@@ -20,7 +20,7 @@
package org.sonar.server.issue.workflow;
import javax.annotation.Nullable;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
public class SetType implements Function {
private final RuleType type;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Transition.java b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Transition.java
index e1c50f7a15a..5489fb88fdf 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Transition.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/Transition.java
@@ -26,6 +26,7 @@ import java.util.List;
import javax.annotation.CheckForNull;
import org.apache.commons.lang3.StringUtils;
import org.sonar.api.issue.Issue;
+import org.sonar.db.permission.ProjectPermission;
import static com.google.common.base.Preconditions.checkArgument;
@@ -36,7 +37,7 @@ public class Transition {
private final Condition[] conditions;
private final Function[] functions;
private final boolean automatic;
- private String requiredProjectPermission;
+ private ProjectPermission requiredProjectPermission;
private Transition(TransitionBuilder builder) {
key = builder.key;
@@ -82,7 +83,7 @@ public class Transition {
}
@CheckForNull
- public String requiredProjectPermission() {
+ public ProjectPermission requiredProjectPermission() {
return requiredProjectPermission;
}
@@ -132,7 +133,7 @@ public class Transition {
private List<Condition> conditions = Lists.newArrayList();
private List<Function> functions = Lists.newArrayList();
private boolean automatic = false;
- private String requiredProjectPermission;
+ private ProjectPermission requiredProjectPermission;
private TransitionBuilder(String key) {
this.key = key;
@@ -163,7 +164,7 @@ public class Transition {
return this;
}
- public TransitionBuilder requiredProjectPermission(String requiredProjectPermission) {
+ public TransitionBuilder requiredProjectPermission(ProjectPermission requiredProjectPermission) {
this.requiredProjectPermission = requiredProjectPermission;
return this;
}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/notification/NotificationManager.java b/server/sonar-server-common/src/main/java/org/sonar/server/notification/NotificationManager.java
index 0c376c2c622..699310a3ec0 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/notification/NotificationManager.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/notification/NotificationManager.java
@@ -22,7 +22,7 @@ package org.sonar.server.notification;
import java.util.Objects;
import java.util.Set;
import org.sonar.api.notifications.Notification;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import static java.util.Objects.requireNonNull;
@@ -83,15 +83,19 @@ public interface NotificationManager {
Set<EmailRecipient> findSubscribedEmailRecipients(String dispatcherKey, String projectKey, Set<String> logins, SubscriberPermissionsOnProject subscriberPermissionsOnProject);
final class SubscriberPermissionsOnProject {
- public static final SubscriberPermissionsOnProject ALL_MUST_HAVE_ROLE_USER = new SubscriberPermissionsOnProject(UserRole.USER);
+ public static final SubscriberPermissionsOnProject ALL_MUST_HAVE_ROLE_USER = new SubscriberPermissionsOnProject(ProjectPermission.USER);
private final String globalSubscribers;
private final String projectSubscribers;
- public SubscriberPermissionsOnProject(String globalAndProjectSubscribers) {
+ public SubscriberPermissionsOnProject(ProjectPermission globalAndProjectSubscribers) {
this(globalAndProjectSubscribers, globalAndProjectSubscribers);
}
+ public SubscriberPermissionsOnProject(ProjectPermission globalSubscribers, ProjectPermission projectSubscribers) {
+ this(globalSubscribers.getKey(), projectSubscribers.getKey());
+ }
+
public SubscriberPermissionsOnProject(String globalSubscribers, String projectSubscribers) {
this.globalSubscribers = requireNonNull(globalSubscribers, "global subscribers's required permission can't be null");
this.projectSubscribers = requireNonNull(projectSubscribers, "project subscribers's required permission can't be null");
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionService.java b/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionService.java
index dc6d5731029..28f8b14dd64 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionService.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionService.java
@@ -21,10 +21,12 @@ package org.sonar.server.permission;
import java.util.List;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
public interface PermissionService {
List<GlobalPermission> getGlobalPermissions();
- List<String> getAllProjectPermissions();
+
+ List<ProjectPermission> getAllProjectPermissions();
}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionServiceImpl.java b/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionServiceImpl.java
index 230683acec3..cb418c3f213 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionServiceImpl.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/permission/PermissionServiceImpl.java
@@ -19,41 +19,37 @@
*/
package org.sonar.server.permission;
-import java.util.Collections;
-import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Set;
import javax.annotation.concurrent.Immutable;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
-import org.sonar.api.web.UserRole;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
+import org.sonar.server.component.ComponentTypes;
@Immutable
public class PermissionServiceImpl implements PermissionService {
- public static final Set<String> ALL_PROJECT_PERMISSIONS = Collections.unmodifiableSet(new LinkedHashSet<>(List.of(
- UserRole.ADMIN,
- UserRole.CODEVIEWER,
- UserRole.ISSUE_ADMIN,
- UserRole.SECURITYHOTSPOT_ADMIN,
- UserRole.SCAN,
- UserRole.USER
- )));
+ /**
+ * This particular order seems to be important for some web services.
+ * Maybe the UI is relying on it?
+ * That's why we are not relying on {@link ProjectPermission#values()}.
+ */
+ private static final List<ProjectPermission> ALL_PROJECT_PERMISSIONS = List.of(
+ ProjectPermission.ADMIN,
+ ProjectPermission.CODEVIEWER,
+ ProjectPermission.ISSUE_ADMIN,
+ ProjectPermission.SECURITYHOTSPOT_ADMIN,
+ ProjectPermission.SCAN,
+ ProjectPermission.USER);
private static final List<GlobalPermission> ALL_GLOBAL_PERMISSIONS = List.of(GlobalPermission.values());
private final List<GlobalPermission> globalPermissions;
- private final List<String> projectPermissions;
public PermissionServiceImpl(ComponentTypes componentTypes) {
globalPermissions = List.copyOf(ALL_GLOBAL_PERMISSIONS.stream()
.filter(s -> !s.equals(GlobalPermission.APPLICATION_CREATOR) || componentTypes.isQualifierPresent(ComponentQualifiers.APP))
.filter(s -> !s.equals(GlobalPermission.PORTFOLIO_CREATOR) || componentTypes.isQualifierPresent(ComponentQualifiers.VIEW))
.toList());
- projectPermissions = List.copyOf(ALL_PROJECT_PERMISSIONS.stream()
- .filter(s -> !s.equals(GlobalPermission.APPLICATION_CREATOR.getKey()) || componentTypes.isQualifierPresent(ComponentQualifiers.APP))
- .filter(s -> !s.equals(GlobalPermission.PORTFOLIO_CREATOR.getKey()) || componentTypes.isQualifierPresent(ComponentQualifiers.VIEW))
- .toList());
}
/**
@@ -68,7 +64,7 @@ public class PermissionServiceImpl implements PermissionService {
* Return an immutable Set of all project permissions
*/
@Override
- public List<String> getAllProjectPermissions() {
- return projectPermissions;
+ public List<ProjectPermission> getAllProjectPermissions() {
+ return ALL_PROJECT_PERMISSIONS;
}
}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/project/VisibilityService.java b/server/sonar-server-common/src/main/java/org/sonar/server/project/VisibilityService.java
index 3fe64754141..dbaa63f2496 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/project/VisibilityService.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/project/VisibilityService.java
@@ -39,7 +39,7 @@ import org.sonar.server.es.Indexers;
import static java.util.Collections.singletonList;
import static java.util.Optional.ofNullable;
import static org.sonar.api.utils.Preconditions.checkState;
-import static org.sonar.api.web.UserRole.PUBLIC_PERMISSIONS;
+import static org.sonar.db.permission.ProjectPermission.PUBLIC_PERMISSIONS;
import static org.sonar.db.ce.CeTaskTypes.GITHUB_PROJECT_PERMISSIONS_PROVISIONING;
import static org.sonar.db.ce.CeTaskTypes.GITLAB_PROJECT_PERMISSIONS_PROVISIONING;
@@ -110,10 +110,10 @@ public class VisibilityService {
dbClient.groupPermissionDao().deleteByEntityUuidForAnyOne(dbSession, entity);
// grant UserRole.CODEVIEWER and UserRole.USER to any group or user with at least one permission on project
PUBLIC_PERMISSIONS.forEach(permission -> {
- dbClient.groupPermissionDao().selectGroupUuidsWithPermissionOnEntityBut(dbSession, entity.getUuid(), permission)
- .forEach(group -> insertProjectPermissionOnGroup(dbSession, entity, permission, group));
- dbClient.userPermissionDao().selectUserIdsWithPermissionOnEntityBut(dbSession, entity.getUuid(), permission)
- .forEach(userUuid -> insertProjectPermissionOnUser(dbSession, entity, permission, userUuid));
+ dbClient.groupPermissionDao().selectGroupUuidsWithPermissionOnEntityBut(dbSession, entity.getUuid(), permission.getKey())
+ .forEach(group -> insertProjectPermissionOnGroup(dbSession, entity, permission.getKey(), group));
+ dbClient.userPermissionDao().selectUserIdsWithPermissionOnEntityBut(dbSession, entity.getUuid(), permission.getKey())
+ .forEach(userUuid -> insertProjectPermissionOnUser(dbSession, entity, permission.getKey(), userUuid));
});
}
@@ -136,9 +136,9 @@ public class VisibilityService {
private void updatePermissionsToPublic(DbSession dbSession, EntityDto entity) {
PUBLIC_PERMISSIONS.forEach(permission -> {
// delete project group permission for UserRole.CODEVIEWER and UserRole.USER
- dbClient.groupPermissionDao().deleteByEntityAndPermission(dbSession, permission, entity);
+ dbClient.groupPermissionDao().deleteByEntityAndPermission(dbSession, permission.getKey(), entity);
// delete project user permission for UserRole.CODEVIEWER and UserRole.USER
- dbClient.userPermissionDao().deleteEntityPermissionOfAnyUser(dbSession, permission, entity);
+ dbClient.userPermissionDao().deleteEntityPermissionOfAnyUser(dbSession, permission.getKey(), entity);
});
}
}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java
index 15d352a81b2..ae66aec98a8 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleDoc.java
@@ -35,7 +35,7 @@ import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.issue.ImpactDto;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import org.sonar.db.rule.RuleDto;
@@ -349,7 +349,7 @@ public class RuleDoc extends BaseDoc {
@CheckForNull
private static RuleType getType(RuleForIndexingDto dto) {
if (dto.isAdHoc() && dto.getAdHocType() != null) {
- return RuleType.valueOf(dto.getAdHocType());
+ return RuleType.fromDbConstant(dto.getAdHocType());
}
return dto.getTypeAsRuleType();
}
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java
index 89cd15fe4f8..3f443234135 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleIndex.java
@@ -57,7 +57,7 @@ import org.sonar.api.config.Configuration;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.db.qualityprofile.QProfileDto;
import org.sonar.server.es.EsClient;
@@ -82,8 +82,8 @@ import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
import static org.elasticsearch.search.aggregations.AggregationBuilders.filters;
import static org.elasticsearch.search.aggregations.AggregationBuilders.reverseNested;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_DEFAULT_VALUE;
import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
import static org.sonar.server.es.EsUtils.SCROLL_TIME_IN_MINUTES;
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java
index d949c2aaf9f..d0904071684 100644
--- a/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java
+++ b/server/sonar-server-common/src/main/java/org/sonar/server/rule/index/RuleQuery.java
@@ -25,7 +25,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.qualityprofile.QProfileDto;
import static java.util.Arrays.asList;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueFieldsSetterTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueFieldsSetterTest.java
index f715b858cf1..7f32d659ffd 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueFieldsSetterTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueFieldsSetterTest.java
@@ -35,7 +35,7 @@ import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultImpact;
import org.sonar.core.issue.DefaultIssue;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueStorageTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueStorageTest.java
index 99c2131ba70..cdbf30c57cf 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueStorageTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/IssueStorageTest.java
@@ -23,7 +23,7 @@ import java.util.Date;
import org.junit.Test;
import org.mockito.MockedStatic;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/TaintCheckerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/TaintCheckerTest.java
index fcf18eba925..8e5073080ad 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/TaintCheckerTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/TaintCheckerTest.java
@@ -25,7 +25,7 @@ import java.util.Map;
import javax.annotation.Nullable;
import org.junit.Test;
import org.sonar.api.config.Configuration;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.issue.IssueDto;
import org.sonar.db.protobuf.DbCommons;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/ChangesOnMyIssuesEmailTemplateTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/ChangesOnMyIssuesEmailTemplateTest.java
index aff59c99a83..53e21adbfb9 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/ChangesOnMyIssuesEmailTemplateTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/ChangesOnMyIssuesEmailTemplateTest.java
@@ -37,7 +37,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.api.notifications.Notification;
import org.sonar.api.platform.Server;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.i18n.I18n;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.AnalysisChange;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.Change;
@@ -65,7 +65,7 @@ import static org.sonar.api.issue.Issue.STATUS_REOPENED;
import static org.sonar.api.issue.Issue.STATUS_RESOLVED;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.newAnalysisChange;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.newBranch;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.newChangedIssue;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/FpPrAcceptedEmailTemplateTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/FpPrAcceptedEmailTemplateTest.java
index 1d01ff0ad4f..20e1d04c1f3 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/FpPrAcceptedEmailTemplateTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/FpPrAcceptedEmailTemplateTest.java
@@ -35,7 +35,7 @@ import org.junit.runner.RunWith;
import org.sonar.api.notifications.Notification;
import org.sonar.api.platform.Server;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.i18n.I18n;
import org.sonar.server.issue.notification.FPOrAcceptedNotification.FpPrAccepted;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.AnalysisChange;
@@ -53,7 +53,7 @@ import static org.apache.commons.lang3.RandomStringUtils.secure;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.server.issue.notification.FPOrAcceptedNotification.FpPrAccepted.ACCEPTED;
import static org.sonar.server.issue.notification.FPOrAcceptedNotification.FpPrAccepted.FP;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.newRandomNotAHotspotRule;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTest.java
index 8eb787b42f9..6d6513ec151 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTest.java
@@ -30,7 +30,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.AnalysisChange;
import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.ChangedIssue;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationSerializerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationSerializerTest.java
index fa26db55f80..fde3169cd39 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationSerializerTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/IssuesChangesNotificationSerializerTest.java
@@ -24,7 +24,7 @@ import java.util.Set;
import java.util.stream.IntStream;
import org.junit.Test;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import static java.util.stream.Collectors.toSet;
@@ -43,7 +43,7 @@ public class IssuesChangesNotificationSerializerTest {
.mapToObj(i -> new IssuesChangesNotificationBuilder.ChangedIssue.Builder("issue_key_" + i)
.setNewStatus("foo")
.setAssignee(null)
- .setRule(newRule("repository", "key" + i, RuleType.valueOf(i), "name" + i))
+ .setRule(newRule("repository", "key" + i, RuleType.fromDbConstant(i), "name" + i))
.setProject(newProject(i + ""))
.build())
.collect(toSet());
@@ -62,7 +62,7 @@ public class IssuesChangesNotificationSerializerTest {
.mapToObj(i -> new IssuesChangesNotificationBuilder.ChangedIssue.Builder("issue_key_" + i)
.setNewStatus("foo")
.setAssignee(null)
- .setRule(newRule("repository", "key" + i, RuleType.valueOf(i), "name" + i))
+ .setRule(newRule("repository", "key" + i, RuleType.fromDbConstant(i), "name" + i))
.setProject(newProject(i + ""))
.build())
.collect(toSet());
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java
index 64f503059d7..c0f8565260a 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/notification/NewIssuesStatisticsTest.java
@@ -31,7 +31,7 @@ import javax.annotation.CheckForNull;
import org.junit.jupiter.api.Test;
import org.sonar.api.issue.Issue;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.issue.notification.NewIssuesStatistics.Metric;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/IssueWorkflowForSecurityHotspotsTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/IssueWorkflowForSecurityHotspotsTest.java
index 0848e232b67..9cc73ebf555 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/IssueWorkflowForSecurityHotspotsTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/IssueWorkflowForSecurityHotspotsTest.java
@@ -53,7 +53,7 @@ import static org.sonar.api.issue.Issue.RESOLUTION_SAFE;
import static org.sonar.api.issue.Issue.STATUS_CLOSED;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByScanBuilder;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.rule.RuleTesting.XOO_X1;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/TransitionTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/TransitionTest.java
index bd5a2621ab2..702f906f96b 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/TransitionTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/issue/workflow/TransitionTest.java
@@ -20,7 +20,7 @@
package org.sonar.server.issue.workflow;
import org.junit.Test;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import static org.assertj.core.api.Assertions.assertThat;
@@ -41,7 +41,7 @@ public class TransitionTest {
.from("OPEN").to("CLOSED")
.conditions(condition1, condition2)
.functions(function1, function2)
- .requiredProjectPermission(UserRole.ISSUE_ADMIN)
+ .requiredProjectPermission(ProjectPermission.ISSUE_ADMIN)
.build();
assertThat(transition.key()).isEqualTo("close");
assertThat(transition.from()).isEqualTo("OPEN");
@@ -49,7 +49,7 @@ public class TransitionTest {
assertThat(transition.conditions()).containsOnly(condition1, condition2);
assertThat(transition.functions()).containsOnly(function1, function2);
assertThat(transition.automatic()).isFalse();
- assertThat(transition.requiredProjectPermission()).isEqualTo(UserRole.ISSUE_ADMIN);
+ assertThat(transition.requiredProjectPermission()).isEqualTo(ProjectPermission.ISSUE_ADMIN);
}
@Test
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/permission/PermissionServiceImplTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/permission/PermissionServiceImplTest.java
index 4c4221e3c52..d3da292bb12 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/permission/PermissionServiceImplTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/permission/PermissionServiceImplTest.java
@@ -20,26 +20,28 @@
package org.sonar.server.permission;
import org.junit.Test;
-import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
+import org.sonar.server.component.ComponentTypesRule;
import static org.assertj.core.api.Assertions.assertThat;
public class PermissionServiceImplTest {
- private ComponentTypesRule resourceTypesRule = new ComponentTypesRule().setRootQualifiers("APP", "VW");
- private PermissionServiceImpl underTest = new PermissionServiceImpl(resourceTypesRule);
+ private final ComponentTypesRule resourceTypesRule = new ComponentTypesRule().setRootQualifiers("APP", "VW");
+ private final PermissionServiceImpl underTest = new PermissionServiceImpl(resourceTypesRule);
@Test
public void globalPermissions_must_be_ordered() {
assertThat(underTest.getGlobalPermissions())
.extracting(GlobalPermission::getKey)
- .containsExactly("admin", "gateadmin", "profileadmin", "provisioning", "scan", "applicationcreator", "portfoliocreator");
+ .containsExactlyInAnyOrder("admin", "gateadmin", "profileadmin", "provisioning", "scan", "applicationcreator", "portfoliocreator");
}
@Test
public void projectPermissions_must_be_ordered() {
assertThat(underTest.getAllProjectPermissions())
- .containsExactly("admin", "codeviewer", "issueadmin", "securityhotspotadmin", "scan", "user");
+ .extracting(ProjectPermission::getKey)
+ .containsExactlyInAnyOrder("admin", "codeviewer", "issueadmin", "securityhotspotadmin", "scan", "user");
}
}
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoIT.java b/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoIT.java
index d51e582eb6c..29e248263c1 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoIT.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerDaoIT.java
@@ -48,8 +48,8 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.db.component.ComponentQualifiers.APP;
import static org.sonar.db.component.ComponentQualifiers.PROJECT;
import static org.sonar.db.component.ComponentQualifiers.VIEW;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class PermissionIndexerDaoIT {
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java
index 7f706879735..e5cd24dd872 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/permission/index/PermissionIndexerTest.java
@@ -43,8 +43,8 @@ import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.db.component.ComponentQualifiers.PROJECT;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.es.Indexers.EntityEvent.PERMISSION_CHANGE;
import static org.sonar.server.permission.index.IndexAuthorizationConstants.TYPE_AUTHORIZATION;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java
index a4cb48a9fce..fb26dd5cc1e 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/RuleDescriptionFormatterTest.java
@@ -20,7 +20,7 @@
package org.sonar.server.rule;
import org.junit.Test;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import org.sonar.db.rule.RuleDto;
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleDocTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleDocTest.java
index a176360b748..21eff8259fc 100644
--- a/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleDocTest.java
+++ b/server/sonar-server-common/src/test/java/org/sonar/server/rule/index/RuleDocTest.java
@@ -22,7 +22,7 @@ package org.sonar.server.rule.index;
import java.util.Set;
import org.junit.Test;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.rule.RuleDescriptionSectionContextDto;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import org.sonar.db.rule.RuleDto;
diff --git a/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/IssueDocTesting.java b/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/IssueDocTesting.java
index 02cf7e1351b..2118e6f4ef5 100644
--- a/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/IssueDocTesting.java
+++ b/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/IssueDocTesting.java
@@ -27,7 +27,7 @@ import java.util.HashMap;
import java.util.Random;
import org.sonar.db.component.ComponentScopes;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.Uuids;
import org.sonar.db.component.ComponentDto;
import org.sonar.server.issue.index.IssueDoc;
diff --git a/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTesting.java b/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTesting.java
index ef76560d70f..8e54f6f16f9 100644
--- a/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTesting.java
+++ b/server/sonar-server-common/src/testFixtures/java/org/sonar/server/issue/notification/IssuesChangesNotificationBuilderTesting.java
@@ -21,7 +21,7 @@ package org.sonar.server.issue.notification;
import java.util.Random;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
@@ -36,10 +36,10 @@ import org.sonar.server.issue.notification.IssuesChangesNotificationBuilder.User
import static com.google.common.base.Preconditions.checkArgument;
import static org.apache.commons.lang3.RandomStringUtils.secure;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
public class IssuesChangesNotificationBuilderTesting {
diff --git a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/ChangedIssueImpl.java b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/ChangedIssueImpl.java
index 2b91499368e..02c0424da06 100644
--- a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/ChangedIssueImpl.java
+++ b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/ChangedIssueImpl.java
@@ -24,7 +24,7 @@ import java.util.Objects;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
class ChangedIssueImpl implements QGChangeEventListener.ChangedIssue {
diff --git a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListener.java b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListener.java
index c5ffd4d58b7..bf9feea1763 100644
--- a/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListener.java
+++ b/server/sonar-webserver-api/src/main/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListener.java
@@ -24,10 +24,10 @@ import java.util.Map;
import java.util.Set;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
@ServerSide
public interface QGChangeEventListener {
diff --git a/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java b/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java
index 51c4d332b60..4303a88bfe9 100644
--- a/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java
+++ b/server/sonar-webserver-api/src/test/java/org/sonar/server/qualitygate/changeevent/QGChangeEventListenersImplTest.java
@@ -39,7 +39,7 @@ import org.mockito.InOrder;
import org.mockito.Mockito;
import org.slf4j.event.Level;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.component.BranchDto;
diff --git a/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/ServerUserSessionIT.java b/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/ServerUserSessionIT.java
index 293a331651a..1e6a60e9594 100644
--- a/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/ServerUserSessionIT.java
+++ b/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/ServerUserSessionIT.java
@@ -27,12 +27,12 @@ import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
@@ -136,23 +136,23 @@ public class ServerUserSessionIT {
public void checkComponentUuidPermission_fails_with_FE_when_user_has_not_permission_for_specified_uuid_in_db() {
UserDto user = db.users().insertUser();
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project);
UserSession session = newUserSession(user);
- assertThatForbiddenExceptionIsThrown(() -> session.checkComponentUuidPermission(UserRole.USER, "another-uuid"));
+ assertThatForbiddenExceptionIsThrown(() -> session.checkComponentUuidPermission(ProjectPermission.USER, "another-uuid"));
}
@Test
public void checkChildProjectsPermission_succeeds_if_user_has_permissions_on_all_application_child_projects() {
UserDto user = db.users().insertUser();
ProjectData project = db.components().insertPrivateProject();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project.getProjectDto());
ProjectData application = db.components().insertPrivateApplication();
db.components().addApplicationProject(application, project);
UserSession underTest = newUserSession(user);
- assertThat(underTest.checkChildProjectsPermission(UserRole.USER, application.getMainBranchComponent())).isSameAs(underTest);
+ assertThat(underTest.checkChildProjectsPermission(ProjectPermission.USER, application.getMainBranchComponent())).isSameAs(underTest);
}
@Test
@@ -162,7 +162,7 @@ public class ServerUserSessionIT {
UserSession underTest = newUserSession(user);
- assertThat(underTest.checkChildProjectsPermission(UserRole.USER, project)).isSameAs(underTest);
+ assertThat(underTest.checkChildProjectsPermission(ProjectPermission.USER, project)).isSameAs(underTest);
}
@Test
@@ -176,7 +176,7 @@ public class ServerUserSessionIT {
UserSession underTest = newUserSession(user);
- assertThatForbiddenExceptionIsThrown(() -> underTest.checkChildProjectsPermission(UserRole.USER, application.getMainBranchComponent()));
+ assertThatForbiddenExceptionIsThrown(() -> underTest.checkChildProjectsPermission(ProjectPermission.USER, application.getMainBranchComponent()));
}
@Test
@@ -199,7 +199,7 @@ public class ServerUserSessionIT {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser();
db.users().insertGlobalPermissionOnUser(user, GlobalPermission.PROVISION_PROJECTS);
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, project);
UserSession session = newUserSession(user);
assertThat(session.hasPermission(GlobalPermission.PROVISION_PROJECTS)).isTrue();
@@ -253,7 +253,7 @@ public class ServerUserSessionIT {
ProjectData project1 = db.components().insertPrivateProject();
ProjectData project2 = db.components().insertPrivateProject();
UserDto user = db.users().insertUser();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project1.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project1.getProjectDto());
ProjectData application = db.components().insertPrivateApplication();
db.components().addApplicationProject(application, project1);
@@ -261,30 +261,30 @@ public class ServerUserSessionIT {
db.components().insertComponent(newProjectCopy(project1.getMainBranchComponent(), application.getMainBranchComponent()));
UserSession session = newUserSession(user);
- assertThat(session.hasChildProjectsPermission(UserRole.USER, application.getMainBranchComponent())).isTrue();
+ assertThat(session.hasChildProjectsPermission(ProjectPermission.USER, application.getMainBranchComponent())).isTrue();
db.components().addApplicationProject(application, project2);
db.components().insertComponent(newProjectCopy(project2.getMainBranchComponent(), application.getMainBranchComponent()));
- assertThat(session.hasChildProjectsPermission(UserRole.USER, application.getMainBranchComponent())).isFalse();
+ assertThat(session.hasChildProjectsPermission(ProjectPermission.USER, application.getMainBranchComponent())).isFalse();
}
@Test
public void test_hasChildProjectsPermission_for_anonymous_user() {
ProjectData project = db.components().insertPrivateProject();
- db.users().insertPermissionOnAnyone(UserRole.USER);
+ db.users().insertPermissionOnAnyone(ProjectPermission.USER);
ProjectData application = db.components().insertPrivateApplication();
db.components().addApplicationProject(application.getProjectDto(), project.getProjectDto());
// add computed project
db.components().insertComponent(newProjectCopy(project.getMainBranchComponent(), application.getMainBranchComponent()));
UserSession session = newAnonymousSession();
- assertThat(session.hasChildProjectsPermission(UserRole.USER, application.getProjectDto())).isFalse();
+ assertThat(session.hasChildProjectsPermission(ProjectPermission.USER, application.getProjectDto())).isFalse();
}
@Test
public void hasChildProjectsPermission_keeps_cache_of_permissions_of_anonymous_user() {
- db.users().insertPermissionOnAnyone(UserRole.USER);
+ db.users().insertPermissionOnAnyone(ProjectPermission.USER);
ProjectDto project = db.components().insertPublicProject().getProjectDto();
ProjectDto application = db.components().insertPublicApplication().getProjectDto();
@@ -293,11 +293,11 @@ public class ServerUserSessionIT {
UserSession session = newAnonymousSession();
// feed the cache
- assertThat(session.hasChildProjectsPermission(UserRole.USER, application)).isTrue();
+ assertThat(session.hasChildProjectsPermission(ProjectPermission.USER, application)).isTrue();
// change privacy of the project without updating the cache
db.getDbClient().componentDao().setPrivateForBranchUuidWithoutAudit(db.getSession(), project.getUuid(), true);
- assertThat(session.hasChildProjectsPermission(UserRole.USER, application)).isTrue();
+ assertThat(session.hasChildProjectsPermission(ProjectPermission.USER, application)).isTrue();
}
@Test
@@ -318,44 +318,44 @@ public class ServerUserSessionIT {
db.components().addPortfolioProject(portfolio, project1.getProjectDto().getUuid());
db.components().insertComponent(newProjectCopy(project1.getMainBranchComponent(), portfolio));
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isTrue();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isTrue();
// Add private project2 with USER permissions to private portfolio
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project2.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project2.getProjectDto());
db.components().addPortfolioProject(portfolio, project2.getProjectDto().getUuid());
db.components().insertComponent(newProjectCopy(project2.getMainBranchComponent(), portfolio));
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isTrue();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isTrue();
// Add private project4 with USER permissions to sub-portfolio
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project4.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project4.getProjectDto());
db.components().addPortfolioProject(subPortfolio, project4.getProjectDto().getUuid());
db.components().insertComponent(newProjectCopy(project4.getMainBranchComponent(), subPortfolio));
db.components().addPortfolioReference(portfolio, subPortfolio.uuid());
// The predicate should work both on view and subview components
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isTrue();
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, subPortfolio)).isTrue();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isTrue();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, subPortfolio)).isTrue();
// Add private project3 without permissions to private portfolio
db.components().addPortfolioProject(portfolio, project3.getProjectDto().getUuid());
db.components().insertComponent(newProjectCopy(project3.getMainBranchComponent(), portfolio));
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isFalse();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isFalse();
// Add private project5 without permissions to sub-portfolio
db.components().addPortfolioProject(subPortfolio, project5.getProjectDto().getUuid());
db.components().insertComponent(newProjectCopy(project5.getMainBranchComponent(), subPortfolio));
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isFalse();
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, subPortfolio)).isFalse();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isFalse();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, subPortfolio)).isFalse();
}
@Test
public void test_hasPortfolioChildProjectsPermission_for_anonymous_user() {
ProjectData project = db.components().insertPrivateProject();
- db.users().insertPermissionOnAnyone(UserRole.USER);
+ db.users().insertPermissionOnAnyone(ProjectPermission.USER);
ComponentDto portfolio = db.components().insertPrivatePortfolio();
@@ -364,12 +364,12 @@ public class ServerUserSessionIT {
db.components().insertComponent(newProjectCopy(project.getMainBranchComponent(), portfolio));
UserSession session = newAnonymousSession();
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isFalse();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isFalse();
}
@Test
public void hasPortfolioChildProjectsPermission_keeps_cache_of_permissions_of_anonymous_user() {
- db.users().insertPermissionOnAnyone(UserRole.USER);
+ db.users().insertPermissionOnAnyone(ProjectPermission.USER);
ProjectDto project = db.components().insertPublicProject().getProjectDto();
ComponentDto portfolio = db.components().insertPublicPortfolio();
@@ -378,11 +378,11 @@ public class ServerUserSessionIT {
UserSession session = newAnonymousSession();
// feed the cache
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isTrue();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isTrue();
// change privacy of the project without updating the cache
db.getDbClient().componentDao().setPrivateForBranchUuidWithoutAudit(db.getSession(), project.getUuid(), true);
- assertThat(session.hasPortfolioChildProjectsPermission(UserRole.USER, portfolio)).isTrue();
+ assertThat(session.hasPortfolioChildProjectsPermission(ProjectPermission.USER, portfolio)).isTrue();
}
@Test
@@ -391,8 +391,8 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, publicProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
}
@Test
@@ -402,8 +402,8 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, publicProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
}
@Test
@@ -413,8 +413,8 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, publicProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
}
@Test
@@ -424,8 +424,8 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, publicProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, publicProject.getMainBranchComponent())).isTrue();
}
@Test
@@ -435,8 +435,8 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newUserSession(user);
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, privateProject.getMainBranchComponent())).isFalse();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, privateProject.getMainBranchComponent())).isFalse();
}
@Test
@@ -447,8 +447,8 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newUserSession(user);
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, privateProject.getMainBranchComponent())).isFalse();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, privateProject.getMainBranchComponent())).isFalse();
}
@Test
@@ -459,100 +459,100 @@ public class ServerUserSessionIT {
ServerUserSession underTest = newUserSession(user);
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.USER, privateProject.getMainBranchComponent())).isFalse();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.CODEVIEWER, privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.USER, privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, privateProject.getMainBranchComponent())).isFalse();
}
@Test
public void hasComponentPermissionByDtoOrUuid_returns_true_for_anonymous_user_for_inserted_permissions_on_group_AnyOne_on_public_projects() {
ProjectData publicProject = db.components().insertPublicProject();
- db.users().insertEntityPermissionOnAnyone("p1", publicProject.getProjectDto());
+ db.users().insertEntityPermissionOnAnyone(ProjectPermission.SCAN, publicProject.getProjectDto());
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.SCAN, publicProject.getMainBranchComponent())).isTrue();
}
@Test
public void hasComponentPermissionByDtoOrUuid_returns_false_for_anonymous_user_for_inserted_permissions_on_group_on_public_projects() {
ProjectData publicProject = db.components().insertPublicProject();
GroupDto group = db.users().insertGroup();
- db.users().insertEntityPermissionOnGroup(group, "p1", publicProject.getProjectDto());
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.SCAN, publicProject.getProjectDto());
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", publicProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.SCAN, publicProject.getMainBranchComponent())).isFalse();
}
@Test
public void hasComponentPermissionByDtoOrUuid_returns_false_for_anonymous_user_for_inserted_permissions_on_group_on_private_projects() {
ProjectData privateProject = db.components().insertPrivateProject();
GroupDto group = db.users().insertGroup();
- db.users().insertEntityPermissionOnGroup(group, "p1", privateProject.getProjectDto());
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.SCAN, privateProject.getProjectDto());
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", privateProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.SCAN, privateProject.getMainBranchComponent())).isFalse();
}
@Test
public void hasComponentPermissionByDtoOrUuid_returns_false_for_anonymous_user_for_inserted_permissions_on_user_on_public_projects() {
UserDto user = db.users().insertUser();
ProjectData publicProject = db.components().insertPublicProject();
- db.users().insertProjectPermissionOnUser(user, "p1", publicProject.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.SCAN, publicProject.getProjectDto());
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", publicProject.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.SCAN, publicProject.getMainBranchComponent())).isFalse();
}
@Test
public void hasComponentPermissionByDtoOrUuid_returns_false_for_anonymous_user_for_inserted_permissions_on_user_on_private_projects() {
UserDto user = db.users().insertUser();
ProjectData project = db.components().insertPrivateProject();
- db.users().insertProjectPermissionOnUser(user, "p1", project.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.SCAN, project.getProjectDto());
ServerUserSession underTest = newAnonymousSession();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", project.getMainBranchComponent())).isFalse();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.SCAN, project.getMainBranchComponent())).isFalse();
}
@Test
public void hasComponentPermissionByDtoOrUuid_keeps_cache_of_permissions_of_logged_in_user() {
UserDto user = db.users().insertUser();
ProjectData publicProject = db.components().insertPublicProject();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, publicProject.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, publicProject.getProjectDto());
UserSession underTest = newUserSession(user);
// feed the cache
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.ADMIN, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.ADMIN, publicProject.getMainBranchComponent())).isTrue();
// change permissions without updating the cache
- db.users().deletePermissionFromUser(publicProject.getProjectDto(), user, UserRole.ADMIN);
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, publicProject.getProjectDto());
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.ADMIN, publicProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.ISSUE_ADMIN, publicProject.getMainBranchComponent())).isFalse();
+ db.users().deletePermissionFromUser(publicProject.getProjectDto(), user, ProjectPermission.ADMIN);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, publicProject.getProjectDto());
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.ADMIN, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.ISSUE_ADMIN, publicProject.getMainBranchComponent())).isFalse();
}
@Test
public void hasComponentPermissionByDtoOrUuid_keeps_cache_of_permissions_of_anonymous_user() {
ProjectData publicProject = db.components().insertPublicProject();
- db.users().insertEntityPermissionOnAnyone(UserRole.ADMIN, publicProject.getProjectDto());
+ db.users().insertEntityPermissionOnAnyone(ProjectPermission.ADMIN, publicProject.getProjectDto());
UserSession underTest = newAnonymousSession();
// feed the cache
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.ADMIN, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.ADMIN, publicProject.getMainBranchComponent())).isTrue();
// change permissions without updating the cache
- db.users().deleteProjectPermissionFromAnyone(publicProject.getProjectDto(), UserRole.ADMIN);
- db.users().insertEntityPermissionOnAnyone(UserRole.ISSUE_ADMIN, publicProject.getProjectDto());
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.ADMIN, publicProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, UserRole.ISSUE_ADMIN, publicProject.getMainBranchComponent())).isFalse();
+ db.users().deleteProjectPermissionFromAnyone(publicProject.getProjectDto(), ProjectPermission.ADMIN);
+ db.users().insertEntityPermissionOnAnyone(ProjectPermission.ISSUE_ADMIN, publicProject.getProjectDto());
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.ADMIN, publicProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.ISSUE_ADMIN, publicProject.getMainBranchComponent())).isFalse();
}
- private boolean hasComponentPermissionByDtoOrUuid(UserSession underTest, String permission, ComponentDto component) {
+ private boolean hasComponentPermissionByDtoOrUuid(UserSession underTest, ProjectPermission permission, ComponentDto component) {
boolean b1 = underTest.hasComponentPermission(permission, component);
boolean b2 = underTest.hasComponentUuidPermission(permission, component.uuid());
checkState(b1 == b2, "Different behaviors");
@@ -566,19 +566,19 @@ public class ServerUserSessionIT {
UserSession underTest = newAnonymousSession();
- assertThat(underTest.keepAuthorizedComponents(UserRole.ADMIN, Arrays.asList(privateProject.getMainBranchComponent(), publicProject.getMainBranchComponent()))).isEmpty();
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ADMIN, Arrays.asList(privateProject.getMainBranchComponent(), publicProject.getMainBranchComponent()))).isEmpty();
}
@Test
public void keepAuthorizedComponents_filters_components_with_granted_permissions_for_anonymous() {
ProjectData publicProject = db.components().insertPublicProject();
ProjectData privateProject = db.components().insertPrivateProject();
- db.users().insertEntityPermissionOnAnyone(UserRole.ISSUE_ADMIN, publicProject.getProjectDto());
+ db.users().insertEntityPermissionOnAnyone(ProjectPermission.ISSUE_ADMIN, publicProject.getProjectDto());
UserSession underTest = newAnonymousSession();
- assertThat(underTest.keepAuthorizedComponents(UserRole.ADMIN, Arrays.asList(privateProject.getMainBranchComponent(), publicProject.getMainBranchComponent()))).isEmpty();
- assertThat(underTest.keepAuthorizedComponents(UserRole.ISSUE_ADMIN, Arrays.asList(privateProject.getMainBranchComponent(), publicProject.getMainBranchComponent())))
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ADMIN, Arrays.asList(privateProject.getMainBranchComponent(), publicProject.getMainBranchComponent()))).isEmpty();
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ISSUE_ADMIN, Arrays.asList(privateProject.getMainBranchComponent(), publicProject.getMainBranchComponent())))
.containsExactly(publicProject.getMainBranchComponent());
}
@@ -586,12 +586,12 @@ public class ServerUserSessionIT {
public void keepAuthorizedComponents_on_branches() {
UserDto user = db.users().insertUser();
ProjectData privateProject = db.components().insertPrivateProject();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, privateProject.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, privateProject.getProjectDto());
ComponentDto privateBranchProject = db.components().insertProjectBranch(privateProject.getMainBranchComponent());
UserSession underTest = newUserSession(user);
- assertThat(underTest.keepAuthorizedComponents(UserRole.ADMIN, asList(privateProject.getMainBranchComponent(), privateBranchProject)))
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ADMIN, asList(privateProject.getMainBranchComponent(), privateBranchProject)))
.containsExactlyInAnyOrder(privateProject.getMainBranchComponent(), privateBranchProject);
}
@@ -608,13 +608,13 @@ public class ServerUserSessionIT {
UserSession underTest = newUserSession(user);
ComponentDto portfolio = db.components().insertPrivatePortfolio();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, portfolio);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, portfolio);
ComponentDto subPortfolio = db.components().insertSubportfolio(portfolio);
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, subPortfolio);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, subPortfolio);
ProjectData app = db.components().insertPrivateApplication();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, app.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, app.getProjectDto());
ProjectData app2 = db.components().insertPrivateApplication();
@@ -623,12 +623,12 @@ public class ServerUserSessionIT {
var copyProject1 = db.components().insertComponent(newProjectCopy(project1, portfolio));
// Add private project2 with USER permissions to private portfolio
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project2);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project2);
db.components().addPortfolioProject(portfolio, project2);
var copyProject2 = db.components().insertComponent(newProjectCopy(project2, portfolio));
// Add private project4 with USER permissions to sub-portfolio
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project4);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project4);
db.components().addPortfolioProject(subPortfolio, project4);
var copyProject4 = db.components().insertComponent(newProjectCopy(project4, subPortfolio));
db.components().addPortfolioReference(portfolio, subPortfolio.uuid());
@@ -638,7 +638,7 @@ public class ServerUserSessionIT {
var copyProject3 = db.components().insertComponent(newProjectCopy(project3, portfolio));
// Add private project5 with USER permissions to app
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project5.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project5.getProjectDto());
db.components().addApplicationProject(app, project5);
var copyProject5 = db.components().insertComponent(newProjectCopy(project5, app));
db.components().addPortfolioReference(portfolio, app.getProjectDto().getUuid());
@@ -648,16 +648,16 @@ public class ServerUserSessionIT {
var copyProject6 = db.components().insertComponent(newProjectCopy(project6, app2));
db.components().addPortfolioReference(portfolio, app2.getProjectDto().getUuid());
- assertThat(underTest.keepAuthorizedComponents(UserRole.ADMIN, List.of(portfolio))).isEmpty();
- assertThat(underTest.keepAuthorizedComponents(UserRole.USER, List.of(portfolio))).containsExactly(portfolio);
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ADMIN, List.of(portfolio))).isEmpty();
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.USER, List.of(portfolio))).containsExactly(portfolio);
- assertThat(underTest.keepAuthorizedComponents(UserRole.ADMIN, Arrays.asList(app.getMainBranchComponent(), subPortfolio, app2.getMainBranchComponent()))).isEmpty();
- assertThat(underTest.keepAuthorizedComponents(UserRole.USER, Arrays.asList(app.getMainBranchComponent(), subPortfolio, app2.getMainBranchComponent()))).containsExactly(app.getMainBranchComponent(), subPortfolio);
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ADMIN, Arrays.asList(app.getMainBranchComponent(), subPortfolio, app2.getMainBranchComponent()))).isEmpty();
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.USER, Arrays.asList(app.getMainBranchComponent(), subPortfolio, app2.getMainBranchComponent()))).containsExactly(app.getMainBranchComponent(), subPortfolio);
- assertThat(underTest.keepAuthorizedComponents(UserRole.ADMIN, Arrays.asList(project1, project2, project3, project4, project5.getMainBranchComponent(), project6.getMainBranchComponent()))).isEmpty();
- assertThat(underTest.keepAuthorizedComponents(UserRole.USER, Arrays.asList(project1, project2, project3, project4, project5.getMainBranchComponent(), project6.getMainBranchComponent())))
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.ADMIN, Arrays.asList(project1, project2, project3, project4, project5.getMainBranchComponent(), project6.getMainBranchComponent()))).isEmpty();
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.USER, Arrays.asList(project1, project2, project3, project4, project5.getMainBranchComponent(), project6.getMainBranchComponent())))
.containsExactly(project1, project2, project4, project5.getMainBranchComponent());
- assertThat(underTest.keepAuthorizedComponents(UserRole.USER, Arrays.asList(copyProject1, copyProject2, copyProject3, copyProject4, copyProject5, copyProject6)))
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.USER, Arrays.asList(copyProject1, copyProject2, copyProject3, copyProject4, copyProject5, copyProject6)))
.containsExactly(copyProject1, copyProject2, copyProject4, copyProject5);
}
@@ -669,13 +669,13 @@ public class ServerUserSessionIT {
UserDto user = db.users().insertUser();
UserSession underTest = newUserSession(user);
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project1.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project1.getProjectDto());
ComponentDto file1Project1 = db.components().insertFile(project1.getMainBranchDto());
ComponentDto file2Project1 = db.components().insertFile(project1.getMainBranchDto());
ComponentDto file1Project2 = db.components().insertFile(project2.getMainBranchDto());
- assertThat(underTest.keepAuthorizedComponents(UserRole.USER, List.of(file1Project1, file2Project1, file1Project2))).containsExactly(file1Project1, file2Project1);
+ assertThat(underTest.keepAuthorizedComponents(ProjectPermission.USER, List.of(file1Project1, file2Project1, file1Project2))).containsExactly(file1Project1, file2Project1);
}
@Test
@@ -742,13 +742,13 @@ public class ServerUserSessionIT {
ComponentDto fileInBranch = db.components().insertComponent(newChildComponent("fileUuid", branch, branch));
// permissions are defined on the project, not on the branch
- db.users().insertProjectPermissionOnUser(user, "p1", privateProject.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, privateProject.getProjectDto());
UserSession underTest = newUserSession(user);
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", privateProject.getMainBranchComponent())).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", branch)).isTrue();
- assertThat(hasComponentPermissionByDtoOrUuid(underTest, "p1", fileInBranch)).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, privateProject.getMainBranchComponent())).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, branch)).isTrue();
+ assertThat(hasComponentPermissionByDtoOrUuid(underTest, ProjectPermission.CODEVIEWER, fileInBranch)).isTrue();
}
@Test
@@ -757,7 +757,7 @@ public class ServerUserSessionIT {
ProjectData privateProject = db.components().insertPrivateProject();
Set<ProjectDto> projectDto = Set.of(publicProject.getProjectDto(), privateProject.getProjectDto());
- List<ProjectDto> projectDtos = newUserSession(null).keepAuthorizedEntities(UserRole.USER, projectDto);
+ List<ProjectDto> projectDtos = newUserSession(null).keepAuthorizedEntities(ProjectPermission.USER, projectDto);
assertThat(projectDtos).containsExactly(publicProject.getProjectDto());
}
@@ -769,37 +769,35 @@ public class ServerUserSessionIT {
ProjectData privateProject = db.components().insertPrivateProject();
Set<ProjectDto> projectDto = Set.of(publicProject.getProjectDto(), privateProject.getProjectDto());
- List<ProjectDto> projectDtos = newUserSession(userDto).keepAuthorizedEntities(UserRole.USER, projectDto);
+ List<ProjectDto> projectDtos = newUserSession(userDto).keepAuthorizedEntities(ProjectPermission.USER, projectDto);
assertThat(projectDtos).containsExactly(publicProject.getProjectDto());
}
@Test
public void keepAuthorizedProjects_shouldAcceptsOnlyPrivateProject_whenCalledWithGoodPermissionAndAnUser() {
- String permission = "aNewPermission";
UserDto userDto = db.users().insertUser();
ProjectDto publicProject = db.components().insertPublicProject().getProjectDto();
ProjectDto privateProject = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(userDto, permission, privateProject);
+ db.users().insertProjectPermissionOnUser(userDto, ProjectPermission.SCAN, privateProject);
ProjectDto privateProjectWithoutPermission = db.components().insertPrivateProject().getProjectDto();
Set<ProjectDto> projectDto = Set.of(publicProject, privateProject, privateProjectWithoutPermission);
- List<ProjectDto> projectDtos = newUserSession(userDto).keepAuthorizedEntities(permission, projectDto);
+ List<ProjectDto> projectDtos = newUserSession(userDto).keepAuthorizedEntities(ProjectPermission.SCAN, projectDto);
assertThat(projectDtos).containsExactly(privateProject);
}
@Test
public void keepAuthorizedProjects_shouldRejectPrivateAndPublicProject_whenCalledWithWrongPermissionAndNoUser() {
- String permission = "aNewPermission";
UserDto userDto = db.users().insertUser();
ProjectDto publicProject = db.components().insertPublicProject().getProjectDto();
ProjectDto privateProject = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(userDto, permission, privateProject);
+ db.users().insertProjectPermissionOnUser(userDto, ProjectPermission.SCAN, privateProject);
ProjectDto privateProjectWithoutPermission = db.components().insertPrivateProject().getProjectDto();
Set<ProjectDto> projectDto = Set.of(publicProject, privateProject, privateProjectWithoutPermission);
- List<ProjectDto> projectDtos = newUserSession(null).keepAuthorizedEntities(permission, projectDto);
+ List<ProjectDto> projectDtos = newUserSession(null).keepAuthorizedEntities(ProjectPermission.SCAN, projectDto);
assertThat(projectDtos).isEmpty();
}
diff --git a/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/TokenUserSessionIT.java b/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/TokenUserSessionIT.java
index 15206a15a46..3a42636fe26 100644
--- a/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/TokenUserSessionIT.java
+++ b/server/sonar-webserver-auth/src/it/java/org/sonar/server/user/TokenUserSessionIT.java
@@ -28,7 +28,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -40,9 +40,9 @@ import org.sonar.db.user.UserTokenDto;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.SCAN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.user.TokenType.GLOBAL_ANALYSIS_TOKEN;
import static org.sonar.db.user.TokenType.PROJECT_ANALYSIS_TOKEN;
import static org.sonar.db.user.TokenType.PROJECT_BADGE_TOKEN;
@@ -212,7 +212,7 @@ public class TokenUserSessionIT {
@Test
@UseDataProvider("validPermissions")
- public void keepAuthorizedEntities_shouldFilterPrivateProjects_whenProjectAnalysisToken(String permission) {
+ public void keepAuthorizedEntities_shouldFilterPrivateProjects_whenProjectAnalysisToken(ProjectPermission permission) {
UserDto user = db.users().insertUser();
ProjectData publicProject = db.components().insertPublicProject();
@@ -296,7 +296,7 @@ public class TokenUserSessionIT {
@Test
@UseDataProvider("validPermissions")
- public void keepAuthorizedComponents_shouldFilterPrivateProjects_whenProjectAnalysisToken(String permission) {
+ public void keepAuthorizedComponents_shouldFilterPrivateProjects_whenProjectAnalysisToken(ProjectPermission permission) {
UserDto user = db.users().insertUser();
ProjectData publicProject = db.components().insertPublicProject();
@@ -337,11 +337,11 @@ public class TokenUserSessionIT {
ProjectData publicProject = db.components().insertPublicProject();
ProjectData privateProject = db.components().insertPrivateProject();
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, privateProject.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, privateProject.getProjectDto());
Set<ComponentDto> componentDtos = Set.of(publicProject.getMainBranchComponent(), privateProject.getMainBranchComponent());
List<ComponentDto> authorizedComponents = mockProjectAnalysisTokenUserSession(user, privateProject.getProjectDto())
- .keepAuthorizedComponents(UserRole.CODEVIEWER, componentDtos);
+ .keepAuthorizedComponents(ProjectPermission.CODEVIEWER, componentDtos);
assertThat(authorizedComponents).isEmpty();
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/SafeModeUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/SafeModeUserSession.java
index 6b872dbbe1c..7a29912c32f 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/SafeModeUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/SafeModeUserSession.java
@@ -25,6 +25,7 @@ import java.util.Optional;
import javax.annotation.CheckForNull;
import javax.annotation.concurrent.Immutable;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.server.user.AbstractUserSession;
@@ -42,17 +43,17 @@ public class SafeModeUserSession extends AbstractUserSession {
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
return false;
}
@Override
- protected boolean hasChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
return false;
}
@Override
- protected boolean hasPortfolioChildProjectsPermission(String permission, String portfolioUuid) {
+ protected boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String portfolioUuid) {
return false;
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java
index 3bb350d7649..193e260da4a 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/AbstractUserSession.java
@@ -25,7 +25,7 @@ import java.util.Optional;
import java.util.Set;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
@@ -38,7 +38,6 @@ import static org.sonar.db.component.ComponentQualifiers.APP;
import static org.sonar.server.user.UserSession.IdentityProvider.SONARQUBE;
public abstract class AbstractUserSession implements UserSession {
- private static final Set<String> PUBLIC_PERMISSIONS = Set.of(UserRole.USER, UserRole.CODEVIEWER);
private static final String INSUFFICIENT_PRIVILEGES_MESSAGE = "Insufficient privileges";
private static final String AUTHENTICATION_IS_REQUIRED_MESSAGE = "Authentication is required";
@@ -87,7 +86,7 @@ public abstract class AbstractUserSession implements UserSession {
protected abstract boolean hasPermissionImpl(GlobalPermission permission);
@Override
- public boolean hasComponentPermission(String permission, ComponentDto component) {
+ public boolean hasComponentPermission(ProjectPermission permission, ComponentDto component) {
Optional<String> projectUuid1 = componentUuidToEntityUuid(component.uuid());
return projectUuid1
@@ -96,33 +95,33 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public final boolean hasEntityPermission(String permission, EntityDto entity) {
+ public final boolean hasEntityPermission(ProjectPermission permission, EntityDto entity) {
return hasEntityUuidPermission(permission, entity.getAuthUuid());
}
@Override
- public final boolean hasEntityPermission(String permission, String entityUuid) {
+ public final boolean hasEntityPermission(ProjectPermission permission, String entityUuid) {
return hasEntityUuidPermission(permission, entityUuid);
}
@Override
- public final boolean hasChildProjectsPermission(String permission, ComponentDto component) {
+ public final boolean hasChildProjectsPermission(ProjectPermission permission, ComponentDto component) {
return componentUuidToEntityUuid(component.uuid())
.map(applicationUuid -> hasChildProjectsPermission(permission, applicationUuid)).orElse(false);
}
@Override
- public final boolean hasChildProjectsPermission(String permission, EntityDto application) {
+ public final boolean hasChildProjectsPermission(ProjectPermission permission, EntityDto application) {
return hasChildProjectsPermission(permission, application.getUuid());
}
@Override
- public final boolean hasPortfolioChildProjectsPermission(String permission, ComponentDto portfolio) {
+ public final boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, ComponentDto portfolio) {
return hasPortfolioChildProjectsPermission(permission, portfolio.uuid());
}
@Override
- public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+ public boolean hasComponentUuidPermission(ProjectPermission permission, String componentUuid) {
Optional<String> entityUuid = componentUuidToEntityUuid(componentUuid);
return entityUuid
.map(s -> hasEntityUuidPermission(permission, s))
@@ -131,27 +130,27 @@ public abstract class AbstractUserSession implements UserSession {
protected abstract Optional<String> componentUuidToEntityUuid(String componentUuid);
- protected abstract boolean hasEntityUuidPermission(String permission, String entityUuid);
+ protected abstract boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid);
- protected abstract boolean hasChildProjectsPermission(String permission, String applicationUuid);
+ protected abstract boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid);
- protected abstract boolean hasPortfolioChildProjectsPermission(String permission, String portfolioUuid);
+ protected abstract boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String portfolioUuid);
@Override
- public final List<ComponentDto> keepAuthorizedComponents(String permission, Collection<ComponentDto> components) {
+ public final List<ComponentDto> keepAuthorizedComponents(ProjectPermission permission, Collection<ComponentDto> components) {
return doKeepAuthorizedComponents(permission, components);
}
@Override
- public final <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> projects) {
+ public final <T extends EntityDto> List<T> keepAuthorizedEntities(ProjectPermission permission, Collection<T> projects) {
return doKeepAuthorizedEntities(permission, projects);
}
/**
* Naive implementation, to be overridden if needed
*/
- protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(String permission, Collection<T> entities) {
- boolean allowPublicComponent = PUBLIC_PERMISSIONS.contains(permission);
+ protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(ProjectPermission permission, Collection<T> entities) {
+ boolean allowPublicComponent = ProjectPermission.PUBLIC_PERMISSIONS.contains(permission);
return entities.stream()
.filter(c -> (allowPublicComponent && !c.isPrivate()) || hasEntityPermission(permission, c.getUuid()))
.toList();
@@ -160,8 +159,8 @@ public abstract class AbstractUserSession implements UserSession {
/**
* Naive implementation, to be overridden if needed
*/
- protected List<ComponentDto> doKeepAuthorizedComponents(String permission, Collection<ComponentDto> components) {
- boolean allowPublicComponent = PUBLIC_PERMISSIONS.contains(permission);
+ protected List<ComponentDto> doKeepAuthorizedComponents(ProjectPermission permission, Collection<ComponentDto> components) {
+ boolean allowPublicComponent = ProjectPermission.PUBLIC_PERMISSIONS.contains(permission);
return components.stream()
.filter(c -> (allowPublicComponent && !c.isPrivate()) || hasComponentPermission(permission, c))
.toList();
@@ -184,7 +183,7 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public final UserSession checkComponentPermission(String projectPermission, ComponentDto component) {
+ public final UserSession checkComponentPermission(ProjectPermission projectPermission, ComponentDto component) {
if (!hasComponentPermission(projectPermission, component)) {
throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
}
@@ -192,7 +191,7 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public UserSession checkEntityPermission(String projectPermission, EntityDto entity) {
+ public UserSession checkEntityPermission(ProjectPermission projectPermission, EntityDto entity) {
if (hasEntityPermission(projectPermission, entity)) {
return this;
}
@@ -201,7 +200,7 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(String projectPermission, EntityDto entity) {
+ public UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(ProjectPermission projectPermission, EntityDto entity) {
if (hasEntityPermission(projectPermission, entity)) {
return this;
}
@@ -210,7 +209,7 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public UserSession checkChildProjectsPermission(String projectPermission, ComponentDto component) {
+ public UserSession checkChildProjectsPermission(ProjectPermission projectPermission, ComponentDto component) {
if (!APP.equals(component.qualifier()) || hasChildProjectsPermission(projectPermission, component)) {
return this;
}
@@ -219,7 +218,7 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public UserSession checkChildProjectsPermission(String projectPermission, EntityDto application) {
+ public UserSession checkChildProjectsPermission(ProjectPermission projectPermission, EntityDto application) {
if (!APP.equals(application.getQualifier()) || hasChildProjectsPermission(projectPermission, application)) {
return this;
}
@@ -228,7 +227,7 @@ public abstract class AbstractUserSession implements UserSession {
}
@Override
- public final UserSession checkComponentUuidPermission(String permission, String componentUuid) {
+ public final UserSession checkComponentUuidPermission(ProjectPermission permission, String componentUuid) {
if (!hasComponentUuidPermission(permission, componentUuid)) {
throw new ForbiddenException(INSUFFICIENT_PRIVILEGES_MESSAGE);
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/DoPrivileged.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/DoPrivileged.java
index 213df3158bd..da6d5db5405 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/DoPrivileged.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/DoPrivileged.java
@@ -24,6 +24,7 @@ import java.util.Collections;
import java.util.Optional;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
/**
@@ -113,7 +114,7 @@ public final class DoPrivileged {
}
@Override
- public boolean hasComponentPermission(String permission, ComponentDto component) {
+ public boolean hasComponentPermission(ProjectPermission permission, ComponentDto component) {
return true;
}
@@ -124,17 +125,17 @@ public final class DoPrivileged {
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
return true;
}
@Override
- protected boolean hasChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
return true;
}
@Override
- protected boolean hasPortfolioChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
return true;
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/GithubWebhookUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/GithubWebhookUserSession.java
index 4effdb77e2e..d42c505441f 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/GithubWebhookUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/GithubWebhookUserSession.java
@@ -22,6 +22,7 @@ package org.sonar.server.user;
import java.util.Collection;
import java.util.Optional;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import static java.util.Collections.emptySet;
@@ -96,22 +97,22 @@ public class GithubWebhookUserSession extends AbstractUserSession {
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
return false;
}
@Override
- protected boolean hasChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
return false;
}
@Override
- protected boolean hasPortfolioChildProjectsPermission(String permission, String portfolioUuid) {
+ protected boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String portfolioUuid) {
return false;
}
@Override
- public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+ public boolean hasComponentUuidPermission(ProjectPermission permission, String componentUuid) {
return true;
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java
index d20f6b1ce23..db27d951e02 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ServerUserSession.java
@@ -41,6 +41,7 @@ import org.sonar.db.component.ComponentTreeQuery;
import org.sonar.db.component.ComponentTreeQuery.Strategy;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
@@ -49,9 +50,9 @@ import static java.util.Optional.of;
import static java.util.Optional.ofNullable;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toSet;
-import static org.sonar.api.web.UserRole.PUBLIC_PERMISSIONS;
import static org.sonar.db.component.ComponentQualifiers.SUBVIEW;
import static org.sonar.db.component.ComponentQualifiers.VIEW;
+import static org.sonar.db.permission.ProjectPermission.PUBLIC_PERMISSIONS;
/**
* Implementation of {@link UserSession} used in web server
@@ -165,19 +166,19 @@ public class ServerUserSession extends AbstractUserSession {
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
return hasPermission(permission, entityUuid);
}
@Override
- protected boolean hasChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
Set<String> childProjectUuids = loadChildProjectUuids(applicationUuid);
Set<String> projectsWithPermission = keepEntitiesUuidsByPermission(permission, childProjectUuids);
return projectsWithPermission.containsAll(childProjectUuids);
}
@Override
- protected boolean hasPortfolioChildProjectsPermission(String permission, String portfolioUuid) {
+ protected boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String portfolioUuid) {
// portfolioUuid might be the UUID of a sub portfolio
Set<String> projectUuids = findProjectUuids(portfolioUuid);
@@ -186,7 +187,7 @@ public class ServerUserSession extends AbstractUserSession {
}
@Override
- protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(String permission, Collection<T> entities) {
+ protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(ProjectPermission permission, Collection<T> entities) {
Set<String> projectsUuids = entities.stream().map(EntityDto::getUuid).collect(Collectors.toSet());
// TODO in SONAR-19445
Set<String> authorizedEntitiesUuids = keepEntitiesUuidsByPermission(permission, projectsUuids);
@@ -196,7 +197,7 @@ public class ServerUserSession extends AbstractUserSession {
.toList();
}
- private Set<String> keepEntitiesUuidsByPermission(String permission, Collection<String> entityUuids) {
+ private Set<String> keepEntitiesUuidsByPermission(ProjectPermission permission, Collection<String> entityUuids) {
try (DbSession dbSession = dbClient.openSession(false)) {
String userUuid = userDto == null ? null : userDto.getUuid();
return dbClient.authorizationDao().keepAuthorizedEntityUuids(dbSession, entityUuids, userUuid, permission);
@@ -266,9 +267,9 @@ public class ServerUserSession extends AbstractUserSession {
return !Objects.isNull(componentDto.qualifier()) && QUALIFIERS.contains(componentDto.qualifier());
}
- private boolean hasPermission(String permission, String entityUuid) {
+ private boolean hasPermission(ProjectPermission permission, String entityUuid) {
Set<String> entityPermissions = permissionsByEntityUuid.computeIfAbsent(entityUuid, this::loadEntityPermissions);
- return entityPermissions.contains(permission);
+ return permission != null && entityPermissions.contains(permission.getKey());
}
private Set<String> loadEntityPermissions(String entityUuid) {
@@ -281,7 +282,7 @@ public class ServerUserSession extends AbstractUserSession {
return loadDbPermissions(dbSession, entityUuid);
}
Set<String> projectPermissions = new HashSet<>();
- projectPermissions.addAll(PUBLIC_PERMISSIONS);
+ projectPermissions.addAll(PUBLIC_PERMISSIONS.stream().map(ProjectPermission::getKey).collect(toSet()));
projectPermissions.addAll(loadDbPermissions(dbSession, entityUuid));
return Collections.unmodifiableSet(projectPermissions);
}
@@ -330,7 +331,7 @@ public class ServerUserSession extends AbstractUserSession {
}
@Override
- protected List<ComponentDto> doKeepAuthorizedComponents(String permission, Collection<ComponentDto> components) {
+ protected List<ComponentDto> doKeepAuthorizedComponents(ProjectPermission permission, Collection<ComponentDto> components) {
try (DbSession dbSession = dbClient.openSession(false)) {
Map<String, String> entityUuidsByComponentUuid = new HashMap<>(getEntityUuidsByComponentUuid(dbSession, components));
Map<String, ComponentDto> originalComponents = findComponentsByCopyComponentUuid(components, dbSession);
@@ -353,7 +354,7 @@ public class ServerUserSession extends AbstractUserSession {
}
}
- protected Set<String> keepAuthorizedProjectsUuids(DbSession dbSession, String permission, Collection<String> entityUuids) {
+ protected Set<String> keepAuthorizedProjectsUuids(DbSession dbSession, ProjectPermission permission, Collection<String> entityUuids) {
return dbClient.authorizationDao().keepAuthorizedEntityUuids(dbSession, entityUuids, getUuid(), permission);
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
index d637ad08ee9..48033a0d609 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/ThreadLocalUserSession.java
@@ -26,6 +26,7 @@ import javax.annotation.CheckForNull;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.server.exceptions.UnauthorizedException;
@@ -123,37 +124,37 @@ public class ThreadLocalUserSession implements UserSession {
}
@Override
- public UserSession checkComponentPermission(String projectPermission, ComponentDto component) {
+ public UserSession checkComponentPermission(ProjectPermission projectPermission, ComponentDto component) {
get().checkComponentPermission(projectPermission, component);
return this;
}
@Override
- public UserSession checkEntityPermission(String projectPermission, EntityDto entity) {
+ public UserSession checkEntityPermission(ProjectPermission projectPermission, EntityDto entity) {
get().checkEntityPermission(projectPermission, entity);
return this;
}
@Override
- public UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(String projectPermission, EntityDto entity) {
+ public UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(ProjectPermission projectPermission, EntityDto entity) {
get().checkEntityPermissionOrElseThrowResourceForbiddenException(projectPermission, entity);
return this;
}
@Override
- public UserSession checkChildProjectsPermission(String projectPermission, ComponentDto component) {
+ public UserSession checkChildProjectsPermission(ProjectPermission projectPermission, ComponentDto component) {
get().checkChildProjectsPermission(projectPermission, component);
return this;
}
@Override
- public UserSession checkChildProjectsPermission(String projectPermission, EntityDto application) {
+ public UserSession checkChildProjectsPermission(ProjectPermission projectPermission, EntityDto application) {
get().checkChildProjectsPermission(projectPermission, application);
return this;
}
@Override
- public UserSession checkComponentUuidPermission(String permission, String componentUuid) {
+ public UserSession checkComponentUuidPermission(ProjectPermission permission, String componentUuid) {
get().checkComponentUuidPermission(permission, componentUuid);
return this;
}
@@ -180,47 +181,47 @@ public class ThreadLocalUserSession implements UserSession {
}
@Override
- public boolean hasComponentPermission(String permission, ComponentDto component) {
+ public boolean hasComponentPermission(ProjectPermission permission, ComponentDto component) {
return get().hasComponentPermission(permission, component);
}
@Override
- public boolean hasEntityPermission(String permission, EntityDto entity) {
+ public boolean hasEntityPermission(ProjectPermission permission, EntityDto entity) {
return get().hasEntityPermission(permission, entity);
}
@Override
- public boolean hasEntityPermission(String permission, String entityUuid) {
+ public boolean hasEntityPermission(ProjectPermission permission, String entityUuid) {
return get().hasEntityPermission(permission, entityUuid);
}
@Override
- public boolean hasChildProjectsPermission(String permission, ComponentDto component) {
+ public boolean hasChildProjectsPermission(ProjectPermission permission, ComponentDto component) {
return get().hasChildProjectsPermission(permission, component);
}
@Override
- public boolean hasChildProjectsPermission(String permission, EntityDto application) {
+ public boolean hasChildProjectsPermission(ProjectPermission permission, EntityDto application) {
return get().hasChildProjectsPermission(permission, application);
}
@Override
- public boolean hasPortfolioChildProjectsPermission(String permission, ComponentDto portfolio) {
+ public boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, ComponentDto portfolio) {
return get().hasPortfolioChildProjectsPermission(permission, portfolio);
}
@Override
- public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+ public boolean hasComponentUuidPermission(ProjectPermission permission, String componentUuid) {
return get().hasComponentUuidPermission(permission, componentUuid);
}
@Override
- public List<ComponentDto> keepAuthorizedComponents(String permission, Collection<ComponentDto> components) {
+ public List<ComponentDto> keepAuthorizedComponents(ProjectPermission permission, Collection<ComponentDto> components) {
return get().keepAuthorizedComponents(permission, components);
}
@Override
- public <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> entities) {
+ public <T extends EntityDto> List<T> keepAuthorizedEntities(ProjectPermission permission, Collection<T> entities) {
return get().keepAuthorizedEntities(permission, entities);
}
}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/TokenUserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/TokenUserSession.java
index bc4a31241db..9cbdd782874 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/TokenUserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/TokenUserSession.java
@@ -28,17 +28,18 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.TokenType;
import org.sonar.db.user.UserDto;
import org.sonar.db.user.UserTokenDto;
import static java.lang.String.format;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class TokenUserSession extends ServerUserSession {
private static final String TOKEN_ASSERTION_ERROR_MESSAGE = "Unsupported token type %s";
- private static final String SCAN = "scan";
private static final Set<GlobalPermission> GLOBAL_ANALYSIS_TOKEN_SUPPORTED_PERMISSIONS = EnumSet.of(GlobalPermission.SCAN, GlobalPermission.PROVISION_PROJECTS);
private final UserTokenDto userToken;
@@ -48,7 +49,7 @@ public class TokenUserSession extends ServerUserSession {
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
TokenType tokenType = TokenType.valueOf(userToken.getType());
return switch (tokenType) {
case USER_TOKEN -> super.hasEntityUuidPermission(permission, entityUuid);
@@ -80,7 +81,7 @@ public class TokenUserSession extends ServerUserSession {
}
@Override
- protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(String permission, Collection<T> entities) {
+ protected <T extends EntityDto> List<T> doKeepAuthorizedEntities(ProjectPermission permission, Collection<T> entities) {
TokenType tokenType = TokenType.valueOf(userToken.getType());
return switch (tokenType) {
case USER_TOKEN, GLOBAL_ANALYSIS_TOKEN -> super.doKeepAuthorizedEntities(permission, entities);
@@ -96,7 +97,7 @@ public class TokenUserSession extends ServerUserSession {
* Required to override doKeepAuthorizedComponents to handle the case of a project analysis token
*/
@Override
- protected Set<String> keepAuthorizedProjectsUuids(DbSession dbSession, String permission, Collection<String> entityUuids) {
+ protected Set<String> keepAuthorizedProjectsUuids(DbSession dbSession, ProjectPermission permission, Collection<String> entityUuids) {
TokenType tokenType = TokenType.valueOf(userToken.getType());
return switch (tokenType) {
case USER_TOKEN, GLOBAL_ANALYSIS_TOKEN -> super.keepAuthorizedProjectsUuids(dbSession, permission, entityUuids);
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java
index c5aaa7f866e..52f3966ed1e 100644
--- a/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java
+++ b/server/sonar-webserver-auth/src/main/java/org/sonar/server/user/UserSession.java
@@ -27,6 +27,7 @@ import javax.annotation.CheckForNull;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import static java.util.Objects.requireNonNull;
@@ -144,27 +145,27 @@ public interface UserSession {
* @param component non-null component.
* @param permission project permission as defined by {@link org.sonar.server.permission.PermissionService}
*/
- boolean hasComponentPermission(String permission, ComponentDto component);
+ boolean hasComponentPermission(ProjectPermission permission, ComponentDto component);
- boolean hasEntityPermission(String permission, EntityDto entity);
+ boolean hasEntityPermission(ProjectPermission permission, EntityDto entity);
- boolean hasEntityPermission(String permission, String entityUuid);
+ boolean hasEntityPermission(ProjectPermission permission, String entityUuid);
- boolean hasChildProjectsPermission(String permission, ComponentDto component);
+ boolean hasChildProjectsPermission(ProjectPermission permission, ComponentDto component);
- boolean hasChildProjectsPermission(String permission, EntityDto application);
+ boolean hasChildProjectsPermission(ProjectPermission permission, EntityDto application);
- boolean hasPortfolioChildProjectsPermission(String permission, ComponentDto component);
+ boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, ComponentDto component);
/**
- * Using {@link #hasComponentPermission(String, ComponentDto)} is recommended
+ * Using {@link #hasComponentPermission(ProjectPermission, ComponentDto)} is recommended
* because it does not have to load project if the referenced component
* is not a project.
*
- * @deprecated use {@link #hasComponentPermission(String, ComponentDto)} instead
+ * @deprecated use {@link #hasComponentPermission(ProjectPermission, ComponentDto)} instead
*/
@Deprecated
- boolean hasComponentUuidPermission(String permission, String componentUuid);
+ boolean hasComponentUuidPermission(ProjectPermission permission, String componentUuid);
/**
* Return the subset of specified components which the user has granted permission.
@@ -173,50 +174,50 @@ public interface UserSession {
* If the input is ordered, then the returned components are in the same order.
* The duplicated components are returned duplicated too.
*/
- List<ComponentDto> keepAuthorizedComponents(String permission, Collection<ComponentDto> components);
+ List<ComponentDto> keepAuthorizedComponents(ProjectPermission permission, Collection<ComponentDto> components);
- <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> components);
+ <T extends EntityDto> List<T> keepAuthorizedEntities(ProjectPermission permission, Collection<T> components);
/**
- * Ensures that {@link #hasComponentPermission(String, ComponentDto)} is {@code true},
+ * Ensures that {@link #hasComponentPermission(ProjectPermission, ComponentDto)} is {@code true},
* otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
*/
- UserSession checkComponentPermission(String projectPermission, ComponentDto component);
+ UserSession checkComponentPermission(ProjectPermission projectPermission, ComponentDto component);
/**
* Ensures that {@link #hasEntityPermission(String, EntityDto)} is {@code true},
* otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
*/
- UserSession checkEntityPermission(String projectPermission, EntityDto entity);
+ UserSession checkEntityPermission(ProjectPermission projectPermission, EntityDto entity);
/**
* Ensures that {@link #hasEntityPermission(String, EntityDto)} is {@code true},
* otherwise throws a {@link org.sonar.server.exceptions.ResourceForbiddenException}.
* <p>
- * Differs from {@link #checkEntityPermission(String, EntityDto)} by throwing a different exception (ensuring no resource listing is possible).
+ * Differs from {@link #checkEntityPermission(ProjectPermission, EntityDto)} by throwing a different exception (ensuring no resource listing is possible).
*/
- UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(String projectPermission, EntityDto entity);
+ UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(ProjectPermission projectPermission, EntityDto entity);
/**
- * Ensures that {@link #hasChildProjectsPermission(String, ComponentDto)} is {@code true}
+ * Ensures that {@link #hasChildProjectsPermission(ProjectPermission, ComponentDto)} is {@code true}
* otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
*/
- UserSession checkChildProjectsPermission(String projectPermission, ComponentDto project);
+ UserSession checkChildProjectsPermission(ProjectPermission projectPermission, ComponentDto project);
/**
- * Ensures that {@link #hasChildProjectsPermission(String, EntityDto)} is {@code true}
+ * Ensures that {@link #hasChildProjectsPermission(ProjectPermission, EntityDto)} is {@code true}
* otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
*/
- UserSession checkChildProjectsPermission(String projectPermission, EntityDto application);
+ UserSession checkChildProjectsPermission(ProjectPermission projectPermission, EntityDto application);
/**
- * Ensures that {@link #hasComponentUuidPermission(String, String)} is {@code true},
+ * Ensures that {@link #hasComponentUuidPermission(ProjectPermission, String)} is {@code true},
* otherwise throws a {@link org.sonar.server.exceptions.ForbiddenException}.
*
- * @deprecated use {@link #checkComponentPermission(String, ComponentDto)} instead
+ * @deprecated use {@link #checkComponentPermission(ProjectPermission, ComponentDto)} instead
*/
@Deprecated
- UserSession checkComponentUuidPermission(String permission, String componentUuid);
+ UserSession checkComponentUuidPermission(ProjectPermission permission, String componentUuid);
/**
* Whether user can administrate system, for example for using cross-organizations services
diff --git a/server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/SafeModeUserSessionTest.java b/server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/SafeModeUserSessionTest.java
index ea5fd3085dc..00e158af1c7 100644
--- a/server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/SafeModeUserSessionTest.java
+++ b/server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/SafeModeUserSessionTest.java
@@ -20,7 +20,7 @@
package org.sonar.server.authentication;
import org.junit.Test;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.GlobalPermission;
import static org.assertj.core.api.Assertions.assertThat;
@@ -46,8 +46,8 @@ public class SafeModeUserSessionTest {
assertThat(underTest.shouldResetPassword()).isFalse();
assertThat(underTest.isSystemAdministrator()).isFalse();
assertThat(underTest.hasPermissionImpl(GlobalPermission.ADMINISTER)).isFalse();
- assertThat(underTest.hasEntityUuidPermission(UserRole.USER, "foo")).isFalse();
- assertThat(underTest.hasChildProjectsPermission(UserRole.USER, "foo")).isFalse();
- assertThat(underTest.hasPortfolioChildProjectsPermission(UserRole.USER, "foo")).isFalse();
+ assertThat(underTest.hasEntityUuidPermission(ProjectPermission.USER, "foo")).isFalse();
+ assertThat(underTest.hasChildProjectsPermission(ProjectPermission.USER, "foo")).isFalse();
+ assertThat(underTest.hasPortfolioChildProjectsPermission(ProjectPermission.USER, "foo")).isFalse();
}
}
diff --git a/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/DoPrivilegedTest.java b/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/DoPrivilegedTest.java
index b4b7041236f..03355eaa833 100644
--- a/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/DoPrivilegedTest.java
+++ b/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/DoPrivilegedTest.java
@@ -19,14 +19,16 @@
*/
package org.sonar.server.user;
+import java.util.Arrays;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.tester.MockUserSession;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class DoPrivilegedTest {
@@ -48,7 +50,8 @@ public class DoPrivilegedTest {
// verify the session used inside Privileged task
assertThat(catcher.userSession.isLoggedIn()).isFalse();
- assertThat(catcher.userSession.hasComponentPermission("any permission", new ComponentDto())).isTrue();
+ Arrays.stream(ProjectPermission.values())
+ .forEach(permission -> assertThat(catcher.userSession.hasComponentPermission(permission, new ComponentDto())).isTrue());
assertThat(catcher.userSession.isSystemAdministrator()).isTrue();
assertThat(catcher.userSession.shouldResetPassword()).isFalse();
assertThat(catcher.userSession.isActive()).isTrue();
@@ -77,7 +80,8 @@ public class DoPrivilegedTest {
// verify the session used inside Privileged task
assertThat(catcher.userSession.isLoggedIn()).isFalse();
- assertThat(catcher.userSession.hasComponentPermission("any permission", new ComponentDto())).isTrue();
+ Arrays.stream(ProjectPermission.values())
+ .forEach(permission -> assertThat(catcher.userSession.hasComponentPermission(permission, new ComponentDto())).isTrue());
}
private class UserSessionCatcherTask extends DoPrivileged.Task {
diff --git a/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/GithubWebhookUserSessionTest.java b/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/GithubWebhookUserSessionTest.java
index a43f159cd11..960f56c83ff 100644
--- a/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/GithubWebhookUserSessionTest.java
+++ b/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/GithubWebhookUserSessionTest.java
@@ -22,6 +22,7 @@ package org.sonar.server.user;
import java.util.Arrays;
import org.junit.Test;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
@@ -96,22 +97,26 @@ public class GithubWebhookUserSessionTest {
@Test
public void hasProjectUuidPermission() {
- assertThat(githubWebhookUserSession.hasEntityUuidPermission("perm", "project")).isFalse();
+ Arrays.stream(ProjectPermission.values()).forEach(projectPermission ->
+ assertThat(githubWebhookUserSession.hasEntityUuidPermission(projectPermission, "project")).isFalse());
}
@Test
public void hasChildProjectsPermission() {
- assertThat(githubWebhookUserSession.hasChildProjectsPermission("perm", "project")).isFalse();
+ Arrays.stream(ProjectPermission.values()).forEach(projectPermission ->
+ assertThat(githubWebhookUserSession.hasChildProjectsPermission(projectPermission, "project")).isFalse());
}
@Test
public void hasPortfolioChildProjectsPermission() {
- assertThat(githubWebhookUserSession.hasPortfolioChildProjectsPermission("perm", "project")).isFalse();
+ Arrays.stream(ProjectPermission.values()).forEach(projectPermission ->
+ assertThat(githubWebhookUserSession.hasPortfolioChildProjectsPermission(projectPermission, "project")).isFalse());
}
@Test
public void hasComponentUuidPermission_returnsAlwaysTrue() {
- assertThat(githubWebhookUserSession.hasComponentUuidPermission("perm", "project")).isTrue();
+ Arrays.stream(ProjectPermission.values()).forEach(projectPermission ->
+ assertThat(githubWebhookUserSession.hasComponentUuidPermission(projectPermission, "project")).isTrue());
}
@Test
diff --git a/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java b/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java
index 489cb81bae5..91a9a3ab728 100644
--- a/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java
+++ b/server/sonar-webserver-auth/src/test/java/org/sonar/server/user/ThreadLocalUserSessionTest.java
@@ -36,7 +36,7 @@ import org.sonar.server.tester.MockUserSession;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class ThreadLocalUserSessionTest {
diff --git a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java
index fc5447032fd..1c0484de527 100644
--- a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java
+++ b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/AbstractMockUserSession.java
@@ -30,7 +30,7 @@ import java.util.Set;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.permission.GlobalPermission;
@@ -39,20 +39,20 @@ import org.sonar.db.project.ProjectDto;
import org.sonar.server.user.AbstractUserSession;
import static com.google.common.base.Preconditions.checkArgument;
+import static org.sonar.db.permission.ProjectPermission.PUBLIC_PERMISSIONS;
public abstract class AbstractMockUserSession<T extends AbstractMockUserSession> extends AbstractUserSession {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMockUserSession.class);
- private static final Set<String> PUBLIC_PERMISSIONS = ImmutableSet.of(UserRole.USER, UserRole.CODEVIEWER); // FIXME to check with Simon
private final Class<T> clazz;
- private final HashMultimap<String, String> projectUuidByPermission = HashMultimap.create();
+ private final HashMultimap<ProjectPermission, String> projectUuidByPermission = HashMultimap.create();
private final Set<GlobalPermission> permissions = new HashSet<>();
private final Map<String, String> projectUuidByComponentUuid = new HashMap<>();
private final Map<String, String> projectUuidByBranchUuid = new HashMap<>();
private final Map<String, Set<String>> applicationProjects = new HashMap<>();
private final Map<String, Set<String>> portfolioProjects = new HashMap<>();
- private final Set<String> projectPermissions = new HashSet<>();
+ private final Set<ProjectPermission> projectPermissions = new HashSet<>();
private boolean systemAdministrator = false;
private boolean resetPassword = false;
@@ -78,10 +78,10 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
Arrays.stream(components)
.forEach(component -> {
if (component.branchUuid().equals(component.uuid()) && !component.isPrivate()) {
- this.projectUuidByPermission.put(UserRole.USER, component.uuid());
- this.projectUuidByPermission.put(UserRole.CODEVIEWER, component.uuid());
- this.projectPermissions.add(UserRole.USER);
- this.projectPermissions.add(UserRole.CODEVIEWER);
+ this.projectUuidByPermission.put(ProjectPermission.USER, component.uuid());
+ this.projectUuidByPermission.put(ProjectPermission.CODEVIEWER, component.uuid());
+ this.projectPermissions.add(ProjectPermission.USER);
+ this.projectPermissions.add(ProjectPermission.CODEVIEWER);
}
this.projectUuidByComponentUuid.put(component.uuid(), component.branchUuid());
});
@@ -92,10 +92,10 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
Arrays.stream(projects)
.forEach(project -> {
if (!project.isPrivate()) {
- this.projectUuidByPermission.put(UserRole.USER, project.getUuid());
- this.projectUuidByPermission.put(UserRole.CODEVIEWER, project.getUuid());
- this.projectPermissions.add(UserRole.USER);
- this.projectPermissions.add(UserRole.CODEVIEWER);
+ this.projectUuidByPermission.put(ProjectPermission.USER, project.getUuid());
+ this.projectUuidByPermission.put(ProjectPermission.CODEVIEWER, project.getUuid());
+ this.projectPermissions.add(ProjectPermission.USER);
+ this.projectPermissions.add(ProjectPermission.CODEVIEWER);
}
this.projectUuidByComponentUuid.put(project.getUuid(), project.getUuid());
});
@@ -118,10 +118,10 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
Arrays.stream(portfolios)
.forEach(portfolio -> {
if (!portfolio.isPrivate()) {
- this.projectUuidByPermission.put(UserRole.USER, portfolio.getUuid());
- this.projectUuidByPermission.put(UserRole.CODEVIEWER, portfolio.getUuid());
- this.projectPermissions.add(UserRole.USER);
- this.projectPermissions.add(UserRole.CODEVIEWER);
+ this.projectUuidByPermission.put(ProjectPermission.USER, portfolio.getUuid());
+ this.projectUuidByPermission.put(ProjectPermission.CODEVIEWER, portfolio.getUuid());
+ this.projectPermissions.add(ProjectPermission.USER);
+ this.projectPermissions.add(ProjectPermission.CODEVIEWER);
}
this.projectUuidByComponentUuid.put(portfolio.getUuid(), portfolio.getUuid());
});
@@ -143,7 +143,7 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
return clazz.cast(this);
}
- public T addProjectPermission(String permission, ComponentDto... components) {
+ public T addProjectPermission(ProjectPermission permission, ComponentDto... components) {
Arrays.stream(components).forEach(component -> {
checkArgument(
component.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
@@ -156,7 +156,7 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
return clazz.cast(this);
}
- public T addProjectPermission(String permission, ProjectDto... projects) {
+ public T addProjectPermission(ProjectPermission permission, ProjectDto... projects) {
Arrays.stream(projects).forEach(component -> {
checkArgument(
component.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
@@ -169,7 +169,7 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
return clazz.cast(this);
}
- public T addPortfolioPermission(String permission, PortfolioDto... portfolios) {
+ public T addPortfolioPermission(ProjectPermission permission, PortfolioDto... portfolios) {
Arrays.stream(portfolios).forEach(component -> {
checkArgument(
component.isPrivate() || !PUBLIC_PERMISSIONS.contains(permission),
@@ -189,7 +189,7 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
}
@Override
- public boolean hasComponentPermission(String permission, ComponentDto component) {
+ public boolean hasComponentPermission(ProjectPermission permission, ComponentDto component) {
return componentUuidToEntityUuid(component.uuid())
.or(() -> componentUuidToEntityUuid(component.branchUuid()))
.map(projectUuid -> hasEntityUuidPermission(permission, projectUuid)).orElseGet(() -> {
@@ -199,19 +199,19 @@ public abstract class AbstractMockUserSession<T extends AbstractMockUserSession>
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
return projectPermissions.contains(permission) && projectUuidByPermission.get(permission).contains(entityUuid);
}
@Override
- protected boolean hasChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
return applicationProjects.containsKey(applicationUuid) && applicationProjects.get(applicationUuid)
.stream()
.allMatch(projectUuid -> projectPermissions.contains(permission) && projectUuidByPermission.get(permission).contains(projectUuid));
}
@Override
- protected boolean hasPortfolioChildProjectsPermission(String permission, String portfolioUuid) {
+ protected boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String portfolioUuid) {
return portfolioProjects.containsKey(portfolioUuid) && portfolioProjects.get(portfolioUuid)
.stream()
.allMatch(projectUuid -> projectPermissions.contains(permission) && projectUuidByPermission.get(permission).contains(projectUuid));
diff --git a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java
index 6940ed20fae..1d77dc6b2f8 100644
--- a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java
+++ b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/tester/UserSessionRule.java
@@ -35,6 +35,7 @@ import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
@@ -208,12 +209,12 @@ public class UserSessionRule implements TestRule, UserSession, BeforeTestExecuti
return this;
}
- public UserSessionRule addProjectPermission(String projectPermission, ComponentDto... components) {
+ public UserSessionRule addProjectPermission(ProjectPermission projectPermission, ComponentDto... components) {
ensureAbstractMockUserSession().addProjectPermission(projectPermission, components);
return this;
}
- public UserSessionRule addPortfolioPermission(String projectPermission, ComponentDto... components) {
+ public UserSessionRule addPortfolioPermission(ProjectPermission projectPermission, ComponentDto... components) {
ensureAbstractMockUserSession().addProjectPermission(projectPermission, components);
return this;
}
@@ -228,12 +229,12 @@ public class UserSessionRule implements TestRule, UserSession, BeforeTestExecuti
return this;
}
- public UserSessionRule addProjectPermission(String projectPermission, ProjectDto... projectDto) {
+ public UserSessionRule addProjectPermission(ProjectPermission projectPermission, ProjectDto... projectDto) {
ensureAbstractMockUserSession().addProjectPermission(projectPermission, projectDto);
return this;
}
- public UserSessionRule addPortfolioPermission(String portfolioPermission, PortfolioDto... portfolioDto) {
+ public UserSessionRule addPortfolioPermission(ProjectPermission portfolioPermission, PortfolioDto... portfolioDto) {
ensureAbstractMockUserSession().addPortfolioPermission(portfolioPermission, portfolioDto);
return this;
}
@@ -272,47 +273,47 @@ public class UserSessionRule implements TestRule, UserSession, BeforeTestExecuti
}
@Override
- public boolean hasComponentPermission(String permission, ComponentDto component) {
+ public boolean hasComponentPermission(ProjectPermission permission, ComponentDto component) {
return currentUserSession.hasComponentPermission(permission, component);
}
@Override
- public boolean hasEntityPermission(String permission, EntityDto entity) {
+ public boolean hasEntityPermission(ProjectPermission permission, EntityDto entity) {
return currentUserSession.hasEntityPermission(permission, entity.getUuid());
}
@Override
- public boolean hasEntityPermission(String permission, String entityUuid) {
+ public boolean hasEntityPermission(ProjectPermission permission, String entityUuid) {
return currentUserSession.hasEntityPermission(permission, entityUuid);
}
@Override
- public boolean hasChildProjectsPermission(String permission, ComponentDto component) {
+ public boolean hasChildProjectsPermission(ProjectPermission permission, ComponentDto component) {
return currentUserSession.hasChildProjectsPermission(permission, component);
}
@Override
- public boolean hasChildProjectsPermission(String permission, EntityDto application) {
+ public boolean hasChildProjectsPermission(ProjectPermission permission, EntityDto application) {
return currentUserSession.hasChildProjectsPermission(permission, application);
}
@Override
- public boolean hasPortfolioChildProjectsPermission(String permission, ComponentDto component) {
+ public boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, ComponentDto component) {
return currentUserSession.hasPortfolioChildProjectsPermission(permission, component);
}
@Override
- public boolean hasComponentUuidPermission(String permission, String componentUuid) {
+ public boolean hasComponentUuidPermission(ProjectPermission permission, String componentUuid) {
return currentUserSession.hasComponentUuidPermission(permission, componentUuid);
}
@Override
- public List<ComponentDto> keepAuthorizedComponents(String permission, Collection<ComponentDto> components) {
+ public List<ComponentDto> keepAuthorizedComponents(ProjectPermission permission, Collection<ComponentDto> components) {
return currentUserSession.keepAuthorizedComponents(permission, components);
}
@Override
- public <T extends EntityDto> List<T> keepAuthorizedEntities(String permission, Collection<T> entities) {
+ public <T extends EntityDto> List<T> keepAuthorizedEntities(ProjectPermission permission, Collection<T> entities) {
return currentUserSession.keepAuthorizedEntities(permission, entities);
}
@@ -383,37 +384,37 @@ public class UserSessionRule implements TestRule, UserSession, BeforeTestExecuti
}
@Override
- public UserSession checkComponentPermission(String projectPermission, ComponentDto component) {
+ public UserSession checkComponentPermission(ProjectPermission projectPermission, ComponentDto component) {
currentUserSession.checkComponentPermission(projectPermission, component);
return this;
}
@Override
- public UserSession checkEntityPermission(String projectPermission, EntityDto entity) {
+ public UserSession checkEntityPermission(ProjectPermission projectPermission, EntityDto entity) {
currentUserSession.checkEntityPermission(projectPermission, entity);
return this;
}
@Override
- public UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(String projectPermission, EntityDto entity) {
+ public UserSession checkEntityPermissionOrElseThrowResourceForbiddenException(ProjectPermission projectPermission, EntityDto entity) {
currentUserSession.checkEntityPermissionOrElseThrowResourceForbiddenException(projectPermission, entity);
return this;
}
@Override
- public UserSession checkChildProjectsPermission(String projectPermission, ComponentDto component) {
+ public UserSession checkChildProjectsPermission(ProjectPermission projectPermission, ComponentDto component) {
currentUserSession.checkChildProjectsPermission(projectPermission, component);
return this;
}
@Override
- public UserSession checkChildProjectsPermission(String projectPermission, EntityDto application) {
+ public UserSession checkChildProjectsPermission(ProjectPermission projectPermission, EntityDto application) {
currentUserSession.checkChildProjectsPermission(projectPermission, application);
return this;
}
@Override
- public UserSession checkComponentUuidPermission(String permission, String componentUuid) {
+ public UserSession checkComponentUuidPermission(ProjectPermission permission, String componentUuid) {
currentUserSession.checkComponentUuidPermission(permission, componentUuid);
return this;
}
diff --git a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/user/TestUserSessionFactory.java b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/user/TestUserSessionFactory.java
index 7431b18045e..c50bd10b04b 100644
--- a/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/user/TestUserSessionFactory.java
+++ b/server/sonar-webserver-auth/src/testFixtures/java/org/sonar/server/user/TestUserSessionFactory.java
@@ -23,6 +23,7 @@ import java.util.Collection;
import java.util.Optional;
import javax.annotation.Nullable;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.db.user.UserTokenDto;
@@ -123,17 +124,17 @@ public class TestUserSessionFactory implements UserSessionFactory {
}
@Override
- protected boolean hasEntityUuidPermission(String permission, String entityUuid) {
+ protected boolean hasEntityUuidPermission(ProjectPermission permission, String entityUuid) {
throw notImplemented();
}
@Override
- protected boolean hasChildProjectsPermission(String permission, String applicationUuid) {
+ protected boolean hasChildProjectsPermission(ProjectPermission permission, String applicationUuid) {
throw notImplemented();
}
@Override
- protected boolean hasPortfolioChildProjectsPermission(String permission, String portfolioUuid) { throw notImplemented(); }
+ protected boolean hasPortfolioChildProjectsPermission(ProjectPermission permission, String portfolioUuid) { throw notImplemented(); }
@Override
public boolean isSystemAdministrator() {
diff --git a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/component/ComponentUpdaterIT.java b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/component/ComponentUpdaterIT.java
index 7b43b4e1079..809c680b6e2 100644
--- a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/component/ComponentUpdaterIT.java
+++ b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/component/ComponentUpdaterIT.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -525,7 +525,8 @@ public class ComponentUpdaterIT {
List<String> permissions = db.getDbClient().userPermissionDao().selectEntityPermissionsOfUser(session, userDto.getUuid(), componentCreationData.projectDto().getUuid());
assertThat(permissions)
- .containsExactlyInAnyOrder(UserRole.USER, UserRole.CODEVIEWER);
+ .map(ProjectPermission::fromKey)
+ .containsExactlyInAnyOrder(ProjectPermission.USER, ProjectPermission.CODEVIEWER);
}
@Test
diff --git a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/GroupPermissionChangerIT.java b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/GroupPermissionChangerIT.java
index 2c93b3ab581..d1bafecf5b2 100644
--- a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/GroupPermissionChangerIT.java
+++ b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/GroupPermissionChangerIT.java
@@ -24,20 +24,20 @@ import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl;
@@ -107,93 +107,93 @@ public class GroupPermissionChangerIT {
.forEach(perm -> {
apply(new GroupPermissionChange(Operation.REMOVE, perm, privateProject, null, permissionService));
- assertThat(db.users().selectAnyonePermissions(privateProject.getUuid())).contains(perm);
+ assertThat(db.users().selectAnyonePermissions(privateProject.getUuid())).map(ProjectPermission::fromKey).contains(perm);
});
}
@Test
public void apply_adds_permission_USER_to_group_on_private_project() {
- applyAddsPermissionToGroupOnPrivateProject(UserRole.USER);
+ applyAddsPermissionToGroupOnPrivateProject(ProjectPermission.USER);
}
@Test
public void apply_adds_permission_CODEVIEWER_to_group_on_private_project() {
- applyAddsPermissionToGroupOnPrivateProject(UserRole.CODEVIEWER);
+ applyAddsPermissionToGroupOnPrivateProject(ProjectPermission.CODEVIEWER);
}
@Test
public void apply_adds_permission_ADMIN_to_group_on_private_project() {
- applyAddsPermissionToGroupOnPrivateProject(UserRole.ADMIN);
+ applyAddsPermissionToGroupOnPrivateProject(ProjectPermission.ADMIN);
}
@Test
public void apply_adds_permission_ISSUE_ADMIN_to_group_on_private_project() {
- applyAddsPermissionToGroupOnPrivateProject(UserRole.ISSUE_ADMIN);
+ applyAddsPermissionToGroupOnPrivateProject(ProjectPermission.ISSUE_ADMIN);
}
@Test
public void apply_adds_permission_SCAN_EXECUTION_to_group_on_private_project() {
- applyAddsPermissionToGroupOnPrivateProject(GlobalPermission.SCAN.getKey());
+ applyAddsPermissionToGroupOnPrivateProject(ProjectPermission.SCAN);
}
- private void applyAddsPermissionToGroupOnPrivateProject(String permission) {
+ private void applyAddsPermissionToGroupOnPrivateProject(ProjectPermission permission) {
apply(new GroupPermissionChange(Operation.ADD, permission, privateProject, group, permissionService));
assertThat(db.users().selectGroupPermissions(group, null)).isEmpty();
- assertThat(db.users().selectGroupPermissions(group, privateProject)).containsOnly(permission);
+ assertThat(db.users().selectGroupPermissions(group, privateProject)).containsOnly(permission.getKey());
}
@Test
public void apply_removes_permission_USER_from_group_on_private_project() {
- applyRemovesPermissionFromGroupOnPrivateProject(UserRole.USER);
+ applyRemovesPermissionFromGroupOnPrivateProject(ProjectPermission.USER);
}
@Test
public void apply_removes_permission_CODEVIEWER_from_group_on_private_project() {
- applyRemovesPermissionFromGroupOnPrivateProject(UserRole.CODEVIEWER);
+ applyRemovesPermissionFromGroupOnPrivateProject(ProjectPermission.CODEVIEWER);
}
@Test
public void apply_removes_permission_ADMIN_from_on_private_project() {
- applyRemovesPermissionFromGroupOnPrivateProject(UserRole.ADMIN);
+ applyRemovesPermissionFromGroupOnPrivateProject(ProjectPermission.ADMIN);
}
@Test
public void apply_removes_permission_ISSUE_ADMIN_from_on_private_project() {
- applyRemovesPermissionFromGroupOnPrivateProject(UserRole.ISSUE_ADMIN);
+ applyRemovesPermissionFromGroupOnPrivateProject(ProjectPermission.ISSUE_ADMIN);
}
@Test
public void apply_removes_permission_SCAN_EXECUTION_from_on_private_project() {
- applyRemovesPermissionFromGroupOnPrivateProject(GlobalPermission.SCAN.getKey());
+ applyRemovesPermissionFromGroupOnPrivateProject(ProjectPermission.SCAN);
}
- private void applyRemovesPermissionFromGroupOnPrivateProject(String permission) {
+ private void applyRemovesPermissionFromGroupOnPrivateProject(ProjectPermission permission) {
db.users().insertEntityPermissionOnGroup(group, permission, privateProject);
- apply(new GroupPermissionChange(Operation.ADD, permission, privateProject, group, permissionService), permission);
+ apply(new GroupPermissionChange(Operation.ADD, permission, privateProject, group, permissionService), permission.getKey());
- assertThat(db.users().selectGroupPermissions(group, privateProject)).containsOnly(permission);
+ assertThat(db.users().selectGroupPermissions(group, privateProject)).containsOnly(permission.getKey());
}
@Test
public void apply_has_no_effect_when_adding_USER_permission_to_group_AnyOne_on_a_public_project() {
- apply(new GroupPermissionChange(Operation.ADD, UserRole.USER, publicProject, null, permissionService));
+ apply(new GroupPermissionChange(Operation.ADD, ProjectPermission.USER, publicProject, null, permissionService));
assertThat(db.users().selectAnyonePermissions(publicProject.getUuid())).isEmpty();
}
@Test
public void apply_has_no_effect_when_adding_CODEVIEWER_permission_to_group_AnyOne_on_a_public_project() {
- apply(new GroupPermissionChange(Operation.ADD, UserRole.CODEVIEWER, publicProject, null, permissionService));
+ apply(new GroupPermissionChange(Operation.ADD, ProjectPermission.CODEVIEWER, publicProject, null, permissionService));
assertThat(db.users().selectAnyonePermissions(publicProject.getUuid())).isEmpty();
}
@Test
public void apply_fails_with_BadRequestException_when_adding_permission_ADMIN_to_group_AnyOne_on_a_public_project() {
- GroupPermissionChange change = new GroupPermissionChange(Operation.ADD, UserRole.ADMIN, publicProject, null, permissionService);
+ GroupPermissionChange change = new GroupPermissionChange(Operation.ADD, ProjectPermission.ADMIN, publicProject, null, permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
.hasMessage("It is not possible to add the 'admin' permission to group 'Anyone'.");
@@ -201,9 +201,9 @@ public class GroupPermissionChangerIT {
@Test
public void apply_adds_permission_ISSUE_ADMIN_to_group_AnyOne_on_a_public_project() {
- apply(new GroupPermissionChange(Operation.ADD, UserRole.ISSUE_ADMIN, publicProject, null, permissionService));
+ apply(new GroupPermissionChange(Operation.ADD, ProjectPermission.ISSUE_ADMIN, publicProject, null, permissionService));
- assertThat(db.users().selectAnyonePermissions(publicProject.getUuid())).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectAnyonePermissions(publicProject.getUuid())).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
@@ -215,7 +215,7 @@ public class GroupPermissionChangerIT {
@Test
public void apply_fails_with_BadRequestException_when_removing_USER_permission_from_group_AnyOne_on_a_public_project() {
- GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, UserRole.USER, publicProject, null, permissionService);
+ GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, ProjectPermission.USER, publicProject, null, permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
.hasMessage("Permission user can't be removed from a public component");
@@ -223,7 +223,7 @@ public class GroupPermissionChangerIT {
@Test
public void apply_fails_with_BadRequestException_when_removing_CODEVIEWER_permission_from_group_AnyOne_on_a_public_project() {
- GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, UserRole.CODEVIEWER, publicProject, null, permissionService);
+ GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, ProjectPermission.CODEVIEWER.getKey(), publicProject, null, permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
.hasMessage("Permission codeviewer can't be removed from a public component");
@@ -231,12 +231,12 @@ public class GroupPermissionChangerIT {
@Test
public void apply_removes_ADMIN_permission_from_group_AnyOne_on_a_public_project() {
- applyRemovesPermissionFromGroupAnyOneOnAPublicProject(UserRole.ADMIN);
+ applyRemovesPermissionFromGroupAnyOneOnAPublicProject(ProjectPermission.ADMIN.getKey());
}
@Test
public void apply_removes_ISSUE_ADMIN_permission_from_group_AnyOne_on_a_public_project() {
- applyRemovesPermissionFromGroupAnyOneOnAPublicProject(UserRole.ISSUE_ADMIN);
+ applyRemovesPermissionFromGroupAnyOneOnAPublicProject(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
@@ -254,7 +254,7 @@ public class GroupPermissionChangerIT {
@Test
public void apply_fails_with_BadRequestException_when_removing_USER_permission_from_a_group_on_a_public_project() {
- GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, UserRole.USER, publicProject, group, permissionService);
+ GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, ProjectPermission.USER, publicProject, group, permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
.hasMessage("Permission user can't be removed from a public component");
@@ -262,7 +262,7 @@ public class GroupPermissionChangerIT {
@Test
public void apply_fails_with_BadRequestException_when_removing_CODEVIEWER_permission_from_a_group_on_a_public_project() {
- GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, UserRole.CODEVIEWER, publicProject, group, permissionService);
+ GroupPermissionChange change = new GroupPermissionChange(Operation.REMOVE, ProjectPermission.CODEVIEWER, publicProject, group, permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
.hasMessage("Permission codeviewer can't be removed from a public component");
@@ -270,7 +270,7 @@ public class GroupPermissionChangerIT {
@Test
public void add_permission_to_anyone() {
- apply(new GroupPermissionChange(Operation.ADD, ADMINISTER_QUALITY_PROFILES.getKey(), null, null, permissionService));
+ apply(new GroupPermissionChange(Operation.ADD, ADMINISTER_QUALITY_PROFILES, null, permissionService));
assertThat(db.users().selectGroupPermissions(group, null)).isEmpty();
assertThat(db.users().selectAnyonePermissions(null)).containsOnly(ADMINISTER_QUALITY_PROFILES.getKey());
@@ -280,7 +280,7 @@ public class GroupPermissionChangerIT {
public void do_nothing_when_adding_permission_that_already_exists() {
db.users().insertPermissionOnGroup(group, ADMINISTER_QUALITY_GATES);
- apply(new GroupPermissionChange(Operation.ADD, ADMINISTER_QUALITY_GATES.getKey(), null, group, permissionService), ADMINISTER_QUALITY_GATES.getKey());
+ apply(new GroupPermissionChange(Operation.ADD, ADMINISTER_QUALITY_GATES, group, permissionService), ADMINISTER_QUALITY_GATES.getKey());
assertThat(db.users().selectGroupPermissions(group, null)).containsExactly(ADMINISTER_QUALITY_GATES.getKey());
}
@@ -288,32 +288,26 @@ public class GroupPermissionChangerIT {
@Test
public void fail_to_add_global_permission_but_SCAN_and_ADMIN_on_private_project() {
permissionService.getGlobalPermissions().stream()
- .map(GlobalPermission::getKey)
- .filter(perm -> !UserRole.ADMIN.equals(perm) && !GlobalPermission.SCAN.getKey().equals(perm))
+ .filter(perm -> !ADMINISTER.equals(perm) && !GlobalPermission.SCAN.equals(perm))
.forEach(perm -> {
- try {
- new GroupPermissionChange(Operation.ADD, perm, privateProject, group, permissionService);
- fail("a BadRequestException should have been thrown for permission " + perm);
- } catch (BadRequestException e) {
- assertThat(e).hasMessage("Invalid project permission '" + perm +
- "'. Valid values are [" + StringUtils.join(permissionService.getAllProjectPermissions(), ", ") + "]");
- }
+ var permissionKey = perm.getKey();
+ assertThatThrownBy(() -> new GroupPermissionChange(Operation.ADD, permissionKey, privateProject, group, permissionService))
+ .withFailMessage("a BadRequestException should have been thrown for permission " + perm)
+ .isInstanceOf(BadRequestException.class)
+ .hasMessage("Invalid project permission '" + perm + "'. Valid values are [" + StringUtils.join(permissionService.getAllProjectPermissions(), ", ") + "]");
});
}
@Test
public void fail_to_add_global_permission_but_SCAN_and_ADMIN_on_public_project() {
permissionService.getGlobalPermissions().stream()
- .map(GlobalPermission::getKey)
- .filter(perm -> !UserRole.ADMIN.equals(perm) && !GlobalPermission.SCAN.getKey().equals(perm))
+ .filter(perm -> !ADMINISTER.equals(perm) && !GlobalPermission.SCAN.equals(perm))
.forEach(perm -> {
- try {
- new GroupPermissionChange(Operation.ADD, perm, publicProject, group, permissionService);
- fail("a BadRequestException should have been thrown for permission " + perm);
- } catch (BadRequestException e) {
- assertThat(e).hasMessage("Invalid project permission '" + perm +
- "'. Valid values are [" + StringUtils.join(permissionService.getAllProjectPermissions(), ", ") + "]");
- }
+ var permissionKey = perm.getKey();
+ assertThatThrownBy(() -> new GroupPermissionChange(Operation.ADD, permissionKey, publicProject, group, permissionService))
+ .withFailMessage("a BadRequestException should have been thrown for permission " + perm)
+ .isInstanceOf(BadRequestException.class)
+ .hasMessage("Invalid project permission '" + perm + "'. Valid values are [" + StringUtils.join(permissionService.getAllProjectPermissions(), ", ") + "]");
});
}
@@ -321,14 +315,13 @@ public class GroupPermissionChangerIT {
public void fail_to_add_project_permission_but_SCAN_and_ADMIN_on_global_group() {
permissionService.getAllProjectPermissions()
.stream()
- .filter(perm -> !GlobalPermission.SCAN.getKey().equals(perm) && !GlobalPermission.ADMINISTER.getKey().equals(perm))
+ .filter(perm -> !ProjectPermission.SCAN.equals(perm) && !ProjectPermission.ADMIN.equals(perm))
.forEach(permission -> {
- try {
- new GroupPermissionChange(Operation.ADD, permission, null, group, permissionService);
- fail("a BadRequestException should have been thrown for permission " + permission);
- } catch (BadRequestException e) {
- assertThat(e).hasMessage("Invalid global permission '" + permission + "'. Valid values are [admin, gateadmin, profileadmin, provisioning, scan]");
- }
+ var permissionKey = permission.getKey();
+ assertThatThrownBy(() -> new GroupPermissionChange(Operation.ADD, permissionKey, null, group, permissionService))
+ .withFailMessage("a BadRequestException should have been thrown for permission " + permission)
+ .isInstanceOf(BadRequestException.class)
+ .hasMessage("Invalid global permission '" + permission + "'. Valid values are [admin, gateadmin, profileadmin, provisioning, scan]");
});
}
@@ -337,7 +330,7 @@ public class GroupPermissionChangerIT {
db.users().insertPermissionOnGroup(group, ADMINISTER_QUALITY_GATES);
db.users().insertPermissionOnGroup(group, PROVISION_PROJECTS);
- apply(new GroupPermissionChange(Operation.REMOVE, ADMINISTER_QUALITY_GATES.getKey(), null, group, permissionService), ADMINISTER_QUALITY_GATES.getKey(),
+ apply(new GroupPermissionChange(Operation.REMOVE, ADMINISTER_QUALITY_GATES, group, permissionService), ADMINISTER_QUALITY_GATES.getKey(),
PROVISION_PROJECTS.getKey());
assertThat(db.users().selectGroupPermissions(group, null)).containsOnly(PROVISION_PROJECTS.getKey());
@@ -346,19 +339,19 @@ public class GroupPermissionChangerIT {
@Test
public void remove_project_permission_from_group() {
db.users().insertPermissionOnGroup(group, ADMINISTER_QUALITY_GATES);
- db.users().insertEntityPermissionOnGroup(group, UserRole.ISSUE_ADMIN, privateProject);
- db.users().insertEntityPermissionOnGroup(group, UserRole.CODEVIEWER, privateProject);
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.ISSUE_ADMIN, privateProject);
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.CODEVIEWER, privateProject);
- apply(new GroupPermissionChange(Operation.REMOVE, UserRole.ISSUE_ADMIN, privateProject, group, permissionService), UserRole.ISSUE_ADMIN,
- UserRole.CODEVIEWER);
+ apply(new GroupPermissionChange(Operation.REMOVE, ProjectPermission.ISSUE_ADMIN.getKey(), privateProject, group, permissionService), ProjectPermission.ISSUE_ADMIN.getKey(),
+ ProjectPermission.CODEVIEWER.getKey());
assertThat(db.users().selectGroupPermissions(group, null)).containsOnly(ADMINISTER_QUALITY_GATES.getKey());
- assertThat(db.users().selectGroupPermissions(group, privateProject)).containsOnly(UserRole.CODEVIEWER);
+ assertThat(db.users().selectGroupPermissions(group, privateProject)).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
public void do_not_fail_if_removing_a_permission_that_does_not_exist() {
- apply(new GroupPermissionChange(Operation.REMOVE, UserRole.ISSUE_ADMIN, privateProject, group, permissionService));
+ apply(new GroupPermissionChange(Operation.REMOVE, ProjectPermission.ISSUE_ADMIN.getKey(), privateProject, group, permissionService));
assertThat(db.users().selectGroupPermissions(group, null)).isEmpty();
assertThat(db.users().selectGroupPermissions(group, privateProject)).isEmpty();
@@ -392,7 +385,7 @@ public class GroupPermissionChangerIT {
db.commit();
}
- private void unsafeInsertProjectPermissionOnAnyone(String perm) {
+ private void unsafeInsertProjectPermissionOnAnyone(ProjectPermission perm) {
GroupPermissionDto dto = new GroupPermissionDto()
.setUuid(Uuids.createFast())
.setGroupUuid(null)
diff --git a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/PermissionTemplateServiceIT.java b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/PermissionTemplateServiceIT.java
index b362cc9a87b..4151521e7b5 100644
--- a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/PermissionTemplateServiceIT.java
+++ b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/PermissionTemplateServiceIT.java
@@ -25,18 +25,18 @@ import java.util.stream.Stream;
import javax.annotation.Nullable;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
-import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDbTester;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.es.Indexers;
import org.sonar.server.es.TestIndexers;
import org.sonar.server.exceptions.TemplateMatchingKeyException;
@@ -101,7 +101,7 @@ public class PermissionTemplateServiceIT {
underTest.applyAndCommit(session, permissionTemplate, singletonList(publicProject));
assertThat(selectProjectPermissionsOfGroup(null, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -116,7 +116,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, publicProject, null);
assertThat(selectProjectPermissionsOfGroup(null, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -131,7 +131,7 @@ public class PermissionTemplateServiceIT {
underTest.applyAndCommit(session, permissionTemplate, singletonList(privateProject));
assertThat(selectProjectPermissionsOfGroup(group, privateProject.getUuid()))
- .containsOnly("p1", UserRole.CODEVIEWER, UserRole.USER, UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.USER.getKey(), ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -147,7 +147,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, privateProject, null);
assertThat(selectProjectPermissionsOfGroup(group, privateProject.getUuid()))
- .containsOnly("p1", UserRole.CODEVIEWER, UserRole.USER, UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.USER.getKey(), ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -162,7 +162,7 @@ public class PermissionTemplateServiceIT {
underTest.applyAndCommit(session, permissionTemplate, singletonList(publicProject));
assertThat(selectProjectPermissionsOfGroup(group, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -178,7 +178,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, publicProject, null);
assertThat(selectProjectPermissionsOfGroup(group, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -193,7 +193,7 @@ public class PermissionTemplateServiceIT {
underTest.applyAndCommit(session, permissionTemplate, singletonList(publicProject));
assertThat(selectProjectPermissionsOfUser(user, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -209,7 +209,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, publicProject, null);
assertThat(selectProjectPermissionsOfUser(user, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -224,7 +224,7 @@ public class PermissionTemplateServiceIT {
underTest.applyAndCommit(session, permissionTemplate, singletonList(privateProject));
assertThat(selectProjectPermissionsOfUser(user, privateProject.getUuid()))
- .containsOnly("p1", UserRole.CODEVIEWER, UserRole.USER, UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.USER.getKey(), ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -240,7 +240,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, privateProject, null);
assertThat(selectProjectPermissionsOfUser(user, privateProject.getUuid()))
- .containsOnly("p1", UserRole.CODEVIEWER, UserRole.USER, UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.USER.getKey(), ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -256,7 +256,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, publicProject, user.getUuid());
assertThat(selectProjectPermissionsOfUser(user, publicProject.getUuid()))
- .containsOnly("p1", UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), ProjectPermission.SCAN.getKey());
}
@Test
@@ -272,7 +272,7 @@ public class PermissionTemplateServiceIT {
underTest.applyDefaultToNewComponent(session, privateProject, user.getUuid());
assertThat(selectProjectPermissionsOfUser(user, privateProject.getUuid()))
- .containsOnly("p1", UserRole.CODEVIEWER, UserRole.USER, UserRole.ADMIN, UserRole.ISSUE_ADMIN, UserRole.SECURITYHOTSPOT_ADMIN, GlobalPermission.SCAN.getKey());
+ .containsOnly("p1", ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.USER.getKey(), ProjectPermission.ADMIN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.SECURITYHOTSPOT_ADMIN.getKey(), GlobalPermission.SCAN.getKey());
}
@Test
@@ -386,16 +386,16 @@ public class PermissionTemplateServiceIT {
ProjectDto project = dbTester.components().insertPrivateProject().getProjectDto();
GroupDto adminGroup = dbTester.users().insertGroup();
GroupDto userGroup = dbTester.users().insertGroup();
- dbTester.users().insertPermissionOnGroup(adminGroup, GlobalPermission.ADMINISTER.getKey());
- dbTester.users().insertPermissionOnGroup(userGroup, UserRole.USER);
+ dbTester.users().insertPermissionOnGroup(adminGroup, GlobalPermission.ADMINISTER);
+ dbTester.users().insertPermissionOnGroup(userGroup, ProjectPermission.USER);
dbTester.users().insertGlobalPermissionOnUser(user, GlobalPermission.ADMINISTER);
PermissionTemplateDto permissionTemplate = dbTester.permissionTemplates().insertTemplate();
dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, adminGroup, GlobalPermission.ADMINISTER.getKey());
- dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, adminGroup, UserRole.ISSUE_ADMIN);
- dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, userGroup, UserRole.USER);
- dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, userGroup, UserRole.CODEVIEWER);
- dbTester.permissionTemplates().addAnyoneToTemplate(permissionTemplate, UserRole.USER);
- dbTester.permissionTemplates().addAnyoneToTemplate(permissionTemplate, UserRole.CODEVIEWER);
+ dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, adminGroup, ProjectPermission.ISSUE_ADMIN);
+ dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, userGroup, ProjectPermission.USER);
+ dbTester.permissionTemplates().addGroupToTemplate(permissionTemplate, userGroup, ProjectPermission.CODEVIEWER);
+ dbTester.permissionTemplates().addAnyoneToTemplate(permissionTemplate, ProjectPermission.USER);
+ dbTester.permissionTemplates().addAnyoneToTemplate(permissionTemplate, ProjectPermission.CODEVIEWER);
dbTester.permissionTemplates().addUserToTemplate(permissionTemplate, user, GlobalPermission.ADMINISTER.getKey());
assertThat(selectProjectPermissionsOfGroup(adminGroup, project.getUuid())).isEmpty();
@@ -405,8 +405,8 @@ public class PermissionTemplateServiceIT {
underTest.applyAndCommit(session, permissionTemplate, singletonList(project));
- assertThat(selectProjectPermissionsOfGroup(adminGroup, project.getUuid())).containsOnly(GlobalPermission.ADMINISTER.getKey(), UserRole.ISSUE_ADMIN);
- assertThat(selectProjectPermissionsOfGroup(userGroup, project.getUuid())).containsOnly(UserRole.USER, UserRole.CODEVIEWER);
+ assertThat(selectProjectPermissionsOfGroup(adminGroup, project.getUuid())).containsOnly(GlobalPermission.ADMINISTER.getKey(), ProjectPermission.ISSUE_ADMIN.getKey());
+ assertThat(selectProjectPermissionsOfGroup(userGroup, project.getUuid())).containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey());
assertThat(selectProjectPermissionsOfGroup(null, project.getUuid())).isEmpty();
assertThat(selectProjectPermissionsOfUser(user, project.getUuid())).containsOnly(GlobalPermission.ADMINISTER.getKey());
}
@@ -427,9 +427,9 @@ public class PermissionTemplateServiceIT {
PermissionTemplateDto template = templateDb.insertTemplate();
dbTester.permissionTemplates().setDefaultTemplates(template, null, null);
templateDb.addProjectCreatorToTemplate(template.getUuid(), GlobalPermission.SCAN.getKey(), template.getName());
- templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.USER, template.getName(), user.getLogin());
- templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), UserRole.CODEVIEWER, template.getName(), group.getName());
- templateDb.addGroupToTemplate(template.getUuid(), null, UserRole.ISSUE_ADMIN, template.getName(), null);
+ templateDb.addUserToTemplate(template.getUuid(), user.getUuid(), ProjectPermission.USER, template.getName(), user.getLogin());
+ templateDb.addGroupToTemplate(template.getUuid(), group.getUuid(), ProjectPermission.CODEVIEWER, template.getName(), group.getName());
+ templateDb.addGroupToTemplate(template.getUuid(), null, ProjectPermission.ISSUE_ADMIN, template.getName(), null);
// authenticated user
checkWouldUserHaveScanPermission(user.getUuid(), true);
diff --git a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/UserPermissionChangerIT.java b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/UserPermissionChangerIT.java
index ee06ae88bc3..87910895440 100644
--- a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/UserPermissionChangerIT.java
+++ b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/permission/UserPermissionChangerIT.java
@@ -19,24 +19,25 @@
*/
package org.sonar.server.common.permission;
+import java.util.Arrays;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
import org.sonar.db.user.UserIdDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl;
@@ -46,7 +47,6 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.server.common.permission.Operation.ADD;
import static org.sonar.server.common.permission.Operation.REMOVE;
-import static org.sonar.server.permission.PermissionServiceImpl.ALL_PROJECT_PERMISSIONS;
public class UserPermissionChangerIT {
@Rule
@@ -101,48 +101,48 @@ public class UserPermissionChangerIT {
@Test
public void apply_has_no_effect_when_adding_permission_USER_on_a_public_project() {
- UserPermissionChange change = new UserPermissionChange(ADD, UserRole.USER, publicProject, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(ADD, ProjectPermission.USER, publicProject, UserIdDto.from(user1), permissionService);
apply(change);
- assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).doesNotContain(UserRole.USER);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).map(ProjectPermission::fromKey).doesNotContain(ProjectPermission.USER);
}
@Test
public void apply_has_no_effect_when_adding_permission_CODEVIEWER_on_a_public_project() {
- UserPermissionChange change = new UserPermissionChange(ADD, UserRole.CODEVIEWER, publicProject, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(ADD, ProjectPermission.CODEVIEWER, publicProject, UserIdDto.from(user1), permissionService);
apply(change);
- assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).doesNotContain(UserRole.CODEVIEWER);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).map(ProjectPermission::fromKey).doesNotContain(ProjectPermission.CODEVIEWER);
}
@Test
public void apply_adds_permission_ADMIN_on_a_public_project() {
- applyAddsPermissionOnAPublicProject(UserRole.ADMIN);
+ applyAddsPermissionOnAPublicProject(ProjectPermission.ADMIN);
}
@Test
public void apply_adds_permission_ISSUE_ADMIN_on_a_public_project() {
- applyAddsPermissionOnAPublicProject(UserRole.ISSUE_ADMIN);
+ applyAddsPermissionOnAPublicProject(ProjectPermission.ISSUE_ADMIN);
}
@Test
public void apply_adds_permission_SCAN_EXECUTION_on_a_public_project() {
- applyAddsPermissionOnAPublicProject(GlobalPermission.SCAN.getKey());
+ applyAddsPermissionOnAPublicProject(ProjectPermission.SCAN);
}
- private void applyAddsPermissionOnAPublicProject(String permission) {
+ private void applyAddsPermissionOnAPublicProject(ProjectPermission permission) {
UserPermissionChange change = new UserPermissionChange(ADD, permission, publicProject, UserIdDto.from(user1), permissionService);
apply(change);
- assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).containsOnly(permission);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).map(ProjectPermission::fromKey).containsOnly(permission);
}
@Test
public void apply_fails_with_BadRequestException_when_removing_permission_USER_from_a_public_project() {
- UserPermissionChange change = new UserPermissionChange(REMOVE, UserRole.USER, publicProject, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(REMOVE, ProjectPermission.USER, publicProject, UserIdDto.from(user1), permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
@@ -151,7 +151,7 @@ public class UserPermissionChangerIT {
@Test
public void apply_fails_with_BadRequestException_when_removing_permission_CODEVIEWER_from_a_public_project() {
- UserPermissionChange change = new UserPermissionChange(REMOVE, UserRole.CODEVIEWER, publicProject, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(REMOVE, ProjectPermission.CODEVIEWER, publicProject, UserIdDto.from(user1), permissionService);
assertThatThrownBy(() -> apply(change))
.isInstanceOf(BadRequestException.class)
@@ -160,24 +160,24 @@ public class UserPermissionChangerIT {
@Test
public void apply_removes_permission_ADMIN_from_a_public_project() {
- applyRemovesPermissionFromPublicProject(UserRole.ADMIN);
+ applyRemovesPermissionFromPublicProject(ProjectPermission.ADMIN);
}
@Test
public void apply_removes_permission_ISSUE_ADMIN_from_a_public_project() {
- applyRemovesPermissionFromPublicProject(UserRole.ISSUE_ADMIN);
+ applyRemovesPermissionFromPublicProject(ProjectPermission.ISSUE_ADMIN);
}
@Test
public void apply_removes_permission_SCAN_EXECUTION_from_a_public_project() {
- applyRemovesPermissionFromPublicProject(GlobalPermission.SCAN.getKey());
+ applyRemovesPermissionFromPublicProject(ProjectPermission.SCAN);
}
- private void applyRemovesPermissionFromPublicProject(String permission) {
+ private void applyRemovesPermissionFromPublicProject(ProjectPermission permission) {
db.users().insertProjectPermissionOnUser(user1, permission, publicProject);
UserPermissionChange change = new UserPermissionChange(REMOVE, permission, publicProject, UserIdDto.from(user1), permissionService);
- apply(change, Set.of(permission));
+ apply(change, Set.of(permission.getKey()));
assertThat(db.users().selectEntityPermissionOfUser(user1, publicProject.getUuid())).isEmpty();
}
@@ -190,7 +190,7 @@ public class UserPermissionChangerIT {
apply(change);
- assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).contains(permission);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).contains(permission.getKey());
});
}
@@ -203,9 +203,9 @@ public class UserPermissionChangerIT {
.forEach(permission -> {
UserPermissionChange change = new UserPermissionChange(REMOVE, permission, privateProject, UserIdDto.from(user1), permissionService);
- apply(change, ALL_PROJECT_PERMISSIONS);
+ apply(change, Arrays.stream(ProjectPermission.values()).map(ProjectPermission::getKey).collect(toSet()));
- assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).doesNotContain(permission);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).doesNotContain(permission.getKey());
});
}
@@ -223,11 +223,11 @@ public class UserPermissionChangerIT {
@Test
public void add_project_permission_to_user() {
- UserPermissionChange change = new UserPermissionChange(ADD, UserRole.ISSUE_ADMIN, privateProject, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(ADD, ProjectPermission.ISSUE_ADMIN, privateProject, UserIdDto.from(user1), permissionService);
apply(change);
assertThat(db.users().selectPermissionsOfUser(user1)).isEmpty();
- assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).contains(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).contains(ProjectPermission.ISSUE_ADMIN.getKey());
assertThat(db.users().selectPermissionsOfUser(user2)).isEmpty();
assertThat(db.users().selectEntityPermissionOfUser(user2, privateProject.getUuid())).isEmpty();
}
@@ -255,7 +255,7 @@ public class UserPermissionChangerIT {
@Test
public void fail_to_add_project_permission() {
assertThatThrownBy(() -> {
- UserPermissionChange change = new UserPermissionChange(ADD, UserRole.ISSUE_ADMIN, null, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(ADD, ProjectPermission.ISSUE_ADMIN, null, UserIdDto.from(user1), permissionService);
apply(change);
})
.isInstanceOf(BadRequestException.class)
@@ -267,31 +267,31 @@ public class UserPermissionChangerIT {
db.users().insertGlobalPermissionOnUser(user1, GlobalPermission.ADMINISTER_QUALITY_GATES);
db.users().insertGlobalPermissionOnUser(user1, GlobalPermission.SCAN);
db.users().insertGlobalPermissionOnUser(user2, GlobalPermission.ADMINISTER_QUALITY_GATES);
- db.users().insertProjectPermissionOnUser(user1, UserRole.ISSUE_ADMIN, privateProject);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ISSUE_ADMIN, privateProject);
UserPermissionChange change = new UserPermissionChange(REMOVE, GlobalPermission.ADMINISTER_QUALITY_GATES.getKey(), null, UserIdDto.from(user1), permissionService);
- apply(change, Set.of(GlobalPermission.ADMINISTER_QUALITY_GATES.getKey(), GlobalPermission.SCAN.getKey(), UserRole.ISSUE_ADMIN));
+ apply(change, Set.of(GlobalPermission.ADMINISTER_QUALITY_GATES.getKey(), GlobalPermission.SCAN.getKey(), ProjectPermission.ISSUE_ADMIN.getKey()));
assertThat(db.users().selectPermissionsOfUser(user1)).containsOnly(GlobalPermission.SCAN);
assertThat(db.users().selectPermissionsOfUser(user2)).containsOnly(GlobalPermission.ADMINISTER_QUALITY_GATES);
- assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
public void remove_project_permission_from_user() {
EntityDto project2 = db.components().insertPrivateProject().getProjectDto();
db.users().insertGlobalPermissionOnUser(user1, GlobalPermission.ADMINISTER_QUALITY_GATES);
- db.users().insertProjectPermissionOnUser(user1, UserRole.ISSUE_ADMIN, privateProject);
- db.users().insertProjectPermissionOnUser(user1, UserRole.USER, privateProject);
- db.users().insertProjectPermissionOnUser(user2, UserRole.ISSUE_ADMIN, privateProject);
- db.users().insertProjectPermissionOnUser(user1, UserRole.ISSUE_ADMIN, project2);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ISSUE_ADMIN, privateProject);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.USER, privateProject);
+ db.users().insertProjectPermissionOnUser(user2, ProjectPermission.ISSUE_ADMIN, privateProject);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ISSUE_ADMIN, project2);
- UserPermissionChange change = new UserPermissionChange(REMOVE, UserRole.ISSUE_ADMIN, privateProject, UserIdDto.from(user1), permissionService);
- apply(change, Set.of(GlobalPermission.ADMINISTER_QUALITY_GATES.getKey(), UserRole.ISSUE_ADMIN, UserRole.USER));
+ UserPermissionChange change = new UserPermissionChange(REMOVE, ProjectPermission.ISSUE_ADMIN, privateProject, UserIdDto.from(user1), permissionService);
+ apply(change, Set.of(GlobalPermission.ADMINISTER_QUALITY_GATES.getKey(), ProjectPermission.ISSUE_ADMIN.getKey(), ProjectPermission.USER.getKey()));
- assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).containsOnly(UserRole.USER);
- assertThat(db.users().selectEntityPermissionOfUser(user2, privateProject.getUuid())).containsOnly(UserRole.ISSUE_ADMIN);
- assertThat(db.users().selectEntityPermissionOfUser(user1, project2.getUuid())).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).containsOnly(ProjectPermission.USER.getKey());
+ assertThat(db.users().selectEntityPermissionOfUser(user2, privateProject.getUuid())).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
+ assertThat(db.users().selectEntityPermissionOfUser(user1, project2.getUuid())).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
@@ -304,7 +304,7 @@ public class UserPermissionChangerIT {
@Test
public void do_not_fail_if_removing_a_project_permission_that_does_not_exist() {
- UserPermissionChange change = new UserPermissionChange(REMOVE, UserRole.ISSUE_ADMIN, privateProject, UserIdDto.from(user1), permissionService);
+ UserPermissionChange change = new UserPermissionChange(REMOVE, ProjectPermission.ISSUE_ADMIN, privateProject, UserIdDto.from(user1), permissionService);
apply(change);
assertThat(db.users().selectEntityPermissionOfUser(user1, privateProject.getUuid())).isEmpty();
diff --git a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/rule/RuleCreatorIT.java b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/rule/RuleCreatorIT.java
index de801eb4624..46bccd40d61 100644
--- a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/rule/RuleCreatorIT.java
+++ b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/rule/RuleCreatorIT.java
@@ -35,9 +35,9 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.utils.System2;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbSession;
@@ -71,6 +71,7 @@ import static org.sonar.api.issue.impact.SoftwareQuality.RELIABILITY;
import static org.sonar.api.issue.impact.SoftwareQuality.SECURITY;
import static org.sonar.api.server.rule.internal.ImpactMapper.convertToImpactSeverity;
import static org.sonar.api.server.rule.internal.ImpactMapper.convertToSoftwareQuality;
+import static org.sonar.core.rule.RuleTypeMapper.toApiRuleType;
import static org.sonar.db.rule.RuleTesting.newCustomRule;
import static org.sonar.db.rule.RuleTesting.newRule;
import static org.sonar.server.util.TypeValidationsTesting.newFullTypeValidations;
@@ -197,7 +198,7 @@ public class RuleCreatorIT {
assertThat(rule.getSeverityString()).isEqualTo(Severity.MAJOR);
assertThat(rule.getCleanCodeAttribute()).isEqualTo(CleanCodeAttribute.CLEAR);
assertThat(rule.getDefaultImpacts()).extracting(ImpactDto::getSoftwareQuality, ImpactDto::getSeverity).containsExactly(tuple(
- convertToSoftwareQuality(RuleType.valueOf(templateRule.getType())),
+ convertToSoftwareQuality(toApiRuleType(RuleType.fromDbConstant(templateRule.getType()))),
convertToImpactSeverity(requireNonNull(Severity.MAJOR))));
}
diff --git a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/user/service/UserServiceIT.java b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/user/service/UserServiceIT.java
index a997ae877ba..d187336783d 100644
--- a/server/sonar-webserver-common/src/it/java/org/sonar/server/common/user/service/UserServiceIT.java
+++ b/server/sonar-webserver-common/src/it/java/org/sonar/server/common/user/service/UserServiceIT.java
@@ -37,7 +37,7 @@ import org.junit.runner.RunWith;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.server.authentication.IdentityProvider;
import org.sonar.api.utils.DateUtils;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -577,8 +577,8 @@ public class UserServiceIT {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
db.users().insertGlobalPermissionOnUser(user, GlobalPermission.SCAN);
db.users().insertGlobalPermissionOnUser(user, GlobalPermission.ADMINISTER_QUALITY_PROFILES);
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project);
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
userService.deactivate(user.getUuid(), false);
@@ -592,8 +592,8 @@ public class UserServiceIT {
UserDto user = db.users().insertUser();
PermissionTemplateDto template = db.permissionTemplates().insertTemplate();
PermissionTemplateDto anotherTemplate = db.permissionTemplates().insertTemplate();
- db.permissionTemplates().addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.USER, template.getName(), user.getLogin());
- db.permissionTemplates().addUserToTemplate(anotherTemplate.getUuid(), user.getUuid(), UserRole.CODEVIEWER, anotherTemplate.getName(), user.getLogin());
+ db.permissionTemplates().addUserToTemplate(template.getUuid(), user.getUuid(), ProjectPermission.USER, template.getName(), user.getLogin());
+ db.permissionTemplates().addUserToTemplate(anotherTemplate.getUuid(), user.getUuid(), ProjectPermission.CODEVIEWER, anotherTemplate.getName(), user.getLogin());
userService.deactivate(user.getUuid(), false);
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreator.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreator.java
index 01784ce8d3b..406bf840f48 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreator.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreator.java
@@ -23,7 +23,7 @@ import java.util.Optional;
import java.util.Set;
import javax.annotation.CheckForNull;
import org.jetbrains.annotations.Nullable;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.auth.DevOpsPlatformSettings;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -126,7 +126,7 @@ public class DefaultDevOpsProjectCreator implements DevOpsProjectCreator {
private void addScanPermissionToCurrentUser(DbSession dbSession, ProjectDto projectDto) {
UserSession userSession = devOpsProjectCreationContext.userSession();
UserIdDto userId = new UserIdDto(requireNonNull(userSession.getUuid()), requireNonNull(userSession.getLogin()));
- UserPermissionChange scanPermission = new UserPermissionChange(Operation.ADD, UserRole.SCAN, projectDto, userId, permissionService);
+ UserPermissionChange scanPermission = new UserPermissionChange(Operation.ADD, ProjectPermission.SCAN.getKey(), projectDto, userId, permissionService);
permissionUpdater.apply(dbSession, Set.of(scanPermission));
}
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/github/GithubProjectCreator.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/github/GithubProjectCreator.java
index 79ca428c1fd..ab769024ac6 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/github/GithubProjectCreator.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/almsettings/github/GithubProjectCreator.java
@@ -22,7 +22,7 @@ package org.sonar.server.common.almsettings.github;
import java.util.Set;
import javax.annotation.CheckForNull;
import org.sonar.alm.client.github.GithubPermissionConverter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.auth.DevOpsPlatformSettings;
import org.sonar.auth.github.AppInstallationToken;
import org.sonar.auth.github.GsonRepositoryCollaborator;
@@ -121,9 +121,9 @@ public class GithubProjectCreator extends DefaultDevOpsProjectCreator {
}
private boolean hasScanPermission(Set<DevOpsPermissionsMappingDto> permissionsMappingDtos, String role, GsonRepositoryPermissions permissions) {
- Set<String> sonarqubePermissions = githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(permissionsMappingDtos,
+ Set<ProjectPermission> sonarqubePermissions = githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(permissionsMappingDtos,
role, permissions);
- return sonarqubePermissions.contains(UserRole.SCAN);
+ return sonarqubePermissions.contains(ProjectPermission.SCAN);
}
}
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/component/ComponentUpdater.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/component/ComponentUpdater.java
index 80d533da292..10c39b9a7a4 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/component/ComponentUpdater.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/component/ComponentUpdater.java
@@ -26,8 +26,6 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.db.component.ComponentScopes;
import org.sonar.api.utils.System2;
import org.sonar.core.i18n.I18n;
import org.sonar.core.util.UuidFactory;
@@ -36,6 +34,9 @@ import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.component.ComponentScopes;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.portfolio.PortfolioDto.SelectionMode;
import org.sonar.db.project.CreationMethod;
@@ -54,9 +55,9 @@ import org.sonar.server.project.DefaultBranchNameResolver;
import static com.google.common.base.Preconditions.checkState;
import static java.util.Collections.singletonList;
-import static org.sonar.api.web.UserRole.PUBLIC_PERMISSIONS;
import static org.sonar.core.component.ComponentKeys.ALLOWED_CHARACTERS_MESSAGE;
import static org.sonar.core.component.ComponentKeys.isValidProjectKey;
+import static org.sonar.db.permission.ProjectPermission.PUBLIC_PERMISSIONS;
import static org.sonar.server.exceptions.BadRequestException.checkRequest;
import static org.sonar.server.exceptions.BadRequestException.throwBadRequestException;
@@ -169,8 +170,8 @@ public class ComponentUpdater {
}
}
- private UserPermissionChange toUserPermissionChange(String permission, ProjectDto projectDto, UserDto userDto) {
- return new UserPermissionChange(Operation.ADD, permission, projectDto, userDto, permissionService);
+ private UserPermissionChange toUserPermissionChange(ProjectPermission permission, ProjectDto projectDto, UserDto userDto) {
+ return new UserPermissionChange(Operation.ADD, permission.getKey(), projectDto, userDto, permissionService);
}
private void addToFavourites(DbSession dbSession, ProjectDto projectDto, @Nullable String userUuid, @Nullable String userLogin) {
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChange.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChange.java
index 6737eabd198..d1112bd2d06 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChange.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChange.java
@@ -23,6 +23,8 @@ import java.util.Optional;
import java.util.StringJoiner;
import javax.annotation.Nullable;
import org.sonar.db.entity.EntityDto;
+import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.GroupDto;
import org.sonar.server.permission.GroupUuidOrAnyone;
import org.sonar.server.permission.PermissionService;
@@ -37,6 +39,16 @@ public class GroupPermissionChange extends PermissionChange {
this.groupDto = groupDto;
}
+ public GroupPermissionChange(Operation operation, ProjectPermission permission, EntityDto entityDto,
+ @Nullable GroupDto groupDto, PermissionService permissionService) {
+ this(operation, permission.getKey(), entityDto, groupDto, permissionService);
+ }
+
+ public GroupPermissionChange(Operation operation, GlobalPermission permission,
+ @Nullable GroupDto groupDto, PermissionService permissionService) {
+ this(operation, permission.getKey(), null, groupDto, permissionService);
+ }
+
public GroupUuidOrAnyone getGroupUuidOrAnyone() {
return GroupUuidOrAnyone.from(groupDto);
}
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChanger.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChanger.java
index da682f62ff1..f8ff1170c87 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChanger.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/GroupPermissionChanger.java
@@ -22,13 +22,13 @@ package org.sonar.server.common.permission;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.Nullable;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.permission.GroupUuidOrAnyone;
@@ -99,7 +99,7 @@ public class GroupPermissionChanger implements GranteeTypeSpecificPermissionUpda
private static boolean isAttemptToAddPublicPermissionToPublicComponent(GroupPermissionChange change, EntityDto project) {
return !project.isPrivate()
&& change.getOperation() == ADD
- && UserRole.PUBLIC_PERMISSIONS.contains(change.getPermission());
+ && ProjectPermission.isPublic(change.getPermission());
}
private static boolean isAttemptToRemovePermissionFromAnyoneOnPrivateComponent(GroupPermissionChange change, EntityDto project) {
@@ -129,7 +129,7 @@ public class GroupPermissionChanger implements GranteeTypeSpecificPermissionUpda
private static boolean isAttemptToRemovePublicPermissionFromPublicComponent(GroupPermissionChange change, EntityDto project) {
return !project.isPrivate()
&& change.getOperation() == REMOVE
- && UserRole.PUBLIC_PERMISSIONS.contains(change.getPermission());
+ && ProjectPermission.isPublic(change.getPermission());
}
private boolean addPermission(DbSession dbSession, GroupPermissionChange change) {
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionChange.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionChange.java
index b03aad134fa..ccd087bb019 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionChange.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionChange.java
@@ -46,7 +46,8 @@ public abstract class PermissionChange {
"Invalid global permission '%s'. Valid values are %s", permission,
permissionService.getGlobalPermissions().stream().map(GlobalPermission::getKey).toList());
} else {
- checkRequest(permissionService.getAllProjectPermissions().contains(permission), "Invalid project permission '%s'. Valid values are %s", permission,
+ checkRequest(permissionService.getAllProjectPermissions().stream().anyMatch(p -> p.getKey().equals(permission)),
+ "Invalid project permission '%s'. Valid values are %s", permission,
permissionService.getAllProjectPermissions());
}
}
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionTemplateService.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionTemplateService.java
index c250c6a8156..b59323739b5 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionTemplateService.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/PermissionTemplateService.java
@@ -30,13 +30,14 @@ import java.util.stream.Collectors;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
-import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.server.ServerSide;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.UserPermissionDto;
import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
@@ -53,7 +54,6 @@ import static com.google.common.base.Preconditions.checkArgument;
import static java.lang.String.format;
import static java.util.Collections.singletonList;
import static org.sonar.api.security.DefaultGroups.isAnyone;
-import static org.sonar.api.web.UserRole.PUBLIC_PERMISSIONS;
import static org.sonar.db.permission.GlobalPermission.SCAN;
@ServerSide
@@ -179,7 +179,7 @@ public class PermissionTemplateService {
}
private static boolean permissionValidForProject(boolean isPrivateEntity, String permission) {
- return isPrivateEntity || !PUBLIC_PERMISSIONS.contains(permission);
+ return isPrivateEntity || !ProjectPermission.isPublic(permission);
}
private static boolean groupNameValidForProject(boolean isPrivateEntity, String groupName) {
@@ -226,7 +226,7 @@ public class PermissionTemplateService {
private static void checkAtMostOneMatchForComponentKey(String componentKey, List<PermissionTemplateDto> matchingTemplates) {
if (matchingTemplates.size() > 1) {
StringBuilder templatesNames = new StringBuilder();
- for (Iterator<PermissionTemplateDto> it = matchingTemplates.iterator(); it.hasNext(); ) {
+ for (Iterator<PermissionTemplateDto> it = matchingTemplates.iterator(); it.hasNext();) {
templatesNames.append("\"").append(it.next().getName()).append("\"");
if (it.hasNext()) {
templatesNames.append(", ");
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChange.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChange.java
index d20aadc420e..6a4580affa7 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChange.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChange.java
@@ -23,6 +23,7 @@ import java.util.Optional;
import java.util.StringJoiner;
import javax.annotation.Nullable;
import org.sonar.db.entity.EntityDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.UserId;
import org.sonar.server.permission.PermissionService;
@@ -32,6 +33,11 @@ public class UserPermissionChange extends PermissionChange {
private final UserId userId;
+ public UserPermissionChange(Operation operation, ProjectPermission permission, @Nullable EntityDto entity, UserId userId,
+ PermissionService permissionService) {
+ this(operation, permission.getKey(), entity, userId, permissionService);
+ }
+
public UserPermissionChange(Operation operation, String permission, @Nullable EntityDto entity, UserId userId,
PermissionService permissionService) {
super(operation, permission, entity, permissionService);
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChanger.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChanger.java
index bc3bb2424fb..8a128906590 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChanger.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/permission/UserPermissionChanger.java
@@ -22,12 +22,12 @@ package org.sonar.server.common.permission;
import java.util.HashSet;
import java.util.Set;
import org.jetbrains.annotations.Nullable;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.UserPermissionDto;
import static org.sonar.server.common.permission.Operation.ADD;
@@ -91,7 +91,7 @@ public class UserPermissionChanger implements GranteeTypeSpecificPermissionUpdat
private static boolean isAttemptToAddPublicPermissionToPublicComponent(UserPermissionChange change, EntityDto project) {
return !project.isPrivate()
&& change.getOperation() == ADD
- && UserRole.PUBLIC_PERMISSIONS.contains(change.getPermission());
+ && ProjectPermission.isPublic(change.getPermission());
}
private static void ensureConsistencyWithVisibility(UserPermissionChange change) {
@@ -105,7 +105,7 @@ public class UserPermissionChanger implements GranteeTypeSpecificPermissionUpdat
private static boolean isAttemptToRemovePublicPermissionFromPublicComponent(UserPermissionChange change, EntityDto entity) {
return !entity.isPrivate()
&& change.getOperation() == REMOVE
- && UserRole.PUBLIC_PERMISSIONS.contains(change.getPermission());
+ && ProjectPermission.isPublic(change.getPermission());
}
private boolean addPermission(DbSession dbSession, Set<String> existingPermissions, UserPermissionChange change) {
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/RuleCreator.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/RuleCreator.java
index e5438e557bd..80e876ceb58 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/RuleCreator.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/RuleCreator.java
@@ -35,11 +35,11 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.api.server.rule.RuleParamType;
import org.sonar.api.server.rule.internal.ImpactMapper;
import org.sonar.api.utils.System2;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -59,6 +59,7 @@ import static com.google.common.collect.Lists.newArrayList;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
import static java.util.Optional.ofNullable;
+import static org.sonar.core.rule.RuleTypeMapper.toApiRuleType;
import static org.sonar.db.rule.RuleDescriptionSectionDto.createDefaultRuleDescriptionSection;
import static org.sonar.server.exceptions.BadRequestException.checkRequest;
@@ -246,7 +247,7 @@ public class RuleCreator {
ruleDto.setSeverity(ImpactMapper.convertToDeprecatedSeverity(impact.getValue()));
} else {
// Map old type and severity to impact
- SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(RuleType.valueOf(type));
+ SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(toApiRuleType(RuleType.fromDbConstant(type)));
org.sonar.api.issue.impact.Severity impactSeverity = ImpactMapper.convertToImpactSeverity(severity);
ruleDto.addDefaultImpact(new ImpactDto()
.setSoftwareQuality(softwareQuality)
diff --git a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/service/NewCustomRule.java b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/service/NewCustomRule.java
index 08933c46993..08157cc0786 100644
--- a/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/service/NewCustomRule.java
+++ b/server/sonar-webserver-common/src/main/java/org/sonar/server/common/rule/service/NewCustomRule.java
@@ -30,7 +30,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.server.common.rule.ReactivationException;
public class NewCustomRule {
diff --git a/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreatorTest.java b/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreatorTest.java
index 148732905ef..185a4b2b952 100644
--- a/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreatorTest.java
+++ b/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/DefaultDevOpsProjectCreatorTest.java
@@ -30,7 +30,7 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.auth.DevOpsPlatformSettings;
import org.sonar.db.DbClient;
import org.sonar.db.alm.setting.ALM;
@@ -289,7 +289,7 @@ class DefaultDevOpsProjectCreatorTest {
UserPermissionChange permissionChange = permissionChangesCaptor.getValue().iterator().next();
assertThat(permissionChange.getUserId().getUuid()).isEqualTo(userSession.getUuid());
assertThat(permissionChange.getUserId().getLogin()).isEqualTo(userSession.getLogin());
- assertThat(permissionChange.getPermission()).isEqualTo(UserRole.SCAN);
+ assertThat(permissionChange.getPermission()).isEqualTo(ProjectPermission.SCAN.getKey());
assertThat(permissionChange.getProjectUuid()).isEqualTo(actualComponentCreationData.projectDto().getUuid());
}
diff --git a/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/github/GithubProjectCreatorTest.java b/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/github/GithubProjectCreatorTest.java
index c9d166b02c4..50b1eb91979 100644
--- a/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/github/GithubProjectCreatorTest.java
+++ b/server/sonar-webserver-common/src/test/java/org/sonar/server/common/almsettings/github/GithubProjectCreatorTest.java
@@ -29,16 +29,16 @@ import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.sonar.alm.client.github.GithubPermissionConverter;
-import org.sonar.api.web.UserRole;
import org.sonar.auth.github.AppInstallationToken;
import org.sonar.auth.github.GitHubSettings;
+import org.sonar.auth.github.GithubApplicationClient;
import org.sonar.auth.github.GsonRepositoryCollaborator;
import org.sonar.auth.github.GsonRepositoryPermissions;
import org.sonar.auth.github.GsonRepositoryTeam;
-import org.sonar.auth.github.GithubApplicationClient;
import org.sonar.db.DbClient;
import org.sonar.db.alm.setting.ALM;
import org.sonar.db.alm.setting.AlmSettingDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.provisioning.DevOpsPermissionsMappingDto;
import org.sonar.db.user.GroupDto;
import org.sonar.server.common.almintegration.ProjectKeyGenerator;
@@ -125,7 +125,8 @@ class GithubProjectCreatorTest {
when(gitHubSettings.getDevOpsPlatform()).thenReturn(GITHUB.getKey());
ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, componentUpdater);
- githubProjectCreator = new GithubProjectCreator(dbClient, devOpsProjectCreationContext, projectKeyGenerator, gitHubSettings, projectCreator, permissionService, permissionUpdater,
+ githubProjectCreator = new GithubProjectCreator(dbClient, devOpsProjectCreationContext, projectKeyGenerator, gitHubSettings, projectCreator, permissionService,
+ permissionUpdater,
managedProjectService, githubApplicationClient, githubPermissionConverter, authAppInstallationToken);
}
@@ -146,7 +147,7 @@ class GithubProjectCreatorTest {
@Test
void isScanAllowedUsingPermissionsFromDevopsPlatform_whenCollaboratorHasDirectAccessButNoScanPermissions_returnsFalse() {
- GsonRepositoryCollaborator collaborator1 = mockCollaborator("collaborator1", 1, "role1", "read", "admin");
+ GsonRepositoryCollaborator collaborator1 = mockCollaborator("collaborator1", 1, "role1", ProjectPermission.USER, ProjectPermission.ADMIN);
mockGithubCollaboratorsFromApi(collaborator1);
bindSessionToCollaborator(collaborator1);
@@ -155,8 +156,8 @@ class GithubProjectCreatorTest {
@Test
void isScanAllowedUsingPermissionsFromDevopsPlatform_whenCollaboratorHasDirectAccess_returnsTrue() {
- GsonRepositoryCollaborator collaborator1 = mockCollaborator("collaborator1", 1, "role1", "read", "admin");
- GsonRepositoryCollaborator collaborator2 = mockCollaborator("collaborator2", 2, "role2", "read", "scan");
+ GsonRepositoryCollaborator collaborator1 = mockCollaborator("collaborator1", 1, "role1", ProjectPermission.USER, ProjectPermission.ADMIN);
+ GsonRepositoryCollaborator collaborator2 = mockCollaborator("collaborator2", 2, "role2", ProjectPermission.USER, ProjectPermission.SCAN);
mockGithubCollaboratorsFromApi(collaborator1, collaborator2);
bindSessionToCollaborator(collaborator2);
@@ -165,7 +166,7 @@ class GithubProjectCreatorTest {
@Test
void isScanAllowedUsingPermissionsFromDevopsPlatform_whenAccessViaTeamButNoScanPermissions_returnsFalse() {
- GsonRepositoryTeam team2 = mockGithubTeam("team2", 2, "role2", "another_perm", UserRole.ADMIN);
+ GsonRepositoryTeam team2 = mockGithubTeam("team2", 2, "role2", ProjectPermission.ISSUE_ADMIN, ProjectPermission.ADMIN);
mockTeamsFromApi(team2);
bindGroupsToUser(team2.name());
@@ -174,8 +175,8 @@ class GithubProjectCreatorTest {
@Test
void isScanAllowedUsingPermissionsFromDevopsPlatform_whenAccessViaTeam_returnsTrue() {
- GsonRepositoryTeam team1 = mockGithubTeam("team1", 1, "role1", "read", "another_perm");
- GsonRepositoryTeam team2 = mockGithubTeam("team2", 2, "role2", "another_perm", UserRole.SCAN);
+ GsonRepositoryTeam team1 = mockGithubTeam("team1", 1, "role1", ProjectPermission.USER, ProjectPermission.ISSUE_ADMIN);
+ GsonRepositoryTeam team2 = mockGithubTeam("team2", 2, "role2", ProjectPermission.ISSUE_ADMIN, ProjectPermission.SCAN);
mockTeamsFromApi(team1, team2);
bindGroupsToUser(team1.name(), team2.name());
@@ -184,8 +185,8 @@ class GithubProjectCreatorTest {
@Test
void isScanAllowedUsingPermissionsFromDevopsPlatform_whenAccessViaTeamButUserNotInTeam_returnsFalse() {
- GsonRepositoryTeam team1 = mockGithubTeam("team1", 1, "role1", "read", "another_perm");
- GsonRepositoryTeam team2 = mockGithubTeam("team2", 2, "role2", "another_perm", UserRole.SCAN);
+ GsonRepositoryTeam team1 = mockGithubTeam("team1", 1, "role1", ProjectPermission.USER, ProjectPermission.ISSUE_ADMIN);
+ GsonRepositoryTeam team2 = mockGithubTeam("team2", 2, "role2", ProjectPermission.ISSUE_ADMIN, ProjectPermission.SCAN);
mockTeamsFromApi(team1, team2);
bindGroupsToUser(team1.name());
@@ -197,7 +198,7 @@ class GithubProjectCreatorTest {
when(userSession.getExternalIdentity()).thenReturn(Optional.of(externalIdentity));
}
- private GsonRepositoryCollaborator mockCollaborator(String collaboratorLogin, int id, String role1, String... sqPermissions) {
+ private GsonRepositoryCollaborator mockCollaborator(String collaboratorLogin, int id, String role1, ProjectPermission... sqPermissions) {
GsonRepositoryCollaborator collaborator = new GsonRepositoryCollaborator(collaboratorLogin, id, role1,
new GsonRepositoryPermissions(false, false, false, false, false));
mockPermissionsConversion(collaborator, sqPermissions);
@@ -210,7 +211,7 @@ class GithubProjectCreatorTest {
collaborators);
}
- private GsonRepositoryTeam mockGithubTeam(String name, int id, String role, String... sqPermissions) {
+ private GsonRepositoryTeam mockGithubTeam(String name, int id, String role, ProjectPermission... sqPermissions) {
GsonRepositoryTeam gsonRepositoryTeam = new GsonRepositoryTeam(name, id, name + "slug", role, new GsonRepositoryPermissions(false, false, false, false, false));
mockPermissionsConversion(gsonRepositoryTeam, sqPermissions);
return gsonRepositoryTeam;
@@ -221,13 +222,13 @@ class GithubProjectCreatorTest {
.thenReturn(Arrays.stream(repositoryTeams).collect(toSet()));
}
- private void mockPermissionsConversion(GsonRepositoryCollaborator collaborator, String... sqPermissions) {
+ private void mockPermissionsConversion(GsonRepositoryCollaborator collaborator, ProjectPermission... sqPermissions) {
Set<DevOpsPermissionsMappingDto> devOpsPermissionsMappingDtos = mockPermissionsMappingsDtos();
lenient().when(githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(devOpsPermissionsMappingDtos, collaborator.roleName(), collaborator.permissions()))
.thenReturn(Arrays.stream(sqPermissions).collect(toSet()));
}
- private void mockPermissionsConversion(GsonRepositoryTeam team, String... sqPermissions) {
+ private void mockPermissionsConversion(GsonRepositoryTeam team, ProjectPermission... sqPermissions) {
Set<DevOpsPermissionsMappingDto> devOpsPermissionsMappingDtos = mockPermissionsMappingsDtos();
lenient().when(githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(devOpsPermissionsMappingDtos, team.permission(), team.permissions()))
.thenReturn(Arrays.stream(sqPermissions).collect(toSet()));
diff --git a/server/sonar-webserver-common/src/test/java/org/sonar/server/common/permission/UserPermissionChangeTest.java b/server/sonar-webserver-common/src/test/java/org/sonar/server/common/permission/UserPermissionChangeTest.java
index 6149b521e40..6a224c47082 100644
--- a/server/sonar-webserver-common/src/test/java/org/sonar/server/common/permission/UserPermissionChangeTest.java
+++ b/server/sonar-webserver-common/src/test/java/org/sonar/server/common/permission/UserPermissionChangeTest.java
@@ -22,6 +22,7 @@ package org.sonar.server.common.permission;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.sonar.db.entity.EntityDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.UserIdDto;
import org.sonar.server.permission.PermissionService;
@@ -34,13 +35,13 @@ class UserPermissionChangeTest {
@Test
void toString_shouldReturnStringRepresentation() {
PermissionService permissionService = mock();
- when(permissionService.getAllProjectPermissions()).thenReturn(List.of("permission1", "permission2"));
+ when(permissionService.getAllProjectPermissions()).thenReturn(List.of(ProjectPermission.ADMIN, ProjectPermission.SCAN));
EntityDto entityDto = mock();
when(entityDto.getName()).thenReturn("entityName");
- UserPermissionChange userPermissionChange = new UserPermissionChange(Operation.ADD, "permission2", entityDto, new UserIdDto("uuid1", "login1"), permissionService);
+ UserPermissionChange userPermissionChange = new UserPermissionChange(Operation.ADD, "scan", entityDto, new UserIdDto("uuid1", "login1"), permissionService);
- assertThat(userPermissionChange).hasToString("UserPermissionChange[userId=login='login1', operation=ADD, permission='permission2', entity=entityName]");
+ assertThat(userPermissionChange).hasToString("UserPermissionChange[userId=login='login1', operation=ADD, permission='scan', entity=entityName]");
}
}
diff --git a/server/sonar-webserver-core/src/it/java/org/sonar/server/rule/registration/RulesRegistrantIT.java b/server/sonar-webserver-core/src/it/java/org/sonar/server/rule/registration/RulesRegistrantIT.java
index 69336850d61..b0e0d335555 100644
--- a/server/sonar-webserver-core/src/it/java/org/sonar/server/rule/registration/RulesRegistrantIT.java
+++ b/server/sonar-webserver-core/src/it/java/org/sonar/server/rule/registration/RulesRegistrantIT.java
@@ -43,7 +43,7 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleScope;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.rule.Context;
import org.sonar.api.server.rule.RuleDescriptionSection;
@@ -1235,7 +1235,7 @@ class RulesRegistrantIT {
repo.createRule("rule1")
.setName("any")
.setHtmlDescription("html")
- .setType(RuleType.VULNERABILITY)
+ .setType(org.sonar.api.rules.RuleType.VULNERABILITY)
.addDefaultImpact(SoftwareQuality.SECURITY, Severity.HIGH)
.setSeverity(SeverityUtil.getSeverityFromOrdinal(2));
repo.done();
@@ -1257,7 +1257,7 @@ class RulesRegistrantIT {
repo.createRule("rule1")
.setName("any")
.setHtmlDescription("html")
- .setType(RuleType.VULNERABILITY)
+ .setType(org.sonar.api.rules.RuleType.VULNERABILITY)
.addDefaultImpact(SoftwareQuality.SECURITY, Severity.LOW)
.setSeverity(SeverityUtil.getSeverityFromOrdinal(2));
repo.done();
@@ -1341,7 +1341,7 @@ class RulesRegistrantIT {
.setSeverity(BLOCKER)
.setInternalKey("config1")
.setTags("tag1", "tag2", "tag3")
- .setType(RuleType.CODE_SMELL)
+ .setType(org.sonar.api.rules.RuleType.CODE_SMELL)
.setStatus(RuleStatus.BETA);
}
@@ -1352,7 +1352,7 @@ class RulesRegistrantIT {
.setName(ruleKey)
.setHtmlDescription("Description of One")
.setSeverity(BLOCKER)
- .setType(RuleType.CODE_SMELL)
+ .setType(org.sonar.api.rules.RuleType.CODE_SMELL)
.setStatus(RuleStatus.BETA);
Arrays.stream(consumers).forEach(c -> c.accept(newRule));
@@ -1389,7 +1389,7 @@ class RulesRegistrantIT {
.setInternalKey("config1")
.setTags("tag1", "tag2", "tag3")
.setScope(RuleScope.ALL)
- .setType(RuleType.CODE_SMELL)
+ .setType(org.sonar.api.rules.RuleType.CODE_SMELL)
.setStatus(RuleStatus.BETA)
.setGapDescription("java.S115.effortToFix")
.addEducationPrincipleKeys("concept1", "concept2", "concept3")
@@ -1402,7 +1402,7 @@ class RulesRegistrantIT {
repo.createRule(HOTSPOT_RULE_KEY.rule())
.setName("Hotspot")
.setHtmlDescription("Minimal hotspot")
- .setType(RuleType.SECURITY_HOTSPOT)
+ .setType(org.sonar.api.rules.RuleType.SECURITY_HOTSPOT)
.addOwaspTop10(Y2021, OwaspTop10.A1, OwaspTop10.A3)
.addCwe(1, 123, 863);
@@ -1430,7 +1430,7 @@ class RulesRegistrantIT {
.setInternalKey("config1 v2")
// tag2 and tag3 removed, tag4 added
.setTags("tag1", "tag4")
- .setType(RuleType.BUG)
+ .setType(org.sonar.api.rules.RuleType.BUG)
.setStatus(READY)
.setGapDescription("java.S115.effortToFix.v2")
.addEducationPrincipleKeys("concept1", "concept4");
@@ -1471,14 +1471,14 @@ class RulesRegistrantIT {
.setInternalKey("config1")
.setTags("tag1", "tag2", "tag3")
.setScope(RuleScope.ALL)
- .setType(RuleType.CODE_SMELL)
+ .setType(org.sonar.api.rules.RuleType.CODE_SMELL)
.setStatus(RuleStatus.BETA)
.addEducationPrincipleKeys("concept1", "concept2", "concept3");
repo.createRule(EXTERNAL_HOTSPOT_RULE_KEY.rule())
.setName("Hotspot")
.setHtmlDescription("Minimal hotspot")
- .setType(RuleType.SECURITY_HOTSPOT)
+ .setType(org.sonar.api.rules.RuleType.SECURITY_HOTSPOT)
.addOwaspTop10(Y2021, OwaspTop10.A1, OwaspTop10.A3)
.addCwe(1, 123, 863);
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java
index bf0b395a1e9..16668ca9921 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/platform/DatabaseServerCompatibility.java
@@ -22,12 +22,15 @@ package org.sonar.server.platform;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.sonar.api.SonarEdition;
+import org.sonar.api.SonarRuntime;
import org.sonar.api.Startable;
import org.sonar.api.utils.MessageException;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.server.platform.db.migration.version.DatabaseVersion;
import static org.sonar.server.log.ServerProcessLogging.STARTUP_LOGGER_NAME;
+import static org.sonar.server.platform.db.migration.version.DatabaseVersion.MIN_UPGRADE_VERSION_COMMUNITY_BUILD_READABLE;
import static org.sonar.server.platform.db.migration.version.DatabaseVersion.MIN_UPGRADE_VERSION_HUMAN_READABLE;
public class DatabaseServerCompatibility implements Startable {
@@ -38,9 +41,12 @@ public class DatabaseServerCompatibility implements Startable {
private final DocumentationLinkGenerator documentationLinkGenerator;
- public DatabaseServerCompatibility(DatabaseVersion version, DocumentationLinkGenerator documentationLinkGenerator) {
+ private final SonarRuntime sonarRuntime;
+
+ public DatabaseServerCompatibility(DatabaseVersion version, DocumentationLinkGenerator documentationLinkGenerator, SonarRuntime sonarRuntime) {
this.version = version;
this.documentationLinkGenerator = documentationLinkGenerator;
+ this.sonarRuntime = sonarRuntime;
}
@Override
@@ -53,8 +59,7 @@ public class DatabaseServerCompatibility implements Startable {
if (status == DatabaseVersion.Status.REQUIRES_UPGRADE) {
Optional<Long> currentVersion = this.version.getVersion();
if (currentVersion.isPresent() && currentVersion.get() < DatabaseVersion.MIN_UPGRADE_VERSION) {
- throw MessageException.of("The version of SonarQube you are trying to upgrade from is too old. Please upgrade to the " +
- MIN_UPGRADE_VERSION_HUMAN_READABLE + " Long-Term Active version first.");
+ throw MessageException.of(buildVersionTooOldMessage());
}
String documentationLink = documentationLinkGenerator.getDocumentationLink("/server-upgrade-and-maintenance/upgrade/upgrade-the-server/roadmap");
String msg = String.format("The database must be manually upgraded. Please backup the database and browse /setup. "
@@ -67,6 +72,17 @@ public class DatabaseServerCompatibility implements Startable {
}
}
+ private String buildVersionTooOldMessage() {
+ if (sonarRuntime.getEdition() == SonarEdition.COMMUNITY) {
+ return "The version of SonarQube you are trying to upgrade from is too old. Please upgrade to the " +
+ MIN_UPGRADE_VERSION_COMMUNITY_BUILD_READABLE + " version first.";
+ } else {
+ return "The version of SonarQube you are trying to upgrade from is too old. Please upgrade to the " +
+ MIN_UPGRADE_VERSION_HUMAN_READABLE + " Long-Term Active version first.";
+ }
+
+ }
+
@Override
public void stop() {
// do nothing
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyHotspotRuleDescriptionSectionsGenerator.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyHotspotRuleDescriptionSectionsGenerator.java
index ed568eb7cc4..514486c609b 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyHotspotRuleDescriptionSectionsGenerator.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyHotspotRuleDescriptionSectionsGenerator.java
@@ -26,12 +26,13 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.CheckForNull;
import org.sonar.api.server.rule.RulesDefinition;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import org.sonar.markdown.Markdown;
import static java.util.Collections.emptySet;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.ASSESS_THE_PROBLEM_SECTION_KEY;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.HOW_TO_FIX_SECTION_KEY;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.ROOT_CAUSE_SECTION_KEY;
@@ -46,7 +47,7 @@ public class LegacyHotspotRuleDescriptionSectionsGenerator implements RuleDescri
@Override
public boolean isGeneratorForRule(RulesDefinition.Rule rule) {
- return SECURITY_HOTSPOT.equals(rule.type()) && rule.ruleDescriptionSections().isEmpty();
+ return SECURITY_HOTSPOT.equals(RuleTypeMapper.toRuleType(rule.type())) && rule.ruleDescriptionSections().isEmpty();
}
@Override
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyIssueRuleDescriptionSectionsGenerator.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyIssueRuleDescriptionSectionsGenerator.java
index 51bda468d96..e1e59b1e8c5 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyIssueRuleDescriptionSectionsGenerator.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/LegacyIssueRuleDescriptionSectionsGenerator.java
@@ -21,17 +21,18 @@ package org.sonar.server.rule;
import java.util.EnumSet;
import java.util.Set;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.db.rule.RuleDescriptionSectionDto.createDefaultRuleDescriptionSection;
public class LegacyIssueRuleDescriptionSectionsGenerator implements RuleDescriptionSectionsGenerator {
@@ -45,7 +46,7 @@ public class LegacyIssueRuleDescriptionSectionsGenerator implements RuleDescript
@Override
public boolean isGeneratorForRule(RulesDefinition.Rule rule) {
- return ISSUE_RULE_TYPES.contains(rule.type()) && rule.ruleDescriptionSections().isEmpty();
+ return ISSUE_RULE_TYPES.contains(RuleTypeMapper.toRuleType(rule.type())) && rule.ruleDescriptionSections().isEmpty();
}
@Override
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/ActiveRulesImpactInitializer.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/ActiveRulesImpactInitializer.java
index 715b85ec480..d30353afcc3 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/ActiveRulesImpactInitializer.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/ActiveRulesImpactInitializer.java
@@ -25,7 +25,7 @@ import java.util.List;
import java.util.Map;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/NewRuleCreator.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/NewRuleCreator.java
index 4fa1db8f4ca..dcc51d2fd55 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/NewRuleCreator.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/NewRuleCreator.java
@@ -22,10 +22,11 @@ package org.sonar.server.rule.registration;
import java.util.stream.Collectors;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.System2;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.issue.ImpactDto;
import org.sonar.db.rule.RuleDto;
@@ -74,7 +75,7 @@ public class NewRuleCreator {
.setUpdatedAt(now)
.setEducationPrinciples(ruleDef.educationPrincipleKeys());
- if (!RuleType.SECURITY_HOTSPOT.equals(ruleDef.type())) {
+ if (RuleType.SECURITY_HOTSPOT != RuleTypeMapper.toRuleType(ruleDef.type())) {
CleanCodeAttribute cleanCodeAttribute = ruleDef.cleanCodeAttribute();
ruleDto.setCleanCodeAttribute(cleanCodeAttribute != null ? cleanCodeAttribute : CleanCodeAttribute.defaultCleanCodeAttribute());
ruleDto.replaceAllDefaultImpacts(ruleDef.defaultImpacts().entrySet()
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/StartupRuleUpdater.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/StartupRuleUpdater.java
index 726b3820c9b..dcea2bd9f9b 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/StartupRuleUpdater.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/rule/registration/StartupRuleUpdater.java
@@ -33,7 +33,7 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.System2;
diff --git a/server/sonar-webserver-core/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java b/server/sonar-webserver-core/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java
index c12e44129b1..45ed2df7d90 100644
--- a/server/sonar-webserver-core/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java
+++ b/server/sonar-webserver-core/src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java
@@ -27,10 +27,10 @@ import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.api.utils.log.Profiler;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.GroupDto;
import org.sonar.server.usergroups.DefaultGroupFinder;
@@ -96,7 +96,7 @@ public class RegisterPermissionTemplates implements Startable {
private void insertPermissionForAdministrators(DbSession dbSession, PermissionTemplateDto template) {
Optional<GroupDto> admins = dbClient.groupDao().selectByName(dbSession, DefaultGroups.ADMINISTRATORS);
if (admins.isPresent()) {
- insertGroupPermission(dbSession, template, UserRole.ADMIN, admins.get());
+ insertGroupPermission(dbSession, template, ProjectPermission.ADMIN, admins.get());
} else {
LOG.error("Cannot setup default permission for group: " + DefaultGroups.ADMINISTRATORS);
}
@@ -104,14 +104,14 @@ public class RegisterPermissionTemplates implements Startable {
private void insertPermissionsForDefaultGroup(DbSession dbSession, PermissionTemplateDto template) {
GroupDto defaultGroup = defaultGroupFinder.findDefaultGroup(dbSession);
- insertGroupPermission(dbSession, template, UserRole.USER, defaultGroup);
- insertGroupPermission(dbSession, template, UserRole.CODEVIEWER, defaultGroup);
- insertGroupPermission(dbSession, template, UserRole.ISSUE_ADMIN, defaultGroup);
- insertGroupPermission(dbSession, template, UserRole.SECURITYHOTSPOT_ADMIN, defaultGroup);
+ insertGroupPermission(dbSession, template, ProjectPermission.USER, defaultGroup);
+ insertGroupPermission(dbSession, template, ProjectPermission.CODEVIEWER, defaultGroup);
+ insertGroupPermission(dbSession, template, ProjectPermission.ISSUE_ADMIN, defaultGroup);
+ insertGroupPermission(dbSession, template, ProjectPermission.SECURITYHOTSPOT_ADMIN, defaultGroup);
}
- private void insertGroupPermission(DbSession dbSession, PermissionTemplateDto template, String permission, GroupDto group) {
- dbClient.permissionTemplateDao().insertGroupPermission(dbSession, template.getUuid(), group.getUuid(), permission, template.getName(), group.getName());
+ private void insertGroupPermission(DbSession dbSession, PermissionTemplateDto template, ProjectPermission permission, GroupDto group) {
+ dbClient.permissionTemplateDao().insertGroupPermission(dbSession, template.getUuid(), group.getUuid(), permission.getKey(), template.getName(), group.getName());
}
}
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java
index a4d0ea02611..e2b2319e161 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/platform/DatabaseServerCompatibilityTest.java
@@ -23,6 +23,8 @@ import java.util.Optional;
import org.junit.Rule;
import org.junit.Test;
import org.slf4j.event.Level;
+import org.sonar.api.SonarEdition;
+import org.sonar.api.SonarRuntime;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.MessageException;
import org.sonar.core.documentation.DocumentationLinkGenerator;
@@ -41,7 +43,8 @@ public class DatabaseServerCompatibilityTest {
private final DatabaseVersion version = mock(DatabaseVersion.class);
private final DocumentationLinkGenerator documentationLinkGenerator = mock(DocumentationLinkGenerator.class);
- private final DatabaseServerCompatibility compatibility = new DatabaseServerCompatibility(version, documentationLinkGenerator);
+ private final SonarRuntime sonarRuntime = mock();
+ private final DatabaseServerCompatibility compatibility = new DatabaseServerCompatibility(version, documentationLinkGenerator, sonarRuntime);
@Test
public void fail_if_requires_downgrade() {
@@ -61,7 +64,19 @@ public class DatabaseServerCompatibilityTest {
assertThatThrownBy(compatibility::start)
.isInstanceOf(MessageException.class)
- .hasMessage("The version of SonarQube you are trying to upgrade from is too old. Please upgrade to the 9.9 Long-Term Active version first.");
+ .hasMessage("The version of SonarQube you are trying to upgrade from is too old. Please upgrade to the 2025.1 Long-Term Active version first.");
+ verifyNoInteractions(documentationLinkGenerator);
+ }
+
+ @Test
+ public void fail_if_requires_firstly_to_upgrade_to_24_12() {
+ when(version.getStatus()).thenReturn(DatabaseVersion.Status.REQUIRES_UPGRADE);
+ when(version.getVersion()).thenReturn(Optional.of(12L));
+ when(sonarRuntime.getEdition()).thenReturn(SonarEdition.COMMUNITY);
+
+ assertThatThrownBy(compatibility::start)
+ .isInstanceOf(MessageException.class)
+ .hasMessage("The version of SonarQube you are trying to upgrade from is too old. Please upgrade to the 24.12 version first.");
verifyNoInteractions(documentationLinkGenerator);
}
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionGeneratorTestData.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionGeneratorTestData.java
index f2f7f0d788b..db319d595f5 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionGeneratorTestData.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionGeneratorTestData.java
@@ -25,7 +25,7 @@ import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
import javax.annotation.Nullable;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RuleDescriptionSection;
import org.sonar.db.rule.RuleDescriptionSectionDto;
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionSectionsGeneratorsTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionSectionsGeneratorsTest.java
index 1a52d4c7c3b..467054ad6e7 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionSectionsGeneratorsTest.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RuleDescriptionSectionsGeneratorsTest.java
@@ -30,6 +30,7 @@ import org.junit.runners.Parameterized;
import org.sonar.api.server.rule.RuleDescriptionSection;
import org.sonar.api.server.rule.RuleDescriptionSectionBuilder;
import org.sonar.api.server.rule.RulesDefinition;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import org.sonar.server.rule.RuleDescriptionGeneratorTestData.RuleDescriptionSectionGeneratorIdentifier;
@@ -37,10 +38,10 @@ import org.sonar.server.rule.RuleDescriptionGeneratorTestData.RuleDescriptionSec
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.ROOT_CAUSE_SECTION_KEY;
import static org.sonar.server.rule.RuleDescriptionGeneratorTestData.RuleDescriptionSectionGeneratorIdentifier.ADVANCED_RULE;
import static org.sonar.server.rule.RuleDescriptionGeneratorTestData.RuleDescriptionSectionGeneratorIdentifier.LEGACY_HOTSPOT;
@@ -125,7 +126,7 @@ public class RuleDescriptionSectionsGeneratorsTest {
when(rule.htmlDescription()).thenReturn(testData.getHtmlDescription());
when(rule.markdownDescription()).thenReturn(testData.getMarkdownDescription());
when(rule.ruleDescriptionSections()).thenReturn(testData.getRuleDescriptionSections());
- when(rule.type()).thenReturn(testData.getRuleType());
+ when(rule.type()).thenReturn(RuleTypeMapper.toApiRuleType(testData.getRuleType()));
}
@Test
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/NewRuleCreatorTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/NewRuleCreatorTest.java
index 6d1c42f64cb..22e6733fe28 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/NewRuleCreatorTest.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/NewRuleCreatorTest.java
@@ -27,9 +27,10 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleScope;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.System2;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.issue.ImpactDto;
import org.sonar.db.rule.RuleDto;
@@ -98,7 +99,7 @@ public class NewRuleCreatorTest {
when(ruleDef.key()).thenReturn("key");
when(repository.key()).thenReturn("repoKey");
- when(ruleDef.type()).thenReturn(ruleType);
+ when(ruleDef.type()).thenReturn(RuleTypeMapper.toApiRuleType(ruleType));
when(ruleDef.scope()).thenReturn(RuleScope.TEST);
when(ruleDef.cleanCodeAttribute()).thenReturn(attribute);
when(ruleDef.severity()).thenReturn(MAJOR);
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/StartupRuleUpdaterTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/StartupRuleUpdaterTest.java
index df3d0345df6..c47fbddc3e4 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/StartupRuleUpdaterTest.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/rule/registration/StartupRuleUpdaterTest.java
@@ -26,7 +26,6 @@ import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleScope;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactory;
@@ -112,7 +111,7 @@ public class StartupRuleUpdaterTest {
RulesDefinition.Rule ruleDef = mock();
when(ruleDef.scope()).thenReturn(RuleScope.TEST);
when(ruleDef.repository()).thenReturn(mock());
- when(ruleDef.type()).thenReturn(RuleType.BUG);
+ when(ruleDef.type()).thenReturn(org.sonar.api.rules.RuleType.BUG);
return ruleDef;
}
diff --git a/server/sonar-webserver-core/src/test/java/org/sonar/server/startup/RegisterPermissionTemplatesTest.java b/server/sonar-webserver-core/src/test/java/org/sonar/server/startup/RegisterPermissionTemplatesTest.java
index dd0c63742a9..30f76e659aa 100644
--- a/server/sonar-webserver-core/src/test/java/org/sonar/server/startup/RegisterPermissionTemplatesTest.java
+++ b/server/sonar-webserver-core/src/test/java/org/sonar/server/startup/RegisterPermissionTemplatesTest.java
@@ -28,7 +28,7 @@ import org.slf4j.event.Level;
import org.sonar.api.security.DefaultGroups;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbTester;
import org.sonar.db.permission.template.PermissionTemplateDto;
@@ -61,11 +61,11 @@ public class RegisterPermissionTemplatesTest {
List<PermissionTemplateGroupDto> groupPermissions = selectGroupPermissions(defaultTemplate);
assertThat(groupPermissions).hasSize(5);
- expectGroupPermission(groupPermissions, UserRole.ADMIN, DefaultGroups.ADMINISTRATORS);
- expectGroupPermission(groupPermissions, UserRole.CODEVIEWER, defaultGroup.getName());
- expectGroupPermission(groupPermissions, UserRole.USER, defaultGroup.getName());
- expectGroupPermission(groupPermissions, UserRole.ISSUE_ADMIN, defaultGroup.getName());
- expectGroupPermission(groupPermissions, UserRole.SECURITYHOTSPOT_ADMIN, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.ADMIN, DefaultGroups.ADMINISTRATORS);
+ expectGroupPermission(groupPermissions, ProjectPermission.CODEVIEWER, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.USER, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.ISSUE_ADMIN, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.SECURITYHOTSPOT_ADMIN, defaultGroup.getName());
verifyDefaultTemplateForProject(defaultTemplate.getUuid());
@@ -83,10 +83,10 @@ public class RegisterPermissionTemplatesTest {
List<PermissionTemplateGroupDto> groupPermissions = selectGroupPermissions(defaultTemplate);
assertThat(groupPermissions).hasSize(4);
- expectGroupPermission(groupPermissions, UserRole.CODEVIEWER, defaultGroup.getName());
- expectGroupPermission(groupPermissions, UserRole.USER, defaultGroup.getName());
- expectGroupPermission(groupPermissions, UserRole.ISSUE_ADMIN, defaultGroup.getName());
- expectGroupPermission(groupPermissions, UserRole.SECURITYHOTSPOT_ADMIN, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.CODEVIEWER, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.USER, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.ISSUE_ADMIN, defaultGroup.getName());
+ expectGroupPermission(groupPermissions, ProjectPermission.SECURITYHOTSPOT_ADMIN, defaultGroup.getName());
verifyDefaultTemplateForProject(defaultTemplate.getUuid());
@@ -113,10 +113,10 @@ public class RegisterPermissionTemplatesTest {
return db.getDbClient().permissionTemplateDao().selectGroupPermissionsByTemplateUuid(db.getSession(), template.getUuid());
}
- private void expectGroupPermission(List<PermissionTemplateGroupDto> groupPermissions, String expectedPermission,
+ private void expectGroupPermission(List<PermissionTemplateGroupDto> groupPermissions, ProjectPermission expectedPermission,
String expectedGroupName) {
assertThat(
- groupPermissions.stream().anyMatch(gp -> gp.getPermission().equals(expectedPermission) && Objects.equals(gp.getGroupName(), expectedGroupName)))
+ groupPermissions.stream().anyMatch(gp -> gp.getPermission().equals(expectedPermission.getKey()) && Objects.equals(gp.getGroupName(), expectedGroupName)))
.isTrue();
}
diff --git a/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueIndex.java b/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueIndex.java
index b77dd42e33a..72b3bd272f0 100644
--- a/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueIndex.java
+++ b/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueIndex.java
@@ -77,7 +77,7 @@ import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttributeCategory;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition;
import org.sonar.api.server.rule.RulesDefinition.OwaspTop10Version;
import org.sonar.api.server.rule.RulesDefinition.PciDssVersion;
@@ -120,8 +120,8 @@ import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
import static org.elasticsearch.search.aggregations.AggregationBuilders.filters;
import static org.elasticsearch.search.aggregations.AggregationBuilders.reverseNested;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_DEFAULT_VALUE;
import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
import static org.sonar.server.es.EsUtils.escapeSpecialRegexChars;
diff --git a/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java b/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java
index 6d321828c82..e105cd9d175 100644
--- a/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java
+++ b/server/sonar-webserver-es/src/main/java/org/sonar/server/issue/index/IssueQueryFactory.java
@@ -47,7 +47,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -75,8 +75,8 @@ import static org.sonar.api.measures.CoreMetrics.ANALYSIS_FROM_SONARQUBE_9_4_KEY
import static org.sonar.api.utils.DateUtils.longToDate;
import static org.sonar.api.utils.DateUtils.parseEndingDateOrDateTime;
import static org.sonar.api.utils.DateUtils.parseStartingDateOrDateTime;
-import static org.sonar.api.web.UserRole.SCAN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.newcodeperiod.NewCodePeriodType.REFERENCE_BRANCH;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.PARAM_COMPONENTS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.PARAM_COMPONENT_UUIDS;
diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFacetsTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFacetsTest.java
index 270c52e46c5..9d8340da24c 100644
--- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFacetsTest.java
+++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFacetsTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition.OwaspAsvsVersion;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.rule.RuleDto;
diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java
index 36d08eafff8..23daad4fed0 100644
--- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java
+++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexFiltersTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.params.provider.ValueSource;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.server.es.SearchOptions;
diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityCategoriesTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityCategoriesTest.java
index 6f39428e060..2cbd1a87fad 100644
--- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityCategoriesTest.java
+++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityCategoriesTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.sonar.api.issue.Issue;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.component.ComponentDto;
import static java.util.Arrays.asList;
diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityHotspotsTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityHotspotsTest.java
index d1f57ab2e8c..a7de06f6410 100644
--- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityHotspotsTest.java
+++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityHotspotsTest.java
@@ -33,10 +33,10 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import static org.sonar.api.rule.Severity.INFO;
import static org.sonar.api.rule.Severity.MAJOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.server.issue.IssueDocTesting.newDoc;
diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityReportsTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityReportsTest.java
index af9a89b1b86..0eee21734c2 100644
--- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityReportsTest.java
+++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueIndexSecurityReportsTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.sonar.api.issue.Issue;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RulesDefinition.StigVersion;
import org.sonar.db.component.ComponentDto;
import org.sonar.server.view.index.ViewDoc;
diff --git a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java
index c4f37ed0913..eb5c05b4ab6 100644
--- a/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java
+++ b/server/sonar-webserver-es/src/test/java/org/sonar/server/issue/index/IssueQueryFactoryTest.java
@@ -55,7 +55,7 @@ import static org.sonar.api.measures.CoreMetrics.ANALYSIS_FROM_SONARQUBE_9_4_KEY
import static org.sonar.db.component.ComponentQualifiers.APP;
import static org.sonar.api.utils.DateUtils.addDays;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.ComponentTesting.newDirectory;
import static org.sonar.db.component.ComponentTesting.newFileDto;
diff --git a/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientPermissionsValidator.java b/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientPermissionsValidator.java
index 2a4565e5a2a..4163b1392f1 100644
--- a/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientPermissionsValidator.java
+++ b/server/sonar-webserver-pushapi/src/main/java/org/sonar/server/pushapi/sonarlint/SonarLintClientPermissionsValidator.java
@@ -22,7 +22,7 @@ package org.sonar.server.pushapi.sonarlint;
import java.util.List;
import java.util.Set;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -70,7 +70,7 @@ public class SonarLintClientPermissionsValidator {
private static void validateProjectPermissions(UserSession userSession, List<ProjectDto> projectDtos) {
validateUsersDeactivationStatus(userSession);
for (ProjectDto projectDto : projectDtos) {
- userSession.checkEntityPermission(UserRole.USER, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.USER, projectDto);
}
}
diff --git a/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/issues/IssueChangeEventServiceImplTest.java b/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/issues/IssueChangeEventServiceImplTest.java
index 3c4de18aae2..af0bc77997d 100644
--- a/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/issues/IssueChangeEventServiceImplTest.java
+++ b/server/sonar-webserver-pushapi/src/test/java/org/sonar/server/pushapi/issues/IssueChangeEventServiceImplTest.java
@@ -32,7 +32,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.FieldDiffs;
import org.sonar.core.util.issue.Issue;
@@ -57,7 +57,7 @@ import static org.sonar.api.issue.DefaultTransitions.REOPEN;
import static org.sonar.api.issue.DefaultTransitions.RESOLVE;
import static org.sonar.api.issue.DefaultTransitions.UNCONFIRM;
import static org.sonar.api.issue.DefaultTransitions.WONT_FIX;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonarqube.ws.Common.Severity.BLOCKER;
import static org.sonarqube.ws.Common.Severity.CRITICAL;
diff --git a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java
index 9fbc090eba9..3ea79cb5467 100644
--- a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java
+++ b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsController.java
@@ -35,7 +35,7 @@ import org.sonar.server.v2.api.projectbindings.request.ProjectBindingsSearchRest
import org.sonar.server.v2.api.projectbindings.response.ProjectBindingsSearchRestResponse;
import org.sonar.server.v2.api.response.PageRestResponse;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
public class DefaultProjectBindingsController implements ProjectBindingsController {
diff --git a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGenerator.java b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGenerator.java
index a7a4236c246..5dc164eee8f 100644
--- a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGenerator.java
+++ b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGenerator.java
@@ -29,7 +29,7 @@ import org.jetbrains.annotations.Nullable;
import org.sonar.api.resources.Language;
import org.sonar.api.resources.Languages;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
import org.sonar.api.utils.DateUtils;
@@ -79,7 +79,7 @@ public class RuleRestResponseGenerator {
.setRepositoryKey(ruleDto.getRepositoryKey())
.setName(ruleDto.getName())
.setSeverity(ruleDto.getSeverityString())
- .setType(RuleTypeRestEnum.from(RuleType.valueOf(ruleDto.getType())))
+ .setType(RuleTypeRestEnum.from(RuleType.fromDbConstant(ruleDto.getType())))
.setImpacts(toImpactRestResponse(ruleDto.getDefaultImpacts()))
.setCleanCodeAttribute(CleanCodeAttributeRestEnum.from(ruleDto.getCleanCodeAttribute()))
.setCleanCodeAttributeCategory(ofNullable(ruleDto.getCleanCodeAttribute())
@@ -110,7 +110,7 @@ public class RuleRestResponseGenerator {
.map(this::toDescriptionSectionResponse)
.ifPresent(section -> builder.setDescriptionSections(List.of(section)));
ofNullable(ruleDto.getAdHocSeverity()).ifPresent(builder::setSeverity);
- ofNullable(ruleDto.getAdHocType()).ifPresent(type -> builder.setType(RuleTypeRestEnum.from(RuleType.valueOf(type))));
+ ofNullable(ruleDto.getAdHocType()).ifPresent(type -> builder.setType(RuleTypeRestEnum.from(RuleType.fromDbConstant(type))));
}
return builder.build();
}
diff --git a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/enums/RuleTypeRestEnum.java b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/enums/RuleTypeRestEnum.java
index aa57cb8080b..f369edb9392 100644
--- a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/enums/RuleTypeRestEnum.java
+++ b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/enums/RuleTypeRestEnum.java
@@ -20,7 +20,7 @@
package org.sonar.server.v2.api.rule.enums;
import java.util.Arrays;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
public enum RuleTypeRestEnum {
CODE_SMELL(RuleType.CODE_SMELL),
diff --git a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/request/RuleCreateRestRequest.java b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/request/RuleCreateRestRequest.java
index 375a14d7ad9..f9358794f59 100644
--- a/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/request/RuleCreateRestRequest.java
+++ b/server/sonar-webserver-webapi-v2/src/main/java/org/sonar/server/v2/api/rule/request/RuleCreateRestRequest.java
@@ -25,7 +25,7 @@ import javax.annotation.Nullable;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.server.v2.api.rule.enums.CleanCodeAttributeRestEnum;
import org.sonar.server.v2.api.rule.enums.RuleStatusRestEnum;
import org.sonar.server.v2.api.rule.resource.Impact;
diff --git a/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsControllerTest.java b/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsControllerTest.java
index 80e007b1ad9..65ef60637d1 100644
--- a/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsControllerTest.java
+++ b/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/projectbindings/controller/DefaultProjectBindingsControllerTest.java
@@ -39,7 +39,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.server.v2.WebApiEndpoints.PROJECT_BINDINGS_ENDPOINT;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
diff --git a/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/controller/DefaultRuleControllerTest.java b/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/controller/DefaultRuleControllerTest.java
index 7ca361be6c4..8ccc2b3e4f3 100644
--- a/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/controller/DefaultRuleControllerTest.java
+++ b/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/controller/DefaultRuleControllerTest.java
@@ -28,7 +28,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.rule.RuleDescriptionSectionDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.rule.RuleTesting;
@@ -57,7 +57,7 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.api.rule.Severity.BLOCKER;
-import static org.sonar.api.rules.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.BUG;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonar.server.v2.WebApiEndpoints.RULES_ENDPOINT;
import static org.sonar.server.v2.api.rule.enums.CleanCodeAttributeRestEnum.MODULAR;
diff --git a/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGeneratorTest.java b/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGeneratorTest.java
index e68974fe135..760514cb7e8 100644
--- a/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGeneratorTest.java
+++ b/server/sonar-webserver-webapi-v2/src/test/java/org/sonar/server/v2/api/rule/converter/RuleRestResponseGeneratorTest.java
@@ -31,7 +31,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
import org.sonar.api.utils.DateUtils;
@@ -83,7 +83,7 @@ public class RuleRestResponseGeneratorTest {
.extracting(RuleDescriptionSectionRestResponse::key, RuleDescriptionSectionRestResponse::content, RuleDescriptionSectionRestResponse::context)
.containsExactly(dto.getRuleDescriptionSectionDtos().stream().map(s -> tuple(s.getKey(), "interpreted" + "html" + s.getContent(), s.getContext())).toArray(Tuple[]::new));
assertThat(ruleRestResponse.severity()).isEqualTo(dto.getSeverityString());
- assertThat(ruleRestResponse.type().name()).isEqualTo(RuleType.valueOf(dto.getType()).name());
+ assertThat(ruleRestResponse.type().name()).isEqualTo(RuleType.fromDbConstant(dto.getType()).name());
assertThat(ruleRestResponse.impacts()).extracting(r -> r.severity().name(), r -> r.softwareQuality().name())
.containsExactly(dto.getDefaultImpacts().stream().map(e -> tuple(e.getSeverity().name(), e.getSoftwareQuality().name())).toArray(Tuple[]::new));
assertThat(ruleRestResponse.cleanCodeAttribute().name()).isEqualTo(dto.getCleanCodeAttribute().name());
@@ -146,7 +146,7 @@ public class RuleRestResponseGeneratorTest {
.extracting(RuleDescriptionSectionRestResponse::key, RuleDescriptionSectionRestResponse::content, RuleDescriptionSectionRestResponse::context)
.containsExactly(tuple("default", "interpreted" + dto.getAdHocDescription(), null));
assertThat(ruleRestResponse.severity()).isEqualTo(dto.getAdHocSeverity());
- assertThat(ruleRestResponse.type().name()).isEqualTo(RuleType.valueOf(dto.getAdHocType()).name());
+ assertThat(ruleRestResponse.type().name()).isEqualTo(RuleType.fromDbConstant(dto.getAdHocType()).name());
}
@Test
@@ -165,7 +165,7 @@ public class RuleRestResponseGeneratorTest {
.extracting(RuleDescriptionSectionRestResponse::key, RuleDescriptionSectionRestResponse::content, RuleDescriptionSectionRestResponse::context)
.containsExactly(tuple("default", "interpreted" + dto.getAdHocDescription(), null));
assertThat(ruleRestResponse.severity()).isEqualTo(dto.getAdHocSeverity());
- assertThat(ruleRestResponse.type().name()).isEqualTo(RuleType.valueOf(dto.getAdHocType()).name());
+ assertThat(ruleRestResponse.type().name()).isEqualTo(RuleType.fromDbConstant(dto.getAdHocType()).name());
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almintegration/ws/github/ImportGithubProjectActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almintegration/ws/github/ImportGithubProjectActionIT.java
index c4175f49ee5..77c69d2fad5 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almintegration/ws/github/ImportGithubProjectActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almintegration/ws/github/ImportGithubProjectActionIT.java
@@ -27,14 +27,13 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.sonar.alm.client.github.GithubApplicationClientImpl;
import org.sonar.alm.client.github.GithubPermissionConverter;
-import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
import org.sonar.auth.github.ExpiringAppInstallationToken;
import org.sonar.auth.github.GitHubSettings;
+import org.sonar.auth.github.GithubApplicationClient;
import org.sonar.auth.github.GsonRepositoryCollaborator;
import org.sonar.auth.github.GsonRepositoryPermissions;
-import org.sonar.auth.github.GithubApplicationClient;
import org.sonar.core.i18n.I18n;
import org.sonar.core.platform.EditionProvider;
import org.sonar.core.platform.PlatformEditionProvider;
@@ -43,10 +42,11 @@ import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.alm.setting.AlmSettingDto;
import org.sonar.db.component.BranchDto;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.newcodeperiod.NewCodePeriodDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.CreationMethod;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
@@ -63,6 +63,7 @@ import org.sonar.server.common.permission.UserPermissionChange;
import org.sonar.server.common.permission.UserPermissionChanger;
import org.sonar.server.common.project.ImportProjectService;
import org.sonar.server.common.project.ProjectCreator;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.es.EsTester;
import org.sonar.server.es.IndexersImpl;
import org.sonar.server.es.TestIndexers;
@@ -365,7 +366,7 @@ public class ImportGithubProjectActionIT {
String role = gsonRepositoryCollaborator.roleName();
GsonRepositoryPermissions permissions = gsonRepositoryCollaborator.permissions();
- when(githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(Set.of(), role, permissions)).thenReturn(Set.of("scan"));
+ when(githubPermissionConverter.toSonarqubeRolesWithFallbackOnRepositoryPermissions(Set.of(), role, permissions)).thenReturn(Set.of(ProjectPermission.SCAN));
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/GetBindingActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/GetBindingActionIT.java
index 42bcb7cbb53..e38ad58e71d 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/GetBindingActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/GetBindingActionIT.java
@@ -39,7 +39,7 @@ import org.sonarqube.ws.AlmSettings.GetBindingWsResponse;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.groups.Tuple.tuple;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.test.JsonAssert.assertJson;
public class GetBindingActionIT {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/ListActionIT.java
index e5c8e380b8b..85500f5bb67 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/almsettings/ws/ListActionIT.java
@@ -41,9 +41,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.groups.Tuple.tuple;
import static org.mockito.Mockito.mock;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.SCAN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.test.JsonAssert.assertJson;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/MeasureActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/MeasureActionIT.java
index 83ff4275910..e78bfaa9981 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/MeasureActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/MeasureActionIT.java
@@ -71,7 +71,7 @@ import static org.sonar.api.measures.Metric.ValueType.LEVEL;
import static org.sonar.api.measures.Metric.ValueType.PERCENT;
import static org.sonar.api.measures.Metric.ValueType.RATING;
import static org.sonar.api.measures.Metric.ValueType.WORK_DUR;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.server.badge.ws.SvgGenerator.Color.DEFAULT;
import static org.sonar.server.badge.ws.SvgGenerator.Color.QUALITY_GATE_ERROR;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/QualityGateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/QualityGateActionIT.java
index 629fca17853..1faa2f829f7 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/QualityGateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/QualityGateActionIT.java
@@ -59,7 +59,7 @@ import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
import static org.sonar.api.measures.Metric.Level.ERROR;
import static org.sonar.api.measures.Metric.Level.OK;
import static org.sonar.api.measures.Metric.ValueType.LEVEL;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.BRANCH;
@RunWith(DataProviderRunner.class)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenActionIT.java
index 7c876cfe071..8ada0a56fb6 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenActionIT.java
@@ -23,7 +23,7 @@ import org.assertj.core.api.Assertions;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mockito;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.project.ProjectDto;
@@ -74,7 +74,7 @@ public class TokenActionIT {
@Test
public void should_generate_token() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
when(tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN)).thenReturn("generated_token");
TestResponse response = ws.newRequest().setParam("project", project.getKey()).execute();
@@ -85,7 +85,7 @@ public class TokenActionIT {
@Test
public void handle_whenApplicationKeyPassed_shouldReturnToken() {
ProjectDto application = db.components().insertPrivateApplication().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.USER, application);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, application);
when(tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN)).thenReturn("generated_token");
TestResponse response = ws.newRequest().setParam("project", application.getKey()).execute();
@@ -96,7 +96,7 @@ public class TokenActionIT {
@Test
public void should_reuse_generated_token() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
when(tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN)).thenReturn("generated_token");
// first call, generating the token
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenRenewActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenRenewActionIT.java
index e6feafee464..ba9f2bbacb5 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenRenewActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/badge/ws/TokenRenewActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.ProjectData;
import org.sonar.db.project.ProjectBadgeTokenDto;
@@ -86,7 +86,7 @@ public class TokenRenewActionIT {
@Test
public void should_add_token_when_no_token_yet_and_return_204() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
when(tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN)).thenReturn("generated_token");
TestResponse response = ws.newRequest().setParam("project", project.getKey()).execute();
@@ -100,7 +100,7 @@ public class TokenRenewActionIT {
@Test
public void handle_whenApplicationKeyPassed_shouldAddTokenAndReturn204() {
ProjectDto application = db.components().insertPrivateApplication().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, application);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, application);
when(tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN)).thenReturn("generated_token");
TestResponse response = ws.newRequest().setParam("project", application.getKey()).execute();
@@ -114,7 +114,7 @@ public class TokenRenewActionIT {
@Test
public void should_replace_existing_token_when__token_already_present_and_update_update_at() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
when(tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN)).thenReturn("generated_token");
ws.newRequest().setParam("project", project.getKey()).execute(); //inserting first token with updated at 1000
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/batch/ProjectDataLoaderIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/batch/ProjectDataLoaderIT.java
index c61955d17b5..5a5a9071ad6 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/batch/ProjectDataLoaderIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/batch/ProjectDataLoaderIT.java
@@ -21,20 +21,20 @@ package org.sonar.server.batch;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.db.component.ComponentScopes;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.component.ComponentScopes;
import org.sonar.db.component.ProjectData;
-import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.source.FileSourceDto;
import org.sonar.scanner.protocol.input.FileData;
import org.sonar.scanner.protocol.input.ProjectRepositories;
import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.tester.UserSessionRule;
@@ -44,7 +44,7 @@ import static java.lang.String.format;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.db.component.ComponentTesting.newFileDto;
-import static org.sonar.db.permission.GlobalPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
public class ProjectDataLoaderIT {
@Rule
@@ -61,8 +61,8 @@ public class ProjectDataLoaderIT {
public void throws_NotFoundException_when_branch_does_not_exist() {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
- userSession.logIn().addProjectPermission(SCAN.getKey(), project)
- .registerBranches(projectData.getMainBranchDto());
+ userSession.logIn().addProjectPermission(SCAN, project)
+ .registerBranches(projectData.getMainBranchDto());
assertThatThrownBy(() -> {
underTest.load(ProjectDataQuery.create()
@@ -77,7 +77,7 @@ public class ProjectDataLoaderIT {
public void return_file_data_from_single_project() {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
- userSession.logIn().addProjectPermission(SCAN.getKey(), project)
+ userSession.logIn().addProjectPermission(SCAN, project)
.registerBranches(projectData.getMainBranchDto());
ComponentDto file = db.components().insertComponent(newFileDto(projectData.getMainBranchComponent()));
dbClient.fileSourceDao().insert(dbSession, newFileSourceDto(file).setSrcHash("123456"));
@@ -95,7 +95,7 @@ public class ProjectDataLoaderIT {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
ComponentDto branch = db.components().insertProjectBranch(mainBranch, b -> b.setKey("my_branch"));
- userSession.logIn().addProjectPermission(SCAN.getKey(), projectData.getProjectDto())
+ userSession.logIn().addProjectPermission(SCAN, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto())
.addProjectBranchMapping(projectData.projectUuid(), branch);
// File on branch
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/DeleteActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/DeleteActionIT.java
index 39788c99944..3cfd49472a5 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/DeleteActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/DeleteActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
@@ -65,7 +65,7 @@ public class DeleteActionIT {
public void delete_branch() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
db.components().insertProjectBranch(project, b -> b.setKey("branch1"));
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
tester.newRequest()
.setParam("project", project.getKey())
@@ -104,7 +104,7 @@ public class DeleteActionIT {
@Test
public void fail_if_branch_does_not_exist() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
assertThatThrownBy(() -> tester.newRequest()
.setParam("project", project.getKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/ListActionIT.java
index adf8465480d..df13fe1aa44 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/ListActionIT.java
@@ -22,7 +22,6 @@ package org.sonar.server.branch.ws;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
@@ -30,11 +29,12 @@ import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ProjectData;
-import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.metric.MetricDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.issue.index.AsyncIssueIndexing;
@@ -54,15 +54,15 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock;
import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
-import static org.sonar.db.component.ComponentQualifiers.PROJECT;
-import static org.sonar.api.rules.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.BUG;
import static org.sonar.api.utils.DateUtils.dateToLong;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.BranchType.BRANCH;
+import static org.sonar.db.component.ComponentQualifiers.PROJECT;
import static org.sonar.db.component.SnapshotTesting.newAnalysis;
-import static org.sonar.db.permission.GlobalPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.test.JsonAssert.assertJson;
public class ListActionIT {
@@ -158,7 +158,7 @@ public class ListActionIT {
db.issues().insert(rule, branch, db.components().getComponentDto(branch), i -> i.setType(BUG).setResolution(null));
indexIssues();
- userSession.logIn().addProjectPermission(SCAN.getKey(), project);
+ userSession.logIn().addProjectPermission(SCAN, project);
String json = ws.newRequest()
.setParam("project", project.getKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/RenameActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/RenameActionIT.java
index 1445a715f62..5d083ef3e8a 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/RenameActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/RenameActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Test;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
@@ -107,7 +107,7 @@ public class RenameActionIT {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
BranchDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch"));
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
tester.newRequest()
.setParam("project", project.getKey())
@@ -127,7 +127,7 @@ public class RenameActionIT {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
db.newCodePeriods().insert(getBranchReferenceNewCodePeriod(project));
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
tester.newRequest()
.setParam("project", project.getKey())
@@ -155,7 +155,7 @@ public class RenameActionIT {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
BranchDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch"));
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
tester.newRequest()
.setParam("project", project.getKey())
@@ -179,7 +179,7 @@ public class RenameActionIT {
public void fail_if_name_already_used() {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
db.components().insertProjectBranch(project, b -> b.setKey("branch"));
assertThatThrownBy(() -> tester.newRequest()
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionIT.java
index 7406042df04..46cde7696af 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Test;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.server.component.ComponentTypesRule;
@@ -121,7 +121,7 @@ public class SetAutomaticDeletionProtectionActionIT {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
BranchDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch1").setExcludeFromPurge(false));
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
assertThatThrownBy(() -> tester.newRequest()
.setParam("project", project.getKey())
@@ -137,7 +137,7 @@ public class SetAutomaticDeletionProtectionActionIT {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
BranchDto branch = db.components().insertProjectBranch(project, b -> b.setKey("branch1").setExcludeFromPurge(false));
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
tester.newRequest()
.setParam("project", project.getKey())
@@ -186,7 +186,7 @@ public class SetAutomaticDeletionProtectionActionIT {
public void fail_if_branch_does_not_exist() {
userSession.logIn();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
assertThatThrownBy(() -> tester.newRequest()
.setParam("project", project.getKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetMainBranchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetMainBranchActionIT.java
index 0670746fc4b..83c7c2e849e 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetMainBranchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/branch/ws/SetMainBranchActionIT.java
@@ -28,7 +28,7 @@ import org.slf4j.event.Level;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentTesting;
@@ -140,7 +140,7 @@ public class SetMainBranchActionIT {
public void fail_whenKeyPassedIsApplicationKey_shouldThrowIllegalArgumentException() {
userSession.logIn();
ProjectData application = db.components().insertPublicApplication();
- userSession.addProjectPermission(UserRole.ADMIN, application.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.ADMIN, application.getProjectDto());
TestRequest request = tester.newRequest()
.setParam(PARAM_PROJECT, application.projectKey())
@@ -156,7 +156,7 @@ public class SetMainBranchActionIT {
userSession.logIn();
ProjectData projectData = db.components().insertPublicProject();
- userSession.addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
String nonExistingBranch = "aNonExistingBranch";
TestRequest request = tester.newRequest()
@@ -172,7 +172,7 @@ public class SetMainBranchActionIT {
public void fail_whenProjectHasNoMainBranch_shouldThrowIllegalStateException() {
userSession.logIn();
ProjectDto project = insertProjectWithoutMainBranch();
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest request = tester.newRequest()
.setParam(PARAM_PROJECT, project.getKey())
@@ -195,7 +195,7 @@ public class SetMainBranchActionIT {
userSession.logIn();
ProjectData projectData = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
TestRequest request = tester.newRequest()
.setParam(PARAM_PROJECT, projectData.projectKey())
@@ -213,7 +213,7 @@ public class SetMainBranchActionIT {
ProjectData projectData = db.components().insertPrivateProject();
BranchDto newMainBranch = db.components().insertProjectBranch(projectData.getProjectDto(), branchDto -> branchDto.setKey("newMain"));
- userSession.addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
tester.newRequest()
.setParam(PARAM_PROJECT, projectData.projectKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/BranchReportSubmitterIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/BranchReportSubmitterIT.java
index dee0b9a0026..d1df85bb22e 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/BranchReportSubmitterIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/BranchReportSubmitterIT.java
@@ -44,6 +44,8 @@ import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ProjectData;
+import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.CreationMethod;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
@@ -82,6 +84,7 @@ import static org.sonar.db.component.ComponentTesting.newBranchDto;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.db.permission.GlobalPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
/**
* Tests of {@link ReportSubmitter} when branch support is installed.
@@ -126,7 +129,7 @@ public class BranchReportSubmitterIT {
ProjectData projectData = db.components().insertPublicProject();
ProjectDto project = projectData.getProjectDto();
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(SCAN.getKey(), project)
+ userSession.logIn(user).addProjectPermission(ProjectPermission.SCAN, project)
.registerBranches(projectData.getMainBranchDto());
mockSuccessfulPrepareSubmitCall();
InputStream reportInput = IOUtils.toInputStream("{binary}", StandardCharsets.UTF_8);
@@ -142,7 +145,7 @@ public class BranchReportSubmitterIT {
ComponentDto mainBranch = projectData.getMainBranchComponent();
ComponentDto branch = db.components().insertProjectBranch(mainBranch, b -> b.setKey("branch1"));
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(SCAN.getKey(), projectData.getProjectDto())
+ userSession.logIn(user).addProjectPermission(ProjectPermission.SCAN, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto())
.addProjectBranchMapping(projectData.projectUuid(), branch);
BranchSupport.ComponentKey componentKey = createComponentKeyOfBranch(mainBranch.getKey(), "branch1");
@@ -170,7 +173,7 @@ public class BranchReportSubmitterIT {
ComponentDto mainBranch = projectData.getMainBranchComponent();
BranchDto exitingProjectMainBranch = db.getDbClient().branchDao().selectByUuid(db.getSession(), mainBranch.uuid()).get();
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(SCAN.getKey(), projectData.getProjectDto())
+ userSession.logIn(user).addProjectPermission(ProjectPermission.SCAN, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto());
ComponentDto createdBranch = createButDoNotInsertBranch(mainBranch, projectData.projectUuid());
userSession.addProjectBranchMapping(projectData.projectUuid(), createdBranch);
@@ -198,7 +201,7 @@ public class BranchReportSubmitterIT {
UserDto user = db.users().insertUser();
userSession.logIn(user)
.addPermission(PROVISION_PROJECTS)
- .addPermission(SCAN);
+ .addPermission(GlobalPermission.SCAN);
ComponentDto createdBranch = createButDoNotInsertBranch(nonExistingBranch, PROJECT_UUID);
BranchSupport.ComponentKey componentKey = createComponentKeyOfBranch(nonExistingBranch.getKey());
@@ -235,7 +238,7 @@ public class BranchReportSubmitterIT {
ProjectData projectData = db.components().insertPublicProject();
ComponentDto project = projectData.getMainBranchComponent();
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(SCAN.getKey(), projectData.getProjectDto());
+ userSession.logIn(user).addProjectPermission(ProjectPermission.SCAN, projectData.getProjectDto());
InputStream reportInput = IOUtils.toInputStream("{binary}", StandardCharsets.UTF_8);
RuntimeException expected = new RuntimeException("Faking an exception thrown by branchSupportDelegate");
when(branchSupportDelegate.createComponentKey(any(), any())).thenThrow(expected);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java
index fe97c19f2c5..e4be15ba26a 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java
@@ -45,6 +45,7 @@ import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.CreationMethod;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
@@ -95,7 +96,6 @@ import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.ComponentTesting.newDirectory;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
-import static org.sonar.db.permission.GlobalPermission.SCAN;
public class ReportSubmitterIT {
@@ -127,7 +127,8 @@ public class ReportSubmitterIT {
new FavoriteUpdater(db.getDbClient()), projectIndexers, new SequenceUuidFactory(), defaultBranchNameResolver, mock(PermissionUpdater.class), permissionService);
private final ManagedProjectService managedProjectService = mock();
private final ManagedInstanceService managedInstanceService = mock();
- private final GithubDevOpsProjectCreationContextService githubDevOpsProjectService = new GithubDevOpsProjectCreationContextService(db.getDbClient(), userSession, githubApplicationClient);
+ private final GithubDevOpsProjectCreationContextService githubDevOpsProjectService = new GithubDevOpsProjectCreationContextService(db.getDbClient(), userSession,
+ githubApplicationClient);
private final ProjectCreator projectCreator = new ProjectCreator(userSession, projectDefaultVisibility, componentUpdater);
private final GithubProjectCreatorFactory githubProjectCreatorFactory = new GithubProjectCreatorFactory(db.getDbClient(), githubGlobalSettingsValidator,
githubApplicationClient, projectKeyGenerator, projectCreator, gitHubSettings, null, permissionUpdater, permissionService,
@@ -137,7 +138,6 @@ public class ReportSubmitterIT {
private final DevOpsProjectCreatorFactory devOpsProjectCreatorFactorySpy = spy(devOpsProjectCreatorFactory);
-
private final ReportSubmitter underTest = new ReportSubmitter(queue, userSession, projectCreator, componentUpdater, permissionTemplateService, db.getDbClient(),
ossEditionBranchSupport, devOpsProjectCreatorFactorySpy, managedInstanceService);
@@ -182,7 +182,7 @@ public class ReportSubmitterIT {
public void submit_a_report_on_existing_project() {
ProjectData project = db.components().insertPrivateProject();
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(SCAN.getKey(), project.getProjectDto())
+ userSession.logIn(user).addProjectPermission(ProjectPermission.SCAN, project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), project.getMainBranchComponent());
mockSuccessfulPrepareSubmitCall();
@@ -191,11 +191,11 @@ public class ReportSubmitterIT {
verifyReportIsPersisted(TASK_UUID);
verifyNoInteractions(permissionTemplateService);
verify(queue).submit(argThat(submit -> submit.getType().equals(CeTaskTypes.REPORT)
- && submit.getComponent()
- .filter(cpt -> cpt.getUuid().equals(project.getMainBranchComponent().uuid()) && cpt.getEntityUuid().equals(project.projectUuid()))
- .isPresent()
- && submit.getSubmitterUuid().equals(user.getUuid())
- && submit.getUuid().equals(TASK_UUID)));
+ && submit.getComponent()
+ .filter(cpt -> cpt.getUuid().equals(project.getMainBranchComponent().uuid()) && cpt.getEntityUuid().equals(project.projectUuid()))
+ .isPresent()
+ && submit.getSubmitterUuid().equals(user.getUuid())
+ && submit.getUuid().equals(TASK_UUID)));
}
@Test
@@ -214,9 +214,9 @@ public class ReportSubmitterIT {
verifyReportIsPersisted(TASK_UUID);
verify(queue).submit(argThat(submit -> submit.getType().equals(CeTaskTypes.REPORT)
- && submit.getComponent().filter(cpt -> cpt.getUuid().equals(createdProject.uuid()) && cpt.getEntityUuid().equals(projectDto.getUuid()))
- .isPresent()
- && submit.getUuid().equals(TASK_UUID)));
+ && submit.getComponent().filter(cpt -> cpt.getUuid().equals(createdProject.uuid()) && cpt.getEntityUuid().equals(projectDto.getUuid()))
+ .isPresent()
+ && submit.getUuid().equals(TASK_UUID)));
assertThat(projectDto.getCreationMethod()).isEqualTo(CreationMethod.SCANNER_API);
}
@@ -274,7 +274,7 @@ public class ReportSubmitterIT {
@Test
public void submit_whenReportIsForANewProjectWithoutDevOpsMetadata_createsLocalProject() {
- userSession.addPermission(PROVISION_PROJECTS).addPermission(SCAN);
+ userSession.addPermission(PROVISION_PROJECTS).addPermission(GlobalPermission.SCAN);
mockSuccessfulPrepareSubmitCall();
when(permissionTemplateService.wouldUserHaveScanPermissionWithDefaultTemplate(any(), anyString(), anyString())).thenReturn(true);
@@ -287,7 +287,7 @@ public class ReportSubmitterIT {
@Test
public void submit_whenReportIsForANewProjectWithValidAlmSettingsAutoProvisioningOnAndPermOnGh_createsProjectWithBinding() {
UserDto user = db.users().insertUser();
- userSession.logIn(user).addPermission(PROVISION_PROJECTS).addPermission(SCAN);
+ userSession.logIn(user).addPermission(PROVISION_PROJECTS).addPermission(GlobalPermission.SCAN);
when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
mockSuccessfulPrepareSubmitCall();
@@ -304,7 +304,7 @@ public class ReportSubmitterIT {
@Test
public void submit_whenReportIsForANewProjectWithValidAlmSettingsAutoProvisioningOnAndProjectVisibilitySyncAndPermOnGh_createsProjectWithBinding() {
UserDto user = db.users().insertUser();
- userSession.logIn(user).addPermission(PROVISION_PROJECTS).addPermission(SCAN);
+ userSession.logIn(user).addPermission(PROVISION_PROJECTS).addPermission(GlobalPermission.SCAN);
when(gitHubSettings.isProvisioningEnabled()).thenReturn(true);
when(gitHubSettings.isProjectVisibilitySynchronizationActivated()).thenReturn(true);
@@ -394,7 +394,8 @@ public class ReportSubmitterIT {
mockGithubRepository(isPrivate);
- DevOpsProjectCreationContext devOpsProjectCreationContext = new DevOpsProjectCreationContext("repo", "orga/repo", "orga/repo", true, "defaultBranch", almSettingDto, userSession);
+ DevOpsProjectCreationContext devOpsProjectCreationContext = new DevOpsProjectCreationContext("repo", "orga/repo", "orga/repo", true, "defaultBranch", almSettingDto,
+ userSession);
DevOpsProjectCreator devOpsProjectCreator = spy(new GithubProjectCreator(db.getDbClient(), devOpsProjectCreationContext, projectKeyGenerator, gitHubSettings, projectCreator,
permissionService, permissionUpdater, managedProjectService, githubApplicationClient, null, null));
@@ -414,7 +415,7 @@ public class ReportSubmitterIT {
@Test
public void user_with_scan_permission_is_allowed_to_submit_a_report_on_existing_project() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addPermission(SCAN);
+ userSession.addPermission(GlobalPermission.SCAN);
mockSuccessfulPrepareSubmitCall();
underTest.submit(project.getKey(), project.name(), emptyMap(), IOUtils.toInputStream("{binary}", UTF_8));
@@ -426,7 +427,7 @@ public class ReportSubmitterIT {
public void submit_a_report_on_existing_project_with_project_scan_permission() {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
- userSession.addProjectPermission(SCAN.getKey(), project)
+ userSession.addProjectPermission(ProjectPermission.SCAN, project)
.addProjectBranchMapping(project.getUuid(), projectData.getMainBranchComponent());
mockSuccessfulPrepareSubmitCall();
@@ -438,7 +439,7 @@ public class ReportSubmitterIT {
@Test
public void fail_if_component_is_not_a_project() {
ComponentDto component = db.components().insertPublicPortfolio();
- userSession.logIn().addPortfolioPermission(SCAN.getKey(), component);
+ userSession.logIn().addPortfolioPermission(ProjectPermission.SCAN, component);
mockSuccessfulPrepareSubmitCall();
String dbKey = component.getKey();
@@ -455,7 +456,7 @@ public class ReportSubmitterIT {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
ComponentDto dir = db.components().insertComponent(newDirectory(projectData.getMainBranchComponent(), "path"));
- userSession.logIn().addProjectPermission(SCAN.getKey(), project);
+ userSession.logIn().addProjectPermission(ProjectPermission.SCAN, project);
mockSuccessfulPrepareSubmitCall();
String dirDbKey = dir.getKey();
@@ -467,7 +468,7 @@ public class ReportSubmitterIT {
.extracting(throwable -> ((BadRequestException) throwable).errors())
.asList()
.contains(format("The project '%s' is already defined in SonarQube but as a module of project '%s'. " +
- "If you really want to stop directly analysing project '%s', please first delete it from SonarQube and then relaunch the analysis of project '%s'.",
+ "If you really want to stop directly analysing project '%s', please first delete it from SonarQube and then relaunch the analysis of project '%s'.",
dir.getKey(), project.getKey(), project.getKey(), dir.getKey()));
}
@@ -482,7 +483,7 @@ public class ReportSubmitterIT {
@Test
public void fail_with_forbidden_exception_on_new_project_when_only_project_scan_permission() {
ProjectDto project = db.components().insertPrivateProject(PROJECT_UUID).getProjectDto();
- userSession.addProjectPermission(SCAN.getKey(), project);
+ userSession.addProjectPermission(ProjectPermission.SCAN, project);
mockSuccessfulPrepareSubmitCall();
Map<String, String> emptyMap = emptyMap();
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java
index 19accf4b68d..11deb107024 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityActionIT.java
@@ -28,7 +28,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.ce.task.taskprocessor.CeTaskProcessor;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.Uuids;
@@ -302,7 +302,7 @@ public class ActivityActionIT {
ProjectData project1 = db.components().insertPrivateProject();
ProjectData project2 = db.components().insertPrivateProject();
// no need to be a system admin
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project1.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project1.getProjectDto());
insertActivity("T1", project1, SUCCESS);
insertActivity("T2", project2, FAILED);
@@ -401,7 +401,7 @@ public class ActivityActionIT {
// is reserved to roots
PortfolioData view = db.components().insertPrivatePortfolioData();
insertActivity("T1", view, SUCCESS);
- userSession.logIn().addPortfolioPermission(UserRole.ADMIN, view.getPortfolioDto());
+ userSession.logIn().addPortfolioPermission(ProjectPermission.ADMIN, view.getPortfolioDto());
TestRequest request = ws.newRequest().setParam(TEXT_QUERY, "T1");
assertThatThrownBy(() -> call(request))
@@ -413,7 +413,7 @@ public class ActivityActionIT {
public void branch_in_past_activity() {
logInAsSystemAdministrator();
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String branchName = "branch1";
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey(branchName));
SnapshotDto analysis = db.components().insertSnapshot(branch);
@@ -455,7 +455,7 @@ public class ActivityActionIT {
public void pull_request_in_past_activity() {
logInAsSystemAdministrator();
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String pullRequestKey = RandomStringUtils.secure().nextAlphanumeric(100);
ComponentDto pullRequest = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BranchType.PULL_REQUEST).setKey(pullRequestKey));
SnapshotDto analysis = db.components().insertSnapshot(pullRequest);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityStatusActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityStatusActionIT.java
index 87508bfe7e5..36b16dcdd7e 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityStatusActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ActivityStatusActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -93,7 +93,7 @@ public class ActivityStatusActionIT {
String anotherProjectKey = "another-project-key";
ProjectData project = db.components().insertPrivateProject(c -> c.setKey(projectKey));
ProjectData anotherProject = db.components().insertPrivateProject(c -> c.setKey(anotherProjectKey));
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
// pending tasks returned
insertInQueue(CeQueueDto.Status.PENDING, project);
insertInQueue(CeQueueDto.Status.PENDING, project);
@@ -119,7 +119,7 @@ public class ActivityStatusActionIT {
String projectKey = "project-key";
ProjectData project = db.components().insertPrivateProject(c -> c.setKey(projectKey));
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
when(system2.now()).thenReturn(2000L);
insertInQueue(CeQueueDto.Status.PENDING, project, 1000L);
Ce.ActivityStatusWsResponse result = callByComponentKey(projectKey);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/AnalysisStatusActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/AnalysisStatusActionIT.java
index 7a9e863c9e0..6c854c4df8b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/AnalysisStatusActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/AnalysisStatusActionIT.java
@@ -23,7 +23,7 @@ import javax.annotation.Nullable;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
@@ -76,7 +76,7 @@ public class AnalysisStatusActionIT {
@Test
public void no_errors_no_warnings() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
Ce.AnalysisStatusWsResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
@@ -106,7 +106,7 @@ public class AnalysisStatusActionIT {
public void return_warnings_for_last_analysis_of_main() {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
SnapshotDto analysis = db.components().insertSnapshot(project);
CeActivityDto activity = insertActivity("task-uuid" + counter++, projectData.getMainBranchDto(), SUCCESS, analysis, REPORT);
@@ -137,7 +137,7 @@ public class AnalysisStatusActionIT {
@Test
public void return_warnings_for_last_analysis_of_branch() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
BranchDto branch = db.components().insertProjectBranch(project, b -> b.setKey(BRANCH_WITH_WARNING));
SnapshotDto analysis = db.components().insertSnapshot(branch);
@@ -168,7 +168,7 @@ public class AnalysisStatusActionIT {
@Test
public void return_warnings_for_last_analysis_of_pull_request() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
BranchDto pullRequest = db.components().insertProjectBranch(project, b -> {
b.setBranchType(BranchType.PULL_REQUEST);
@@ -203,7 +203,7 @@ public class AnalysisStatusActionIT {
public void return_warnings_per_branch() {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
SnapshotDto analysis = db.components().insertSnapshot(project);
CeActivityDto activity = insertActivity("task-uuid" + counter++, projectData.getMainBranchDto(), SUCCESS, analysis, REPORT);
@@ -263,7 +263,7 @@ public class AnalysisStatusActionIT {
@Test
public void response_contains_branch_or_pullRequest_for_branch_or_pullRequest_only() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
db.components().insertProjectBranch(project, b -> b.setKey(BRANCH_WITHOUT_WARNING));
@@ -312,7 +312,7 @@ public class AnalysisStatusActionIT {
db.getDbClient().ceTaskMessageDao().insert(db.getSession(), ceTaskMessage);
db.commit();
- userSession.logIn().setSystemAdministrator().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().setSystemAdministrator().addProjectPermission(ProjectPermission.USER, project);
String result = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/CancelActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/CancelActionIT.java
index ffa7b0043b2..d2c1ec9e6b7 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/CancelActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/CancelActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.impl.utils.TestSystem2;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.ce.queue.CeQueue;
import org.sonar.ce.queue.CeQueueImpl;
import org.sonar.ce.queue.CeTaskSubmit;
@@ -103,7 +103,7 @@ public class CancelActionIT {
ProjectData project = db.components().insertPrivateProject();
ProjectDto projectDto = project.getProjectDto();
ComponentDto mainBranchComponent = project.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.ADMIN, projectDto);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, projectDto);
userSession.addProjectBranchMapping(projectDto.getUuid(), mainBranchComponent);
CeQueueDto queue = createTaskSubmit(mainBranchComponent);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java
index 2002c015b3d..5dc2e4374ba 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/ComponentActionIT.java
@@ -26,7 +26,7 @@ import javax.annotation.Nullable;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
@@ -77,7 +77,7 @@ public class ComponentActionIT {
@Test
public void empty_queue_and_empty_activity() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
Ce.ComponentResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
@@ -92,7 +92,7 @@ public class ComponentActionIT {
ProjectData project1 = db.components().insertPrivateProject();
SnapshotDto analysisProject1 = db.components().insertSnapshot(project1.getMainBranchComponent());
ProjectData project2 = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project1.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project1.getProjectDto());
insertActivity("T1", project1.getMainBranchComponent(), project1.getProjectDto(), CeActivityDto.Status.SUCCESS, analysisProject1);
insertActivity("T2", project2.getMainBranchComponent(), project2.getProjectDto(), CeActivityDto.Status.FAILED, null);
insertActivity("T3", project1.getMainBranchComponent(), project1.getProjectDto(), CeActivityDto.Status.FAILED, null);
@@ -153,7 +153,7 @@ public class ComponentActionIT {
@Test
public void canceled_tasks_must_not_be_picked_as_current_analysis() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
insertActivity("T1", project.getMainBranchComponent(), project.getProjectDto(), CeActivityDto.Status.SUCCESS);
insertActivity("T2", project.getMainBranchComponent(), project.getProjectDto(), CeActivityDto.Status.FAILED);
insertActivity("T3", project.getMainBranchComponent(), project.getProjectDto(), CeActivityDto.Status.SUCCESS);
@@ -175,7 +175,7 @@ public class ComponentActionIT {
@Test
public void branch_in_activity() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String branchName = secure().nextAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey(branchName));
SnapshotDto analysis = db.components().insertSnapshot(branch);
@@ -196,7 +196,7 @@ public class ComponentActionIT {
@Test
public void branch_in_queue_analysis() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String branchName = secure().nextAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setBranchType(BRANCH).setKey(branchName));
CeQueueDto queue1 = insertQueue("T1", project.getMainBranchComponent(), project.getProjectDto(), IN_PROGRESS);
@@ -220,7 +220,7 @@ public class ComponentActionIT {
@Test
public void return_many_tasks_from_same_project() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
insertQueue("Main", project.getMainBranchComponent(), project.getProjectDto(), IN_PROGRESS);
String branchName1 = "Branch1";
@@ -250,7 +250,7 @@ public class ComponentActionIT {
@Test
public void populates_warning_count_and_warnings_of_activities() {
ProjectData privateProject = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, privateProject.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, privateProject.getProjectDto());
SnapshotDto analysis = db.components().insertSnapshot(privateProject.getMainBranchComponent());
CeActivityDto activity = insertActivity("Branch", privateProject.getMainBranchComponent(), privateProject.getProjectDto(), SUCCESS, analysis);
int messageCount = 5;
@@ -307,7 +307,7 @@ public class ComponentActionIT {
}
private void logInWithBrowsePermission(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
}
private CeQueueDto insertQueue(String taskUuid, ComponentDto component, EntityDto entityDto, CeQueueDto.Status status) {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/DismissAnalysisWarningActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/DismissAnalysisWarningActionIT.java
index 60af166f28c..cb0cd4348ae 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/DismissAnalysisWarningActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/DismissAnalysisWarningActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto;
@@ -104,7 +104,7 @@ public class DismissAnalysisWarningActionIT {
public void return_204_on_success() {
UserDto user = db.users().insertUser();
ProjectData project = db.components().insertPrivateProject();
- userSession.logIn(user).addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, project.getProjectDto());
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchComponent());
CeActivityDto activity = insertActivity("task-uuid" + counter++, project.getMainBranchComponent(), SUCCESS, analysis, REPORT);
CeTaskMessageDto taskMessageDismissible = createTaskMessage(activity, "dismissable warning", MessageType.SUGGEST_DEVELOPER_EDITION_UPGRADE);
@@ -124,7 +124,7 @@ public class DismissAnalysisWarningActionIT {
public void is_idempotent() {
UserDto user = db.users().insertUser();
ProjectData project = db.components().insertPrivateProject();
- userSession.logIn(user).addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, project.getProjectDto());
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchComponent());
CeActivityDto activity = insertActivity("task-uuid" + counter++, project.getMainBranchComponent(), SUCCESS, analysis, REPORT);
CeTaskMessageDto taskMessageDismissible = createTaskMessage(activity, "dismissable warning", MessageType.SUGGEST_DEVELOPER_EDITION_UPGRADE);
@@ -148,7 +148,7 @@ public class DismissAnalysisWarningActionIT {
public void returns_400_if_warning_is_not_dismissable() {
UserDto user = db.users().insertUser();
ProjectData project = db.components().insertPrivateProject();
- userSession.logIn(user).addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, project.getProjectDto());
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchComponent());
CeActivityDto activity = insertActivity("task-uuid" + counter++, project.getMainBranchComponent(), SUCCESS, analysis, REPORT);
CeTaskMessageDto taskMessage = createTaskMessage(activity, "generic warning");
@@ -167,7 +167,7 @@ public class DismissAnalysisWarningActionIT {
public void returns_404_if_warning_does_not_exist() {
UserDto user = db.users().insertUser();
ProjectData project = db.components().insertPrivateProject();
- userSession.logIn(user).addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, project.getProjectDto());
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchComponent());
insertActivity("task-uuid" + counter++, project.getMainBranchComponent(), SUCCESS, analysis, REPORT);
String warningUuid = "78d1e2ff-3e67-4037-ba58-0d57d5f88e44";
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java
index b3c42ee922a..b889a5c2fed 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/ws/TaskActionIT.java
@@ -27,7 +27,6 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.ce.CeTaskCharacteristics;
import org.sonar.core.util.CloseableIterator;
import org.sonar.core.util.UuidFactoryFast;
@@ -42,6 +41,7 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.dismissmessage.MessageType;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.exceptions.ForbiddenException;
@@ -56,10 +56,10 @@ import static java.util.Collections.singleton;
import static org.apache.commons.lang3.RandomStringUtils.secure;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.SCAN;
import static org.sonar.core.ce.CeTaskCharacteristics.BRANCH_TYPE;
import static org.sonar.db.component.BranchType.BRANCH;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
public class TaskActionIT {
@@ -144,7 +144,7 @@ public class TaskActionIT {
@Test
public void task_is_archived() {
UserDto user = db.users().insertUser();
- loginAndAddProjectPermission(user, GlobalPermission.SCAN.getKey());
+ loginAndAddProjectPermission(user, ProjectPermission.SCAN);
CeActivityDto activityDto = createActivityDto(SOME_TASK_UUID);
persist(activityDto);
@@ -169,7 +169,7 @@ public class TaskActionIT {
logInAsSystemAdministrator();
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String branchName = secure().nextAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(mainBranch, b -> b.setBranchType(BRANCH).setKey(branchName));
db.components().insertSnapshot(branch);
@@ -307,7 +307,7 @@ public class TaskActionIT {
@Test
public void get_project_queue_task_with_scan_permission_on_project() {
UserDto user = db.users().insertUser();
- loginAndAddProjectPermission(user, GlobalPermission.SCAN.getKey());
+ loginAndAddProjectPermission(user, ProjectPermission.SCAN);
CeQueueDto task = createAndPersistQueueTask(privateProjectMainBranch, user);
call(task.getUuid());
@@ -327,7 +327,7 @@ public class TaskActionIT {
@Test
public void get_project_queue_task_of_private_project_with_user_permission_fails_with_ForbiddenException() {
UserDto user = db.users().insertUser();
- userSession.logIn().addProjectPermission(UserRole.USER, privateProject);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, privateProject);
CeQueueDto task = createAndPersistQueueTask(privateProjectMainBranch, user);
String uuid = task.getUuid();
@@ -338,13 +338,13 @@ public class TaskActionIT {
@Test
public void get_project_queue_task_on_public_project() {
UserDto user = db.users().insertUser();
- loginAndAddProjectPermission(user, GlobalPermission.SCAN.getKey());
+ loginAndAddProjectPermission(user, ProjectPermission.SCAN);
CeQueueDto task = createAndPersistQueueTask(privateProjectMainBranch, user);
call(task.getUuid());
}
- private void loginAndAddProjectPermission(@Nullable UserDto user, String permission) {
+ private void loginAndAddProjectPermission(@Nullable UserDto user, ProjectPermission permission) {
if (user != null) {
userSession.logIn(user);
} else {
@@ -474,7 +474,7 @@ public class TaskActionIT {
@Test
public void get_warnings_on_private_project_archived_task_if_user_fails_with_ForbiddenException() {
- userSession.logIn().addProjectPermission(UserRole.USER, privateProject);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, privateProject);
CeActivityDto persistArchivedTask = createAndPersistArchivedTask(privateProjectMainBranch);
assertThatThrownBy(() -> insertWarningsCallEndpointAndAssertWarnings(persistArchivedTask))
@@ -483,7 +483,7 @@ public class TaskActionIT {
@Test
public void get_warnings_on_private_project_archived_task_if_scan() {
- loginAndAddProjectPermission(null, GlobalPermission.SCAN.getKey());
+ loginAndAddProjectPermission(null, ProjectPermission.SCAN);
insertWarningsCallEndpointAndAssertWarnings(createAndPersistArchivedTask(privateProjectMainBranch));
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ComponentServiceUpdateKeyIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ComponentServiceUpdateKeyIT.java
index 23e942fcdac..96bc3dbf7c1 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ComponentServiceUpdateKeyIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ComponentServiceUpdateKeyIT.java
@@ -26,7 +26,7 @@ import java.util.Set;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -114,7 +114,7 @@ public class ComponentServiceUpdateKeyIT {
@Test
public void fail_to_update_project_key_without_admin_permission() {
ProjectDto project = insertSampleProject();
- userSession.logIn("john").addProjectPermission(UserRole.USER, project);
+ userSession.logIn("john").addProjectPermission(ProjectPermission.USER, project);
assertThatThrownBy(() -> underTest.updateKey(dbSession, project, "sample2:root"))
.isInstanceOf(ForbiddenException.class);
@@ -167,6 +167,6 @@ public class ComponentServiceUpdateKeyIT {
}
private void logInAsProjectAdministrator(ProjectDto provisionedProject) {
- userSession.logIn("john").addProjectPermission(UserRole.ADMIN, provisionedProject);
+ userSession.logIn("john").addProjectPermission(ProjectPermission.ADMIN, provisionedProject);
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/AppActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/AppActionIT.java
index 1ebb7e2b2e9..1894d26a0ae 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/AppActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/AppActionIT.java
@@ -45,7 +45,7 @@ import static org.sonar.api.measures.CoreMetrics.LINES_KEY;
import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT_KEY;
import static org.sonar.api.measures.CoreMetrics.TESTS_KEY;
import static org.sonar.api.measures.CoreMetrics.VIOLATIONS_KEY;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.PULL_REQUEST;
import static org.sonar.db.component.ComponentTesting.newDirectory;
import static org.sonar.db.component.ComponentTesting.newFileDto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SearchProjectsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SearchProjectsActionIT.java
index f350e374dba..46234f54245 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SearchProjectsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SearchProjectsActionIT.java
@@ -40,7 +40,7 @@ import org.sonar.api.measures.Metric;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.platform.EditionProvider.Edition;
import org.sonar.core.platform.PlatformEditionProvider;
import org.sonar.db.DbClient;
@@ -1377,7 +1377,7 @@ class SearchProjectsActionIT {
authorizationIndexerTester.allowOnlyAnyone(publicProject);
index();
- userSession.addProjectPermission(UserRole.USER, privateProject);
+ userSession.addProjectPermission(ProjectPermission.USER, privateProject);
SearchProjectsWsResponse result = call(request);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java
index 74393eaa54e..e4d6d5b2281 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java
@@ -29,12 +29,11 @@ import org.junit.jupiter.params.provider.ValueSource;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.PortfolioData;
import org.sonar.db.component.ProjectData;
import org.sonar.server.component.TestComponentFinder;
@@ -53,7 +52,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.db.component.BranchType.PULL_REQUEST;
@@ -289,7 +288,7 @@ public class ShowActionIT {
public void branch() {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String branchKey = "my_branch";
ComponentDto branch = db.components().insertProjectBranch(mainBranch, b -> b.setKey(branchKey));
userSession.addProjectBranchMapping(projectData.projectUuid(), branch);
@@ -315,7 +314,7 @@ public class ShowActionIT {
public void dont_show_branch_if_main_branch() {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto());
ShowWsResponse response = ws.newRequest()
@@ -332,7 +331,7 @@ public class ShowActionIT {
public void pull_request() {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String pullRequest = "pr-1234";
ComponentDto branch = db.components().insertProjectBranch(mainBranch, b -> b.setKey(pullRequest).setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(projectData.projectUuid(), branch);
@@ -392,7 +391,7 @@ public class ShowActionIT {
userSession.addProjectBranchMapping(projectData3.projectUuid(), branch4);
userSession.addProjectBranchMapping(projectData3.projectUuid(), branch5);
- userSession.addProjectPermission(UserRole.USER, projectData1.getProjectDto(), projectData2.getProjectDto(), projectData3.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, projectData1.getProjectDto(), projectData2.getProjectDto(), projectData3.getProjectDto())
.registerBranches(projectData1.getMainBranchDto(), projectData2.getMainBranchDto(), projectData3.getMainBranchDto());
userSession.registerPortfolios(portfolio1, portfolio2, subview);
userSession.registerProjects(projectData1.getProjectDto(), projectData2.getProjectDto(), projectData3.getProjectDto());
@@ -469,7 +468,7 @@ public class ShowActionIT {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(mainBranch));
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto());
db.components().insertProjectBranch(mainBranch, b -> b.setKey("my_branch"));
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SuggestionsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SuggestionsActionIT.java
index e245c0b21cc..a22fcfa9786 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SuggestionsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/SuggestionsActionIT.java
@@ -66,7 +66,7 @@ import static org.sonar.db.component.ComponentQualifiers.PROJECT;
import static org.sonar.db.component.ComponentQualifiers.SUBVIEW;
import static org.sonar.db.component.ComponentQualifiers.UNIT_TEST_FILE;
import static org.sonar.db.component.ComponentQualifiers.VIEW;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.server.component.ws.SuggestionsAction.PARAM_MORE;
import static org.sonar.server.component.ws.SuggestionsAction.PARAM_QUERY;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java
index 540914522b4..7d69a2a27c0 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java
@@ -36,7 +36,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.component.DefaultComponentTypes;
import org.sonar.core.i18n.I18n;
import org.sonar.db.DbClient;
@@ -378,7 +378,7 @@ public class TreeActionIT {
@Test
public void branch() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String branchKey = "my_branch";
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey(branchKey));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
@@ -402,7 +402,7 @@ public class TreeActionIT {
public void dont_show_branch_if_main_branch() {
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertFile(project.getMainBranchDto());
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), project.getMainBranchComponent());
TreeWsResponse response = ws.newRequest()
@@ -417,7 +417,7 @@ public class TreeActionIT {
@Test
public void pull_request() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String pullRequestId = "pr-123";
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey(pullRequestId).setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
@@ -440,7 +440,7 @@ public class TreeActionIT {
public void fail_when_not_enough_privileges() {
ProjectData project = db.components().insertPrivateProject("project-uuid");
userSession.logIn()
- .addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto());
+ .addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto());
db.commit();
TestRequest request = ws.newRequest()
@@ -533,7 +533,7 @@ public class TreeActionIT {
@Test
public void fail_if_branch_does_not_exist() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));
TestRequest request = ws.newRequest()
@@ -592,7 +592,7 @@ public class TreeActionIT {
}
private void logInWithBrowsePermission(ProjectData project) {
- userSession.logIn().addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), project.getMainBranchComponent());
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionIT.java
index b2d794be1c2..c55ef73a7f3 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionIT.java
@@ -28,10 +28,10 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.config.Configuration;
import org.sonar.api.platform.Server;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto;
@@ -64,7 +64,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.event.EventTesting.newEvent;
import static org.sonar.server.developers.ws.SearchEventsAction.PARAM_FROM;
import static org.sonar.server.developers.ws.SearchEventsAction.PARAM_PROJECTS;
@@ -199,8 +199,8 @@ class SearchEventsActionIT {
void does_not_return_events_of_project_for_which_the_current_user_has_no_browse_permission() {
ProjectData projectData1 = db.components().insertPrivateProject();
ComponentDto mainBranch1 = projectData1.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.CODEVIEWER, projectData1.getProjectDto());
- userSession.addProjectPermission(UserRole.ISSUE_ADMIN, projectData1.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.CODEVIEWER, projectData1.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.ISSUE_ADMIN, projectData1.getProjectDto());
ProjectData projectData2 = db.components().insertPrivateProject();
ComponentDto mainBranch2 = projectData2.getMainBranchComponent();
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java
index b9282eff617..c979a6c93af 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.config.Configuration;
import org.sonar.api.platform.Server;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeActivityDto;
import org.sonar.db.ce.CeQueueDto;
@@ -57,7 +57,7 @@ import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.server.developers.ws.SearchEventsAction.PARAM_FROM;
import static org.sonar.server.developers.ws.SearchEventsAction.PARAM_PROJECTS;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionQualityGateIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionQualityGateIT.java
index e9503e09cfe..9231f33bc03 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionQualityGateIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionQualityGateIT.java
@@ -47,7 +47,7 @@ import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.db.component.BranchType.PULL_REQUEST;
import static org.sonar.db.event.EventTesting.newEvent;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/duplication/ws/ShowActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/duplication/ws/ShowActionIT.java
index 887b53a1d66..1ba4bc8b1b2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/duplication/ws/ShowActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/duplication/ws/ShowActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -93,7 +93,7 @@ public class ShowActionIT {
ComponentDto file = db.components().insertComponent(newFileDto(project).setKey("foo.js"));
db.components().insertSnapshot(newAnalysis(project));
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project);
TestResponse result = newBaseRequest().setParam("key", file.getKey()).execute();
@@ -108,7 +108,7 @@ public class ShowActionIT {
@Test
public void duplications_by_file_key_and_branch() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project);
String branchName = secure().nextAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(branchName));
userSessionRule.addProjectBranchMapping(project.uuid(), branch);
@@ -164,7 +164,7 @@ public class ShowActionIT {
@Test
public void duplications_by_file_key_and_pull_request() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project);
String pullRequestKey = secure().nextAlphanumeric(100);
ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setBranchType(PULL_REQUEST).setKey(pullRequestKey));
userSessionRule.addProjectBranchMapping(project.uuid(), pullRequest);
@@ -250,7 +250,7 @@ public class ShowActionIT {
private void verifyCallToFileWithDuplications(Function<ComponentDto, TestRequest> requestFactory) {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project);
ComponentDto file = db.components().insertComponent(newFileDto(project).setKey("foo.js"));
String xml = """
<duplications>
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java
index 0c7c87aa9dd..3e244135780 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java
@@ -24,7 +24,7 @@ import javax.annotation.Nullable;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -47,7 +47,7 @@ import static java.net.HttpURLConnection.HTTP_NO_CONTENT;
import static java.util.Optional.ofNullable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.server.favorite.ws.FavoritesWsParameters.PARAM_COMPONENT;
@@ -86,7 +86,7 @@ public class AddActionIT {
@Test
public void fail_when_no_browse_permission_on_the_project() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
assertThatThrownBy(() -> call(project.getKey()))
.isInstanceOf(ForbiddenException.class);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/SearchActionIT.java
index 1577dce501d..271d143f2e8 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/SearchActionIT.java
@@ -26,7 +26,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.project.ProjectDto;
@@ -177,7 +177,7 @@ public class SearchActionIT {
private void addPermissionAndFavorite(ProjectDto component) {
db.favorites().add(component, userUuid, userLogin);
db.commit();
- userSession.addProjectPermission(UserRole.USER, component);
+ userSession.addProjectPermission(ProjectPermission.USER, component);
}
private SearchResponse call(@Nullable Integer page, @Nullable Integer pageSize) {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AddCommentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AddCommentActionIT.java
index c51aaf89d35..8eea70cf9b4 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AddCommentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AddCommentActionIT.java
@@ -31,9 +31,9 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbClient;
@@ -212,7 +212,7 @@ public class AddCommentActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
RuleDto rule = dbTester.rules().insertHotspotRule();
IssueDto hotspot = dbTester.issues().insertHotspot(rule, project, file);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AssignActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AssignActionIT.java
index c5e7d8118ae..ad12e3e1472 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AssignActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/AssignActionIT.java
@@ -35,11 +35,11 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbClient;
@@ -86,7 +86,7 @@ import static org.sonar.api.issue.Issue.STATUSES;
import static org.sonar.api.issue.Issue.STATUS_CLOSED;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.db.component.ComponentTesting.newFileDto;
@RunWith(DataProviderRunner.class)
@@ -210,7 +210,7 @@ public class AssignActionIT {
ComponentDto file = dbTester.components().insertComponent(newFileDto(project.getMainBranchComponent()));
IssueDto hotspot = dbTester.issues().insertHotspot(project.getMainBranchComponent(), file);
- insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.USER);
+ insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.USER);
UserDto assignee = insertUserWithProjectUserPermission(secure().nextAlphanumeric(15), project.getProjectDto());
when(issueFieldsSetter.assign(eq(hotspot.toDefaultIssue()), userMatcher(assignee), any(IssueChangeContext.class))).thenReturn(true);
@@ -227,7 +227,7 @@ public class AssignActionIT {
UserDto assignee = insertUser(secure().nextAlphanumeric(15));
IssueDto hotspot = dbTester.issues().insertHotspot(project.getMainBranchComponent(), file, h -> h.setAssigneeUuid(assignee.getUuid()));
- insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.USER);
+ insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.USER);
when(issueFieldsSetter.assign(eq(hotspot.toDefaultIssue()), isNull(), any(IssueChangeContext.class))).thenReturn(true);
@@ -243,7 +243,7 @@ public class AssignActionIT {
ComponentDto file = dbTester.components().insertComponent(newFileDto(branch, project.getMainBranchComponent().uuid()));
IssueDto hotspot = dbTester.issues().insertHotspot(branch, file);
- insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.USER);
+ insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.USER);
userSessionRule.addProjectBranchMapping(project.projectUuid(), branch);
UserDto assignee = insertUserWithProjectUserPermission(secure().nextAlphanumeric(15), project.getProjectDto());
@@ -260,7 +260,7 @@ public class AssignActionIT {
ComponentDto file = dbTester.components().insertComponent(newFileDto(project.getMainBranchComponent()));
IssueDto hotspot = dbTester.issues().insertHotspot(project.getMainBranchComponent(), file);
- insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.USER);
+ insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.USER);
UserDto assignee = insertUser(secure().nextAlphanumeric(15));
when(issueFieldsSetter.assign(eq(hotspot.toDefaultIssue()), userMatcher(assignee), any(IssueChangeContext.class))).thenReturn(true);
@@ -278,7 +278,7 @@ public class AssignActionIT {
ComponentDto file = dbTester.components().insertComponent(newFileDto(branch, project.getMainBranchComponent()));
IssueDto hotspot = dbTester.issues().insertHotspot(branch, file);
- insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.USER);
+ insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.USER);
userSessionRule.addProjectBranchMapping(project.projectUuid(), branch);
UserDto assignee = insertUser(secure().nextAlphanumeric(15));
@@ -296,7 +296,7 @@ public class AssignActionIT {
ComponentDto file = dbTester.components().insertComponent(newFileDto(project.getMainBranchComponent()));
IssueDto hotspot = dbTester.issues().insertHotspot(project.getMainBranchComponent(), file);
- UserDto me = insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.USER);
+ UserDto me = insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.USER);
when(issueFieldsSetter.assign(eq(hotspot.toDefaultIssue()), userMatcher(me), any(IssueChangeContext.class))).thenReturn(true);
@@ -479,7 +479,7 @@ public class AssignActionIT {
ComponentDto file = dbTester.components().insertComponent(newFileDto(project.getMainBranchComponent()));
IssueDto hotspot = dbTester.issues().insertHotspot(project.getMainBranchComponent(), file);
- UserDto me = insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), UserRole.CODEVIEWER);
+ UserDto me = insertAndLoginAsUserWithProjectUserPermission(secure().nextAlphanumeric(10), project.getProjectDto(), ProjectPermission.CODEVIEWER);
when(issueFieldsSetter.assign(eq(hotspot.toDefaultIssue()), userMatcher(me), any(IssueChangeContext.class))).thenReturn(true);
@@ -613,17 +613,17 @@ public class AssignActionIT {
return dbTester.users().insertUser(login);
}
- private UserDto insertUserWithProjectPermission(String login, EntityDto project, String permission) {
+ private UserDto insertUserWithProjectPermission(String login, EntityDto project, ProjectPermission permission) {
UserDto user = dbTester.users().insertUser(login);
dbTester.users().insertProjectPermissionOnUser(user, permission, project);
return user;
}
private UserDto insertUserWithProjectUserPermission(String login, EntityDto project) {
- return insertUserWithProjectPermission(login, project, UserRole.USER);
+ return insertUserWithProjectPermission(login, project, ProjectPermission.USER);
}
- private UserDto insertAndLoginAsUserWithProjectUserPermission(String login, ProjectDto project, String permission) {
+ private UserDto insertAndLoginAsUserWithProjectUserPermission(String login, ProjectDto project, ProjectPermission permission) {
UserDto user = insertUserWithProjectUserPermission(login, project);
userSessionRule.logIn(user).addProjectPermission(permission, project);
return user;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ChangeStatusActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ChangeStatusActionIT.java
index 519c249287d..9c7c0851a4a 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ChangeStatusActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ChangeStatusActionIT.java
@@ -36,9 +36,9 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.sonar.api.issue.DefaultTransitions;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbClient;
@@ -81,7 +81,7 @@ import static org.sonar.api.issue.Issue.RESOLUTION_SAFE;
import static org.sonar.api.issue.Issue.STATUS_CLOSED;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.component.ComponentTesting.newFileDto;
@@ -307,7 +307,7 @@ public class ChangeStatusActionIT {
@Test
@UseDataProvider("anyPublicProjectPermissionButHotspotAdmin")
- public void fails_with_ForbiddenException_if_project_is_public_and_user_has_no_HotspotAdmin_permission_on_it(String permission) {
+ public void fails_with_ForbiddenException_if_project_is_public_and_user_has_no_HotspotAdmin_permission_on_it(ProjectPermission permission) {
ProjectData projectData = dbTester.components().insertPublicProject();
ComponentDto project = projectData.getMainBranchComponent();
@@ -331,15 +331,15 @@ public class ChangeStatusActionIT {
@DataProvider
public static Object[][] anyPublicProjectPermissionButHotspotAdmin() {
return new Object[][] {
- {UserRole.ADMIN},
- {UserRole.ISSUE_ADMIN},
- {UserRole.SCAN}
+ {ProjectPermission.ADMIN},
+ {ProjectPermission.ISSUE_ADMIN},
+ {ProjectPermission.SCAN}
};
}
@Test
@UseDataProvider("anyPrivateProjectPermissionButHotspotAdmin")
- public void fails_with_ForbiddenException_if_project_is_private_and_has_no_IssueAdmin_permission_on_it(String permission) {
+ public void fails_with_ForbiddenException_if_project_is_private_and_has_no_IssueAdmin_permission_on_it(ProjectPermission permission) {
ProjectData projectData = dbTester.components().insertPrivateProject();
ComponentDto project = projectData.getMainBranchComponent();
@@ -363,11 +363,11 @@ public class ChangeStatusActionIT {
@DataProvider
public static Object[][] anyPrivateProjectPermissionButHotspotAdmin() {
return new Object[][] {
- {UserRole.USER},
- {UserRole.ADMIN},
- {UserRole.ISSUE_ADMIN},
- {UserRole.CODEVIEWER},
- {UserRole.SCAN}
+ {ProjectPermission.USER},
+ {ProjectPermission.ADMIN},
+ {ProjectPermission.ISSUE_ADMIN},
+ {ProjectPermission.CODEVIEWER},
+ {ProjectPermission.SCAN}
};
}
@@ -378,7 +378,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file);
@@ -392,7 +392,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file);
@@ -406,7 +406,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file, h -> h.setStatus(status).setResolution(resolution));
@@ -424,7 +424,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file, h -> h.setStatus(STATUS_TO_REVIEW).setResolution(null));
when(transitionService.doTransition(any(), any(), any())).thenReturn(transitionDone);
@@ -459,7 +459,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
when(branchDto.getBranchType()).thenReturn(BranchType.BRANCH);
String projectUuid = "projectUuid";
@@ -485,7 +485,7 @@ public class ChangeStatusActionIT {
userSessionRule.logIn().registerProjects(project)
.registerBranches(branch)
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, project);
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, project);
newRequest(hotspot, STATUS_REVIEWED, RESOLUTION_FIXED, NO_COMMENT).execute();
verify(hotspotChangeEventService).distributeHotspotChangedEvent(eq(branchDto.getProjectUuid()), any(HotspotChangedEvent.class));
@@ -497,7 +497,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
when(branchDto.getBranchType()).thenReturn(BranchType.PULL_REQUEST);
IssueDto hotspot = dbTester.issues().insertHotspot(project, file);
@@ -529,7 +529,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file, h -> h.setStatus(STATUS_REVIEWED).setResolution(resolution));
@@ -581,7 +581,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file, h -> h.setStatus(currentStatus).setResolution(currentResolution));
@@ -641,7 +641,7 @@ public class ChangeStatusActionIT {
ComponentDto project = projectData.getMainBranchComponent();
userSessionRule.logIn().registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(project));
IssueDto hotspot = dbTester.issues().insertHotspot(project, file, h -> h.setStatus(status).setResolution(resolution));
String comment = secure().nextAlphabetic(12);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/DeleteCommentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/DeleteCommentActionIT.java
index 5705602bc60..2bdff9c7b95 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/DeleteCommentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/DeleteCommentActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -78,7 +78,7 @@ public class DeleteCommentActionIT {
IssueChangeDto comment = dbTester.issues().insertComment(hotspot, userDeletingOwnComment, "Some comment");
userSessionRule.logIn(userDeletingOwnComment);
- userSessionRule.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
TestRequest request = newRequest(comment.getKey());
@@ -144,7 +144,7 @@ public class DeleteCommentActionIT {
IssueChangeDto comment = dbTester.issues().insertComment(hotspot, userWithHotspotComment, "Some comment");
userSessionRule.logIn(userTryingToDelete);
- userSessionRule.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
TestRequest request = newRequest(comment.getKey());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/EditCommentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/EditCommentActionIT.java
index 64088115ada..e8e478c32f2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/EditCommentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/EditCommentActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -86,7 +86,7 @@ public class EditCommentActionIT {
.isNotEmpty();
userSessionRule.logIn(userEditingOwnComment);
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
TestRequest request = newRequest(comment.getKey(), "new comment");
@@ -151,7 +151,7 @@ public class EditCommentActionIT {
IssueChangeDto comment = dbTester.issues().insertComment(hotspot, userWithHotspotComment, "Some comment");
userSessionRule.logIn(userTryingToDelete);
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
TestRequest request = newRequest(comment.getKey(), "new comment");
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ListActionIT.java
index ca1b195156a..2a23e0c69cf 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ListActionIT.java
@@ -30,7 +30,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/PullActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/PullActionIT.java
index d6b430e9796..c572267b7d3 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/PullActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/PullActionIT.java
@@ -60,7 +60,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.ComponentTesting.newFileDto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java
index 29fec55809e..11f125d7a36 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java
@@ -43,7 +43,7 @@ import org.sonar.api.config.Configuration;
import org.sonar.api.impl.utils.TestSystem2;
import org.sonar.api.issue.Issue;
import org.sonar.api.rule.RuleKey;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
import org.sonar.db.DbClient;
@@ -103,9 +103,9 @@ import static org.sonar.api.issue.Issue.STATUS_CLOSED;
import static org.sonar.api.issue.Issue.STATUS_RESOLVED;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newDirectory;
import static org.sonar.db.component.ComponentTesting.newDirectoryOnBranch;
import static org.sonar.db.component.ComponentTesting.newFileDto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ShowActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ShowActionIT.java
index 4e3d1a85314..4f668d0562d 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ShowActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/ShowActionIT.java
@@ -41,9 +41,8 @@ import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
@@ -53,6 +52,7 @@ import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.protobuf.DbCommons.TextRange;
import org.sonar.db.protobuf.DbIssues;
@@ -96,7 +96,7 @@ import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.ASSESS_THE_PROBLEM_SECTION_KEY;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.HOW_TO_FIX_SECTION_KEY;
import static org.sonar.api.server.rule.RuleDescriptionSection.RuleDescriptionSectionKeys.INTRODUCTION_SECTION_KEY;
@@ -289,7 +289,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDto rule = newRule(SECURITY_HOTSPOT);
IssueDto hotspot = dbTester.issues().insertHotspot(rule, mainBranchComponent, file);
@@ -320,7 +320,7 @@ public class ShowActionIT {
@Test
@UseDataProvider("allPublicProjectPermissionsButSECURITYHOTSPOT_ADMIN")
- public void return_canChangeStatus_false_on_public_project_when_authenticated_without_SECURITYHOTSPOT_ADMIN_permission(@Nullable String permission) {
+ public void return_canChangeStatus_false_on_public_project_when_authenticated_without_SECURITYHOTSPOT_ADMIN_permission(@Nullable ProjectPermission permission) {
ProjectData projectData = dbTester.components().insertPublicProject();
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
@@ -341,12 +341,12 @@ public class ShowActionIT {
@Test
@UseDataProvider("allPublicProjectPermissionsButSECURITYHOTSPOT_ADMIN")
- public void return_canChangeStatus_true_on_public_project_when_authenticated_with_SECURITYHOTSPOT_ADMIN_permission(@Nullable String permission) {
+ public void return_canChangeStatus_true_on_public_project_when_authenticated_with_SECURITYHOTSPOT_ADMIN_permission(@Nullable ProjectPermission permission) {
ProjectData projectData = dbTester.components().insertPublicProject();
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
if (permission != null) {
userSessionRule.addProjectPermission(permission, projectData.getProjectDto());
}
@@ -365,21 +365,21 @@ public class ShowActionIT {
public static Object[][] allPublicProjectPermissionsButSECURITYHOTSPOT_ADMIN() {
return new Object[][] {
{null}, // no permission
- {UserRole.ADMIN},
- {UserRole.SCAN},
- {UserRole.ISSUE_ADMIN}
+ {ProjectPermission.ADMIN},
+ {ProjectPermission.SCAN},
+ {ProjectPermission.ISSUE_ADMIN}
};
}
@Test
@UseDataProvider("allPrivateProjectPermissionsButSECURITYHOTSPOT_ADMIN_and_USER")
- public void return_canChangeStatus_false_on_private_project_without_SECURITYHOTSPOT_ADMIN_permission(@Nullable String permission) {
+ public void return_canChangeStatus_false_on_private_project_without_SECURITYHOTSPOT_ADMIN_permission(@Nullable ProjectPermission permission) {
ProjectData projectData = dbTester.components().insertPrivateProject();
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule
.registerProjects(projectData.getProjectDto())
.logIn()
- .addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
if (permission != null) {
userSessionRule.addProjectPermission(permission, projectData.getProjectDto());
}
@@ -396,14 +396,14 @@ public class ShowActionIT {
@Test
@UseDataProvider("allPrivateProjectPermissionsButSECURITYHOTSPOT_ADMIN_and_USER")
- public void return_canChangeStatus_false_on_private_project_with_SECURITYHOTSPOT_ADMIN_permission(@Nullable String permission) {
+ public void return_canChangeStatus_false_on_private_project_with_SECURITYHOTSPOT_ADMIN_permission(@Nullable ProjectPermission permission) {
ProjectData projectData = dbTester.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
userSessionRule
.registerProjects(projectData.getProjectDto())
.logIn()
- .addProjectPermission(UserRole.USER, projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
if (permission != null) {
userSessionRule.addProjectPermission(permission, projectData.getProjectDto());
}
@@ -422,10 +422,10 @@ public class ShowActionIT {
public static Object[][] allPrivateProjectPermissionsButSECURITYHOTSPOT_ADMIN_and_USER() {
return new Object[][] {
{null}, // only USER permission
- {UserRole.CODEVIEWER},
- {UserRole.ADMIN},
- {UserRole.SCAN},
- {UserRole.ISSUE_ADMIN}
+ {ProjectPermission.CODEVIEWER},
+ {ProjectPermission.ADMIN},
+ {ProjectPermission.SCAN},
+ {ProjectPermission.ISSUE_ADMIN}
};
}
@@ -436,7 +436,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDto rule = newRule(SECURITY_HOTSPOT);
IssueDto hotspot = dbTester.issues().insertHotspot(rule, mainBranchComponent, file, t -> t.setStatus(status).setResolution(resolution));
@@ -468,7 +468,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDescriptionSectionDto introductionSection = generateSectionWithKey(INTRODUCTION_SECTION_KEY);
@@ -504,7 +504,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDescriptionSectionDto introductionSection = generateSectionWithKey(DEFAULT_KEY);
@@ -530,7 +530,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDescriptionSectionDto introductionSection = generateSectionWithKey(INTRODUCTION_SECTION_KEY);
@@ -568,7 +568,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
String description = "== Title\n<div>line1\nline2</div>";
@@ -599,7 +599,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDto rule = newRuleWithoutSection(SECURITY_HOTSPOT, r -> r.setTemplateUuid("123"));
@@ -619,7 +619,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto());
- userSessionRule.logIn().addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(newFileDto(mainBranchComponent));
RuleDescriptionSectionDto vaadinSection = newContextSpecificDescriptionSection("vaadin");
@@ -1104,8 +1104,8 @@ public class ShowActionIT {
.extracting(User::getLogin, User::getName, User::getActive)
.containsExactlyInAnyOrder(
Stream.concat(
- Stream.of(author, assignee),
- changeLogAndCommentsUsers.stream())
+ Stream.of(author, assignee),
+ changeLogAndCommentsUsers.stream())
.map(t -> tuple(t.getLogin(), t.getName(), t.isActive()))
.toArray(Tuple[]::new));
}
@@ -1159,7 +1159,7 @@ public class ShowActionIT {
ComponentDto mainBranchComponent = projectData.getMainBranchComponent();
userSessionRule.registerProjects(projectData.getProjectDto())
- .addProjectPermission(UserRole.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
+ .addProjectPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, projectData.getProjectDto());
ComponentDto file = dbTester.components().insertComponent(
newFileDto(mainBranchComponent)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java
index 80c431a4779..118be21b2b9 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java
@@ -28,6 +28,7 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDbTester;
import org.sonar.db.rule.RuleDto;
@@ -37,10 +38,10 @@ import org.sonar.server.tester.UserSessionRule;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.rule.RuleTesting.newRule;
public class IssueFinderIT {
@@ -94,7 +95,7 @@ public class IssueFinderIT {
return issueDbTester.insert(newIssue(rule, project.getMainBranchComponent(), file));
}
- private void addProjectPermission(IssueDto issueDto, String permission) {
+ private void addProjectPermission(IssueDto issueDto, ProjectPermission permission) {
BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException("Couldn't find branch :" + issueDto.getProjectUuid()));
ProjectDto projectDto = db.getDbClient().projectDao().selectByUuid(db.getSession(), branchDto.getProjectUuid()).get();
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java
index b17db72a3d6..b58504431ef 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java
@@ -30,7 +30,7 @@ import org.junit.Test;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.FieldDiffs;
import org.sonar.db.DbTester;
@@ -48,8 +48,8 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.rule.RuleTesting.newRule;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java
index d63375ad18b..430edd6417c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java
@@ -39,10 +39,10 @@ import org.sonar.server.tester.UserSessionRule;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.rule.RuleTesting.newRule;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java
index 5e6e93ecabf..54a49be6a29 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java
@@ -26,7 +26,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.util.Uuids;
import org.sonar.db.component.BranchDto;
@@ -35,6 +35,7 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting;
import org.sonar.db.issue.IssueDto;
import org.sonar.db.issue.IssueTesting;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.server.issue.workflow.FunctionExecutor;
@@ -47,9 +48,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.api.issue.Issue.STATUS_CLOSED;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.component.ComponentTesting.newFileDto;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.db.rule.RuleTesting.newRule;
public class TransitionActionIT {
@@ -124,7 +125,7 @@ public class TransitionActionIT {
return IssueTesting.newIssue(rule, project, file);
}
- private void loginAndAddProjectPermission(String login, String permission) {
+ private void loginAndAddProjectPermission(String login, ProjectPermission permission) {
ProjectDto projectDto = ComponentTesting.newProjectDto();
BranchDto branchDto = ComponentTesting.newBranchDto(projectDto.getUuid(), BranchType.BRANCH).setIsMain(true).setUuid(issue.projectUuid());
userSession.logIn(login).addProjectPermission(permission, projectDto)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java
index 772d0869824..df10afba46a 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java
@@ -39,8 +39,8 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.sonar.api.issue.Issue.STATUS_CONFIRMED;
import static org.sonar.api.issue.Issue.STATUS_OPEN;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.component.ComponentTesting.newFileDto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/WebIssueStorageIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/WebIssueStorageIT.java
index 5b3664c516e..9468de7356c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/WebIssueStorageIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/WebIssueStorageIT.java
@@ -28,7 +28,7 @@ import org.sonar.api.impl.utils.TestSystem2;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.Duration;
import org.sonar.api.utils.System2;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AddCommentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AddCommentActionIT.java
index 5f72f9259a5..8a1250057d8 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AddCommentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AddCommentActionIT.java
@@ -35,6 +35,7 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.es.EsTester;
@@ -65,15 +66,14 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
import static org.sonar.db.issue.IssueChangeDto.TYPE_COMMENT;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class AddCommentActionIT {
private static final long NOW = 10_000_000_000L;
-
@Rule
public DbTester dbTester = DbTester.create(System2.INSTANCE);
@@ -220,7 +220,7 @@ public class AddCommentActionIT {
return request.execute();
}
- private void loginWithBrowsePermission(IssueDto issueDto, String permission) {
+ private void loginWithBrowsePermission(IssueDto issueDto, ProjectPermission permission) {
UserDto user = dbTester.users().insertUser("john");
userSession.logIn(user)
.addProjectPermission(permission,
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AssignActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AssignActionIT.java
index d6711fd3a0f..196650c0906 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AssignActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AssignActionIT.java
@@ -24,12 +24,13 @@ import javax.annotation.Nullable;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.impl.utils.TestSystem2;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.UserDto;
import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.ForbiddenException;
@@ -56,9 +57,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.tester.UserSessionRule.standalone;
public class AssignActionIT {
@@ -289,7 +290,7 @@ public class AssignActionIT {
setUserWithPermission(issue, USER);
}
- private void setUserWithPermission(IssueDto issue, String permission) {
+ private void setUserWithPermission(IssueDto issue, ProjectPermission permission) {
currentUser = insertUser(CURRENT_USER_LOGIN);
userSession.logIn(currentUser)
.addProjectPermission(permission,
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/BulkChangeActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/BulkChangeActionIT.java
index 9eb6f0a93c4..0dd5c62d035 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/BulkChangeActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/BulkChangeActionIT.java
@@ -30,7 +30,7 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.sonar.api.impl.utils.TestSystem2;
import org.sonar.api.issue.IssueStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
import org.sonar.core.util.SequenceUuidFactory;
@@ -41,6 +41,7 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.es.EsTester;
@@ -91,14 +92,14 @@ import static org.sonar.api.issue.Issue.STATUS_OPEN;
import static org.sonar.api.issue.Issue.STATUS_RESOLVED;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.VULNERABILITY;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.SECURITYHOTSPOT_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.VULNERABILITY;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueChangeDto.TYPE_COMMENT;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.SECURITYHOTSPOT_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.projectBranchOf;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.projectOf;
import static org.sonar.server.issue.notification.IssuesChangesNotificationBuilderTesting.ruleOf;
@@ -790,8 +791,8 @@ public class BulkChangeActionIT {
return request.executeProtobuf(BulkChangeWsResponse.class);
}
- private void addUserProjectPermissions(UserDto user, ProjectData project, String... permissions) {
- for (String permission : permissions) {
+ private void addUserProjectPermissions(UserDto user, ProjectData project, ProjectPermission... permissions) {
+ for (ProjectPermission permission : permissions) {
db.users().insertProjectPermissionOnUser(user, permission, project.getProjectDto());
userSession.addProjectPermission(permission, project.getProjectDto());
userSession.addProjectBranchMapping(project.projectUuid(), project.getMainBranchComponent());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ChangelogActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ChangelogActionIT.java
index 5505f47f054..64524018aed 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ChangelogActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ChangelogActionIT.java
@@ -50,8 +50,8 @@ import static java.util.Optional.ofNullable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.groups.Tuple.tuple;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.user.UserTesting.newUserDto;
import static org.sonar.test.JsonAssert.assertJson;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DeleteCommentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DeleteCommentActionIT.java
index 04daecbfa75..d78a444753c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DeleteCommentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DeleteCommentActionIT.java
@@ -31,6 +31,7 @@ import org.sonar.db.DbTester;
import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.UserDto;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -48,8 +49,8 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class DeleteCommentActionIT {
@@ -177,7 +178,7 @@ public class DeleteCommentActionIT {
return request.execute();
}
- private void loginAndAddProjectPermission(UserDto user, IssueDto issueDto, String permission) {
+ private void loginAndAddProjectPermission(UserDto user, IssueDto issueDto, ProjectPermission permission) {
userSession.logIn(user).addProjectPermission(permission, dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid()).get());
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DoTransitionActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DoTransitionActionIT.java
index 1e2bbb79f2a..3a4805c777c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DoTransitionActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/DoTransitionActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.sonar.api.impl.utils.TestSystem2;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.utils.System2;
@@ -71,9 +71,9 @@ import static org.mockito.Mockito.verifyNoInteractions;
import static org.sonar.api.issue.Issue.STATUS_CONFIRMED;
import static org.sonar.api.issue.Issue.STATUS_OPEN;
import static org.sonar.api.rule.Severity.MAJOR;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/EditCommentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/EditCommentActionIT.java
index 4fb47f95a0f..8a932c3f800 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/EditCommentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/EditCommentActionIT.java
@@ -33,6 +33,7 @@ import org.sonar.db.DbTester;
import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.user.UserDto;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -51,8 +52,8 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public class EditCommentActionIT {
@@ -128,7 +129,7 @@ public class EditCommentActionIT {
IssueChangeDto commentDto = issueDbTester.insertComment(issueDto, null, "please fix it");
loginWithBrowsePermission(user, USER, issueDto);
- assertThatThrownBy(() -> call(commentDto.getKey(), "please have a look"))
+ assertThatThrownBy(() -> call(commentDto.getKey(), "please have a look"))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("You can only edit your own comments");
}
@@ -218,7 +219,7 @@ public class EditCommentActionIT {
return issueDbTester.insertIssue();
}
- private void loginWithBrowsePermission(UserDto user, String permission, IssueDto issueDto) {
+ private void loginWithBrowsePermission(UserDto user, ProjectPermission permission, IssueDto issueDto) {
userSession.logIn(user).addProjectPermission(permission,
dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid()).get(),
dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getComponentUuid()).get());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ListActionIT.java
index 389e71106f5..d108dc09dd4 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ListActionIT.java
@@ -32,7 +32,7 @@ import org.junit.runner.RunWith;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.Durations;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullActionIT.java
index 783e6e76195..8b6fa673272 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullActionIT.java
@@ -62,7 +62,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.ComponentTesting.newFileDto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullTaintActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullTaintActionIT.java
index ebda6513b12..df1cb973755 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullTaintActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/PullTaintActionIT.java
@@ -67,7 +67,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.groups.Tuple.tuple;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.protobuf.DbIssues.MessageFormattingType.CODE;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ReindexActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ReindexActionIT.java
index 9ce1775f34b..31a6f03598d 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ReindexActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/ReindexActionIT.java
@@ -22,7 +22,7 @@ package org.sonar.server.issue.ws;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.es.EsTester;
@@ -70,7 +70,7 @@ public class ReindexActionIT {
public void reindex_project() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
userSession.logIn().setSystemAdministrator();
- userSession.addProjectPermission(UserRole.ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project);
TestResponse response = tester.newRequest()
.setParam("project", project.getKey())
@@ -102,7 +102,7 @@ public class ReindexActionIT {
@Test
public void fail_if_not_authorized() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
TestRequest testRequest = tester.newRequest().setParam("project", project.getKey());
assertThatThrownBy(testRequest::execute)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java
index 372f88969fd..67199c026e2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java
@@ -67,7 +67,7 @@ import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock;
import static org.sonar.api.utils.DateUtils.addDays;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_02;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionFacetsIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionFacetsIT.java
index 3194ceb7d87..6249b00a829 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionFacetsIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionFacetsIT.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.config.Configuration;
import org.sonar.api.issue.Issue;
import org.sonar.api.resources.Languages;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.Durations;
import org.sonar.api.utils.System2;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java
index 4b4fb97231e..0fbb78a3287 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionIT.java
@@ -47,11 +47,10 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
import org.sonar.api.rules.CleanCodeAttributeCategory;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.Durations;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
@@ -67,6 +66,7 @@ import org.sonar.db.issue.IssueChangeDto;
import org.sonar.db.issue.IssueDto;
import org.sonar.db.issue.IssueFixedDto;
import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.protobuf.DbCommons;
import org.sonar.db.protobuf.DbIssues;
@@ -121,16 +121,16 @@ import static org.sonar.api.issue.Issue.STATUS_RESOLVED;
import static org.sonar.api.issue.Issue.STATUS_REVIEWED;
import static org.sonar.api.issue.impact.Severity.HIGH;
import static org.sonar.api.issue.impact.SoftwareQuality.SECURITY;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.api.server.ws.WebService.Param.FACETS;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.api.utils.DateUtils.parseDate;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.core.config.MQRModeConstants.MULTI_QUALITY_MODE_ENABLED;
import static org.sonar.db.component.ComponentQualifiers.UNIT_TEST_FILE;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.db.protobuf.DbIssues.MessageFormattingType.CODE;
import static org.sonar.db.rule.RuleDescriptionSectionDto.createDefaultRuleDescriptionSection;
import static org.sonar.db.rule.RuleTesting.XOO_X1;
@@ -205,7 +205,7 @@ class SearchActionIT {
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto projectDto = projectData.getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, projectDto);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, projectDto);
ComponentDto project = projectData.getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
@@ -233,8 +233,7 @@ class SearchActionIT {
assertThat(response.getIssuesList())
.extracting(
- Issue::getKey, Issue::getRule, Issue::getSeverity, Issue::getComponent, Issue::getResolution, Issue::getStatus, Issue::getMessage
- , Issue::getMessageFormattingsList,
+ Issue::getKey, Issue::getRule, Issue::getSeverity, Issue::getComponent, Issue::getResolution, Issue::getStatus, Issue::getMessage, Issue::getMessageFormattingsList,
Issue::getEffort, Issue::getAssignee, Issue::getAuthor, Issue::getLine, Issue::getHash, Issue::getTagsList,
Issue::getCreationDate, Issue::getUpdateDate,
Issue::getQuickFixAvailable, Issue::getCodeVariantsList)
@@ -399,7 +398,7 @@ class SearchActionIT {
assertThat(result.getIssuesCount()).isOne();
assertThat(result.getIssues(0).getFlows(0).getLocationsList()).extracting(Common.Location::getComponent, Common.Location::getMsg,
- Common.Location::getMsgFormattingsList)
+ Common.Location::getMsgFormattingsList)
.containsExactlyInAnyOrder(
tuple(file.getKey(), "FLOW MESSAGE", List.of()),
tuple(anotherFile.getKey(), "ANOTHER FLOW MESSAGE", List.of(Common.MessageFormatting.newBuilder()
@@ -522,8 +521,7 @@ class SearchActionIT {
c -> c.setKey("PROJECT_KEY").setName("NAME_PROJECT_ID").setLongName("LONG_NAME_PROJECT_ID").setLanguage("java"));
grantPermissionToAnyone(project.getProjectDto(), ISSUE_ADMIN);
indexPermissions();
- ComponentDto file =
- db.components().insertComponent(newFileDto(project.getMainBranchComponent(), null, "FILE_ID").setKey("FILE_KEY").setLanguage("js"));
+ ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent(), null, "FILE_ID").setKey("FILE_KEY").setLanguage("js"));
IssueDto issue = newIssue(newIssueRule(), project.getMainBranchComponent(), file)
.setKee("82fd47d4-b650-4037-80bc-7b112bd4eac2")
@@ -913,8 +911,7 @@ class SearchActionIT {
@Test
void issue_on_removed_file() {
RuleDto rule = newIssueRule();
- ComponentDto project =
- db.components().insertPublicProject("PROJECT_ID", c -> c.setKey("PROJECT_KEY").setKey("PROJECT_KEY")).getMainBranchComponent();
+ ComponentDto project = db.components().insertPublicProject("PROJECT_ID", c -> c.setKey("PROJECT_KEY").setKey("PROJECT_KEY")).getMainBranchComponent();
indexPermissions();
ComponentDto removedFile = db.components().insertComponent(newFileDto(project).setUuid("REMOVED_FILE_ID")
.setKey("REMOVED_FILE_KEY")
@@ -939,8 +936,7 @@ class SearchActionIT {
@Test
void apply_paging_with_one_component() {
RuleDto rule = newIssueRule();
- ComponentDto project =
- db.components().insertPublicProject("PROJECT_ID", c -> c.setKey("PROJECT_KEY").setKey("PROJECT_KEY")).getMainBranchComponent();
+ ComponentDto project = db.components().insertPublicProject("PROJECT_ID", c -> c.setKey("PROJECT_KEY").setKey("PROJECT_KEY")).getMainBranchComponent();
indexPermissions();
ComponentDto file = db.components().insertComponent(newFileDto(project, null, "FILE_ID").setKey("FILE_KEY"));
for (int i = 0; i < SearchOptions.MAX_PAGE_SIZE + 1; i++) {
@@ -1273,7 +1269,7 @@ class SearchActionIT {
assertThat(response.getIssuesList())
.extracting(Issue::getAuthor)
.containsExactlyInAnyOrder("", "");
- assertThat(response.getFacets().getFacetsList()).isEmpty();
+ assertThat(response.getFacets().getFacetsList()).isEmpty();
}
@Test
@@ -2294,7 +2290,8 @@ class SearchActionIT {
"additionalFields", "asc", "assigned", "assignees", "author", "components", "branch", "pullRequest", "createdAfter", "createdAt",
"createdBefore", "createdInLast", "directories", "facets", "files", "issues", "scopes", "languages", "onComponentOnly",
"p", "projects", "ps", "resolutions", "resolved", "rules", "s", "severities", "statuses", "tags", "types", "pciDss-3.2", "pciDss-4" +
- ".0", "owaspAsvs-4.0",
+ ".0",
+ "owaspAsvs-4.0",
"owaspAsvsLevel", "owaspTop10", "owaspTop10-2021", "stig-ASD_V5R3", "casa", "sansTop25", "cwe", "sonarsourceSecurity", "timeZone",
"inNewCodePeriod", "codeVariants",
"cleanCodeAttributeCategories", "impactSeverities", "impactSoftwareQualities", "issueStatuses", "fixedInPullRequest",
@@ -2562,7 +2559,7 @@ class SearchActionIT {
issueIndexer.indexAllIssues();
}
- private void grantPermissionToAnyone(ProjectDto project, String permission) {
+ private void grantPermissionToAnyone(ProjectDto project, ProjectPermission permission) {
dbClient.groupPermissionDao().insert(session,
new GroupPermissionDto()
.setUuid(Uuids.createFast())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java
index fe7fcae0415..cbd41ad685f 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java
@@ -42,6 +42,7 @@ import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.ImpactDto;
import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto;
@@ -77,12 +78,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
class SetSeverityActionIT {
@@ -394,7 +395,7 @@ class SetSeverityActionIT {
return request.execute();
}
- private void logInAndAddProjectPermission(IssueDto issueDto, String permission) {
+ private void logInAndAddProjectPermission(IssueDto issueDto, ProjectPermission permission) {
BranchDto branchDto = dbClient.branchDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find branch with uuid : %s", issueDto.getProjectUuid())));
UserDto user = dbTester.users().insertUser("john");
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTagsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTagsActionIT.java
index bf6d1fd6cb3..13e54528ada 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTagsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTagsActionIT.java
@@ -38,6 +38,7 @@ import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto;
@@ -68,9 +69,9 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newPublicProjectDto;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
public class SetTagsActionIT {
@@ -261,7 +262,7 @@ public class SetTagsActionIT {
.orElseThrow();
}
- private void logInAndAddProjectPermission(IssueDto issueDto, String permission) {
+ private void logInAndAddProjectPermission(IssueDto issueDto, ProjectPermission permission) {
UserDto user = db.users().insertUser("john");
ProjectDto projectDto = retrieveProjectDto(issueDto);
userSession.logIn(user)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java
index c782eecf0e3..f1750b94ef2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java
@@ -32,7 +32,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
@@ -46,6 +46,7 @@ import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto;
@@ -80,13 +81,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import static org.sonar.api.rule.Severity.MAJOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
@RunWith(DataProviderRunner.class)
public class SetTypeActionIT {
@@ -209,7 +210,7 @@ public class SetTypeActionIT {
public void fail_when_missing_browse_permission() {
IssueDto issueDto = issueDbTester.insertIssue();
String login = "john";
- String permission = ISSUE_ADMIN;
+ ProjectPermission permission = ISSUE_ADMIN;
logInAndAddProjectPermission(login, issueDto, permission);
assertThatThrownBy(() -> call(issueDto.getKey(), BUG.name()))
@@ -278,7 +279,7 @@ public class SetTypeActionIT {
.registerBranches(branchDto);
}
- private void logInAndAddProjectPermission(String login, IssueDto issueDto, String permission) {
+ private void logInAndAddProjectPermission(String login, IssueDto issueDto, ProjectPermission permission) {
BranchDto branchDto = dbClient.branchDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find branch with uuid : %s", issueDto.getProjectUuid())));
userSession.logIn(login)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionIT.java
index 8aeadec956c..a6c7a15b94b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionIT.java
@@ -24,17 +24,18 @@ import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.server.component.ComponentTypeTree;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
-import org.sonar.server.component.DefaultComponentTypes;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbTester;
import org.sonar.db.issue.AnticipatedTransitionDao;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.component.ComponentTypeTree;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.DefaultComponentTypes;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.tester.UserSessionRule;
import org.sonar.server.ws.TestRequest;
@@ -44,9 +45,9 @@ import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.db.component.ProjectTesting.newPrivateProjectDto;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
public class AnticipatedTransitionsActionIT {
@@ -57,7 +58,7 @@ public class AnticipatedTransitionsActionIT {
@Rule
public DbTester db = DbTester.create();
- private final ComponentFinder componentFinder = new ComponentFinder(db.getDbClient(), new ComponentTypes(new ComponentTypeTree[]{DefaultComponentTypes.get()}));
+ private final ComponentFinder componentFinder = new ComponentFinder(db.getDbClient(), new ComponentTypes(new ComponentTypeTree[] {DefaultComponentTypes.get()}));
private final AnticipatedTransitionsActionValidator validator = new AnticipatedTransitionsActionValidator(db.getDbClient(), componentFinder, userSession);
private final UuidFactory uuidFactory = new SequenceUuidFactory();
private final AnticipatedTransitionDao anticipatedTransitionDao = db.getDbClient().anticipatedTransitionDao();
@@ -97,9 +98,9 @@ public class AnticipatedTransitionsActionIT {
]</code></pre>""");
assertThat(definition.isPost()).isTrue();
assertThat(definition.isInternal()).isTrue();
- assertThat(definition.params()).extracting(WebService.Param::key, WebService.Param::isRequired, WebService.Param::description, WebService.Param::since).containsExactlyInAnyOrder(
- tuple("projectKey", true, "The key of the project", "10.2")
- );
+ assertThat(definition.params()).extracting(WebService.Param::key, WebService.Param::isRequired, WebService.Param::description, WebService.Param::since)
+ .containsExactlyInAnyOrder(
+ tuple("projectKey", true, "The key of the project", "10.2"));
}
@Test
@@ -220,7 +221,7 @@ public class AnticipatedTransitionsActionIT {
.setPayload(requestBody);
}
- private void mockUser(ProjectDto projectDto, String permission) {
+ private void mockUser(ProjectDto projectDto, ProjectPermission permission) {
UserDto user = db.users().insertUser();
db.users().insertProjectPermissionOnUser(user, permission, projectDto);
userSession.logIn(user);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/live/LiveMeasureTreeUpdaterImplIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/live/LiveMeasureTreeUpdaterImplIT.java
index e4dbb0202fb..faaf4201f42 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/live/LiveMeasureTreeUpdaterImplIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/live/LiveMeasureTreeUpdaterImplIT.java
@@ -28,7 +28,7 @@ import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.measures.Metric;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.BranchType;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java
index 0c1e7a36271..0aa8f7a5624 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java
@@ -51,12 +51,12 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.measures.CoreMetrics.RELIABILITY_ISSUES;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.SCAN;
-import static org.sonar.api.web.UserRole.USER;
import static org.sonar.db.component.BranchDto.DEFAULT_MAIN_BRANCH_NAME;
import static org.sonar.db.component.BranchType.PULL_REQUEST;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newProjectCopy;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.component.ws.MeasuresWsParameters.PARAM_ADDITIONAL_FIELDS;
import static org.sonar.server.component.ws.MeasuresWsParameters.PARAM_BRANCH;
import static org.sonar.server.component.ws.MeasuresWsParameters.PARAM_COMPONENT;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentTreeActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentTreeActionIT.java
index acd063a15b2..54ea579220e 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentTreeActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentTreeActionIT.java
@@ -73,7 +73,7 @@ import static org.sonar.api.measures.Metric.ValueType.INT;
import static org.sonar.api.measures.Metric.ValueType.RATING;
import static org.sonar.api.server.ws.WebService.Param.SORT;
import static org.sonar.api.utils.DateUtils.parseDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.PULL_REQUEST;
import static org.sonar.db.component.ComponentDbTester.toProjectDto;
import static org.sonar.db.component.ComponentQualifiers.APP;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchActionIT.java
index 587ec58355b..fc80616a584 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchActionIT.java
@@ -28,7 +28,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.metric.MetricDto;
@@ -71,9 +71,9 @@ public class SearchActionIT {
ComponentDto project2 = db.components().insertPrivateProject(p -> p.setKey("MY_PROJECT_2").setName("Project 2")).getMainBranchComponent();
ComponentDto project3 = db.components().insertPrivateProject(p -> p.setKey("MY_PROJECT_3").setName("Project 3")).getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project1);
- userSession.addProjectPermission(UserRole.USER, project2);
- userSession.addProjectPermission(UserRole.USER, project3);
+ userSession.addProjectPermission(ProjectPermission.USER, project1);
+ userSession.addProjectPermission(ProjectPermission.USER, project2);
+ userSession.addProjectPermission(ProjectPermission.USER, project3);
MetricDto complexity = db.measures().insertMetric(m -> m.setKey("complexity").setValueType(INT.name()));
db.measures().insertMeasure(project1, m -> m.addValue(complexity.getKey(), 12.0d));
@@ -104,7 +104,7 @@ public class SearchActionIT {
@Test
public void return_measures() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto coverage = db.measures().insertMetric(m -> m.setValueType(FLOAT.name()));
db.measures().insertMeasure(project, m -> m.addValue(coverage.getKey(), 15.5d));
@@ -120,7 +120,7 @@ public class SearchActionIT {
@Test
public void search_shouldReturnAcceptedIssuesMetric_whenIsCalledWithDeprecatedWontFixIssuesMetric() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto acceptedIssues = db.measures().insertMetric(m -> m.setValueType(INT.name())
.setKey("accepted_issues")
.setShortName("Accepted Issues"));
@@ -138,7 +138,7 @@ public class SearchActionIT {
@Test
public void return_best_value() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto matchBestValue = db.measures().insertMetric(m -> m.setValueType(FLOAT.name()).setBestValue(15.5d));
db.measures().insertMeasure(project, m -> m.addValue(matchBestValue.getKey(), 15.5d));
MetricDto doesNotMatchBestValue = db.measures().insertMetric(m -> m.setValueType(INT.name()).setBestValue(50d));
@@ -161,7 +161,7 @@ public class SearchActionIT {
@Test
public void return_measures_on_new_code_period() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto coverage = db.measures().insertMetric(m -> m.setKey("new_metric").setValueType(FLOAT.name()));
db.measures().insertMeasure(project, m -> m.addValue(coverage.getKey(), 10d));
@@ -182,9 +182,9 @@ public class SearchActionIT {
ComponentDto project1 = db.components().insertPrivateProject(p -> p.setName("C")).getMainBranchComponent();
ComponentDto project2 = db.components().insertPrivateProject(p -> p.setName("A")).getMainBranchComponent();
ComponentDto project3 = db.components().insertPrivateProject(p -> p.setName("B")).getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project1);
- userSession.addProjectPermission(UserRole.USER, project2);
- userSession.addProjectPermission(UserRole.USER, project3);
+ userSession.addProjectPermission(ProjectPermission.USER, project1);
+ userSession.addProjectPermission(ProjectPermission.USER, project2);
+ userSession.addProjectPermission(ProjectPermission.USER, project3);
db.measures().insertMeasure(project1, m -> m.addValue(coverage.getKey(), 5.5d));
db.measures().insertMeasure(project2, m -> m.addValue(coverage.getKey(), 6.5d));
db.measures().insertMeasure(project3, m -> m.addValue(coverage.getKey(), 7.5d));
@@ -203,7 +203,7 @@ public class SearchActionIT {
@Test
public void return_measures_on_view() {
ComponentDto view = db.components().insertPrivatePortfolio();
- userSession.addProjectPermission(UserRole.USER, view);
+ userSession.addProjectPermission(ProjectPermission.USER, view);
MetricDto coverage = db.measures().insertMetric(m -> m.setValueType(FLOAT.name()));
db.measures().insertMeasure(view, m -> m.addValue(coverage.getKey(), 15.5d));
@@ -219,7 +219,7 @@ public class SearchActionIT {
@Test
public void return_measures_on_application() {
ComponentDto application = db.components().insertPrivateApplication().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, application);
+ userSession.addProjectPermission(ProjectPermission.USER, application);
MetricDto coverage = db.measures().insertMetric(m -> m.setValueType(FLOAT.name()));
db.measures().insertMeasure(application, m -> m.addValue(coverage.getKey(), 15.5d));
@@ -236,8 +236,8 @@ public class SearchActionIT {
public void return_measures_on_sub_view() {
ComponentDto view = db.components().insertPrivatePortfolio();
ComponentDto subView = db.components().insertComponent(newSubPortfolio(view));
- userSession.addProjectPermission(UserRole.USER, view);
- userSession.addProjectPermission(UserRole.USER, subView);
+ userSession.addProjectPermission(ProjectPermission.USER, view);
+ userSession.addProjectPermission(ProjectPermission.USER, subView);
MetricDto metric = db.measures().insertMetric(m -> m.setValueType(FLOAT.name()));
db.measures().insertMeasure(subView, m -> m.addValue(metric.getKey(), 15.5d));
@@ -257,7 +257,7 @@ public class SearchActionIT {
ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent();
db.measures().insertMeasure(project1, m -> m.addValue(metric.getKey(), 15.5d));
db.measures().insertMeasure(project2, m -> m.addValue(metric.getKey(), 42.0d));
- Arrays.stream(new ComponentDto[] {project1}).forEach(p -> userSession.addProjectPermission(UserRole.USER, p));
+ Arrays.stream(new ComponentDto[] {project1}).forEach(p -> userSession.addProjectPermission(ProjectPermission.USER, p));
SearchWsResponse result = call(asList(project1.getKey(), project2.getKey()), singletonList(metric.getKey()));
@@ -270,7 +270,7 @@ public class SearchActionIT {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto branch = db.components().insertProjectBranch(project);
db.measures().insertMeasure(branch, m -> m.addValue(coverage.getKey(), 10d));
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
SearchWsResponse result = call(singletonList(branch.getKey()), singletonList(coverage.getKey()));
@@ -280,7 +280,7 @@ public class SearchActionIT {
@Test
public void fail_if_no_metric() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
assertThatThrownBy(() -> call(singletonList(project.uuid()), null))
.isInstanceOf(IllegalArgumentException.class)
@@ -290,7 +290,7 @@ public class SearchActionIT {
@Test
public void fail_if_empty_metric() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
assertThatThrownBy(() -> call(singletonList(project.uuid()), emptyList()))
.isInstanceOf(IllegalArgumentException.class)
@@ -300,7 +300,7 @@ public class SearchActionIT {
@Test
public void fail_if_unknown_metric() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto metric = db.measures().insertMetric();
assertThatThrownBy(() -> call(singletonList(project.getKey()), newArrayList("violations", metric.getKey(), "ncloc")))
@@ -354,7 +354,7 @@ public class SearchActionIT {
public void fail_if_directory() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto dir = db.components().insertComponent(newDirectory(project, "dir"));
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto metric = db.measures().insertMetric();
assertThatThrownBy(() -> call(singletonList(dir.getKey()), singletonList(metric.getKey())))
@@ -366,7 +366,7 @@ public class SearchActionIT {
public void fail_if_file() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
MetricDto metric = db.measures().insertMetric();
assertThatThrownBy(() -> call(singletonList(file.getKey()), singletonList(metric.getKey())))
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java
index 80b0965d1b2..4bcf2197152 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java
@@ -29,7 +29,7 @@ import org.sonar.api.measures.Metric.ValueType;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -107,7 +107,7 @@ class SearchHistoryActionIT {
public void setUp() {
project = db.components().insertPrivateProject();
analysis = db.components().insertSnapshot(project.getProjectDto());
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
nclocMetric = insertNclocMetric();
complexityMetric = insertComplexityMetric();
@@ -119,7 +119,7 @@ class SearchHistoryActionIT {
@Test
void empty_response() {
project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.projectKey())
@@ -140,7 +140,7 @@ class SearchHistoryActionIT {
void analyses_but_no_measure() {
project = db.components().insertPrivateProject();
analysis = db.components().insertSnapshot(project.getProjectDto());
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
SearchHistoryRequest request = SearchHistoryRequest.builder()
@@ -235,7 +235,7 @@ class SearchHistoryActionIT {
@Test
void pagination_applies_to_analyses() {
project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
List<String> analysisDates = LongStream.rangeClosed(1, 9)
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project.mainBranchUuid()).setCreatedAt(i * 1_000_000_000)))
@@ -260,7 +260,7 @@ class SearchHistoryActionIT {
@Test
void inclusive_from_and_to_dates() {
project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
List<String> analysisDates = LongStream.rangeClosed(1, 9)
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project.mainBranchUuid()).setCreatedAt(System2.INSTANCE.now() + i * 1_000_000_000L)))
@@ -328,7 +328,7 @@ class SearchHistoryActionIT {
@Test
void branch() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey("my_branch"));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.mainBranchUuid()));
@@ -352,7 +352,7 @@ class SearchHistoryActionIT {
@Test
void pull_request() {
ProjectData project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey("pr-123").setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.mainBranchUuid()));
@@ -387,7 +387,7 @@ class SearchHistoryActionIT {
@Test
void fail_if_not_enough_permissions() {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.projectKey())
.setMetrics(singletonList(complexityMetric.getKey()))
@@ -408,7 +408,7 @@ class SearchHistoryActionIT {
application.getProjectDto(),
project1.getProjectDto(),
project2.getProjectDto())
- .addProjectPermission(UserRole.USER, application.getProjectDto(), project1.getProjectDto());
+ .addProjectPermission(ProjectPermission.USER, application.getProjectDto(), project1.getProjectDto());
SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(application.projectKey())
@@ -434,7 +434,7 @@ class SearchHistoryActionIT {
void fail_when_component_is_removed() {
ProjectData projectData = db.components().insertPrivateProject();
db.components().insertComponent(newFileDto(project.getMainBranchComponent()).setKey("file-key").setEnabled(false));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_COMPONENT, "file-key")
@@ -448,7 +448,7 @@ class SearchHistoryActionIT {
void fail_if_branch_does_not_exist() {
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));
assertThatThrownBy(() -> ws.newRequest()
@@ -480,7 +480,7 @@ class SearchHistoryActionIT {
@Test
void json_example() {
project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
long now = parseDateTime("2017-01-23T17:00:53+0100").getTime();
LongStream.rangeClosed(0, 2)
@@ -521,10 +521,10 @@ class SearchHistoryActionIT {
@Test
void handle_shouldUpdateTelemetryProviders() {
PortfolioData portfolioData = db.components().insertPrivatePortfolioData();
- userSession.addPortfolioPermission(UserRole.USER, portfolioData.getPortfolioDto());
+ userSession.addPortfolioPermission(ProjectPermission.USER, portfolioData.getPortfolioDto());
project = db.components().insertPrivateProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
db.commit();
// Request for a portfolio
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ListActionIT.java
index a6384cc7bb8..4d68e4360bd 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ListActionIT.java
@@ -27,7 +27,7 @@ import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
@@ -122,7 +122,7 @@ public class ListActionIT {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
userSession.registerProjects(project);
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
ListWSResponse response = ws.newRequest()
.setParam("project", project.getKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/SetActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/SetActionIT.java
index 5cb712b30bd..0d0c0c4221e 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/SetActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/SetActionIT.java
@@ -30,7 +30,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.core.platform.EditionProvider;
import org.sonar.core.platform.PlatformEditionProvider;
@@ -458,7 +458,7 @@ public class SetActionIT {
}
private void logInAsProjectAdministrator(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
}
private void logInAsSystemAdministrator() {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ShowActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ShowActionIT.java
index 848e88b2185..f7327c19a84 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ShowActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/ShowActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
@@ -257,15 +257,15 @@ public class ShowActionIT {
}
private void logInAsProjectAdministrator(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
}
private void logInAsProjectScan(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.SCAN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.SCAN, project);
}
private void logInAsProjectIssueAdmin(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ISSUE_ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ISSUE_ADMIN, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/UnsetActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/UnsetActionIT.java
index c1666d4d254..7257a6ef223 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/UnsetActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/newcodeperiod/ws/UnsetActionIT.java
@@ -26,7 +26,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.core.platform.EditionProvider;
import org.sonar.core.platform.PlatformEditionProvider;
@@ -393,7 +393,7 @@ public class UnsetActionIT {
}
private void logInAsProjectAdministrator(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
}
private void logInAsSystemAdministrator() {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java
index bdc0e7c97f2..ace01dfb093 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java
@@ -49,7 +49,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newPortfolio;
import static org.sonar.server.notification.ws.NotificationsWsParameters.PARAM_CHANNEL;
import static org.sonar.server.notification.ws.NotificationsWsParameters.PARAM_LOGIN;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/ListActionIT.java
index a692e7dd63a..3a759421b2b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/ListActionIT.java
@@ -47,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
import static org.sonar.test.JsonAssert.assertJson;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddGroupActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddGroupActionIT.java
index 3c74c3f2e9c..915eb176521 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddGroupActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddGroupActionIT.java
@@ -20,23 +20,23 @@
package org.sonar.server.permission.ws;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService.Action;
-import org.sonar.api.web.UserRole;
import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.component.ComponentTesting;
-import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
+import org.sonar.server.common.management.ManagedInstanceChecker;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.exceptions.ServerException;
-import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl;
import org.sonar.server.ws.TestRequest;
@@ -110,7 +110,6 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
assertThat(db.users().selectGroupPermissions(group, null)).containsOnly("provisioning");
}
-
@Test
public void add_permission_to_project_referenced_by_its_id() {
GroupDto group = db.users().insertGroup("sonar-administrators");
@@ -219,13 +218,13 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
TestRequest request = newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
.setParam(PARAM_PROJECT_KEY, project.getKey())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey());
assertThatThrownBy(request::execute)
.isInstanceOf(IllegalStateException.class)
.hasMessage("Managed project");
- assertThat(db.users().selectGroupPermissions(group, project)).doesNotContain(UserRole.CODEVIEWER);
+ assertThat(db.users().selectGroupPermissions(group, project)).doesNotContain(ProjectPermission.CODEVIEWER.getKey());
}
@Test
@@ -234,7 +233,7 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
loginAsAdmin();
assertThatThrownBy(() -> {
- executeRequest(group, UserRole.ISSUE_ADMIN);
+ executeRequest(group, ProjectPermission.ISSUE_ADMIN.getKey());
})
.isInstanceOf(BadRequestException.class);
}
@@ -364,21 +363,21 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
public void adding_project_permission_is_allowed_to_project_administrators() {
GroupDto group = db.users().insertGroup("sonar-administrators");
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
- assertThat(db.users().selectGroupPermissions(group, project)).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectGroupPermissions(group, project)).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
public void fails_when_adding_any_permission_to_group_AnyOne_on_a_private_project() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
permissionService.getAllProjectPermissions()
.forEach(permission -> {
@@ -386,7 +385,7 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
newRequest()
.setParam(PARAM_GROUP_NAME, "anyone")
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, permission)
+ .setParam(PARAM_PERMISSION, permission.getKey())
.execute();
fail("a BadRequestException should have been raised for " + permission);
} catch (BadRequestException e) {
@@ -398,12 +397,12 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
@Test
public void no_effect_when_adding_USER_permission_to_group_AnyOne_on_a_public_project() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_GROUP_NAME, "anyone")
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey())
.execute();
assertThat(db.users().selectAnyonePermissions(project.getUuid())).isEmpty();
@@ -412,12 +411,12 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
@Test
public void no_effect_when_adding_CODEVIEWER_permission_to_group_AnyOne_on_a_public_project() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_GROUP_NAME, "anyone")
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey())
.execute();
assertThat(db.users().selectAnyonePermissions(project.getUuid())).isEmpty();
@@ -427,12 +426,12 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
public void no_effect_when_adding_USER_permission_to_group_on_a_public_project() {
GroupDto group = db.users().insertGroup();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey())
.execute();
assertThat(db.users().selectAnyonePermissions(project.getUuid())).isEmpty();
@@ -442,12 +441,12 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
public void no_effect_when_adding_CODEVIEWER_permission_to_group_on_a_public_project() {
GroupDto group = db.users().insertGroup();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey())
.execute();
assertThat(db.users().selectAnyonePermissions(project.getUuid())).isEmpty();
@@ -457,14 +456,15 @@ public class AddGroupActionIT extends BasePermissionWsIT<AddGroupAction> {
public void fail_when_using_branch_uuid() {
GroupDto group = db.users().insertGroup();
ComponentDto project = db.components().insertPublicProject().getMainBranchComponent();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
ComponentDto branch = db.components().insertProjectBranch(project);
- assertThatThrownBy(() -> newRequest()
+ var testRequest = newRequest()
.setParam(PARAM_PROJECT_ID, branch.uuid())
.setParam(PARAM_GROUP_NAME, group.getName())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
- .execute())
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey());
+
+ assertThatThrownBy(testRequest::execute)
.isInstanceOf(NotFoundException.class)
.hasMessage("Entity not found");
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java
index 337eb7ebc21..0094beccb07 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.server.component.ComponentTypes;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.component.ComponentDto;
import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.permission.GlobalPermission;
@@ -191,7 +191,7 @@ public class AddUserActionIT extends BasePermissionWsIT<AddUserAction> {
assertThatThrownBy(() -> {
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
})
.isInstanceOf(BadRequestException.class);
@@ -223,30 +223,30 @@ public class AddUserActionIT extends BasePermissionWsIT<AddUserAction> {
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.SCAN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.SCAN.getKey())
.execute();
assertThat(db.users().selectPermissionsOfUser(user)).isEmpty();
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(UserRole.SCAN);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(ProjectPermission.SCAN.getKey());
}
@Test
public void fail_when_project_is_managed_and_user_not_sysadmin() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
doThrow(new IllegalStateException("Managed project")).when(managedInstanceChecker).throwIfProjectIsManaged(any(), eq(project.getUuid()));
TestRequest request = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_KEY, project.getKey())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey());
assertThatThrownBy(request::execute)
.isInstanceOf(IllegalStateException.class)
.hasMessage("Managed project");
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).doesNotContain(UserRole.CODEVIEWER);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).doesNotContain(ProjectPermission.CODEVIEWER.getKey());
}
@Test
@@ -364,26 +364,26 @@ public class AddUserActionIT extends BasePermissionWsIT<AddUserAction> {
public void adding_project_permission_is_allowed_to_project_administrators() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_KEY, project.getKey())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
public void no_effect_when_adding_USER_permission_on_a_public_project() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey())
.execute();
assertThat(db.users().selectAnyonePermissions(project.getUuid())).isEmpty();
@@ -392,12 +392,12 @@ public class AddUserActionIT extends BasePermissionWsIT<AddUserAction> {
@Test
public void no_effect_when_adding_CODEVIEWER_permission_on_a_public_project() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey())
.execute();
assertThat(db.users().selectAnyonePermissions(project.getUuid())).isEmpty();
@@ -406,7 +406,7 @@ public class AddUserActionIT extends BasePermissionWsIT<AddUserAction> {
@Test
public void fail_when_using_branch_uuid() {
ComponentDto project = db.components().insertPublicProject().getMainBranchComponent();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
ComponentDto branch = db.components().insertProjectBranch(project);
TestRequest request = newRequest()
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/GroupsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/GroupsActionIT.java
index 60ae505a138..85eea064a88 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/GroupsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/GroupsActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Test;
import org.sonar.api.security.DefaultGroups;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService.Action;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.permission.GlobalPermission;
@@ -53,7 +53,7 @@ import static org.mockito.Mockito.when;
import static org.sonar.api.server.ws.WebService.Param.PAGE;
import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.test.JsonAssert.assertJson;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PROJECT_ID;
@@ -194,9 +194,9 @@ public class GroupsActionIT extends BasePermissionWsIT<GroupsAction> {
GroupDto groupWithoutPermission = db.users().insertGroup("group-without-permission");
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
String result = newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, project.getUuid())
.execute()
.getInput();
@@ -217,7 +217,7 @@ public class GroupsActionIT extends BasePermissionWsIT<GroupsAction> {
loginAsAdmin();
String result = newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, project.getUuid())
.setParam(TEXT_QUERY, "group-with")
.execute()
@@ -238,7 +238,7 @@ public class GroupsActionIT extends BasePermissionWsIT<GroupsAction> {
loginAsAdmin();
String result = newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, project.getUuid())
.execute()
.getInput();
@@ -270,7 +270,7 @@ public class GroupsActionIT extends BasePermissionWsIT<GroupsAction> {
loginAsAdmin();
String result = newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, "view-uuid")
.execute()
.getInput();
@@ -292,7 +292,7 @@ public class GroupsActionIT extends BasePermissionWsIT<GroupsAction> {
loginAsAdmin();
String result = newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, "view-uuid")
.execute()
.getInput();
@@ -365,7 +365,7 @@ public class GroupsActionIT extends BasePermissionWsIT<GroupsAction> {
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, branch.uuid())
.execute();
})
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveGroupActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveGroupActionIT.java
index 477d18260f8..76c708e8183 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveGroupActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveGroupActionIT.java
@@ -23,24 +23,24 @@ import com.tngtech.java.junit.dataprovider.DataProviderRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService.Action;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
import org.sonar.db.component.ComponentDto;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.GroupPermissionDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.common.management.ManagedInstanceChecker;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl;
import org.sonar.server.ws.TestRequest;
@@ -109,54 +109,54 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
public void wsAction_shouldRemoveProjectPermission() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
db.users().insertPermissionOnGroup(aGroup, GlobalPermission.ADMINISTER);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ADMIN, project);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ISSUE_ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ISSUE_ADMIN, project);
loginAsAdmin();
newRequest()
.setParam(PARAM_GROUP_NAME, aGroup.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.execute();
assertThat(db.users().selectGroupPermissions(aGroup, null)).containsOnly(GlobalPermission.ADMINISTER.getKey());
- assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
public void wsAction_whenUsingViewUuid_shouldRemovePermission() {
EntityDto portfolio = db.components().insertPrivatePortfolioDto();
db.users().insertPermissionOnGroup(aGroup, GlobalPermission.ADMINISTER);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ADMIN, portfolio);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ISSUE_ADMIN, portfolio);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ADMIN, portfolio);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ISSUE_ADMIN, portfolio);
loginAsAdmin();
newRequest()
.setParam(PARAM_GROUP_NAME, aGroup.getName())
.setParam(PARAM_PROJECT_ID, portfolio.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.execute();
assertThat(db.users().selectGroupPermissions(aGroup, null)).containsOnly(GlobalPermission.ADMINISTER.getKey());
- assertThat(db.users().selectGroupPermissions(aGroup, portfolio)).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectGroupPermissions(aGroup, portfolio)).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
public void wsAction_whenUsingProjectKey_shouldRemovePermission() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
db.users().insertPermissionOnGroup(aGroup, GlobalPermission.ADMINISTER);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ADMIN, project);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ISSUE_ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ISSUE_ADMIN, project);
loginAsAdmin();
newRequest()
.setParam(PARAM_GROUP_NAME, aGroup.getName())
.setParam(PARAM_PROJECT_KEY, project.getKey())
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.execute();
assertThat(db.users().selectGroupPermissions(aGroup, null)).containsOnly(GlobalPermission.ADMINISTER.getKey());
- assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
@@ -165,8 +165,7 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
db.users().insertPermissionOnGroup(aGroup, GlobalPermission.PROVISION_PROJECTS);
loginAsAdmin();
- String administerPermission = GlobalPermission.ADMINISTER.getKey();
- assertThatThrownBy(() -> executeRequest(aGroup, administerPermission))
+ assertThatThrownBy(() -> executeRequest(aGroup, GlobalPermission.ADMINISTER))
.isInstanceOf(BadRequestException.class)
.hasMessage("Last group with permission 'admin'. Permission cannot be removed.");
}
@@ -189,7 +188,7 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
public void wsAction_whenUsingProjectPermissionWithoutProject_shouldFail() {
loginAsAdmin();
- assertThatThrownBy(() -> executeRequest(aGroup, UserRole.ISSUE_ADMIN))
+ assertThatThrownBy(() -> executeRequest(aGroup, ProjectPermission.ISSUE_ADMIN))
.isInstanceOf(BadRequestException.class)
.hasMessage("Invalid global permission 'issueadmin'. Valid values are [admin, gateadmin, profileadmin, provisioning, scan]");
}
@@ -232,7 +231,7 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
@Test
public void wsAction_whenGroupAndProjectAreManaged_shouldFailAndNotRemovePermissions() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.CODEVIEWER, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.CODEVIEWER, project);
doThrow(new IllegalStateException("Managed project and group")).when(managedInstanceChecker).throwIfGroupAndProjectAreManaged(any(), eq(aGroup.getUuid()), eq(project.getUuid()));
@@ -245,7 +244,7 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
.isInstanceOf(IllegalStateException.class)
.hasMessage("Managed project and group");
- assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(UserRole.CODEVIEWER);
+ assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
@@ -286,6 +285,14 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
.hasMessage("Project id or project key can be provided, not both.");
}
+ private void executeRequest(GroupDto groupDto, ProjectPermission permission) {
+ executeRequest(groupDto, permission.getKey());
+ }
+
+ private void executeRequest(GroupDto groupDto, GlobalPermission permission) {
+ executeRequest(groupDto, permission.getKey());
+ }
+
private void executeRequest(GroupDto groupDto, String permission) {
newRequest()
.setParam(PARAM_GROUP_NAME, groupDto.getName())
@@ -322,17 +329,17 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
@Test
public void wsAction_whenRemovingProjectPermissionAsProjectAdminButNotSystemAdmin_shouldRemovePermission() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.CODEVIEWER, project);
- db.users().insertEntityPermissionOnGroup(aGroup, UserRole.ISSUE_ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.CODEVIEWER, project);
+ db.users().insertEntityPermissionOnGroup(aGroup, ProjectPermission.ISSUE_ADMIN, project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_GROUP_NAME, aGroup.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
- assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(UserRole.CODEVIEWER);
+ assertThat(db.users().selectGroupPermissions(aGroup, project)).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
@@ -340,29 +347,29 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
permissionService.getAllProjectPermissions()
.forEach(perm -> unsafeInsertProjectPermissionOnAnyone(perm, project));
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
permissionService.getAllProjectPermissions()
.forEach(permission -> {
newRequest()
.setParam(PARAM_GROUP_NAME, "anyone")
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, permission)
+ .setParam(PARAM_PERMISSION, permission.getKey())
.execute();
- assertThat(db.users().selectAnyonePermissions(project.getUuid())).contains(permission);
+ assertThat(db.users().selectAnyonePermissions(project.getUuid())).contains(permission.getKey());
});
}
@Test
public void wsAction_whenRemovingBrowsePermissionFromGroupAnyoneOnPublicProject_shouldFail() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = newRequest()
.setParam(PARAM_GROUP_NAME, "anyone")
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -372,12 +379,12 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
@Test
public void wsAction_whenRemovingCodeviewerPermissionFromGroupAnyoneOnPublicProject_shouldFail() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = newRequest()
.setParam(PARAM_GROUP_NAME, "anyone")
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -388,12 +395,12 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
public void wsAction_whenRemovingBrowsePermissionFromGroupOnPublicProject_shouldFail() {
GroupDto group = db.users().insertGroup();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -404,12 +411,12 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
public void wsAction_whenRemovingCodeviewerPermissionFromGroupOnPublicProject() {
GroupDto group = db.users().insertGroup();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -420,7 +427,7 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
public void wsAction_whenUsingBranchUuid_shouldFail() {
GroupDto group = db.users().insertGroup();
ComponentDto project = db.components().insertPublicProject().getMainBranchComponent();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
ComponentDto branch = db.components().insertProjectBranch(project);
TestRequest testRequest = newRequest()
@@ -438,10 +445,10 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser();
GroupDto projectAdminGroup = db.users().insertGroup();
- db.users().insertEntityPermissionOnGroup(projectAdminGroup, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(projectAdminGroup, UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(projectAdminGroup, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(projectAdminGroup, ProjectPermission.ADMIN, project);
- userSession.logIn(user).setGroups(projectAdminGroup).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(user).setGroups(projectAdminGroup).addProjectPermission(ProjectPermission.ADMIN, project);
assertThatThrownBy(() -> removeBrowsePermissionFromGroup(project, projectAdminGroup))
.isInstanceOf(BadRequestException.class)
@@ -454,16 +461,16 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
UserDto user = db.users().insertUser();
GroupDto projectAdminGroup = db.users().insertGroup();
GroupDto otherProjectAdminGroup = db.users().insertGroup();
- db.users().insertEntityPermissionOnGroup(projectAdminGroup, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(projectAdminGroup, UserRole.ADMIN, project);
- db.users().insertEntityPermissionOnGroup(otherProjectAdminGroup, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(otherProjectAdminGroup, UserRole.ADMIN, project);
- userSession.logIn(user).setGroups(projectAdminGroup, otherProjectAdminGroup).addProjectPermission(UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(projectAdminGroup, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(projectAdminGroup, ProjectPermission.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(otherProjectAdminGroup, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(otherProjectAdminGroup, ProjectPermission.ADMIN, project);
+ userSession.logIn(user).setGroups(projectAdminGroup, otherProjectAdminGroup).addProjectPermission(ProjectPermission.ADMIN, project);
removeBrowsePermissionFromGroup(project, projectAdminGroup);
- assertThat(db.users().selectGroupPermissions(projectAdminGroup, project)).containsOnly(UserRole.ADMIN);
- assertThat(db.users().selectGroupPermissions(otherProjectAdminGroup, project)).containsExactlyInAnyOrder(UserRole.USER, UserRole.ADMIN);
+ assertThat(db.users().selectGroupPermissions(projectAdminGroup, project)).containsOnly(ProjectPermission.ADMIN.getKey());
+ assertThat(db.users().selectGroupPermissions(otherProjectAdminGroup, project)).containsExactlyInAnyOrder(ProjectPermission.USER.getKey(), ProjectPermission.ADMIN.getKey());
}
@Test
@@ -472,29 +479,29 @@ public class RemoveGroupActionIT extends BasePermissionWsIT<RemoveGroupAction> {
UserDto user = db.users().insertUser();
GroupDto projectAdminGroup = db.users().insertGroup();
db.users().insertMember(projectAdminGroup, user);
- db.users().insertEntityPermissionOnGroup(projectAdminGroup, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(projectAdminGroup, UserRole.ADMIN, project);
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project);
- userSession.logIn(user).addProjectPermission(UserRole.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(projectAdminGroup, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(projectAdminGroup, ProjectPermission.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project);
+ userSession.logIn(user).addProjectPermission(ProjectPermission.ADMIN, project);
removeBrowsePermissionFromGroup(project, projectAdminGroup);
- assertThat(db.users().selectGroupPermissions(projectAdminGroup, project)).containsOnly(UserRole.ADMIN);
+ assertThat(db.users().selectGroupPermissions(projectAdminGroup, project)).containsOnly(ProjectPermission.ADMIN.getKey());
}
private void removeBrowsePermissionFromGroup(ProjectDto project, GroupDto projectAdminGroup) {
newRequest()
.setParam(PARAM_PROJECT_ID, project.getUuid())
.setParam(PARAM_GROUP_NAME, projectAdminGroup.getName())
- .setParam(PARAM_PERMISSION, UserRole.USER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey())
.execute();
}
- private void unsafeInsertProjectPermissionOnAnyone(String perm, ProjectDto project) {
+ private void unsafeInsertProjectPermissionOnAnyone(ProjectPermission perm, ProjectDto project) {
GroupPermissionDto dto = new GroupPermissionDto()
.setUuid(Uuids.createFast())
.setGroupUuid(null)
- .setRole(perm)
+ .setRole(perm.getKey())
.setEntityUuid(project.getUuid())
.setEntityName(project.getName());
db.getDbClient().groupPermissionDao().insert(db.getSession(), dto, project, null);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveUserActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveUserActionIT.java
index 35f8c85ed32..75875875daa 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveUserActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/RemoveUserActionIT.java
@@ -21,10 +21,10 @@ package org.sonar.server.permission.ws;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.api.web.UserRole;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
@@ -143,9 +143,9 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
GroupDto projectAdmins = createGroupAndAddUser(admin, userSessionRule);
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(admin, UserRole.USER, project);
- db.users().insertEntityPermissionOnGroup(projectAdmins, UserRole.USER, project);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(admin, ProjectPermission.USER, project);
+ db.users().insertEntityPermissionOnGroup(projectAdmins, ProjectPermission.USER, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest request = removeBrowseRight(project);
@@ -178,7 +178,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
return newRequest()
.setParam(PARAM_USER_LOGIN, userSession.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey());
}
@Test
@@ -188,7 +188,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
TestRequest testRequest = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
- .setParam(PARAM_PERMISSION, UserRole.ADMIN);
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -198,49 +198,49 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
@Test
public void wsAction_whenProject_shouldRemovePermission() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
loginAsAdmin();
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey())
.execute();
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(UserRole.ISSUE_ADMIN);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
}
@Test
public void wsAction_whenUsingProjectKey_shouldRemovePermission() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
loginAsAdmin();
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_KEY, project.getKey())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(UserRole.CODEVIEWER);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
public void wsAction_whenUsingViewUuid_shouldRemovePermission() {
ComponentDto view = db.components().insertPrivatePortfolio();
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, view);
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, view);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, view);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, view);
loginAsAdmin();
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_KEY, view.getKey())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
- assertThat(db.users().selectEntityPermissionOfUser(user, view.uuid())).containsOnly(UserRole.ADMIN);
+ assertThat(db.users().selectEntityPermissionOfUser(user, view.uuid())).containsOnly(ProjectPermission.ADMIN.getKey());
}
@Test
@@ -250,7 +250,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
TestRequest testRequest = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, "unknown-project-uuid")
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN);
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(NotFoundException.class);
@@ -262,7 +262,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
TestRequest testRequest = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN);
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class);
@@ -308,7 +308,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
@Test
public void wsAction_whenProjectAndUserAreManaged_shouldThrowAndNotRemovePermissions() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
doThrow(new IllegalStateException("Managed project")).when(managedInstanceChecker).throwIfUserAndProjectAreManaged(any(), eq(user.getUuid()), eq(project.getUuid()));
@@ -316,13 +316,13 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
TestRequest request = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey());
assertThatThrownBy(request::execute)
.isInstanceOf(IllegalStateException.class)
.hasMessage("Managed project");
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(UserRole.CODEVIEWER);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
@@ -393,7 +393,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
TestRequest testRequest = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_KEY, project.getKey());
assertThatThrownBy(testRequest::execute)
@@ -406,28 +406,28 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
@Test
public void wsAction_whenProjectPermissionAndProjectAdmin_shouldRemovePermission() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.execute();
- assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(UserRole.CODEVIEWER);
+ assertThat(db.users().selectEntityPermissionOfUser(user, project.getUuid())).containsOnly(ProjectPermission.CODEVIEWER.getKey());
}
@Test
public void wsAction_whenBrowsePermissionAndPublicProject_shouldFail() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.USER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -438,12 +438,12 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
@Test
public void wsAction_whenCodeviewerPermissionAndPublicProject_shouldFail() {
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PROJECT_ID, project.getUuid())
- .setParam(PARAM_PERMISSION, UserRole.CODEVIEWER);
+ .setParam(PARAM_PERMISSION, ProjectPermission.CODEVIEWER.getKey());
assertThatThrownBy(testRequest::execute)
.isInstanceOf(BadRequestException.class)
@@ -453,7 +453,7 @@ public class RemoveUserActionIT extends BasePermissionWsIT<RemoveUserAction> {
@Test
public void wsAction_whenUsingBranchUuid_shouldFail() {
ComponentDto project = db.components().insertPublicProject().getMainBranchComponent();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
ComponentDto branch = db.components().insertProjectBranch(project);
TestRequest testRequest = newRequest()
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java
index 7f17f9e45b4..38ff869f905 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java
@@ -23,7 +23,7 @@ import java.util.Set;
import org.junit.Test;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.server.ws.WebService.SelectionMode;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentQualifiers;
@@ -106,19 +106,19 @@ public class UsersActionIT extends BasePermissionWsIT<UsersAction> {
// User has permission on project
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser(newUserDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
// User has permission on another project
ProjectDto anotherProject = db.components().insertPrivateProject().getProjectDto();
UserDto userHavePermissionOnAnotherProject = db.users().insertUser(newUserDto());
- db.users().insertProjectPermissionOnUser(userHavePermissionOnAnotherProject, UserRole.ISSUE_ADMIN, anotherProject);
+ db.users().insertProjectPermissionOnUser(userHavePermissionOnAnotherProject, ProjectPermission.ISSUE_ADMIN, anotherProject);
// User has no permission
UserDto withoutPermission = db.users().insertUser(newUserDto());
- userSession.logIn().addProjectPermission(GlobalPermission.ADMINISTER.getKey(), project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
String result = newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.setParam(PARAM_PROJECT_ID, project.getUuid())
.execute()
.getInput();
@@ -133,7 +133,7 @@ public class UsersActionIT extends BasePermissionWsIT<UsersAction> {
// User with permission on project
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser(newUserDto("with-permission-login", "with-permission-name", "with-permission-email"));
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
// User without permission
UserDto withoutPermission = db.users().insertUser(newUserDto("without-permission-login", "without-permission-name", "without-permission-email"));
@@ -154,7 +154,7 @@ public class UsersActionIT extends BasePermissionWsIT<UsersAction> {
// User with permission on project
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser(newUserDto("with-permission-login", "with-permission-name", "with-permission-email"));
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
// User without permission
UserDto withoutPermission = db.users().insertUser(newUserDto("without-permission-login", "without-permission-name", "without-permission-email"));
@@ -171,7 +171,7 @@ public class UsersActionIT extends BasePermissionWsIT<UsersAction> {
// User with permission on project
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
UserDto user = db.users().insertUser(newUserDto("with-permission-login", "with-permission-name", "with-permission-email"));
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project);
// User without permission
UserDto withoutPermission = db.users().insertUser(newUserDto("without-permission-login", "without-permission-name", "without-permission-email"));
@@ -277,7 +277,7 @@ public class UsersActionIT extends BasePermissionWsIT<UsersAction> {
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ISSUE_ADMIN.getKey())
.setParam(Param.SELECTED, SelectionMode.ALL.value())
.execute();
})
@@ -336,8 +336,8 @@ public class UsersActionIT extends BasePermissionWsIT<UsersAction> {
UserDto user = db.users().insertUser(newUserDto());
ProjectData project = db.components().insertPublicProject();
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project.getProjectDto());
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
assertThatThrownBy(() -> {
newRequest()
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddGroupToTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddGroupToTemplateActionIT.java
index 08907248d1a..544b77e44f2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddGroupToTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddGroupToTemplateActionIT.java
@@ -23,15 +23,15 @@ import java.util.List;
import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService.Action;
-import org.sonar.api.web.UserRole;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.GroupDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -45,10 +45,10 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.security.DefaultGroups.ANYONE;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
@@ -100,7 +100,7 @@ public class AddGroupToTemplateActionIT extends BasePermissionWsIT<AddGroupToTem
newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
- .setParam(PARAM_PERMISSION, CODEVIEWER)
+ .setParam(PARAM_PERMISSION, CODEVIEWER.getKey())
.setParam(PARAM_TEMPLATE_NAME, template.getName().toUpperCase())
.execute();
@@ -132,7 +132,7 @@ public class AddGroupToTemplateActionIT extends BasePermissionWsIT<AddGroupToTem
assertThatThrownBy(() -> newRequest(ANYONE, template.getUuid(), ADMIN))
.isInstanceOf(BadRequestException.class)
- .hasMessage(String.format("It is not possible to add the '%s' permission to the group 'Anyone'.", UserRole.ADMIN));
+ .hasMessage(String.format("It is not possible to add the '%s' permission to the group 'Anyone'.", ProjectPermission.ADMIN));
}
@Test
@@ -163,7 +163,7 @@ public class AddGroupToTemplateActionIT extends BasePermissionWsIT<AddGroupToTem
public void fail_if_permission_missing() {
loginAsAdmin();
- assertThatThrownBy(() -> newRequest(group.getName(), template.getUuid(), null))
+ assertThatThrownBy(() -> newRequest(group.getName(), template.getUuid(), (String) null))
.isInstanceOf(IllegalArgumentException.class);
}
@@ -193,6 +193,10 @@ public class AddGroupToTemplateActionIT extends BasePermissionWsIT<AddGroupToTem
.hasMessage("Permission template with id 'unknown-key' is not found");
}
+ private void newRequest(@Nullable String groupName, @Nullable String templateKey, ProjectPermission permission) {
+ newRequest(groupName, templateKey, permission.getKey());
+ }
+
private void newRequest(@Nullable String groupName, @Nullable String templateKey, @Nullable String permission) {
TestRequest request = newRequest();
if (groupName != null) {
@@ -208,7 +212,7 @@ public class AddGroupToTemplateActionIT extends BasePermissionWsIT<AddGroupToTem
request.execute();
}
- private List<String> getGroupNamesInTemplateAndPermission(PermissionTemplateDto template, String permission) {
+ private List<String> getGroupNamesInTemplateAndPermission(PermissionTemplateDto template, ProjectPermission permission) {
PermissionQuery query = PermissionQuery.builder().setPermission(permission).build();
return db.getDbClient().permissionTemplateDao()
.selectGroupNamesByQueryAndTemplate(db.getSession(), query, template.getUuid());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddProjectCreatorToTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddProjectCreatorToTemplateActionIT.java
index a7acb89ca58..9ce4d0b92e3 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddProjectCreatorToTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddProjectCreatorToTemplateActionIT.java
@@ -22,14 +22,14 @@ package org.sonar.server.permission.ws.template;
import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.permission.PermissionService;
@@ -72,11 +72,11 @@ public class AddProjectCreatorToTemplateActionIT extends BasePermissionWsIT<AddP
loginAsAdmin();
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.execute();
- assertThatProjectCreatorIsPresentFor(UserRole.ADMIN, template.getUuid());
+ assertThatProjectCreatorIsPresentFor(ProjectPermission.ADMIN, template.getUuid());
}
@Test
@@ -86,7 +86,7 @@ public class AddProjectCreatorToTemplateActionIT extends BasePermissionWsIT<AddP
new PermissionTemplateCharacteristicDto()
.setUuid(Uuids.createFast())
.setTemplateUuid(template.getUuid())
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setWithProjectCreator(false)
.setCreatedAt(1_000_000_000L)
.setUpdatedAt(1_000_000_000L),
@@ -95,11 +95,11 @@ public class AddProjectCreatorToTemplateActionIT extends BasePermissionWsIT<AddP
when(system.now()).thenReturn(3_000_000_000L);
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.USER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey())
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.execute();
- assertThatProjectCreatorIsPresentFor(UserRole.USER, template.getUuid());
+ assertThatProjectCreatorIsPresentFor(ProjectPermission.USER, template.getUuid());
PermissionTemplateCharacteristicDto reloaded = reload(characteristic);
assertThat(reloaded.getCreatedAt()).isEqualTo(1_000_000_000L);
assertThat(reloaded.getUpdatedAt()).isEqualTo(3_000_000_000L);
@@ -111,7 +111,7 @@ public class AddProjectCreatorToTemplateActionIT extends BasePermissionWsIT<AddP
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, "42")
.execute();
})
@@ -137,14 +137,14 @@ public class AddProjectCreatorToTemplateActionIT extends BasePermissionWsIT<AddP
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.execute();
})
.isInstanceOf(ForbiddenException.class);
}
- private void assertThatProjectCreatorIsPresentFor(String permission, String templateUuid) {
+ private void assertThatProjectCreatorIsPresentFor(ProjectPermission permission, String templateUuid) {
Optional<PermissionTemplateCharacteristicDto> templatePermission = db.getDbClient().permissionTemplateCharacteristicDao().selectByPermissionAndTemplateId(db.getSession(),
permission,
templateUuid);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddUserToTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddUserToTemplateActionIT.java
index 1bd85e4ecf4..d00548bf023 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddUserToTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/AddUserToTemplateActionIT.java
@@ -24,11 +24,13 @@ import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -40,10 +42,10 @@ import org.sonar.server.ws.TestRequest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME;
@@ -83,7 +85,7 @@ public class AddUserToTemplateActionIT extends BasePermissionWsIT<AddUserToTempl
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
- .setParam(PARAM_PERMISSION, CODEVIEWER)
+ .setParam(PARAM_PERMISSION, CODEVIEWER.getKey())
.setParam(PARAM_TEMPLATE_NAME, permissionTemplate.getName().toUpperCase())
.execute();
@@ -105,7 +107,7 @@ public class AddUserToTemplateActionIT extends BasePermissionWsIT<AddUserToTempl
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(user.getLogin(), permissionTemplate.getUuid(), PROVISION_PROJECTS.getKey());
+ newRequest(user.getLogin(), permissionTemplate.getUuid(), PROVISION_PROJECTS);
})
.isInstanceOf(IllegalArgumentException.class);
}
@@ -135,7 +137,7 @@ public class AddUserToTemplateActionIT extends BasePermissionWsIT<AddUserToTempl
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(user.getLogin(), permissionTemplate.getUuid(), null);
+ newRequest(user.getLogin(), permissionTemplate.getUuid(), (String) null);
})
.isInstanceOf(IllegalArgumentException.class);
}
@@ -171,6 +173,14 @@ public class AddUserToTemplateActionIT extends BasePermissionWsIT<AddUserToTempl
.hasMessage("Permission template with id 'unknown-key' is not found");
}
+ private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable ProjectPermission permission) {
+ newRequest(userLogin, templateKey, permission != null ? permission.getKey() : null);
+ }
+
+ private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable GlobalPermission permission) {
+ newRequest(userLogin, templateKey, permission != null ? permission.getKey() : null);
+ }
+
private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable String permission) {
TestRequest request = newRequest();
if (userLogin != null) {
@@ -186,7 +196,7 @@ public class AddUserToTemplateActionIT extends BasePermissionWsIT<AddUserToTempl
request.execute();
}
- private List<String> getLoginsInTemplateAndPermission(PermissionTemplateDto template, String permission) {
+ private List<String> getLoginsInTemplateAndPermission(PermissionTemplateDto template, ProjectPermission permission) {
PermissionQuery permissionQuery = PermissionQuery.builder().setPermission(permission).build();
return db.getDbClient().permissionTemplateDao()
.selectUserLoginsByQueryAndTemplate(db.getSession(), permissionQuery, template.getUuid());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/ApplyTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/ApplyTemplateActionIT.java
index 8b07cbb4c04..1dc6258f976 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/ApplyTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/ApplyTemplateActionIT.java
@@ -24,25 +24,25 @@ import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbTester;
-import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.common.management.ManagedInstanceChecker;
+import org.sonar.server.common.permission.DefaultTemplatesResolver;
+import org.sonar.server.common.permission.DefaultTemplatesResolverImpl;
+import org.sonar.server.common.permission.PermissionTemplateService;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.es.TestIndexers;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
-import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.management.ManagedProjectService;
-import org.sonar.server.common.permission.DefaultTemplatesResolver;
-import org.sonar.server.common.permission.DefaultTemplatesResolverImpl;
-import org.sonar.server.common.permission.PermissionTemplateService;
import org.sonar.server.permission.ws.BasePermissionWsIT;
import org.sonar.server.ws.TestRequest;
@@ -95,22 +95,22 @@ public class ApplyTemplateActionIT extends BasePermissionWsIT<ApplyTemplateActio
// template 1
template1 = db.permissionTemplates().insertTemplate();
- addUserToTemplate(user1, template1, UserRole.CODEVIEWER);
- addUserToTemplate(user2, template1, UserRole.ISSUE_ADMIN);
- addGroupToTemplate(group1, template1, UserRole.ADMIN);
- addGroupToTemplate(group2, template1, UserRole.USER);
+ addUserToTemplate(user1, template1, ProjectPermission.CODEVIEWER);
+ addUserToTemplate(user2, template1, ProjectPermission.ISSUE_ADMIN);
+ addGroupToTemplate(group1, template1, ProjectPermission.ADMIN);
+ addGroupToTemplate(group2, template1, ProjectPermission.USER);
// template 2
PermissionTemplateDto template2 = db.permissionTemplates().insertTemplate();
- addUserToTemplate(user1, template2, UserRole.USER);
- addUserToTemplate(user2, template2, UserRole.USER);
- addGroupToTemplate(group1, template2, UserRole.USER);
- addGroupToTemplate(group2, template2, UserRole.USER);
+ addUserToTemplate(user1, template2, ProjectPermission.USER);
+ addUserToTemplate(user2, template2, ProjectPermission.USER);
+ addGroupToTemplate(group1, template2, ProjectPermission.USER);
+ addGroupToTemplate(group2, template2, ProjectPermission.USER);
project = db.components().insertPrivateProject().getProjectDto();
- db.users().insertProjectPermissionOnUser(user1, UserRole.ADMIN, project);
- db.users().insertProjectPermissionOnUser(user2, UserRole.ADMIN, project);
- db.users().insertEntityPermissionOnGroup(group1, UserRole.ADMIN, project);
- db.users().insertEntityPermissionOnGroup(group2, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user1, ProjectPermission.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user2, ProjectPermission.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(group1, ProjectPermission.ADMIN, project);
+ db.users().insertEntityPermissionOnGroup(group2, ProjectPermission.ADMIN, project);
}
@Test
@@ -217,11 +217,11 @@ public class ApplyTemplateActionIT extends BasePermissionWsIT<ApplyTemplateActio
}
private void assertTemplate1AppliedToProject() {
- assertThat(selectProjectPermissionGroups(project, UserRole.ADMIN)).containsExactly(group1.getName());
- assertThat(selectProjectPermissionGroups(project, UserRole.USER)).containsExactly(group2.getName());
- assertThat(selectProjectPermissionUsers(project, UserRole.ADMIN)).isEmpty();
- assertThat(selectProjectPermissionUsers(project, UserRole.CODEVIEWER)).containsExactly(user1.getUuid());
- assertThat(selectProjectPermissionUsers(project, UserRole.ISSUE_ADMIN)).containsExactly(user2.getUuid());
+ assertThat(selectProjectPermissionGroups(project, ProjectPermission.ADMIN)).containsExactly(group1.getName());
+ assertThat(selectProjectPermissionGroups(project, ProjectPermission.USER)).containsExactly(group2.getName());
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.CODEVIEWER)).containsExactly(user1.getUuid());
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.ISSUE_ADMIN)).containsExactly(user2.getUuid());
}
private void newRequest(@Nullable String templateUuid, @Nullable String projectUuid, @Nullable String projectKey) {
@@ -238,24 +238,24 @@ public class ApplyTemplateActionIT extends BasePermissionWsIT<ApplyTemplateActio
request.execute();
}
- private void addUserToTemplate(UserDto user, PermissionTemplateDto permissionTemplate, String permission) {
+ private void addUserToTemplate(UserDto user, PermissionTemplateDto permissionTemplate, ProjectPermission permission) {
db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), permissionTemplate.getUuid(), user.getUuid(),
permission, permissionTemplate.getName(), user.getLogin());
db.commit();
}
- private void addGroupToTemplate(GroupDto group, PermissionTemplateDto permissionTemplate, String permission) {
+ private void addGroupToTemplate(GroupDto group, PermissionTemplateDto permissionTemplate, ProjectPermission permission) {
db.getDbClient().permissionTemplateDao().insertGroupPermission(db.getSession(), permissionTemplate.getUuid(), group.getUuid(),
permission, permissionTemplate.getName(), group.getName());
db.commit();
}
- private List<String> selectProjectPermissionGroups(EntityDto entity, String permission) {
+ private List<String> selectProjectPermissionGroups(EntityDto entity, ProjectPermission permission) {
PermissionQuery query = PermissionQuery.builder().setPermission(permission).setEntity(entity).build();
return db.getDbClient().groupPermissionDao().selectGroupNamesByQuery(db.getSession(), query);
}
- private List<String> selectProjectPermissionUsers(EntityDto entity, String permission) {
+ private List<String> selectProjectPermissionUsers(EntityDto entity, ProjectPermission permission) {
PermissionQuery query = PermissionQuery.builder().setPermission(permission).setEntity(entity).build();
return db.getDbClient().userPermissionDao().selectUserUuidsByQuery(db.getSession(), query);
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionIT.java
index dedc507cc63..e9bdddc83ef 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/BulkApplyTemplateActionIT.java
@@ -25,7 +25,6 @@ import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentQualifiers;
@@ -33,6 +32,7 @@ import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ProjectData;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto;
@@ -99,16 +99,16 @@ public class BulkApplyTemplateActionIT extends BasePermissionWsIT<BulkApplyTempl
// template 1 for org 1
template1 = db.permissionTemplates().insertTemplate();
- addUserToTemplate(user1, template1, UserRole.CODEVIEWER);
- addUserToTemplate(user2, template1, UserRole.ISSUE_ADMIN);
- addGroupToTemplate(group1, template1, UserRole.ADMIN);
- addGroupToTemplate(group2, template1, UserRole.USER);
+ addUserToTemplate(user1, template1, ProjectPermission.CODEVIEWER);
+ addUserToTemplate(user2, template1, ProjectPermission.ISSUE_ADMIN);
+ addGroupToTemplate(group1, template1, ProjectPermission.ADMIN);
+ addGroupToTemplate(group2, template1, ProjectPermission.USER);
// template 2
PermissionTemplateDto template2 = db.permissionTemplates().insertTemplate();
- addUserToTemplate(user1, template2, UserRole.USER);
- addUserToTemplate(user2, template2, UserRole.USER);
- addGroupToTemplate(group1, template2, UserRole.USER);
- addGroupToTemplate(group2, template2, UserRole.USER);
+ addUserToTemplate(user1, template2, ProjectPermission.USER);
+ addUserToTemplate(user2, template2, ProjectPermission.USER);
+ addGroupToTemplate(group1, template2, ProjectPermission.USER);
+ addGroupToTemplate(group2, template2, ProjectPermission.USER);
}
@Test
@@ -334,50 +334,50 @@ public class BulkApplyTemplateActionIT extends BasePermissionWsIT<BulkApplyTempl
}
private void assertTemplate1AppliedToPublicProject(ProjectDto project) {
- assertThat(selectProjectPermissionGroups(project, UserRole.ADMIN)).containsExactly(group1.getName());
- assertThat(selectProjectPermissionGroups(project, UserRole.USER)).isEmpty();
- assertThat(selectProjectPermissionUsers(project, UserRole.ADMIN)).isEmpty();
- assertThat(selectProjectPermissionUsers(project, UserRole.CODEVIEWER)).isEmpty();
- assertThat(selectProjectPermissionUsers(project, UserRole.ISSUE_ADMIN)).containsExactly(user2.getUuid());
+ assertThat(selectProjectPermissionGroups(project, ProjectPermission.ADMIN)).containsExactly(group1.getName());
+ assertThat(selectProjectPermissionGroups(project, ProjectPermission.USER)).isEmpty();
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.CODEVIEWER)).isEmpty();
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.ISSUE_ADMIN)).containsExactly(user2.getUuid());
}
private void assertTemplate1AppliedToPrivateProject(ProjectDto project) {
- assertThat(selectProjectPermissionGroups(project, UserRole.ADMIN)).containsExactly(group1.getName());
- assertThat(selectProjectPermissionGroups(project, UserRole.USER)).containsExactly(group2.getName());
- assertThat(selectProjectPermissionUsers(project, UserRole.ADMIN)).isEmpty();
- assertThat(selectProjectPermissionUsers(project, UserRole.CODEVIEWER)).containsExactly(user1.getUuid());
- assertThat(selectProjectPermissionUsers(project, UserRole.ISSUE_ADMIN)).containsExactly(user2.getUuid());
+ assertThat(selectProjectPermissionGroups(project, ProjectPermission.ADMIN)).containsExactly(group1.getName());
+ assertThat(selectProjectPermissionGroups(project, ProjectPermission.USER)).containsExactly(group2.getName());
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.CODEVIEWER)).containsExactly(user1.getUuid());
+ assertThat(selectProjectPermissionUsers(project, ProjectPermission.ISSUE_ADMIN)).containsExactly(user2.getUuid());
}
private void assertNoPermissionOnEntity(EntityDto entity) {
- assertThat(selectProjectPermissionGroups(entity, UserRole.ADMIN)).isEmpty();
- assertThat(selectProjectPermissionGroups(entity, UserRole.CODEVIEWER)).isEmpty();
- assertThat(selectProjectPermissionGroups(entity, UserRole.ISSUE_ADMIN)).isEmpty();
- assertThat(selectProjectPermissionGroups(entity, UserRole.USER)).isEmpty();
- assertThat(selectProjectPermissionUsers(entity, UserRole.ADMIN)).isEmpty();
- assertThat(selectProjectPermissionUsers(entity, UserRole.CODEVIEWER)).isEmpty();
- assertThat(selectProjectPermissionUsers(entity, UserRole.ISSUE_ADMIN)).isEmpty();
- assertThat(selectProjectPermissionUsers(entity, UserRole.USER)).isEmpty();
+ assertThat(selectProjectPermissionGroups(entity, ProjectPermission.ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionGroups(entity, ProjectPermission.CODEVIEWER)).isEmpty();
+ assertThat(selectProjectPermissionGroups(entity, ProjectPermission.ISSUE_ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionGroups(entity, ProjectPermission.USER)).isEmpty();
+ assertThat(selectProjectPermissionUsers(entity, ProjectPermission.ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionUsers(entity, ProjectPermission.CODEVIEWER)).isEmpty();
+ assertThat(selectProjectPermissionUsers(entity, ProjectPermission.ISSUE_ADMIN)).isEmpty();
+ assertThat(selectProjectPermissionUsers(entity, ProjectPermission.USER)).isEmpty();
}
- private void addUserToTemplate(UserDto user, PermissionTemplateDto permissionTemplate, String permission) {
+ private void addUserToTemplate(UserDto user, PermissionTemplateDto permissionTemplate, ProjectPermission permission) {
db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), permissionTemplate.getUuid(), user.getUuid(),
permission, permissionTemplate.getName(), user.getLogin());
db.commit();
}
- private void addGroupToTemplate(GroupDto group, PermissionTemplateDto permissionTemplate, String permission) {
+ private void addGroupToTemplate(GroupDto group, PermissionTemplateDto permissionTemplate, ProjectPermission permission) {
db.getDbClient().permissionTemplateDao().insertGroupPermission(db.getSession(), permissionTemplate.getUuid(), group.getUuid(),
permission, permissionTemplate.getName(), group.getName());
db.commit();
}
- private List<String> selectProjectPermissionGroups(EntityDto project, String permission) {
+ private List<String> selectProjectPermissionGroups(EntityDto project, ProjectPermission permission) {
PermissionQuery query = PermissionQuery.builder().setPermission(permission).setEntity(project).build();
return db.getDbClient().groupPermissionDao().selectGroupNamesByQuery(db.getSession(), query);
}
- private List<String> selectProjectPermissionUsers(EntityDto project, String permission) {
+ private List<String> selectProjectPermissionUsers(EntityDto project, ProjectPermission permission) {
PermissionQuery query = PermissionQuery.builder().setPermission(permission).setEntity(project).build();
return db.getDbClient().userPermissionDao().selectUserUuidsByQuery(db.getSession(), query);
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/DeleteTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/DeleteTemplateActionIT.java
index 1622446d1f0..635aa5188e6 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/DeleteTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/DeleteTemplateActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.server.component.ComponentTypesRule;
@@ -217,9 +217,9 @@ public class DeleteTemplateActionIT {
PermissionTemplateDto dto = db.permissionTemplates().insertTemplate();
UserDto user = db.getDbClient().userDao().insert(db.getSession(), UserTesting.newUserDto().setActive(true));
GroupDto group = db.getDbClient().groupDao().insert(db.getSession(), GroupTesting.newGroupDto());
- db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), dto.getUuid(), user.getUuid(), UserRole.ADMIN,
+ db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), dto.getUuid(), user.getUuid(), ProjectPermission.ADMIN,
dto.getName(), user.getLogin());
- db.getDbClient().permissionTemplateDao().insertGroupPermission(db.getSession(), dto.getUuid(), group.getUuid(), UserRole.CODEVIEWER,
+ db.getDbClient().permissionTemplateDao().insertGroupPermission(db.getSession(), dto.getUuid(), group.getUuid(), ProjectPermission.CODEVIEWER,
dto.getName(), group.getName());
db.commit();
return dto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveGroupFromTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveGroupFromTemplateActionIT.java
index d9607ad3843..a1c875d86f8 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveGroupFromTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveGroupFromTemplateActionIT.java
@@ -23,14 +23,16 @@ import java.util.List;
import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService.Action;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.GroupDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -45,9 +47,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.security.DefaultGroups.ANYONE;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.db.permission.GlobalPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_GROUP_NAME;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
@@ -55,7 +57,7 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_T
public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGroupFromTemplateAction> {
- private static final String PERMISSION = CODEVIEWER;
+ private static final ProjectPermission PERMISSION = CODEVIEWER;
private GroupDto group;
private PermissionTemplateDto template;
@@ -100,7 +102,7 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
public void remove_group_from_template_by_name_case_insensitive() {
newRequest()
.setParam(PARAM_GROUP_NAME, group.getName())
- .setParam(PARAM_PERMISSION, PERMISSION)
+ .setParam(PARAM_PERMISSION, PERMISSION.getKey())
.setParam(PARAM_TEMPLATE_NAME, template.getName().toUpperCase())
.execute();
@@ -126,7 +128,10 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
@Test
public void fail_if_not_a_project_permission() {
- assertThatThrownBy(() -> newRequest(group.getName(), template.getUuid(), PROVISION_PROJECTS.getKey()))
+ var groupName = group.getName();
+ var templateUuid = template.getUuid();
+
+ assertThatThrownBy(() -> newRequest(groupName, templateUuid, PROVISION_PROJECTS))
.isInstanceOf(IllegalArgumentException.class);
}
@@ -140,7 +145,7 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
@Test
public void fail_if_not_logged_in() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
userSession.anonymous();
newRequest(group.getName(), template.getUuid(), PERMISSION);
})
@@ -149,7 +154,7 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
@Test
public void fail_if_group_params_missing() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest(null, template.getUuid(), PERMISSION);
})
.isInstanceOf(IllegalArgumentException.class)
@@ -158,15 +163,15 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
@Test
public void fail_if_permission_missing() {
- assertThatThrownBy(() -> {
- newRequest(group.getName(), template.getUuid(), null);
+ assertThatThrownBy(() -> {
+ newRequest(group.getName(), template.getUuid(), (String) null);
})
.isInstanceOf(IllegalArgumentException.class);
}
@Test
public void fail_if_template_missing() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest(group.getName(), null, PERMISSION);
})
.isInstanceOf(BadRequestException.class);
@@ -174,7 +179,7 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
@Test
public void fail_if_group_does_not_exist() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest("unknown-group-name", template.getUuid(), PERMISSION);
})
.isInstanceOf(NotFoundException.class)
@@ -183,13 +188,21 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
@Test
public void fail_if_template_key_does_not_exist() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest(group.getName(), "unknown-key", PERMISSION);
})
.isInstanceOf(NotFoundException.class)
.hasMessage("Permission template with id 'unknown-key' is not found");
}
+ private void newRequest(@Nullable String groupName, @Nullable String templateKey, @Nullable GlobalPermission permission) {
+ newRequest(groupName, templateKey, permission != null ? permission.getKey() : null);
+ }
+
+ private void newRequest(@Nullable String groupName, @Nullable String templateKey, @Nullable ProjectPermission permission) {
+ newRequest(groupName, templateKey, permission != null ? permission.getKey() : null);
+ }
+
private void newRequest(@Nullable String groupName, @Nullable String templateKey, @Nullable String permission) {
TestRequest request = newRequest();
if (groupName != null) {
@@ -205,13 +218,13 @@ public class RemoveGroupFromTemplateActionIT extends BasePermissionWsIT<RemoveGr
request.execute();
}
- private void addGroupToTemplate(PermissionTemplateDto template, @Nullable String groupUuid, String permission, String groupName) {
+ private void addGroupToTemplate(PermissionTemplateDto template, @Nullable String groupUuid, ProjectPermission permission, String groupName) {
db.getDbClient().permissionTemplateDao().insertGroupPermission(db.getSession(), template.getUuid(), groupUuid,
permission, template.getName(), groupName);
db.commit();
}
- private List<String> getGroupNamesInTemplateAndPermission(PermissionTemplateDto template, String permission) {
+ private List<String> getGroupNamesInTemplateAndPermission(PermissionTemplateDto template, ProjectPermission permission) {
PermissionQuery permissionQuery = PermissionQuery.builder().setPermission(permission).build();
return db.getDbClient().permissionTemplateDao()
.selectGroupNamesByQueryAndTemplate(db.getSession(), permissionQuery, template.getUuid());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveProjectCreatorFromTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveProjectCreatorFromTemplateActionIT.java
index 4ecdaf491bd..75195381899 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveProjectCreatorFromTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveProjectCreatorFromTemplateActionIT.java
@@ -22,14 +22,14 @@ package org.sonar.server.permission.ws.template;
import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.exceptions.UnauthorizedException;
@@ -75,7 +75,7 @@ public class RemoveProjectCreatorFromTemplateActionIT extends BasePermissionWsIT
new PermissionTemplateCharacteristicDto()
.setUuid(Uuids.createFast())
.setTemplateUuid(template.getUuid())
- .setPermission(UserRole.USER)
+ .setPermission(ProjectPermission.USER)
.setWithProjectCreator(false)
.setCreatedAt(1_000_000_000L)
.setUpdatedAt(1_000_000_000L),
@@ -84,11 +84,11 @@ public class RemoveProjectCreatorFromTemplateActionIT extends BasePermissionWsIT
when(system.now()).thenReturn(3_000_000_000L);
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.USER)
+ .setParam(PARAM_PERMISSION, ProjectPermission.USER.getKey())
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.execute();
- assertWithoutProjectCreatorFor(UserRole.USER);
+ assertWithoutProjectCreatorFor(ProjectPermission.USER);
PermissionTemplateCharacteristicDto reloaded = reload(characteristic);
assertThat(reloaded.getCreatedAt()).isEqualTo(1_000_000_000L);
assertThat(reloaded.getUpdatedAt()).isEqualTo(3_000_000_000L);
@@ -97,18 +97,18 @@ public class RemoveProjectCreatorFromTemplateActionIT extends BasePermissionWsIT
@Test
public void do_not_fail_when_no_template_permission() {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.execute();
- assertNoTemplatePermissionFor(UserRole.ADMIN);
+ assertNoTemplatePermissionFor(ProjectPermission.ADMIN);
}
@Test
public void fail_when_template_does_not_exist() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, "42")
.execute();
})
@@ -117,7 +117,7 @@ public class RemoveProjectCreatorFromTemplateActionIT extends BasePermissionWsIT
@Test
public void fail_if_permission_is_not_a_project_permission() {
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest()
.setParam(PARAM_PERMISSION, ADMINISTER_QUALITY_GATES.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
@@ -130,9 +130,9 @@ public class RemoveProjectCreatorFromTemplateActionIT extends BasePermissionWsIT
public void fail_if_not_authenticated() {
userSession.anonymous();
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.execute();
})
@@ -143,23 +143,23 @@ public class RemoveProjectCreatorFromTemplateActionIT extends BasePermissionWsIT
public void fail_if_insufficient_privileges() {
userSession.logIn();
- assertThatThrownBy(() -> {
+ assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, UserRole.ADMIN)
+ .setParam(PARAM_PERMISSION, ProjectPermission.ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.execute();
})
.isInstanceOf(ForbiddenException.class);
}
- private void assertWithoutProjectCreatorFor(String permission) {
+ private void assertWithoutProjectCreatorFor(ProjectPermission permission) {
Optional<PermissionTemplateCharacteristicDto> templatePermission = db.getDbClient().permissionTemplateCharacteristicDao().selectByPermissionAndTemplateId(db.getSession(),
permission, template.getUuid());
assertThat(templatePermission).isPresent();
assertThat(templatePermission.get().getWithProjectCreator()).isFalse();
}
- private void assertNoTemplatePermissionFor(String permission) {
+ private void assertNoTemplatePermissionFor(ProjectPermission permission) {
Optional<PermissionTemplateCharacteristicDto> templatePermission = db.getDbClient().permissionTemplateCharacteristicDao().selectByPermissionAndTemplateId(db.getSession(),
permission, template.getUuid());
assertThat(templatePermission).isNotPresent();
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveUserFromTemplateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveUserFromTemplateActionIT.java
index 835f3549d96..1d85d6c8954 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveUserFromTemplateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/RemoveUserFromTemplateActionIT.java
@@ -24,11 +24,13 @@ import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.PermissionQuery;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.UserDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -42,9 +44,9 @@ import org.sonar.server.ws.TestRequest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME;
@@ -52,7 +54,7 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_U
public class RemoveUserFromTemplateActionIT extends BasePermissionWsIT<RemoveUserFromTemplateAction> {
- private static final String DEFAULT_PERMISSION = CODEVIEWER;
+ private static final ProjectPermission DEFAULT_PERMISSION = CODEVIEWER;
private UserDto user;
private PermissionTemplateDto template;
@@ -86,7 +88,7 @@ public class RemoveUserFromTemplateActionIT extends BasePermissionWsIT<RemoveUse
loginAsAdmin();
newRequest()
.setParam(PARAM_USER_LOGIN, user.getLogin())
- .setParam(PARAM_PERMISSION, DEFAULT_PERMISSION)
+ .setParam(PARAM_PERMISSION, DEFAULT_PERMISSION.getKey())
.setParam(PARAM_TEMPLATE_NAME, template.getName().toUpperCase())
.execute();
@@ -129,7 +131,7 @@ public class RemoveUserFromTemplateActionIT extends BasePermissionWsIT<RemoveUse
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(user.getLogin(), template.getUuid(), PROVISION_PROJECTS.getKey());
+ newRequest(user.getLogin(), template.getUuid(), PROVISION_PROJECTS);
})
.isInstanceOf(IllegalArgumentException.class);
}
@@ -169,7 +171,7 @@ public class RemoveUserFromTemplateActionIT extends BasePermissionWsIT<RemoveUse
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(user.getLogin(), template.getUuid(), null);
+ newRequest(user.getLogin(), template.getUuid(), (String) null);
})
.isInstanceOf(IllegalArgumentException.class);
}
@@ -204,6 +206,14 @@ public class RemoveUserFromTemplateActionIT extends BasePermissionWsIT<RemoveUse
.hasMessage("Permission template with id 'unknown-key' is not found");
}
+ private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable GlobalPermission permission) {
+ newRequest(userLogin, templateKey, permission != null ? permission.getKey() : null);
+ }
+
+ private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable ProjectPermission permission) {
+ newRequest(userLogin, templateKey, permission != null ? permission.getKey() : null);
+ }
+
private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable String permission) {
TestRequest request = newRequest();
if (userLogin != null) {
@@ -219,13 +229,13 @@ public class RemoveUserFromTemplateActionIT extends BasePermissionWsIT<RemoveUse
request.execute();
}
- private List<String> getLoginsInTemplateAndPermission(PermissionTemplateDto template, String permission) {
+ private List<String> getLoginsInTemplateAndPermission(PermissionTemplateDto template, ProjectPermission permission) {
PermissionQuery permissionQuery = PermissionQuery.builder().setPermission(permission).build();
return db.getDbClient().permissionTemplateDao()
.selectUserLoginsByQueryAndTemplate(db.getSession(), permissionQuery, template.getUuid());
}
- private void addUserToTemplate(UserDto user, PermissionTemplateDto template, String permission) {
+ private void addUserToTemplate(UserDto user, PermissionTemplateDto template, ProjectPermission permission) {
db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), template.getUuid(), user.getUuid(), permission,
template.getName(), user.getLogin());
db.commit();
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/SearchTemplatesActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/SearchTemplatesActionIT.java
index 4aa21c0b3b9..e0fb6156ce5 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/SearchTemplatesActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/SearchTemplatesActionIT.java
@@ -23,20 +23,20 @@ import java.util.Date;
import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.api.web.UserRole;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto;
-import org.sonar.server.exceptions.UnauthorizedException;
-import org.sonar.server.l18n.I18nRule;
import org.sonar.server.common.permission.DefaultTemplatesResolver;
import org.sonar.server.common.permission.DefaultTemplatesResolverImpl;
+import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.server.exceptions.UnauthorizedException;
+import org.sonar.server.l18n.I18nRule;
import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl;
import org.sonar.server.permission.ws.BasePermissionWsIT;
@@ -93,12 +93,12 @@ public class SearchTemplatesActionIT extends BasePermissionWsIT<SearchTemplatesA
GroupDto group2 = db.users().insertGroup();
GroupDto group3 = db.users().insertGroup();
- addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user1.getLogin());
- addUserToTemplate(projectTemplate.getUuid(), user2.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user2.getLogin());
- addUserToTemplate(projectTemplate.getUuid(), user3.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user3.getLogin());
- addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.CODEVIEWER, projectTemplate.getName(), user1.getLogin());
- addGroupToTemplate(projectTemplate.getUuid(), group1.getUuid(), UserRole.ADMIN, projectTemplate.getName(), group1.getName());
- addPermissionTemplateWithProjectCreator(projectTemplate.getUuid(), UserRole.ADMIN, projectTemplate.getName());
+ addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), ProjectPermission.ISSUE_ADMIN, projectTemplate.getName(), user1.getLogin());
+ addUserToTemplate(projectTemplate.getUuid(), user2.getUuid(), ProjectPermission.ISSUE_ADMIN, projectTemplate.getName(), user2.getLogin());
+ addUserToTemplate(projectTemplate.getUuid(), user3.getUuid(), ProjectPermission.ISSUE_ADMIN, projectTemplate.getName(), user3.getLogin());
+ addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), ProjectPermission.CODEVIEWER, projectTemplate.getName(), user1.getLogin());
+ addGroupToTemplate(projectTemplate.getUuid(), group1.getUuid(), ProjectPermission.ADMIN, projectTemplate.getName(), group1.getName());
+ addPermissionTemplateWithProjectCreator(projectTemplate.getUuid(), ProjectPermission.ADMIN, projectTemplate.getName());
db.permissionTemplates().setDefaultTemplates(projectTemplate, null, null);
@@ -123,18 +123,18 @@ public class SearchTemplatesActionIT extends BasePermissionWsIT<SearchTemplatesA
GroupDto group2 = db.users().insertGroup();
GroupDto group3 = db.users().insertGroup();
- addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user1.getLogin());
- addUserToTemplate(projectTemplate.getUuid(), user2.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user2.getLogin());
- addUserToTemplate(projectTemplate.getUuid(), user3.getUuid(), UserRole.ISSUE_ADMIN, projectTemplate.getName(), user3.getLogin());
- addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), UserRole.CODEVIEWER, projectTemplate.getName(), user1.getLogin());
- addGroupToTemplate(projectTemplate.getUuid(), group1.getUuid(), UserRole.ADMIN, projectTemplate.getName(), group1.getName());
- addPermissionTemplateWithProjectCreator(projectTemplate.getUuid(), UserRole.ADMIN, projectTemplate.getName());
+ addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), ProjectPermission.ISSUE_ADMIN, projectTemplate.getName(), user1.getLogin());
+ addUserToTemplate(projectTemplate.getUuid(), user2.getUuid(), ProjectPermission.ISSUE_ADMIN, projectTemplate.getName(), user2.getLogin());
+ addUserToTemplate(projectTemplate.getUuid(), user3.getUuid(), ProjectPermission.ISSUE_ADMIN, projectTemplate.getName(), user3.getLogin());
+ addUserToTemplate(projectTemplate.getUuid(), user1.getUuid(), ProjectPermission.CODEVIEWER, projectTemplate.getName(), user1.getLogin());
+ addGroupToTemplate(projectTemplate.getUuid(), group1.getUuid(), ProjectPermission.ADMIN, projectTemplate.getName(), group1.getName());
+ addPermissionTemplateWithProjectCreator(projectTemplate.getUuid(), ProjectPermission.ADMIN, projectTemplate.getName());
- addUserToTemplate(portfoliosTemplate.getUuid(), user1.getUuid(), UserRole.USER, portfoliosTemplate.getName(), user1.getLogin());
- addUserToTemplate(portfoliosTemplate.getUuid(), user2.getUuid(), UserRole.USER, portfoliosTemplate.getName(), user2.getLogin());
- addGroupToTemplate(portfoliosTemplate.getUuid(), group1.getUuid(), UserRole.ISSUE_ADMIN, portfoliosTemplate.getName(), group1.getName());
- addGroupToTemplate(portfoliosTemplate.getUuid(), group2.getUuid(), UserRole.ISSUE_ADMIN, portfoliosTemplate.getName(), group2.getName());
- addGroupToTemplate(portfoliosTemplate.getUuid(), group3.getUuid(), UserRole.ISSUE_ADMIN, portfoliosTemplate.getName(), group3.getName());
+ addUserToTemplate(portfoliosTemplate.getUuid(), user1.getUuid(), ProjectPermission.USER, portfoliosTemplate.getName(), user1.getLogin());
+ addUserToTemplate(portfoliosTemplate.getUuid(), user2.getUuid(), ProjectPermission.USER, portfoliosTemplate.getName(), user2.getLogin());
+ addGroupToTemplate(portfoliosTemplate.getUuid(), group1.getUuid(), ProjectPermission.ISSUE_ADMIN, portfoliosTemplate.getName(), group1.getName());
+ addGroupToTemplate(portfoliosTemplate.getUuid(), group2.getUuid(), ProjectPermission.ISSUE_ADMIN, portfoliosTemplate.getName(), group2.getName());
+ addGroupToTemplate(portfoliosTemplate.getUuid(), group3.getUuid(), ProjectPermission.ISSUE_ADMIN, portfoliosTemplate.getName(), group3.getName());
db.permissionTemplates().setDefaultTemplates(projectTemplate, applicationsTemplate, portfoliosTemplate);
@@ -354,22 +354,22 @@ public class SearchTemplatesActionIT extends BasePermissionWsIT<SearchTemplatesA
return insert;
}
- private void addGroupToTemplate(String templateUuid, @Nullable String groupUuid, String permission, String templateName, String groupName) {
+ private void addGroupToTemplate(String templateUuid, @Nullable String groupUuid, ProjectPermission permission, String templateName, String groupName) {
dbClient.permissionTemplateDao().insertGroupPermission(db.getSession(), templateUuid, groupUuid, permission, templateName, groupName);
db.getSession().commit();
}
- private void addUserToTemplate(String templateUuid, String userId, String permission, String templateName, String userLogin) {
+ private void addUserToTemplate(String templateUuid, String userId, ProjectPermission permission, String templateName, String userLogin) {
dbClient.permissionTemplateDao().insertUserPermission(db.getSession(), templateUuid, userId, permission, templateName, userLogin);
db.getSession().commit();
}
- private void addPermissionTemplateWithProjectCreator(String templateUuid, String permission, String templateName) {
+ private void addPermissionTemplateWithProjectCreator(String templateUuid, ProjectPermission permission, String templateName) {
dbClient.permissionTemplateCharacteristicDao().insert(dbSession, new PermissionTemplateCharacteristicDto()
.setUuid(Uuids.createFast())
.setWithProjectCreator(true)
.setTemplateUuid(templateUuid)
- .setPermission(permission)
+ .setPermission(permission.getKey())
.setCreatedAt(1_000_000_000L)
.setUpdatedAt(2_000_000_000L),
templateName);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateGroupsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateGroupsActionIT.java
index a41f0ceb066..b7ee1dcf3c0 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateGroupsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateGroupsActionIT.java
@@ -22,14 +22,14 @@ package org.sonar.server.permission.ws.template;
import java.util.stream.IntStream;
import javax.annotation.Nullable;
import org.junit.Test;
-import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
import org.sonar.db.permission.template.PermissionTemplateGroupDto;
import org.sonar.db.user.GroupDto;
+import org.sonar.server.component.ComponentTypes;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -46,12 +46,12 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.api.server.ws.WebService.Param.PAGE;
import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.template.PermissionTemplateTesting.newPermissionTemplateGroupDto;
import static org.sonar.db.user.GroupTesting.newGroupDto;
import static org.sonar.test.JsonAssert.assertJson;
@@ -96,7 +96,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
loginAsAdmin();
String response = newRequest()
- .setParam(PARAM_PERMISSION, ISSUE_ADMIN)
+ .setParam(PARAM_PERMISSION, ISSUE_ADMIN.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.execute()
.getInput();
@@ -163,7 +163,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
loginAsAdmin();
WsGroupsResponse response = newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.setParam(PARAM_TEMPLATE_ID, template.getUuid())
.executeProtobuf(WsGroupsResponse.class);
@@ -204,7 +204,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
loginAsAdmin();
WsGroupsResponse response = newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.setParam(PAGE, "2")
.setParam(PAGE_SIZE, "1")
@@ -271,10 +271,10 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
PermissionTemplateDto otherTemplate = db.permissionTemplates().insertTemplate();
IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
GroupDto group = db.users().insertGroup("Group-" + i);
- db.permissionTemplates().addGroupToTemplate(otherTemplate, group, UserRole.USER);
+ db.permissionTemplates().addGroupToTemplate(otherTemplate, group, ProjectPermission.USER);
});
String lastGroupName = "Group-" + (DEFAULT_PAGE_SIZE + 1);
- db.permissionTemplates().addGroupToTemplate(template, db.users().selectGroup(lastGroupName).get(), UserRole.USER);
+ db.permissionTemplates().addGroupToTemplate(template, db.users().selectGroup(lastGroupName).get(), ProjectPermission.USER);
loginAsAdmin();
WsGroupsResponse response = newRequest()
@@ -294,7 +294,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.setParam(PARAM_TEMPLATE_ID, template1.getUuid())
.execute();
})
@@ -308,7 +308,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.setParam(PARAM_TEMPLATE_ID, template1.getUuid())
.execute();
})
@@ -322,7 +322,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.setParam(PARAM_TEMPLATE_ID, template1.getUuid())
.setParam(PARAM_TEMPLATE_NAME, template1.getName())
.execute();
@@ -336,7 +336,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.execute();
})
.isInstanceOf(BadRequestException.class);
@@ -348,7 +348,7 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
assertThatThrownBy(() -> {
newRequest()
- .setParam(PARAM_PERMISSION, USER)
+ .setParam(PARAM_PERMISSION, USER.getKey())
.setParam(PARAM_TEMPLATE_ID, "unknown-uuid")
.execute();
})
@@ -378,6 +378,10 @@ public class TemplateGroupsActionIT extends BasePermissionWsIT<TemplateGroupsAct
db.commit();
}
+ private static PermissionTemplateGroupDto newPermissionTemplateGroup(ProjectPermission permission, String templateUuid, @Nullable String groupUuid) {
+ return newPermissionTemplateGroup(permission.getKey(), templateUuid, groupUuid);
+ }
+
private static PermissionTemplateGroupDto newPermissionTemplateGroup(String permission, String templateUuid, @Nullable String groupUuid) {
return newPermissionTemplateGroupDto()
.setPermission(permission)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateUsersActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateUsersActionIT.java
index ec61476fdde..96e9205f417 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateUsersActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/template/TemplateUsersActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Test;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.component.ComponentTypesRule;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.permission.template.PermissionTemplateDto;
@@ -46,10 +46,10 @@ import org.sonarqube.ws.Permissions;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.SCAN;
import static org.sonar.db.permission.PermissionQuery.DEFAULT_PAGE_SIZE;
import static org.sonar.db.permission.template.PermissionTemplateTesting.newPermissionTemplateUserDto;
@@ -96,7 +96,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
addUserToTemplate(newPermissionTemplateUser(ADMIN, template1, user2), template1.getName());
loginAsAdmin();
- String result = newRequest(null, template1.getUuid()).execute().getInput();
+ String result = newRequest((String) null, template1.getUuid()).execute().getInput();
assertJson(result).isSimilarTo(getClass().getResource("template_users-example.json"));
}
@@ -117,7 +117,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
PermissionTemplateDto anotherTemplate = addTemplate();
addUserToTemplate(newPermissionTemplateUser(USER, anotherTemplate, user1), anotherTemplate.getName());
- Permissions.UsersWsResponse response = newRequest(null, null)
+ Permissions.UsersWsResponse response = newRequest((String) null, null)
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.executeProtobuf(Permissions.UsersWsResponse.class);
@@ -144,7 +144,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
PermissionTemplateDto anotherTemplate = addTemplate();
addUserToTemplate(newPermissionTemplateUser(USER, anotherTemplate, user1), anotherTemplate.getName());
- Permissions.UsersWsResponse response = newRequest(null, null)
+ Permissions.UsersWsResponse response = newRequest((String) null, null)
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.setParam(WebService.Param.TEXT_QUERY, "ame-1")
.executeProtobuf(Permissions.UsersWsResponse.class);
@@ -162,7 +162,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
String templateName = addUsersToSomeTemplate(user1, user2, user3);
- Permissions.UsersWsResponse response = newRequest(null, null)
+ Permissions.UsersWsResponse response = newRequest((String) null, null)
.setParam(PARAM_TEMPLATE_NAME, templateName)
.setParam(WebService.Param.TEXT_QUERY, "ran")
.executeProtobuf(Permissions.UsersWsResponse.class);
@@ -181,7 +181,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
String templateName = addUsersToSomeTemplate(user1, user2, user3);
- Permissions.UsersWsResponse response = newRequest(null, null)
+ Permissions.UsersWsResponse response = newRequest((String) null, null)
.setParam(PARAM_TEMPLATE_NAME, templateName)
.setParam(WebService.Param.TEXT_QUERY, "xyz")
.executeProtobuf(Permissions.UsersWsResponse.class);
@@ -259,7 +259,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
addUserToTemplate(newPermissionTemplateUser(ISSUE_ADMIN, template, user3), template.getName());
loginAsAdmin();
- Permissions.UsersWsResponse response = newRequest(null, null)
+ Permissions.UsersWsResponse response = newRequest((String) null, null)
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.executeProtobuf(Permissions.UsersWsResponse.class);
@@ -273,13 +273,13 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
PermissionTemplateDto otherTemplate = db.permissionTemplates().insertTemplate();
IntStream.rangeClosed(1, DEFAULT_PAGE_SIZE + 1).forEach(i -> {
UserDto user = db.users().insertUser("User-" + i);
- db.permissionTemplates().addUserToTemplate(otherTemplate, user, UserRole.USER);
+ db.permissionTemplates().addUserToTemplate(otherTemplate, user, ProjectPermission.USER);
});
String lastLogin = "User-" + (DEFAULT_PAGE_SIZE + 1);
- db.permissionTemplates().addUserToTemplate(template, db.users().selectUserByLogin(lastLogin).get(), UserRole.USER);
+ db.permissionTemplates().addUserToTemplate(template, db.users().selectUserByLogin(lastLogin).get(), ProjectPermission.USER);
loginAsAdmin();
- Permissions.UsersWsResponse response = newRequest(null, null)
+ Permissions.UsersWsResponse response = newRequest((String) null, null)
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.executeProtobuf(Permissions.UsersWsResponse.class);
@@ -306,7 +306,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(null, null)
+ newRequest((String) null, null)
.execute();
})
.isInstanceOf(BadRequestException.class);
@@ -317,7 +317,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(null, "unknown-template-uuid")
+ newRequest((String) null, "unknown-template-uuid")
.execute();
})
.isInstanceOf(NotFoundException.class);
@@ -329,7 +329,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
loginAsAdmin();
assertThatThrownBy(() -> {
- newRequest(null, template.getUuid())
+ newRequest((String) null, template.getUuid())
.setParam(PARAM_TEMPLATE_NAME, template.getName())
.execute();
})
@@ -342,7 +342,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
userSession.anonymous();
assertThatThrownBy(() -> {
- newRequest(null, template.getUuid()).execute();
+ newRequest((String) null, template.getUuid()).execute();
})
.isInstanceOf(UnauthorizedException.class);
}
@@ -353,7 +353,7 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
userSession.logIn().addPermission(SCAN);
assertThatThrownBy(() -> {
- newRequest(null, template.getUuid()).execute();
+ newRequest((String) null, template.getUuid()).execute();
})
.isInstanceOf(ForbiddenException.class);
}
@@ -369,6 +369,10 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
db.commit();
}
+ private static PermissionTemplateUserDto newPermissionTemplateUser(ProjectPermission permission, PermissionTemplateDto template, UserDto user) {
+ return newPermissionTemplateUser(permission.getKey(), template, user);
+ }
+
private static PermissionTemplateUserDto newPermissionTemplateUser(String permission, PermissionTemplateDto template, UserDto user) {
return newPermissionTemplateUserDto()
.setPermission(permission)
@@ -376,6 +380,14 @@ public class TemplateUsersActionIT extends BasePermissionWsIT<TemplateUsersActio
.setUserUuid(user.getUuid());
}
+ private TestRequest newRequest(@Nullable ProjectPermission permission, @Nullable String templateUuid) {
+ return newRequest(permission != null ? permission.getKey() : null, templateUuid);
+ }
+
+ private TestRequest newRequest(@Nullable GlobalPermission permission, @Nullable String templateUuid) {
+ return newRequest(permission != null ? permission.getKey() : null, templateUuid);
+ }
+
private TestRequest newRequest(@Nullable String permission, @Nullable String templateUuid) {
TestRequest request = newRequest();
if (permission != null) {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java
index 7a297c4ab98..d299b1e4e65 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -96,7 +96,7 @@ public class DeleteActionIT {
public void project_administrator_deletes_the_project_by_key() {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto project = projectData.getMainBranchComponent();
- userSessionRule.logIn().addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
call(tester.newRequest().setParam(PARAM_PROJECT, project.getKey()));
@@ -111,7 +111,7 @@ public class DeleteActionIT {
UserDto insert = dbClient.userDao().insert(dbSession,
newUserDto().setHomepageType("PROJECT").setHomepageParameter(projectData.projectUuid()));
dbSession.commit();
- userSessionRule.logIn().addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
DeleteAction underTest = new DeleteAction(
new ComponentCleanerService(dbClient, new TestIndexers()),
from(db), dbClient, userSessionRule, projectLifeCycleListeners);
@@ -134,7 +134,7 @@ public class DeleteActionIT {
webhookDbTester.insertWebhook(project);
webhookDbTester.insertWebhook(project);
- userSessionRule.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
DeleteAction underTest = new DeleteAction(
new ComponentCleanerService(dbClient, new TestIndexers()),
from(db), dbClient, userSessionRule, projectLifeCycleListeners);
@@ -153,9 +153,9 @@ public class DeleteActionIT {
ProjectData project = db.components().insertPrivateProject();
userSessionRule.logIn()
- .addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
- .addProjectPermission(UserRole.ISSUE_ADMIN, project.getProjectDto())
- .addProjectPermission(UserRole.USER, project.getProjectDto());
+ .addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ISSUE_ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto());
TestRequest request = tester.newRequest().setParam(PARAM_PROJECT, project.projectKey());
assertThatThrownBy(() -> call(request))
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/ProjectFinderIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/ProjectFinderIT.java
index 8e5664062f7..72bbc2def18 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/ProjectFinderIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/ProjectFinderIT.java
@@ -30,7 +30,7 @@ import org.sonar.server.tester.UserSessionRule;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.api.web.UserRole.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
import static org.sonar.server.project.ws.ProjectFinder.SearchResult;
public class ProjectFinderIT {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyProjectsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyProjectsActionIT.java
index 90219a90c82..f47fd14098f 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyProjectsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyProjectsActionIT.java
@@ -28,7 +28,7 @@ import org.sonar.api.measures.Metric.ValueType;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -92,8 +92,8 @@ public class SearchMyProjectsActionIT {
SnapshotDto cLangSnapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(cLang.getMainBranchDto()).setCreatedAt(anotherTime));
dbClient.measureDao().insert(dbSession, newMeasure(jdk7.getMainBranchDto(), alertStatusMetric, Level.ERROR.name()));
dbClient.measureDao().insert(dbSession, newMeasure(cLang.getMainBranchDto(), alertStatusMetric, Level.OK.name()));
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, jdk7.getProjectDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, cLang.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, jdk7.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, cLang.getProjectDto());
db.commit();
System.setProperty("user.timezone", "UTC");
@@ -107,8 +107,8 @@ public class SearchMyProjectsActionIT {
ProjectData jdk7 = insertJdk7();
ProjectData cLang = insertClang();
UserDto anotherUser = db.users().insertUser(newUserDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, jdk7.getProjectDto());
- db.users().insertProjectPermissionOnUser(anotherUser, UserRole.ADMIN, cLang.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, jdk7.getProjectDto());
+ db.users().insertProjectPermissionOnUser(anotherUser, ProjectPermission.ADMIN, cLang.getProjectDto());
SearchMyProjectsWsResponse result = callWs();
@@ -119,7 +119,7 @@ public class SearchMyProjectsActionIT {
public void return_only_first_1000_projects() {
IntStream.range(0, 1_010).forEach(i -> {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, project);
});
SearchMyProjectsWsResponse result = callWs();
@@ -133,9 +133,9 @@ public class SearchMyProjectsActionIT {
ComponentDto c_project = db.components().insertPrivateProject(p -> p.setName("c_project_name")).getMainBranchComponent();
ComponentDto a_project = db.components().insertPrivateProject(p -> p.setName("A_project_name")).getMainBranchComponent();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, b_project);
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, a_project);
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, c_project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, b_project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, a_project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, c_project);
SearchMyProjectsWsResponse result = callWs();
@@ -147,7 +147,7 @@ public class SearchMyProjectsActionIT {
for (int i = 0; i < 10; i++) {
int j = i;
ProjectData project = db.components().insertPrivateProject(p -> p.setName("project-" + j));
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, project.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, project.getProjectDto());
}
SearchMyProjectsWsResponse result = ws.newRequest()
@@ -164,8 +164,8 @@ public class SearchMyProjectsActionIT {
ProjectData jdk7 = insertJdk7();
ProjectData clang = insertClang();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, jdk7.getProjectDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, clang.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, jdk7.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ISSUE_ADMIN, clang.getProjectDto());
SearchMyProjectsWsResponse result = callWs();
@@ -177,8 +177,8 @@ public class SearchMyProjectsActionIT {
ProjectData jdk7 = insertJdk7();
PortfolioDto portfolio = insertPortfolio();
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, jdk7.getProjectDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, portfolio);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, jdk7.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, portfolio);
SearchMyProjectsWsResponse result = callWs();
@@ -189,7 +189,7 @@ public class SearchMyProjectsActionIT {
public void does_not_return_branches() {
ProjectData project = db.components().insertPublicProject();
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, project.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, project.getProjectDto());
SearchMyProjectsWsResponse result = callWs();
@@ -206,8 +206,8 @@ public class SearchMyProjectsActionIT {
GroupDto group = db.users().insertGroup();
db.users().insertMember(group, user);
- db.users().insertEntityPermissionOnGroup(group, UserRole.ADMIN, jdk7.getProjectDto());
- db.users().insertEntityPermissionOnGroup(group, UserRole.USER, cLang.getProjectDto());
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.ADMIN, jdk7.getProjectDto());
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.USER, cLang.getProjectDto());
SearchMyProjectsWsResponse result = callWs();
@@ -223,11 +223,11 @@ public class SearchMyProjectsActionIT {
GroupDto group = db.users().insertGroup();
db.users().insertMember(group, user);
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, jdk7.getProjectDto());
- db.users().insertEntityPermissionOnGroup(group, UserRole.ADMIN, cLang.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, jdk7.getProjectDto());
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.ADMIN, cLang.getProjectDto());
// admin via group and user
- db.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, sonarqube.getProjectDto());
- db.users().insertEntityPermissionOnGroup(group, UserRole.ADMIN, sonarqube.getProjectDto());
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, sonarqube.getProjectDto());
+ db.users().insertEntityPermissionOnGroup(group, ProjectPermission.ADMIN, sonarqube.getProjectDto());
SearchMyProjectsWsResponse result = callWs();
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyScannableProjectsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyScannableProjectsActionIT.java
index 3f45a029a3f..7c9b4750296 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyScannableProjectsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/SearchMyScannableProjectsActionIT.java
@@ -33,7 +33,7 @@ import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
-import static org.sonar.api.web.UserRole.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
import static org.sonar.test.JsonAssert.assertJson;
import static org.sonarqube.ws.Projects.SearchMyScannableProjectsResponse;
import static org.sonarqube.ws.Projects.SearchMyScannableProjectsResponse.Project;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateKeyActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateKeyActionIT.java
index 4dbb4f2f92c..64eb6b7eb1f 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateKeyActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateKeyActionIT.java
@@ -26,7 +26,7 @@ import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -64,7 +64,7 @@ public class UpdateKeyActionIT {
@Test
public void update_key_of_project_referenced_by_its_key() {
ProjectData project = insertProject();
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
call(project.projectKey(), ANOTHER_KEY);
@@ -78,7 +78,7 @@ public class UpdateKeyActionIT {
@Test
public void fail_if_not_authorized() {
ProjectData project = insertProject();
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
String projectKey = project.projectKey();
assertThatThrownBy(() -> call(projectKey, ANOTHER_KEY))
@@ -89,7 +89,7 @@ public class UpdateKeyActionIT {
@Test
public void fail_if_new_key_is_not_provided() {
ProjectData project = insertProject();
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
String projectKey = project.projectKey();
assertThatThrownBy(() -> call(projectKey, null))
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java
index 77c598f9ede..7acd2e7dbe2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java
@@ -32,7 +32,7 @@ import org.sonar.db.component.ComponentQualifiers;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
@@ -103,8 +103,9 @@ public class UpdateVisibilityActionIT {
private final ComponentTypes componentTypes = new ComponentTypesRule().setRootQualifiers(ComponentQualifiers.PROJECT);
private final PermissionService permissionService = new PermissionServiceImpl(componentTypes);
private final Set<String> PROJECT_PERMISSIONS_BUT_USER_AND_CODEVIEWER = permissionService.getAllProjectPermissions().stream()
- .filter(perm -> !perm.equals(UserRole.USER) && !perm.equals(UserRole.CODEVIEWER))
- .collect(Collectors.toSet());
+ .filter(perm -> !perm.equals(ProjectPermission.USER) && !perm.equals(ProjectPermission.CODEVIEWER))
+ .map(ProjectPermission::getKey)
+ .collect(Collectors.toSet());
private final DbClient dbClient = dbTester.getDbClient();
private final DbSession dbSession = dbTester.getSession();
@@ -208,8 +209,8 @@ public class UpdateVisibilityActionIT {
ComponentDto subView = ComponentTesting.newSubPortfolio(portfolio.getRootComponent());
ComponentDto projectCopy = newProjectCopy("foo", project.getMainBranchComponent(), subView);
dbTester.components().insertComponents(subView, projectCopy);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto(), application);
- userSessionRule.addPortfolioPermission(UserRole.ADMIN, portfolio.getPortfolioDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto(), application);
+ userSessionRule.addPortfolioPermission(ProjectPermission.ADMIN, portfolio.getPortfolioDto());
Stream.of(project.getProjectDto(), portfolio.getPortfolioDto(), application).forEach(c -> request
.setParam(PARAM_PROJECT, c.getKey())
@@ -246,7 +247,7 @@ public class UpdateVisibilityActionIT {
ProjectData project = dbTester.components().insertPublicProject();
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, randomVisibility);
- userSessionRule.addProjectPermission(UserRole.ISSUE_ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ISSUE_ADMIN, project.getProjectDto());
Arrays.stream(GlobalPermission.values())
.forEach(userSessionRule::addPermission);
@@ -261,7 +262,7 @@ public class UpdateVisibilityActionIT {
ProjectData project = dbTester.components().insertPublicProject();
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, randomVisibility);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
assertThatThrownBy(request::execute)
.isInstanceOf(ForbiddenException.class)
@@ -272,7 +273,7 @@ public class UpdateVisibilityActionIT {
public void execute_throws_ForbiddenException_if_user_has_global_ADMIN_permission_even_if_sonar_allowPermissionManagementForProjectAdmins_is_set_to_false() {
when(configuration.getBoolean(CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY)).thenReturn(of(false));
ProjectDto project = dbTester.components().insertPublicProject().getProjectDto();
- userSessionRule.setSystemAdministrator().addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.setSystemAdministrator().addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, "private");
@@ -288,7 +289,7 @@ public class UpdateVisibilityActionIT {
.forEach(i -> insertPendingTask(project.getMainBranchDto()));
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, randomVisibility);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
assertThatThrownBy(request::execute)
.isInstanceOf(IllegalStateException.class)
@@ -302,7 +303,7 @@ public class UpdateVisibilityActionIT {
.forEach(i -> insertInProgressTask(project.getMainBranchDto()));
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, randomVisibility);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
assertThatThrownBy(request::execute)
.isInstanceOf(IllegalStateException.class)
@@ -314,7 +315,7 @@ public class UpdateVisibilityActionIT {
ProjectDto project = dbTester.components().insertPublicProject(p -> p.setKey(MANAGED_PROJECT_KEY)).getProjectDto();
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, Visibility.PUBLIC.getLabel());
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
doThrow(new IllegalStateException("Managed project")).when(managedInstanceChecker).throwIfProjectIsManaged(any(), eq(project.getUuid()));
@@ -336,7 +337,7 @@ public class UpdateVisibilityActionIT {
ComponentDto file = ComponentTesting.newFileDto(project.getMainBranchComponent());
dbTester.components().insertComponents(branch, dir, file);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, initiallyPrivate ? PUBLIC : PRIVATE)
@@ -364,7 +365,7 @@ public class UpdateVisibilityActionIT {
ComponentDto file = ComponentTesting.newFileDto(project.getMainBranchComponent())
.setPrivate(initiallyPrivate);
dbTester.components().insertComponents(branch, dir, file);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, initiallyPrivate ? PRIVATE : PUBLIC)
@@ -382,7 +383,7 @@ public class UpdateVisibilityActionIT {
UserDto user = dbTester.users().insertUser();
GroupDto group = dbTester.users().insertGroup();
unsafeGiveAllPermissionsToRootComponent(project, user, group);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, PRIVATE)
@@ -397,7 +398,7 @@ public class UpdateVisibilityActionIT {
UserDto user = dbTester.users().insertUser();
GroupDto group = dbTester.users().insertGroup();
unsafeGiveAllPermissionsToRootComponent(project, user, group);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, PRIVATE)
@@ -412,7 +413,7 @@ public class UpdateVisibilityActionIT {
UserDto user = dbTester.users().insertUser();
GroupDto group = dbTester.users().insertGroup();
unsafeGiveAllPermissionsToRootComponent(project, user, group);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, PUBLIC)
@@ -427,7 +428,7 @@ public class UpdateVisibilityActionIT {
UserDto user = dbTester.users().insertUser();
GroupDto group = dbTester.users().insertGroup();
unsafeGiveAllPermissionsToRootComponent(project, user, group);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, PUBLIC)
@@ -440,7 +441,7 @@ public class UpdateVisibilityActionIT {
public void execute_updates_permission_of_specified_project_in_indexes_when_changing_visibility() {
ProjectData project = randomPublicOrPrivateProject();
boolean initiallyPrivate = project.getProjectDto().isPrivate();
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, initiallyPrivate ? PUBLIC : PRIVATE)
@@ -453,7 +454,7 @@ public class UpdateVisibilityActionIT {
public void execute_does_not_update_permission_of_specified_project_in_indexes_if_already_has_specified_visibility() {
ProjectData project = randomPublicOrPrivateProject();
boolean initiallyPrivate = project.getProjectDto().isPrivate();
- userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, initiallyPrivate ? PRIVATE : PUBLIC)
@@ -471,16 +472,16 @@ public class UpdateVisibilityActionIT {
dbTester.users().insertProjectPermissionOnUser(user1, "p1", project);
dbTester.users().insertProjectPermissionOnUser(user1, "p2", project);
dbTester.users().insertProjectPermissionOnUser(user2, "p2", project);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, PRIVATE)
.execute();
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user1.getUuid(), project.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, "p1", "p2");
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), "p1", "p2");
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user2.getUuid(), project.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, "p2");
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), "p2");
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user3.getUuid(), project.getUuid()))
.isEmpty();
}
@@ -494,16 +495,16 @@ public class UpdateVisibilityActionIT {
dbTester.users().insertEntityPermissionOnGroup(group1, "p1", project);
dbTester.users().insertEntityPermissionOnGroup(group1, "p2", project);
dbTester.users().insertEntityPermissionOnGroup(group2, "p2", project);
- userSessionRule.addProjectPermission(UserRole.ADMIN, project);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, project);
request.setParam(PARAM_PROJECT, project.getKey())
.setParam(PARAM_VISIBILITY, PRIVATE)
.execute();
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group1.getUuid(), project.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, "p1", "p2");
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), "p1", "p2");
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group2.getUuid(), project.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, "p2");
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), "p2");
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group3.getUuid(), project.getUuid()))
.isEmpty();
}
@@ -512,10 +513,10 @@ public class UpdateVisibilityActionIT {
public void update_a_portfolio_to_private() {
PortfolioDto portfolio = dbTester.components().insertPublicPortfolioDto();
GroupDto group = dbTester.users().insertGroup();
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.ISSUE_ADMIN, portfolio);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.ISSUE_ADMIN, portfolio);
UserDto user = dbTester.users().insertUser();
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, portfolio);
- userSessionRule.addPortfolioPermission(UserRole.ADMIN, portfolio);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, portfolio);
+ userSessionRule.addPortfolioPermission(ProjectPermission.ADMIN, portfolio);
request.setParam(PARAM_PROJECT, portfolio.getKey())
.setParam(PARAM_VISIBILITY, PRIVATE)
@@ -523,23 +524,23 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.portfolioDao().selectByUuid(dbSession, portfolio.getUuid()).get().isPrivate()).isTrue();
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), portfolio.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, UserRole.ISSUE_ADMIN);
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.ISSUE_ADMIN.getKey());
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), portfolio.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, UserRole.ADMIN);
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.ADMIN.getKey());
}
@Test
public void update_a_portfolio_to_public() {
PortfolioDto portfolio = dbTester.components().insertPrivatePortfolioDto();
- userSessionRule.addPortfolioPermission(UserRole.ADMIN, portfolio);
+ userSessionRule.addPortfolioPermission(ProjectPermission.ADMIN, portfolio);
GroupDto group = dbTester.users().insertGroup();
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.ISSUE_ADMIN, portfolio);
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.USER, portfolio);
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.CODEVIEWER, portfolio);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.ISSUE_ADMIN, portfolio);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.USER, portfolio);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.CODEVIEWER, portfolio);
UserDto user = dbTester.users().insertUser();
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, portfolio);
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.USER, portfolio);
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, portfolio);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, portfolio);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, portfolio);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, portfolio);
request.setParam(PARAM_PROJECT, portfolio.getKey())
.setParam(PARAM_VISIBILITY, PUBLIC)
@@ -547,19 +548,19 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.componentDao().selectByUuid(dbSession, portfolio.getUuid()).get().isPrivate()).isFalse();
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), portfolio.getUuid()))
- .containsOnly(UserRole.ISSUE_ADMIN);
+ .containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), portfolio.getUuid()))
- .containsOnly(UserRole.ADMIN);
+ .containsOnly(ProjectPermission.ADMIN.getKey());
}
@Test
public void update_an_application_to_private() {
ProjectDto application = dbTester.components().insertPublicApplication().getProjectDto();
GroupDto group = dbTester.users().insertGroup();
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.ISSUE_ADMIN, application);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.ISSUE_ADMIN, application);
UserDto user = dbTester.users().insertUser();
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, application);
- userSessionRule.addProjectPermission(UserRole.ADMIN, application);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, application);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, application);
request.setParam(PARAM_PROJECT, application.getKey())
.setParam(PARAM_VISIBILITY, PRIVATE)
@@ -567,23 +568,23 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.projectDao().selectByUuid(dbSession, application.getUuid()).get().isPrivate()).isTrue();
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), application.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, UserRole.ISSUE_ADMIN);
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.ISSUE_ADMIN.getKey());
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), application.getUuid()))
- .containsOnly(UserRole.USER, UserRole.CODEVIEWER, UserRole.ADMIN);
+ .containsOnly(ProjectPermission.USER.getKey(), ProjectPermission.CODEVIEWER.getKey(), ProjectPermission.ADMIN.getKey());
}
@Test
public void update_an_application_to_public() {
ProjectDto application = dbTester.components().insertPrivateApplication().getProjectDto();
- userSessionRule.addProjectPermission(UserRole.ADMIN, application);
+ userSessionRule.addProjectPermission(ProjectPermission.ADMIN, application);
GroupDto group = dbTester.users().insertGroup();
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.ISSUE_ADMIN, application);
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.USER, application);
- dbTester.users().insertEntityPermissionOnGroup(group, UserRole.CODEVIEWER, application);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.ISSUE_ADMIN, application);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.USER, application);
+ dbTester.users().insertEntityPermissionOnGroup(group, ProjectPermission.CODEVIEWER, application);
UserDto user = dbTester.users().insertUser();
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.ADMIN, application);
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.USER, application);
- dbTester.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, application);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.ADMIN, application);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, application);
+ dbTester.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, application);
request.setParam(PARAM_PROJECT, application.getKey())
.setParam(PARAM_VISIBILITY, PUBLIC)
@@ -591,9 +592,9 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.projectDao().selectApplicationByKey(dbSession, application.getKey()).get().isPrivate()).isFalse();
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), application.getUuid()))
- .containsOnly(UserRole.ISSUE_ADMIN);
+ .containsOnly(ProjectPermission.ISSUE_ADMIN.getKey());
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), application.getUuid()))
- .containsOnly(UserRole.ADMIN);
+ .containsOnly(ProjectPermission.ADMIN.getKey());
}
private void unsafeGiveAllPermissionsToRootComponent(ProjectDto projectDto, UserDto user, GroupDto group) {
@@ -611,7 +612,7 @@ public class UpdateVisibilityActionIT {
});
}
- private void unsafeInsertProjectPermissionOnAnyone(ProjectDto projectDto, String permission) {
+ private void unsafeInsertProjectPermissionOnAnyone(ProjectDto projectDto, ProjectPermission permission) {
GroupPermissionDto dto = new GroupPermissionDto()
.setUuid(Uuids.createFast())
.setGroupUuid(null)
@@ -622,7 +623,7 @@ public class UpdateVisibilityActionIT {
dbTester.commit();
}
- private void unsafeInsertProjectPermissionOnGroup(ProjectDto projectDto, GroupDto group, String permission) {
+ private void unsafeInsertProjectPermissionOnGroup(ProjectDto projectDto, GroupDto group, ProjectPermission permission) {
GroupPermissionDto dto = new GroupPermissionDto()
.setUuid(Uuids.createFast())
.setGroupUuid(group.getUuid())
@@ -634,8 +635,8 @@ public class UpdateVisibilityActionIT {
dbTester.commit();
}
- private void unsafeInsertProjectPermissionOnUser(ProjectDto component, UserDto user, String permission) {
- UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission, user.getUuid(), component.getUuid());
+ private void unsafeInsertProjectPermissionOnUser(ProjectDto component, UserDto user, ProjectPermission permission) {
+ UserPermissionDto dto = new UserPermissionDto(Uuids.create(), permission.getKey(), user.getUuid(), component.getUuid());
dbTester.getDbClient().userPermissionDao().insert(dbTester.getSession(), dto, component, user, null);
dbTester.commit();
}
@@ -650,9 +651,9 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, null, projectUuid))
.isEmpty();
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), projectUuid))
- .containsAll(permissionService.getAllProjectPermissions());
+ .containsAll(permissionService.getAllProjectPermissions().stream().map(ProjectPermission::getKey).collect(Collectors.toSet()));
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), projectUuid))
- .containsAll(permissionService.getAllProjectPermissions());
+ .containsAll(permissionService.getAllProjectPermissions().stream().map(ProjectPermission::getKey).collect(Collectors.toSet()));
}
private void verifyHasAllPermissionsButProjectPermissionsUserAndBrowse(String projectUuid, UserDto user, GroupDto group) {
@@ -663,16 +664,16 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.userPermissionDao().selectGlobalPermissionsOfUser(dbSession, user.getUuid()))
.containsAll(GLOBAL_PERMISSIONS_NAME_SET);
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, null, projectUuid))
- .doesNotContain(UserRole.USER)
- .doesNotContain(UserRole.CODEVIEWER)
+ .doesNotContain(ProjectPermission.USER.getKey())
+ .doesNotContain(ProjectPermission.CODEVIEWER.getKey())
.containsAll(PROJECT_PERMISSIONS_BUT_USER_AND_CODEVIEWER);
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), projectUuid))
- .doesNotContain(UserRole.USER)
- .doesNotContain(UserRole.CODEVIEWER)
+ .doesNotContain(ProjectPermission.USER.getKey())
+ .doesNotContain(ProjectPermission.CODEVIEWER.getKey())
.containsAll(PROJECT_PERMISSIONS_BUT_USER_AND_CODEVIEWER);
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), projectUuid))
- .doesNotContain(UserRole.USER)
- .doesNotContain(UserRole.CODEVIEWER)
+ .doesNotContain(ProjectPermission.USER.getKey())
+ .doesNotContain(ProjectPermission.CODEVIEWER.getKey())
.containsAll(PROJECT_PERMISSIONS_BUT_USER_AND_CODEVIEWER);
}
@@ -684,11 +685,11 @@ public class UpdateVisibilityActionIT {
assertThat(dbClient.userPermissionDao().selectGlobalPermissionsOfUser(dbSession, user.getUuid()))
.containsAll(GLOBAL_PERMISSIONS_NAME_SET);
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, null, projectUuid))
- .containsAll(permissionService.getAllProjectPermissions());
+ .containsAll(permissionService.getAllProjectPermissions().stream().map(ProjectPermission::getKey).collect(Collectors.toSet()));
assertThat(dbClient.groupPermissionDao().selectEntityPermissionsOfGroup(dbSession, group.getUuid(), projectUuid))
- .containsAll(permissionService.getAllProjectPermissions());
+ .containsAll(permissionService.getAllProjectPermissions().stream().map(ProjectPermission::getKey).collect(Collectors.toSet()));
assertThat(dbClient.userPermissionDao().selectEntityPermissionsOfUser(dbSession, user.getUuid(), projectUuid))
- .containsAll(permissionService.getAllProjectPermissions());
+ .containsAll(permissionService.getAllProjectPermissions().stream().map(ProjectPermission::getKey).collect(Collectors.toSet()));
}
private void insertPendingTask(BranchDto branch) {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/CreateEventActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/CreateEventActionIT.java
index fc422a000ab..37ec51ffe6c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/CreateEventActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/CreateEventActionIT.java
@@ -26,7 +26,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
@@ -325,7 +325,7 @@ public class CreateEventActionIT {
}
private void logInAsProjectAdministrator(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
}
private CreateEventResponse call(String categoryName, String name, String analysis) {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java
index 1750eb21b25..d075650e2dd 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java
@@ -23,7 +23,7 @@ import org.apache.commons.lang3.RandomStringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -146,7 +146,7 @@ public class DeleteActionIT {
}
private void logInAsProjectAdministrator(ProjectData project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java
index cd517e6120d..553e7da6897 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -149,7 +149,7 @@ public class DeleteEventActionIT {
}
private void logInAsProjectAdministrator(ProjectData project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/SearchActionIT.java
index 97ce26c55b6..68e0d7c664c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/SearchActionIT.java
@@ -35,7 +35,7 @@ import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.testfixtures.log.LogAndArguments;
import org.sonar.api.testfixtures.log.LogTester;
import org.sonar.api.utils.log.LoggerLevel;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
@@ -186,7 +186,7 @@ public class SearchActionIT {
}
private void addProjectPermission(ProjectData projectData) {
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
.addProjectBranchMapping(projectData.getProjectDto().getUuid(), projectData.getMainBranchComponent());
}
@@ -684,7 +684,7 @@ public class SearchActionIT {
userSession.logIn()
.registerApplication(application)
.registerProjects(project1, project2)
- .addProjectPermission(UserRole.USER, application, project1);
+ .addProjectPermission(ProjectPermission.USER, application, project1);
var projectDbKey = application.getKey();
assertThatThrownBy(() -> call(projectDbKey))
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java
index 366ed153bb8..5cefc8b4537 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -161,7 +161,7 @@ public class UpdateEventActionIT {
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchDto());
db.events().insertEvent(newEvent(analysis).setUuid("E1"));
- userSession.logIn().addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project.getProjectDto());
assertThatThrownBy(() -> call("E1", "name"))
.isInstanceOf(ForbiddenException.class);
@@ -244,7 +244,7 @@ public class UpdateEventActionIT {
}
private void logInAsProjectAdministrator(ProjectData project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/ExportActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/ExportActionIT.java
index 8f6709a3e03..c853b11035c 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/ExportActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/ExportActionIT.java
@@ -23,7 +23,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.ce.task.CeTask;
import org.sonar.db.DbTester;
import org.sonar.db.ce.CeTaskTypes;
@@ -94,7 +94,7 @@ public class ExportActionIT {
@Test
public void triggers_CE_task() {
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(user).addProjectPermission(ProjectPermission.ADMIN, project);
when(exportSubmitter.submitProjectExport(project.getKey(), user.getUuid())).thenReturn(createResponseExampleTask());
TestResponse response = actionTester.newRequest().setMethod("POST").setParam("key", project.getKey()).execute();
@@ -115,7 +115,7 @@ public class ExportActionIT {
@Test
public void triggers_CE_task_if_project_admin() {
UserDto user = db.users().insertUser();
- userSession.logIn(user).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(user).addProjectPermission(ProjectPermission.ADMIN, project);
when(exportSubmitter.submitProjectExport(project.getKey(), user.getUuid())).thenReturn(createResponseExampleTask());
TestResponse response = actionTester.newRequest().setMethod("POST").setParam("key", project.getKey()).execute();
@@ -124,7 +124,7 @@ public class ExportActionIT {
}
private void logInAsProjectAdministrator(String login) {
- userSession.logIn(login).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(login).addProjectPermission(ProjectPermission.ADMIN, project);
}
private String responseExample() {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/StatusActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/StatusActionIT.java
index a1e66d4a4ec..87d3f266ffb 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/StatusActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectdump/ws/StatusActionIT.java
@@ -32,7 +32,7 @@ import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Slug;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -297,7 +297,7 @@ public class StatusActionIT {
}
private void logInAsProjectAdministrator(String login) {
- userSession.logIn(login).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(login).addProjectPermission(ProjectPermission.ADMIN, project);
}
private String ensureDumpFileExists(String projectKey, boolean isImport) throws IOException {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java
index 2f57a80f8fe..f818315c655 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -210,7 +210,7 @@ public class CreateActionIT {
public void fail_if_view() {
PortfolioData view = db.components().insertPrivatePortfolioData();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, view.getRootComponent());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, view.getRootComponent());
TestRequest testRequest = ws.newRequest()
.setParam(PARAM_NAME, "Custom")
.setParam(PARAM_URL, "http://example.org")
@@ -232,7 +232,7 @@ public class CreateActionIT {
@Test
public void fail_when_using_branch_db_uuid() {
ProjectData project = db.components().insertPrivateProject();
- userSession.logIn().addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project.getProjectDto());
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());
TestRequest testRequest = ws.newRequest()
@@ -255,7 +255,7 @@ public class CreateActionIT {
}
private void failIfNotAProjectWithKey(ProjectDto project, ComponentDto component) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = ws.newRequest()
.setParam(PARAM_NAME, "Custom")
@@ -267,7 +267,7 @@ public class CreateActionIT {
}
private void failIfNotAProjectWithUuid(ProjectDto project, ComponentDto component) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest testRequest = ws.newRequest()
.setParam(PARAM_NAME, "Custom")
@@ -299,6 +299,6 @@ public class CreateActionIT {
}
private void logInAsProjectAdministrator(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/DeleteActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/DeleteActionIT.java
index 3812f694ee0..bcbaa7bdf0a 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/DeleteActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/DeleteActionIT.java
@@ -40,7 +40,7 @@ import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_ID;
public class DeleteActionIT {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/SearchActionIT.java
index 23a9a9d253d..012afe3e689 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/SearchActionIT.java
@@ -41,8 +41,8 @@ import static java.lang.String.format;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.Assertions.tuple;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_PROJECT_ID;
import static org.sonar.server.projectlink.ws.ProjectLinksWsParameters.PARAM_PROJECT_KEY;
import static org.sonar.test.JsonAssert.assertJson;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projecttag/ws/SetActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projecttag/ws/SetActionIT.java
index 17a01df1092..e212b81861f 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projecttag/ws/SetActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/projecttag/ws/SetActionIT.java
@@ -46,8 +46,8 @@ import static java.net.HttpURLConnection.HTTP_NO_CONTENT;
import static java.util.Optional.ofNullable;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentDbTester.defaults;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.server.es.Indexers.EntityEvent.PROJECT_TAGS_UPDATE;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java
index df07675c8e8..2b651ca5e81 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java
@@ -24,7 +24,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -76,7 +76,7 @@ class DeselectActionIT {
QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
associateProjectToQualityGate(project, qualityGate);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
ws.newRequest()
.setParam("projectKey", project.getKey())
@@ -141,7 +141,7 @@ class DeselectActionIT {
@Test
void fail_when_not_project_admin() {
ProjectData project = db.components().insertPrivateProject();
- userSession.logIn().addProjectPermission(UserRole.ISSUE_ADMIN, project.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ISSUE_ADMIN, project.getProjectDto());
assertThatThrownBy(() -> ws.newRequest()
.setParam("projectKey", project.projectKey())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/GetByProjectActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/GetByProjectActionIT.java
index a1a6c209018..229afb86992 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/GetByProjectActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/GetByProjectActionIT.java
@@ -22,7 +22,7 @@ package org.sonar.server.qualitygate.ws;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -136,7 +136,7 @@ public class GetByProjectActionIT {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
db.qualityGates().setDefaultQualityGate(qualityGate);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
GetByProjectResponse result = ws.newRequest()
.setParam("project", project.getKey())
@@ -150,7 +150,7 @@ public class GetByProjectActionIT {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
db.qualityGates().setDefaultQualityGate(qualityGate);
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
GetByProjectResponse result = ws.newRequest()
.setParam("project", project.getKey())
@@ -188,6 +188,6 @@ public class GetByProjectActionIT {
}
private void logInAsProjectUser(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/ProjectStatusActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/ProjectStatusActionIT.java
index d990ae3dac0..43140f0e7ed 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/ProjectStatusActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/ProjectStatusActionIT.java
@@ -28,7 +28,7 @@ import org.junit.Test;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -108,7 +108,7 @@ public class ProjectStatusActionIT {
public void test_json_example() throws IOException {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
MetricDto gateDetailsMetric = insertGateDetailMetric();
SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(mainBranch)
@@ -149,7 +149,7 @@ public class ProjectStatusActionIT {
newProjectMeasureDto(gateDetailsMetric, mainBranch, lastAnalysis)
.setData("not_used"));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String response = ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, pastAnalysis.getUuid())
@@ -170,7 +170,7 @@ public class ProjectStatusActionIT {
dbClient.measureDao().insert(dbSession,
newMeasure(mainBranch, gateDetailsMetric, IOUtils.toString(getClass().getResource("ProjectStatusActionIT/measure_data.json"), UTF_8)));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String response = ws.newRequest()
.setParam(PARAM_PROJECT_ID, projectData.projectUuid())
@@ -202,7 +202,7 @@ public class ProjectStatusActionIT {
newProjectMeasureDto(gateDetailsMetric, branch, lastAnalysis)
.setData("not_used"));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String response = ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, pastAnalysis.getUuid())
@@ -223,7 +223,7 @@ public class ProjectStatusActionIT {
dbClient.measureDao().insert(dbSession,
newMeasure(project, gateDetailsMetric, IOUtils.toString(getClass().getResource("ProjectStatusActionIT/measure_data.json"), UTF_8)));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String response = ws.newRequest()
.setParam(PARAM_PROJECT_KEY, project.getKey())
@@ -247,7 +247,7 @@ public class ProjectStatusActionIT {
dbClient.measureDao().insert(dbSession,
newMeasure(branch, gateDetailsMetric, IOUtils.toString(getClass().getResource("ProjectStatusActionIT/measure_data.json"), UTF_8)));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String response = ws.newRequest()
.setParam(PARAM_PROJECT_KEY, mainBranch.getKey())
@@ -273,7 +273,7 @@ public class ProjectStatusActionIT {
dbClient.measureDao().insert(dbSession,
newMeasure(pr, gateDetailsMetric, IOUtils.toString(getClass().getResource("ProjectStatusActionIT/measure_data.json"), UTF_8)));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
String response = ws.newRequest()
.setParam(PARAM_PROJECT_KEY, mainBranch.getKey())
@@ -289,7 +289,7 @@ public class ProjectStatusActionIT {
ComponentDto mainBranch = projectData.getMainBranchComponent();
SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(mainBranch));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ProjectStatusResponse result = ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, snapshot.getUuid())
@@ -303,7 +303,7 @@ public class ProjectStatusActionIT {
public void return_undefined_status_if_project_is_not_analyzed() {
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ProjectStatusResponse result = ws.newRequest()
.setParam(PARAM_PROJECT_ID, projectData.projectUuid())
@@ -319,7 +319,7 @@ public class ProjectStatusActionIT {
ComponentDto mainBranch = projectData.getMainBranchComponent();
SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(mainBranch));
dbSession.commit();
- userSession.addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, snapshot.getUuid())
@@ -332,7 +332,7 @@ public class ProjectStatusActionIT {
ComponentDto mainBranch = projectData.getMainBranchComponent();
SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(mainBranch));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, snapshot.getUuid())
@@ -348,7 +348,7 @@ public class ProjectStatusActionIT {
when(qualityGateCaycChecker.checkCaycCompliantFromProject(any(DbSession.class), eq(projectData.projectUuid()))).thenReturn(COMPLIANT);
SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(mainBranch));
dbSession.commit();
- userSession.addProjectPermission(UserRole.USER, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, projectData.getProjectDto());
ProjectStatusResponse result = ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, snapshot.getUuid())
@@ -363,7 +363,7 @@ public class ProjectStatusActionIT {
ComponentDto mainBranch = projectData.getMainBranchComponent();
SnapshotDto snapshot = dbClient.snapshotDao().insert(dbSession, newAnalysis(mainBranch));
dbSession.commit();
- userSession.addProjectPermission(UserRole.SCAN, projectData.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.SCAN, projectData.getProjectDto());
var response = ws.newRequest()
.setParam(PARAM_ANALYSIS_ID, snapshot.getUuid()).execute();
@@ -451,7 +451,7 @@ public class ProjectStatusActionIT {
public void fail_when_using_branch_uuid() {
ProjectData projectData = db.components().insertPublicProject();
ComponentDto mainBranch = projectData.getMainBranchComponent();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, projectData.getProjectDto());
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, projectData.getProjectDto());
ComponentDto branch = db.components().insertProjectBranch(mainBranch);
SnapshotDto snapshot = db.components().insertSnapshot(branch);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SearchActionIT.java
index 8456e2ffede..93e63822c2b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SearchActionIT.java
@@ -48,7 +48,7 @@ import static org.mockito.Mockito.when;
import static org.sonar.api.server.ws.WebService.SelectionMode.ALL;
import static org.sonar.api.server.ws.WebService.SelectionMode.DESELECTED;
import static org.sonar.api.server.ws.WebService.SelectionMode.SELECTED;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_GATE_NAME;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_PAGE;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java
index a9cd281be44..33f243e7d43 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java
@@ -37,8 +37,8 @@ import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_GATE_NAME;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/QProfileBackuperImplIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/QProfileBackuperImplIT.java
index 01f81f997d6..e742c401c4d 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/QProfileBackuperImplIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/QProfileBackuperImplIT.java
@@ -39,7 +39,7 @@ import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbSession;
@@ -105,7 +105,7 @@ class QProfileBackuperImplIT {
"<rule>" +
"<repositoryKey>" + rule.getRepositoryKey() + "</repositoryKey>" +
"<key>" + rule.getRuleKey() + "</key>" +
- "<type>" + RuleType.valueOf(rule.getType()).name() + "</type>" +
+ "<type>" + RuleType.fromDbConstant(rule.getType()).name() + "</type>" +
"<priority>" + activeRule.getSeverityString() + "</priority>" +
"<impacts>" +
"<impact>" +
@@ -135,7 +135,7 @@ class QProfileBackuperImplIT {
"<rule>" +
"<repositoryKey>" + rule.getRepositoryKey() + "</repositoryKey>" +
"<key>" + rule.getRuleKey() + "</key>" +
- "<type>" + RuleType.valueOf(rule.getType()).name() + "</type>" +
+ "<type>" + RuleType.fromDbConstant(rule.getType()).name() + "</type>" +
"<priority>" + activeRule.getSeverityString() + "</priority>" +
"<impacts>" +
"<impact>" +
@@ -164,7 +164,7 @@ class QProfileBackuperImplIT {
"<rule>" +
"<repositoryKey>" + rule.getRepositoryKey() + "</repositoryKey>" +
"<key>" + rule.getRuleKey() + "</key>" +
- "<type>" + RuleType.valueOf(rule.getType()).name() + "</type>" +
+ "<type>" + RuleType.fromDbConstant(rule.getType()).name() + "</type>" +
"<priority>" + activeRule.getSeverityString() + "</priority>" +
"<impacts>" +
"<impact>" +
@@ -217,7 +217,7 @@ class QProfileBackuperImplIT {
"<rules><rule>" +
"<repositoryKey>" + rule.getRepositoryKey() + "</repositoryKey>" +
"<key>" + rule.getKey().rule() + "</key>" +
- "<type>" + RuleType.valueOf(rule.getType()) + "</type>" +
+ "<type>" + RuleType.fromDbConstant(rule.getType()) + "</type>" +
"<priority>" + activeRule.getSeverityString() + "</priority>" +
"<impacts>" +
"<impact>" +
@@ -254,7 +254,7 @@ class QProfileBackuperImplIT {
"<rules><rule>" +
"<repositoryKey>" + rule.getRepositoryKey() + "</repositoryKey>" +
"<key>" + rule.getKey().rule() + "</key>" +
- "<type>" + RuleType.valueOf(rule.getType()) + "</type>" +
+ "<type>" + RuleType.fromDbConstant(rule.getType()) + "</type>" +
"<priority>" + activeRule.getSeverityString() + "</priority>" +
"<impacts>" +
"<impact>" +
@@ -404,7 +404,7 @@ class QProfileBackuperImplIT {
"<rule>" +
"<repositoryKey>" + rule.getRepositoryKey() + "</repositoryKey>" +
"<key>" + rule.getRuleKey() + "</key>" +
- "<type>" + RuleType.valueOf(rule.getType()).name() + "</type>" +
+ "<type>" + RuleType.fromDbConstant(rule.getType()).name() + "</type>" +
"<priority>" + activeRule.getSeverityString() + "</priority>" +
(prioritizedInBackup == null ? "" : "<prioritizedRule>" + prioritizedInBackup + "</prioritizedRule>") +
"</rule>" +
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/AddProjectActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/AddProjectActionIT.java
index e9c3e23a07a..d0033c92997 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/AddProjectActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/AddProjectActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.resources.Languages;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -146,7 +146,7 @@ public class AddProjectActionIT {
public void project_administrator_can_change_profile() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
QProfileDto profile = db.qualityProfiles().insert(qp -> qp.setLanguage("xoo"));
- userSession.logIn(db.users().insertUser()).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(db.users().insertUser()).addProjectPermission(ProjectPermission.ADMIN, project);
call(project, profile);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/CompareActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/CompareActionIT.java
index f7e26b0be12..f7d02ec35b6 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/CompareActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/CompareActionIT.java
@@ -31,7 +31,7 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.rule.RuleParamType;
import org.sonar.api.server.ws.WebService;
import org.sonar.core.util.Uuids;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/ProjectsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/ProjectsActionIT.java
index 79fe68897a8..92b3916d2ff 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/ProjectsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/ProjectsActionIT.java
@@ -38,7 +38,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.api.server.ws.WebService.Param.PAGE;
import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonarqube.ws.client.qualityprofile.QualityProfileWsParameters.PARAM_KEY;
public class ProjectsActionIT {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionIT.java
index 292801e250d..e5e0580db80 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualityprofile/ws/RemoveProjectActionIT.java
@@ -26,7 +26,7 @@ import org.mockito.Mockito;
import org.sonar.api.resources.Languages;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
@@ -123,7 +123,7 @@ public class RemoveProjectActionIT {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
QProfileDto profile = db.qualityProfiles().insert(qp -> qp.setLanguage("xoo"));
db.qualityProfiles().associateWithProject(project, profile);
- userSession.logIn(db.users().insertUser()).addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn(db.users().insertUser()).addProjectPermission(ProjectPermission.ADMIN, project);
call(project, profile);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/RuleUpdaterIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/RuleUpdaterIT.java
index 4600f01695f..f62eb8b9fe6 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/RuleUpdaterIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/RuleUpdaterIT.java
@@ -34,7 +34,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
import org.sonar.api.utils.System2;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/CreateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/CreateActionIT.java
index 93c7ca23ac9..a44fbdd1794 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/CreateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/CreateActionIT.java
@@ -50,7 +50,7 @@ import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
-import static org.sonar.api.rules.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.BUG;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonar.db.rule.RuleTesting.newCustomRule;
import static org.sonar.db.rule.RuleTesting.newTemplateRule;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/RuleQueryFactoryIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/RuleQueryFactoryIT.java
index 2678a18f1e4..21a5abd41fb 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/RuleQueryFactoryIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/RuleQueryFactoryIT.java
@@ -43,8 +43,8 @@ import static org.sonar.api.rule.RuleStatus.READY;
import static org.sonar.api.rule.Severity.CRITICAL;
import static org.sonar.api.rule.Severity.MAJOR;
import static org.sonar.api.rule.Severity.MINOR;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
import static org.sonar.api.server.ws.WebService.Param.ASCENDING;
import static org.sonar.api.server.ws.WebService.Param.SORT;
import static org.sonar.api.server.ws.WebService.Param.TEXT_QUERY;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/SearchActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/SearchActionIT.java
index c018cdfae6e..2006f9a94f0 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/SearchActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/SearchActionIT.java
@@ -43,7 +43,7 @@ import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
@@ -353,7 +353,7 @@ class SearchActionIT {
Common.Impact.newBuilder()
.setSoftwareQuality(Common.SoftwareQuality.SECURITY)
.setSeverity(Common.ImpactSeverity.ImpactSeverity_INFO).build());
- assertThat(result.getType().name()).isEqualTo(RuleType.valueOf(rule.getType()).name());
+ assertThat(result.getType().name()).isEqualTo(RuleType.fromDbConstant(rule.getType()).name());
assertThat(result.getLang()).isEqualTo("java");
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/ShowActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/ShowActionIT.java
index 625eccbf32e..74e99d2bf3b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/ShowActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/ShowActionIT.java
@@ -28,7 +28,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/UpdateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/UpdateActionIT.java
index 8c8fba93f31..6d644e7b5ae 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/UpdateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/UpdateActionIT.java
@@ -27,7 +27,7 @@ import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/ClearActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/ClearActionIT.java
index a297904ea2a..1152364b467 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/ClearActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/ClearActionIT.java
@@ -45,7 +45,7 @@ import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
public class ClearActionIT {
@Rule
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/GetActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/GetActionIT.java
index 45e09dfca4a..b473acda9bf 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/GetActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/scannercache/ws/GetActionIT.java
@@ -29,7 +29,7 @@ import org.apache.commons.io.IOUtils;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.audit.NoOpAuditPersister;
import org.sonar.db.component.BranchDao;
@@ -50,7 +50,7 @@ import org.sonar.server.ws.WsActionTester;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.SCAN;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
public class GetActionIT {
@Rule
@@ -157,7 +157,7 @@ public class GetActionIT {
@Test
public void fail_if_no_permissions() {
ProjectDto project = dbTester.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.CODEVIEWER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.CODEVIEWER, project);
TestRequest request = wsTester
.newRequest()
.setParam("project", project.getKey());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ListDefinitionsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ListDefinitionsActionIT.java
index 0001c6ad584..330619afd57 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ListDefinitionsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ListDefinitionsActionIT.java
@@ -30,7 +30,7 @@ import org.sonar.api.config.PropertyFieldDefinition;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.permission.GlobalPermission;
@@ -346,7 +346,7 @@ public class ListDefinitionsActionIT {
@Test
public void fail_when_user_has_not_project_browse_permission() {
- userSession.logIn("project-admin").addProjectPermission(UserRole.CODEVIEWER, project);
+ userSession.logIn("project-admin").addProjectPermission(ProjectPermission.CODEVIEWER, project);
propertyDefinitions.addComponent(PropertyDefinition.builder("foo").build());
assertThatThrownBy(() -> executeRequest(project.getKey()))
@@ -442,7 +442,7 @@ public class ListDefinitionsActionIT {
}
private void logInAsProjectUser() {
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
}
private void logInAsAdmin() {
@@ -451,8 +451,8 @@ public class ListDefinitionsActionIT {
private void logInAsProjectAdmin() {
userSession.logIn()
- .addProjectPermission(UserRole.ADMIN, project)
- .addProjectPermission(UserRole.USER, project);
+ .addProjectPermission(ProjectPermission.ADMIN, project)
+ .addProjectPermission(ProjectPermission.USER, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ResetActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ResetActionIT.java
index c4bbf32399e..cde37a27d57 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ResetActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ResetActionIT.java
@@ -54,8 +54,8 @@ import static java.lang.String.format;
import static java.net.HttpURLConnection.HTTP_NO_CONTENT;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentQualifiers.PROJECT;
import static org.sonar.db.component.ComponentQualifiers.VIEW;
import static org.sonar.db.property.PropertyTesting.newComponentPropertyDto;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/SetActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/SetActionIT.java
index 5cbdd246351..cd482f865e3 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/SetActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/SetActionIT.java
@@ -40,7 +40,7 @@ import org.sonar.api.config.PropertyFieldDefinition;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -1288,11 +1288,11 @@ public class SetActionIT {
}
private void logInAsPortfolioAdministrator(PortfolioDto portfolio) {
- userSession.logIn().addPortfolioPermission(UserRole.ADMIN, portfolio);
+ userSession.logIn().addPortfolioPermission(ProjectPermission.ADMIN, portfolio);
}
private void logInAsProjectAdministrator(ProjectDto project) {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
}
private ProjectData randomPublicOrPrivateProject() {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ValuesActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ValuesActionIT.java
index 1f7790aaec1..252cc78512e 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ValuesActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/setting/ws/ValuesActionIT.java
@@ -33,7 +33,7 @@ import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.PropertyFieldDefinition;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ProjectData;
@@ -57,9 +57,10 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.groups.Tuple.tuple;
import static org.sonar.db.component.ComponentQualifiers.PROJECT;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.SCAN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.SCAN;
import static org.sonar.db.property.PropertyTesting.newComponentPropertyDto;
import static org.sonar.db.property.PropertyTesting.newGlobalPropertyDto;
@@ -400,7 +401,7 @@ public class ValuesActionIT {
@Test
public void return_global_secured_settings_when_not_authenticated_but_with_scan_permission() {
- userSession.anonymous().addPermission(SCAN);
+ userSession.anonymous().addPermission(GlobalPermission.SCAN);
definitions.addComponents(asList(
PropertyDefinition.builder("foo").build(),
PropertyDefinition.builder("secret.secured").build()));
@@ -418,7 +419,7 @@ public class ValuesActionIT {
public void return_component_secured_settings_when_not_authenticated_but_with_project_scan_permission() {
userSession
.addProjectPermission(USER, project)
- .addProjectPermission(SCAN.getKey(), project);
+ .addProjectPermission(ProjectPermission.SCAN, project);
definitions.addComponents(asList(
PropertyDefinition.builder("foo").onQualifiers(PROJECT).build(),
PropertyDefinition.builder("global.secret.secured").build(),
@@ -439,7 +440,7 @@ public class ValuesActionIT {
public void return_component_secured_settings_even_if_not_defined_when_not_authenticated_but_with_scan_permission() {
userSession
.addProjectPermission(USER, project)
- .addProjectPermission(SCAN.getKey(), project);
+ .addProjectPermission(ProjectPermission.SCAN, project);
db.properties().insertProperties(null, project.getKey(), project.getName(), project.getQualifier(),
newComponentPropertyDto(project).setKey("not-defined.secured").setValue("123"));
@@ -691,7 +692,7 @@ public class ValuesActionIT {
@Test
public void fail_when_setting_key_is_defined_in_sonar_properties() {
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
String settingKey = ProcessProperties.Property.JDBC_URL.getKey();
assertThatThrownBy(() -> {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IndexActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IndexActionIT.java
index 19d3eb70d9d..ceb15f97d10 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IndexActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IndexActionIT.java
@@ -37,8 +37,8 @@ import org.sonar.server.ws.TestResponse;
import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.test.JsonAssert.assertJson;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IssueSnippetsActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IssueSnippetsActionIT.java
index 67af5aa5dd0..3b9f012ffc8 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IssueSnippetsActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/IssueSnippetsActionIT.java
@@ -59,8 +59,8 @@ import static org.sonar.api.measures.CoreMetrics.LINES_KEY;
import static org.sonar.api.measures.CoreMetrics.TECHNICAL_DEBT_KEY;
import static org.sonar.api.measures.CoreMetrics.TESTS_KEY;
import static org.sonar.api.measures.CoreMetrics.VIOLATIONS_KEY;
-import static org.sonar.api.web.UserRole.CODEVIEWER;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.CODEVIEWER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.ComponentTesting.newFileDto;
public class IssueSnippetsActionIT {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java
index 4c223f200c1..1f5ef4123d4 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.mockito.stubbing.Answer;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester;
import org.sonar.db.audit.NoOpAuditPersister;
@@ -136,9 +136,9 @@ public class LinesActionIT {
db.commit();
userSession.logIn("login")
- .addProjectPermission(UserRole.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), branch)
- .addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto());
+ .addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto());
tester.newRequest()
.setParam("key", file.getKey())
@@ -162,8 +162,8 @@ public class LinesActionIT {
db.commit();
userSession.logIn("login")
- .addProjectPermission(UserRole.USER, projectData.getProjectDto())
- .addProjectPermission(UserRole.CODEVIEWER, projectData.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
+ .addProjectPermission(ProjectPermission.CODEVIEWER, projectData.getProjectDto())
.addProjectBranchMapping(projectData.projectUuid(), branch);
tester.newRequest()
@@ -312,7 +312,7 @@ public class LinesActionIT {
public void fail_if_branch_does_not_exist() {
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));
assertThatThrownBy(() -> tester.newRequest()
@@ -327,7 +327,7 @@ public class LinesActionIT {
public void fail_when_uuid_and_branch_params_are_used_together() {
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));
assertThatThrownBy(() -> tester.newRequest()
@@ -342,7 +342,7 @@ public class LinesActionIT {
public void fail_when_using_branch_uuid() {
ProjectData project = db.components().insertPrivateProject();
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
assertThatThrownBy(() -> tester.newRequest()
.setParam("uuid", branch.getUuid())
@@ -406,7 +406,7 @@ public class LinesActionIT {
private void setUserWithValidPermission(ProjectData privateProject) {
userSession.logIn("login")
- .addProjectPermission(UserRole.CODEVIEWER, privateProject.getProjectDto())
+ .addProjectPermission(ProjectPermission.CODEVIEWER, privateProject.getProjectDto())
.registerBranches(privateProject.getMainBranchDto());
}
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/RawActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/RawActionIT.java
index 281036addb3..09a6bbc55b2 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/RawActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/RawActionIT.java
@@ -23,7 +23,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.server.component.ComponentTypesRule;
@@ -58,7 +58,7 @@ public class RawActionIT {
@Test
public void raw_from_file() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSession.addProjectPermission(ProjectPermission.CODEVIEWER, project);
ComponentDto file = db.components().insertComponent(newFileDto(project));
db.fileSources().insertFileSource(file, s -> s.setSourceData(
Data.newBuilder()
@@ -76,7 +76,7 @@ public class RawActionIT {
@Test
public void raw_from_branch_file() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSession.addProjectPermission(ProjectPermission.CODEVIEWER, project);
String branchName = secure().nextAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(branchName));
userSession.addProjectBranchMapping(project.uuid(), branch);
@@ -107,7 +107,7 @@ public class RawActionIT {
@Test
public void fail_on_unknown_branch() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSession.addProjectPermission(ProjectPermission.CODEVIEWER, project);
ComponentDto branch = db.components().insertProjectBranch(project);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.uuid()));
db.fileSources().insertFileSource(file);
@@ -123,7 +123,7 @@ public class RawActionIT {
@Test
public void fail_when_using_branch_db_key() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.CODEVIEWER, project);
+ userSession.addProjectPermission(ProjectPermission.CODEVIEWER, project);
ComponentDto branch = db.components().insertProjectBranch(project);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.uuid()));
db.fileSources().insertFileSource(file);
@@ -138,7 +138,7 @@ public class RawActionIT {
@Test
public void fail_when_wrong_permission() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- userSession.addProjectPermission(UserRole.ISSUE_ADMIN, project);
+ userSession.addProjectPermission(ProjectPermission.ISSUE_ADMIN, project);
ComponentDto file = db.components().insertComponent(newFileDto(project));
assertThatThrownBy(() -> ws.newRequest()
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java
index c3b07038193..9931649c1d8 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -74,7 +74,7 @@ public class ScmActionIT {
@Test
public void show_scm() {
userSessionRule.logIn();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
@@ -93,7 +93,7 @@ public class ScmActionIT {
@Test
public void hide_author_if_not_logged_in() {
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
@@ -113,7 +113,7 @@ public class ScmActionIT {
@Test
public void show_scm_from_given_range_lines() {
userSessionRule.logIn();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
@@ -139,7 +139,7 @@ public class ScmActionIT {
@Test
public void not_group_lines_by_commit() {
userSessionRule.logIn();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
// lines 1 and 2 are the same commit, but not 3 (different date)
@@ -165,7 +165,7 @@ public class ScmActionIT {
@Test
public void group_lines_by_commit() {
userSessionRule.logIn();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
// lines 1 and 2 are the same commit, but not 3 (different date)
@@ -191,7 +191,7 @@ public class ScmActionIT {
@Test
public void accept_negative_value_in_from_parameter() {
userSessionRule.logIn();
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
@@ -216,7 +216,7 @@ public class ScmActionIT {
@Test
public void return_empty_value_when_no_scm() {
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
@@ -234,7 +234,7 @@ public class ScmActionIT {
@Test
public void fail_without_code_viewer_permission() {
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
assertThatThrownBy(() -> {
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java
index 7aef5491ff0..9a5e6eee3f5 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDao;
@@ -74,7 +74,7 @@ public class ShowActionIT {
@Test
public void show_source() {
String fileKey = "src/Foo.java";
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project)
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project)
.addProjectBranchMapping(project.getUuid(), mainBranchComponentDto);
when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file));
when(sourceService.getLinesAsHtml(eq(session), eq(file.uuid()), anyInt(), anyInt())).thenReturn(Optional.of(newArrayList(
@@ -94,7 +94,7 @@ public class ShowActionIT {
@Test
public void show_source_with_from_and_to_params() {
String fileKey = "src/Foo.java";
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project)
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project)
.addProjectBranchMapping(project.getUuid(), mainBranchComponentDto);
when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file));
when(sourceService.getLinesAsHtml(session, file.uuid(), 3, 5)).thenReturn(Optional.of(newArrayList(
@@ -112,7 +112,7 @@ public class ShowActionIT {
@Test
public void show_source_accept_from_less_than_one() {
String fileKey = "src/Foo.java";
- userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project)
+ userSessionRule.addProjectPermission(ProjectPermission.CODEVIEWER, project)
.addProjectBranchMapping(project.getUuid(), mainBranchComponentDto);
when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file));
when(sourceService.getLinesAsHtml(session, file.uuid(), 1, 5)).thenReturn(Optional.of(newArrayList(
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ui/ws/ComponentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ui/ws/ComponentActionIT.java
index 0ecb7a35dc8..405d861bab7 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ui/ws/ComponentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/ui/ws/ComponentActionIT.java
@@ -31,7 +31,7 @@ import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.api.web.page.Page;
import org.sonar.api.web.page.Page.Qualifier;
import org.sonar.api.web.page.PageDefinition;
@@ -119,7 +119,7 @@ public class ComponentActionIT {
@Test
public void return_info_if_user_has_browse_permission_on_project() {
ProjectData project = insertProject();
- userSession.logIn().addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -129,7 +129,7 @@ public class ComponentActionIT {
@Test
public void return_info_if_user_has_administration_permission_on_project() {
ProjectData project = insertProject();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -148,7 +148,7 @@ public class ComponentActionIT {
@Test
public void return_component_info_when_anonymous_no_snapshot() {
ProjectData project = insertProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -161,7 +161,7 @@ public class ComponentActionIT {
UserDto user = db.users().insertUser("obiwan");
propertyDbTester.insertProperty(new PropertyDto().setKey("favourite").setEntityUuid(projectData.getProjectDto().getUuid()).setUserUuid(user.getUuid()),
projectData.getProjectDto().getKey(), projectData.getProjectDto().getName(), projectData.getProjectDto().getQualifier(), user.getLogin());
- userSession.logIn(user).addProjectPermission(UserRole.USER, projectData.getProjectDto())
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto());
init();
@@ -177,7 +177,7 @@ public class ComponentActionIT {
UserDto user = db.users().insertUser("obiwan");
propertyDbTester.insertProperty(new PropertyDto().setKey("favourite").setEntityUuid(projectData.projectUuid()).setUserUuid(user.getUuid()),
projectDto.getKey(), projectDto.getName(), projectDto.getQualifier(), user.getLogin());
- userSession.logIn(user).addProjectPermission(UserRole.USER, projectData.getProjectDto())
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, projectData.getProjectDto())
.registerBranches(branch);
init();
@@ -210,8 +210,8 @@ public class ComponentActionIT {
propertyDbTester.insertProperty(new PropertyDto().setKey("favourite").setEntityUuid(subportfolio.uuid()).setUserUuid(user.getUuid()),
subportfolio.getKey(), subportfolio.name(), subportfolio.qualifier(), user.getLogin());
- userSession.logIn(user).addProjectPermission(UserRole.USER, portfolio)
- .addProjectPermission(UserRole.USER, subportfolio);
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, portfolio)
+ .addProjectPermission(ProjectPermission.USER, subportfolio);
init();
String json = ws.newRequest()
@@ -238,7 +238,7 @@ public class ComponentActionIT {
propertyDbTester.insertProperty(new PropertyDto().setKey("favourite").setEntityUuid(portfolio.uuid()).setUserUuid(user.getUuid()),
subportfolio.getKey(), portfolio.name(), portfolio.qualifier(), user.getLogin());
- userSession.logIn(user).addProjectPermission(UserRole.USER, portfolio);
+ userSession.logIn(user).addProjectPermission(ProjectPermission.USER, portfolio);
init();
String json = ws.newRequest()
@@ -264,7 +264,7 @@ public class ComponentActionIT {
application1.getProjectDto(),
project11.getProjectDto(),
project12.getProjectDto());
- userSession.addProjectPermission(UserRole.USER, application1.getProjectDto(), project11.getProjectDto(), project12.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, application1.getProjectDto(), project11.getProjectDto(), project12.getProjectDto())
.registerBranches(application1.getMainBranchDto());
ProjectData application2 = db.components().insertPrivateApplication();
@@ -274,7 +274,7 @@ public class ComponentActionIT {
application2.getProjectDto(),
project21.getProjectDto(),
project22.getProjectDto());
- userSession.addProjectPermission(UserRole.USER, application2.getProjectDto(), project21.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, application2.getProjectDto(), project21.getProjectDto())
.registerBranches(application2.getMainBranchDto());
init();
@@ -298,7 +298,7 @@ public class ComponentActionIT {
db.components().insertSnapshot(project, snapshot -> snapshot
.setCreatedAt(parseDateTime("2015-04-22T11:44:00+0200").getTime())
.setProjectVersion("3.14"));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -309,7 +309,7 @@ public class ComponentActionIT {
public void return_component_info_when_file_on_master() {
db.qualityGates().createDefaultQualityGate();
ComponentDto main = componentDbTester.insertPrivateProject(p -> p.setName("Sample").setKey("sample")).getMainBranchComponent();
- userSession.addProjectPermission(UserRole.USER, main);
+ userSession.addProjectPermission(ProjectPermission.USER, main);
init();
ComponentDto dirDto = componentDbTester.insertComponent(newDirectory(main, "src"));
@@ -328,7 +328,7 @@ public class ComponentActionIT {
ProjectData project = componentDbTester.insertPrivateProject(p -> p.setName("Sample").setKey("sample"));
String branchName = "feature1";
ComponentDto branch = componentDbTester.insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey(branchName));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
userSession.addProjectBranchMapping(project.projectUuid(), branch);
init();
ComponentDto dirDto = componentDbTester.insertComponent(newDirectory(branch, "src"));
@@ -374,7 +374,7 @@ public class ComponentActionIT {
addQualityProfiles(project.getMainBranchComponent(),
new QualityProfile(qp1.getKee(), qp1.getName(), qp1.getLanguage(), new Date()),
new QualityProfile(qp2.getKee(), qp2.getName(), qp2.getLanguage(), new Date()));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -389,7 +389,7 @@ public class ComponentActionIT {
@Test
public void return_empty_quality_profiles_when_no_measure() {
ProjectData project = insertProject();
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -402,7 +402,7 @@ public class ComponentActionIT {
ProjectData project = db.components().insertPrivateProject();
QualityGateDto qualityGateDto = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way"));
db.qualityGates().associateProjectToQualityGate(project.getProjectDto(), qualityGateDto);
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -417,7 +417,7 @@ public class ComponentActionIT {
BranchDto branch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.BRANCH));
QualityGateDto qualityGateDto = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way"));
db.qualityGates().associateProjectToQualityGate(project, qualityGateDto);
- userSession.addProjectPermission(UserRole.USER, project)
+ userSession.addProjectPermission(ProjectPermission.USER, project)
.addProjectBranchMapping(project.getUuid(), db.components().getComponentDto(branch));
init();
@@ -434,7 +434,7 @@ public class ComponentActionIT {
public void return_default_quality_gate() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
db.qualityGates().createDefaultQualityGate(qg -> qg.setName("Sonar way"));
- userSession.addProjectPermission(UserRole.USER, project);
+ userSession.addProjectPermission(ProjectPermission.USER, project);
init();
executeAndVerify(project.getKey(), "return_default_quality_gate.json");
@@ -443,7 +443,7 @@ public class ComponentActionIT {
@Test
public void return_extensions() {
ProjectData project = insertProject();
- userSession.anonymous().addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.anonymous().addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init(createPages());
@@ -478,8 +478,8 @@ public class ComponentActionIT {
public void return_extensions_for_admin() {
ProjectData project = insertProject();
userSession.anonymous()
- .addProjectPermission(UserRole.USER, project.getProjectDto())
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init(createPages());
@@ -491,8 +491,8 @@ public class ComponentActionIT {
ProjectData project = insertProject();
UserDto user = db.users().insertUser();
userSession.logIn(user)
- .addProjectPermission(UserRole.USER, project.getProjectDto())
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
Page page1 = Page.builder("my_plugin/first_page")
.setName("First Page")
@@ -515,8 +515,8 @@ public class ComponentActionIT {
public void return_configuration_with_all_properties() {
ProjectData project = insertProject();
userSession.anonymous()
- .addProjectPermission(UserRole.USER, project.getProjectDto())
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
ComponentType projectComponentType = ComponentType.builder(project.getProjectDto().getQualifier())
.setProperty("comparable", true)
@@ -537,7 +537,7 @@ public class ComponentActionIT {
public void return_configuration_for_quality_profile_admin() {
ProjectData project = insertProject();
userSession.logIn()
- .addProjectPermission(UserRole.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.addPermission(ADMINISTER_QUALITY_PROFILES)
.registerBranches(project.getMainBranchDto());
init();
@@ -549,7 +549,7 @@ public class ComponentActionIT {
public void return_configuration_for_quality_gate_admin() {
ProjectData project = insertProject();
userSession.logIn()
- .addProjectPermission(UserRole.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.addPermission(ADMINISTER_QUALITY_GATES)
.registerBranches(project.getMainBranchDto());
init();
@@ -562,9 +562,9 @@ public class ComponentActionIT {
ProjectData project = insertProject();
UserSessionRule userSessionRule = userSession.logIn();
init();
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto())
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto());
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto());
String json = execute(project.projectKey());
@@ -592,8 +592,8 @@ public class ComponentActionIT {
ProjectData project = insertProject();
UserSessionRule userSessionRule = userSession.logIn();
init();
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto())
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
String json = execute(project.projectKey());
@@ -621,7 +621,7 @@ public class ComponentActionIT {
ProjectData project = insertProject();
UserSessionRule userSessionRule = userSession.logIn();
init();
- userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSessionRule.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
String json = execute(project.projectKey());
@@ -636,7 +636,7 @@ public class ComponentActionIT {
ComponentDto file = componentDbTester.insertComponent(newFileDto(directory, directory, "cdef").setName("Source.xoo")
.setKey("polop:src/main/xoo/Source.xoo")
.setPath(directory.path()));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init();
@@ -646,7 +646,7 @@ public class ComponentActionIT {
@Test
public void project_administrator_is_allowed_to_get_information() {
ProjectData project = insertProject();
- userSession.addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSession.addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
init(createPages());
@@ -660,7 +660,7 @@ public class ComponentActionIT {
init();
userSession.logIn()
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.addPermission(GlobalPermission.ADMINISTER)
.registerBranches(project.getMainBranchDto());
assertJson(execute(project.projectKey())).isSimilarTo("{\"visibility\": \"private\"}");
@@ -673,7 +673,7 @@ public class ComponentActionIT {
init();
userSession.logIn()
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto())
.addPermission(GlobalPermission.ADMINISTER);
assertJson(execute(project.projectKey())).isSimilarTo("{\"visibility\": \"public\"}");
@@ -686,13 +686,13 @@ public class ComponentActionIT {
init(createPages());
userSession.logIn()
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.addPermission(GlobalPermission.ADMINISTER)
.registerBranches(project.getMainBranchDto());
assertJson(execute(project.projectKey())).isSimilarTo("{\"configuration\": {\"canApplyPermissionTemplate\": true}}");
userSession.logIn()
- .addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ .addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
assertJson(execute(project.projectKey())).isSimilarTo("{\"configuration\": {\"canApplyPermissionTemplate\": false}}");
@@ -704,7 +704,7 @@ public class ComponentActionIT {
ProjectData project = db.components().insertPublicProject();
init(createPages());
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
assertJson(execute(project.projectKey())).isSimilarTo("{\"configuration\": {\"canUpdateProjectVisibilityToPrivate\": true}}");
}
@@ -763,8 +763,8 @@ public class ComponentActionIT {
QualityGateDto qualityGateDto = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way"));
db.qualityGates().associateProjectToQualityGate(db.components().getProjectDtoByMainBranch(mainBranch), qualityGateDto);
userSession.logIn(user)
- .addProjectPermission(UserRole.USER, projectDto)
- .addProjectPermission(UserRole.ADMIN, projectDto)
+ .addProjectPermission(ProjectPermission.USER, projectDto)
+ .addProjectPermission(ProjectPermission.ADMIN, projectDto)
.registerBranches(projectData.getMainBranchDto());
String result = execute(mainBranch.getKey());
@@ -798,7 +798,7 @@ public class ComponentActionIT {
public void fail_on_directory_key_as_param() {
ProjectData project = insertProject();
ComponentDto directory = componentDbTester.insertComponent(newDirectory(project.getMainBranchComponent(), "src/main/xoo"));
- userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
+ userSession.addProjectPermission(ProjectPermission.USER, project.getProjectDto());
init();
String dirKey = directory.getKey();
assertThatThrownBy(() -> execute(dirKey))
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionHomepageIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionHomepageIT.java
index f94a66590b4..b74d69f3c9f 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionHomepageIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionHomepageIT.java
@@ -50,7 +50,7 @@ import static org.apache.commons.lang3.RandomStringUtils.secure;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.PROJECTS;
@RunWith(DataProviderRunner.class)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionIT.java
index f343d99f2b2..74aeb14892b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/CurrentActionIT.java
@@ -50,7 +50,7 @@ import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.db.permission.GlobalPermission.SCAN;
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/DeactivateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/DeactivateActionIT.java
index 40e570e8b29..b8eb63a0e4f 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/DeactivateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/user/ws/DeactivateActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -175,8 +175,8 @@ public class DeactivateActionIT {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
db.users().insertGlobalPermissionOnUser(user, GlobalPermission.SCAN);
db.users().insertGlobalPermissionOnUser(user, GlobalPermission.ADMINISTER_QUALITY_PROFILES);
- db.users().insertProjectPermissionOnUser(user, UserRole.USER, project);
- db.users().insertProjectPermissionOnUser(user, UserRole.CODEVIEWER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.USER, project);
+ db.users().insertProjectPermissionOnUser(user, ProjectPermission.CODEVIEWER, project);
deactivate(user.getLogin());
@@ -191,8 +191,8 @@ public class DeactivateActionIT {
UserDto user = db.users().insertUser();
PermissionTemplateDto template = db.permissionTemplates().insertTemplate();
PermissionTemplateDto anotherTemplate = db.permissionTemplates().insertTemplate();
- db.permissionTemplates().addUserToTemplate(template.getUuid(), user.getUuid(), UserRole.USER, template.getName(), user.getLogin());
- db.permissionTemplates().addUserToTemplate(anotherTemplate.getUuid(), user.getUuid(), UserRole.CODEVIEWER, anotherTemplate.getName(), user.getLogin());
+ db.permissionTemplates().addUserToTemplate(template.getUuid(), user.getUuid(), ProjectPermission.USER, template.getName(), user.getLogin());
+ db.permissionTemplates().addUserToTemplate(anotherTemplate.getUuid(), user.getUuid(), ProjectPermission.CODEVIEWER, anotherTemplate.getName(), user.getLogin());
deactivate(user.getLogin());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usergroups/ws/DeleteActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usergroups/ws/DeleteActionIT.java
index c8f7983e297..42513c13d6b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usergroups/ws/DeleteActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usergroups/ws/DeleteActionIT.java
@@ -26,7 +26,7 @@ import org.junit.Test;
import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.WebService.Action;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactoryImpl;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -146,7 +146,7 @@ public class DeleteActionIT {
insertDefaultGroup();
GroupDto group = db.users().insertGroup();
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
- db.users().insertProjectPermissionOnGroup(group, UserRole.ADMIN, project);
+ db.users().insertProjectPermissionOnGroup(group, ProjectPermission.ADMIN, project);
loginAsAdmin();
newRequest()
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usertoken/ws/GenerateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usertoken/ws/GenerateActionIT.java
index e37a848d96a..f5ce53e5487 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usertoken/ws/GenerateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/usertoken/ws/GenerateActionIT.java
@@ -34,11 +34,12 @@ import org.sonar.api.config.internal.MapSettings;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
import org.sonar.db.DbTester;
-import org.sonar.server.component.ComponentTypesRule;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.TokenType;
import org.sonar.db.user.UserDto;
import org.sonar.server.component.ComponentFinder;
+import org.sonar.server.component.ComponentTypesRule;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException;
@@ -176,7 +177,7 @@ public class GenerateActionIT {
public void a_user_can_generate_projectAnalysisToken_with_the_project_scan_permission() {
UserDto user = userLogin();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.addProjectPermission(SCAN.toString(), project);
+ userSession.addProjectPermission(ProjectPermission.SCAN, project);
GenerateWsResponse response = newRequest(null, TOKEN_NAME, PROJECT_ANALYSIS_TOKEN, project.getKey());
@@ -190,7 +191,7 @@ public class GenerateActionIT {
public void a_user_can_generate_projectAnalysisToken_with_the_project_scan_permission_passing_login() {
UserDto user = userLogin();
ProjectDto project = db.components().insertPublicProject().getProjectDto();
- userSession.addProjectPermission(SCAN.toString(), project);
+ userSession.addProjectPermission(ProjectPermission.SCAN, project);
GenerateWsResponse responseWithLogin = newRequest(user.getLogin(), TOKEN_NAME, PROJECT_ANALYSIS_TOKEN, project.getKey());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/CreateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/CreateActionIT.java
index 3ef09efdf38..e4d567ae1c5 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/CreateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/CreateActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.UuidFactoryFast;
import org.sonar.db.DbClient;
@@ -99,7 +99,7 @@ public class CreateActionIT {
String longProjectKey = generateStringWithLength(400);
ProjectDto project = componentDbTester.insertPrivateProject(componentDto -> componentDto.setKey(longProjectKey)).getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
CreateWsResponse response = wsActionTester.newRequest()
.setParam("project", longProjectKey)
@@ -161,7 +161,7 @@ public class CreateActionIT {
public void create_a_webhook_on_project() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
CreateWsResponse response = wsActionTester.newRequest()
.setParam("project", project.getKey())
@@ -195,7 +195,7 @@ public class CreateActionIT {
for (int i = 0; i < 10; i++) {
webhookDbTester.insertWebhook(project);
}
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest request = wsActionTester.newRequest()
.setParam(PROJECT_KEY_PARAM, project.getKey())
.setParam(NAME_PARAM, NAME_WEBHOOK_EXAMPLE_001)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/DeleteActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/DeleteActionIT.java
index 9c5d3fba7e6..f77251f2b84 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/DeleteActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/DeleteActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
@@ -94,7 +94,7 @@ public class DeleteActionIT {
webhookDeliveryDbTester.insert(newDto().setWebhookUuid(dto.getUuid()));
webhookDeliveryDbTester.insert(newDto().setWebhookUuid(dto.getUuid()));
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestResponse response = wsActionTester.newRequest()
.setParam(KEY_PARAM, dto.getUuid())
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/ListActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/ListActionIT.java
index b2efd04e7c7..b43dc1ab72b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/ListActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/ListActionIT.java
@@ -26,7 +26,7 @@ import org.sonar.api.config.Configuration;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
@@ -203,7 +203,7 @@ public class ListActionIT {
@Test
public void list_project_webhooks_when_project_key_param_is_provided() {
ProjectDto project1 = componentDbTester.insertPrivateProject().getProjectDto();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project1);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project1);
WebhookDto dto1 = webhookDbTester.insertWebhook(project1);
WebhookDto dto2 = webhookDbTester.insertWebhook(project1);
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/UpdateActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/UpdateActionIT.java
index 5d828108537..b9314bde13b 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/UpdateActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/UpdateActionIT.java
@@ -25,7 +25,7 @@ import org.junit.Test;
import org.sonar.api.config.Configuration;
import org.sonar.server.component.ComponentTypes;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDbTester;
@@ -92,7 +92,7 @@ public class UpdateActionIT {
public void update_a_project_webhook_with_required_fields() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
WebhookDto dto = webhookDbTester.insertWebhook(project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestResponse response = wsActionTester.newRequest()
.setParam("webhook", dto.getUuid())
@@ -113,7 +113,7 @@ public class UpdateActionIT {
public void update_with_empty_secrets_removes_the_secret() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
WebhookDto dto = webhookDbTester.insertWebhook(project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestResponse response = wsActionTester.newRequest()
.setParam("webhook", dto.getUuid())
@@ -135,7 +135,7 @@ public class UpdateActionIT {
public void update_a_project_webhook_with_all_fields() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
WebhookDto dto = webhookDbTester.insertWebhook(project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestResponse response = wsActionTester.newRequest()
.setParam("webhook", dto.getUuid())
@@ -233,7 +233,7 @@ public class UpdateActionIT {
public void fail_if_url_is_not_valid() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
WebhookDto dto = webhookDbTester.insertWebhook(project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest request = wsActionTester.newRequest()
.setParam("webhook", dto.getUuid())
.setParam("name", NAME_WEBHOOK_EXAMPLE_001)
@@ -247,7 +247,7 @@ public class UpdateActionIT {
public void handle_whenSecretIsTooShort_fail() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
WebhookDto dto = webhookDbTester.insertWebhook(project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest request = wsActionTester.newRequest()
.setParam("webhook", dto.getUuid())
.setParam("name", NAME_WEBHOOK_EXAMPLE_001)
@@ -262,7 +262,7 @@ public class UpdateActionIT {
public void fail_if_credential_in_url_is_have_a_wrong_format() {
ProjectDto project = componentDbTester.insertPrivateProject().getProjectDto();
WebhookDto dto = webhookDbTester.insertWebhook(project);
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
TestRequest request = wsActionTester.newRequest()
.setParam("webhook", dto.getUuid())
.setParam("name", NAME_WEBHOOK_EXAMPLE_001)
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionIT.java
index ec7bdbaf230..3ce14a67ad7 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveriesActionIT.java
@@ -24,7 +24,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.project.ProjectDto;
@@ -86,7 +86,7 @@ public class WebhookDeliveriesActionIT {
@Test
public void search_by_component_and_return_no_records() {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("componentKey", project.getKey())
@@ -97,7 +97,7 @@ public class WebhookDeliveriesActionIT {
@Test
public void search_by_task_and_return_no_records() {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("ceTaskId", "t1")
@@ -108,7 +108,7 @@ public class WebhookDeliveriesActionIT {
@Test
public void search_by_webhook_and_return_no_records() {
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("webhook", "t1")
@@ -131,7 +131,7 @@ public class WebhookDeliveriesActionIT {
.setHttpStatus(200);
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
String json = ws.newRequest()
.setParam("componentKey", project.getKey())
@@ -150,7 +150,7 @@ public class WebhookDeliveriesActionIT {
dbClient.webhookDeliveryDao().insert(db.getSession(), dto2);
dbClient.webhookDeliveryDao().insert(db.getSession(), dto3);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("ceTaskId", "t1")
@@ -174,7 +174,7 @@ public class WebhookDeliveriesActionIT {
dbClient.webhookDeliveryDao().insert(db.getSession(), dto4);
dbClient.webhookDeliveryDao().insert(db.getSession(), dto5);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project, otherProject);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project, otherProject);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("webhook", "wh-1-uuid")
@@ -197,7 +197,7 @@ public class WebhookDeliveriesActionIT {
webhookDeliveryDbTester.insert(newDto().setProjectUuid(project.getUuid()).setCeTaskUuid("t1").setWebhookUuid("wh-1-uuid"));
}
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("webhook", "wh-1-uuid")
@@ -214,7 +214,7 @@ public class WebhookDeliveriesActionIT {
webhookDeliveryDbTester.insert(newDto().setProjectUuid(project.getUuid()).setCeTaskUuid("t1").setWebhookUuid("wh-1-uuid"));
}
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("webhook", "wh-1-uuid")
@@ -234,7 +234,7 @@ public class WebhookDeliveriesActionIT {
webhookDeliveryDbTester.insert(newDto().setProjectUuid(project.getUuid()).setCeTaskUuid("t1").setWebhookUuid("wh-1-uuid"));
}
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveriesWsResponse response = ws.newRequest()
.setParam("webhook", "wh-1-uuid")
@@ -253,7 +253,7 @@ public class WebhookDeliveriesActionIT {
.setProjectUuid(project.getUuid());
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
TestRequest request = ws.newRequest()
.setParam("componentKey", project.getKey());
@@ -268,7 +268,7 @@ public class WebhookDeliveriesActionIT {
.setProjectUuid(project.getUuid());
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
TestRequest request = ws.newRequest()
.setParam("ceTaskId", dto.getCeTaskUuid());
diff --git a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveryActionIT.java b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveryActionIT.java
index c0c85f57225..9b270cfe293 100644
--- a/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveryActionIT.java
+++ b/server/sonar-webserver-webapi/src/it/java/org/sonar/server/webhook/ws/WebhookDeliveryActionIT.java
@@ -23,7 +23,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbTester;
import org.sonar.db.project.ProjectDto;
@@ -106,7 +106,7 @@ public class WebhookDeliveryActionIT {
.setPayload("{\"status\"=\"SUCCESS\"}");
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
String json = ws.newRequest()
.setParam("deliveryId", dto.getUuid())
@@ -125,7 +125,7 @@ public class WebhookDeliveryActionIT {
.setErrorStacktrace("IOException -> can not connect");
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveryWsResponse response = ws.newRequest()
.setParam("deliveryId", dto.getUuid())
@@ -146,7 +146,7 @@ public class WebhookDeliveryActionIT {
.setAnalysisUuid(null);
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.ADMIN, project);
Webhooks.DeliveryWsResponse response = ws.newRequest()
.setParam("deliveryId", dto.getUuid())
@@ -164,7 +164,7 @@ public class WebhookDeliveryActionIT {
.setProjectUuid(project.getUuid());
dbClient.webhookDeliveryDao().insert(db.getSession(), dto);
db.commit();
- userSession.logIn().addProjectPermission(UserRole.USER, project);
+ userSession.logIn().addProjectPermission(ProjectPermission.USER, project);
assertThatThrownBy(() -> ws.newRequest()
.setMediaType(MediaTypes.PROTOBUF)
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/AlmSettingsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/AlmSettingsSupport.java
index 59cfc334fd5..eb95112ee7a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/AlmSettingsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/AlmSettingsSupport.java
@@ -26,6 +26,7 @@ import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.alm.setting.ALM;
import org.sonar.db.alm.setting.AlmSettingDto;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.almsettings.MultipleAlmFeature;
import org.sonar.server.component.ComponentFinder;
@@ -35,7 +36,7 @@ import org.sonar.server.user.UserSession;
import static java.lang.String.format;
import static org.apache.commons.lang.StringUtils.isEmpty;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
@ServerSide
public class AlmSettingsSupport {
@@ -83,7 +84,7 @@ public class AlmSettingsSupport {
return getProject(dbSession, projectKey, ADMIN);
}
- public ProjectDto getProject(DbSession dbSession, String projectKey, String projectPermission) {
+ public ProjectDto getProject(DbSession dbSession, String projectKey, ProjectPermission projectPermission) {
ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey);
userSession.checkEntityPermission(projectPermission, project);
return project;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GetBindingAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GetBindingAction.java
index 23bac661228..b89125fbcd8 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GetBindingAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/GetBindingAction.java
@@ -35,7 +35,7 @@ import org.sonarqube.ws.AlmSettings.GetBindingWsResponse;
import static java.lang.String.format;
import static java.util.Optional.ofNullable;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.common.AlmSettingMapper.toResponseAlm;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/ListAction.java
index 699e095f18e..d74e61bb684 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/ListAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/almsettings/ws/ListAction.java
@@ -36,7 +36,7 @@ import org.sonarqube.ws.AlmSettings.AlmSetting;
import org.sonarqube.ws.AlmSettings.ListWsResponse;
import static java.util.Optional.ofNullable;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
import static org.sonar.db.permission.GlobalPermission.PROVISION_PROJECTS;
import static org.sonar.server.common.AlmSettingMapper.toResponseAlm;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java
index d28ea922644..f1f4ce5dd76 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenAction.java
@@ -25,7 +25,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewAction;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectBadgeTokenDto;
@@ -81,7 +81,7 @@ public class TokenAction implements ProjectBadgesWsAction {
ProjectDto projectDto = dbClient.projectDao().selectProjectOrAppByKey(dbSession, projectKey)
.orElseThrow(() -> new IllegalArgumentException(PROJECT_OR_APP_NOT_FOUND));
- userSession.checkEntityPermission(UserRole.USER, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.USER, projectDto);
ProjectBadgeTokenDto projectBadgeTokenDto = dbClient.projectBadgeTokenDao().selectTokenByProject(dbSession, projectDto);
if (projectBadgeTokenDto == null) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java
index 92c27f7fd1b..75c37d78780 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/badge/ws/TokenRenewAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewAction;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -78,7 +78,7 @@ public class TokenRenewAction implements ProjectBadgesWsAction {
ProjectDto projectDto = dbClient.projectDao().selectProjectOrAppByKey(dbSession, projectKey)
.orElseThrow(() -> new IllegalArgumentException(PROJECT_OR_APP_NOT_FOUND));
- userSession.checkEntityPermission(UserRole.ADMIN, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, projectDto);
String newGeneratedToken = tokenGenerator.generate(TokenType.PROJECT_BADGE_TOKEN);
dbClient.projectBadgeTokenDao().upsert(dbSession, newGeneratedToken, projectDto, userSession.getUuid(), userSession.getLogin());
dbSession.commit();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java
index b4a0b65be4e..45e07eebb02 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/batch/ProjectDataLoader.java
@@ -23,7 +23,7 @@ import java.util.Collections;
import java.util.List;
import javax.annotation.Nullable;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -57,7 +57,7 @@ public class ProjectDataLoader {
String pullRequest = query.getPullRequest();
ComponentDto project = componentFinder.getByKey(session, projectKey);
checkRequest(project.isRootProject(), "Key '%s' belongs to a component which is not a Project", projectKey);
- boolean hasScanPerm = userSession.hasComponentPermission(UserRole.SCAN, project) || userSession.hasPermission(GlobalPermission.SCAN);
+ boolean hasScanPerm = userSession.hasComponentPermission(ProjectPermission.SCAN, project) || userSession.hasPermission(GlobalPermission.SCAN);
checkPermission(hasScanPerm);
ComponentDto branchComponent = (branch == null && pullRequest == null) ? project
: componentFinder.getByKeyAndOptionalBranchOrPullRequest(session, projectKey, branch, pullRequest);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java
index b3dbde4f1d9..dc80a0f6946 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/DeleteAction.java
@@ -23,7 +23,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewController;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -93,7 +93,7 @@ public class DeleteAction implements BranchWsAction {
}
private void checkPermission(ProjectDto project) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java
index 03570522840..38fe429cceb 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/ListAction.java
@@ -30,7 +30,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -47,7 +47,7 @@ import static java.util.Collections.singletonList;
import static java.util.Optional.ofNullable;
import static org.sonar.api.measures.CoreMetrics.ALERT_STATUS_KEY;
import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.db.permission.GlobalPermission.SCAN;
import static org.sonar.server.branch.ws.BranchesWs.addProjectParam;
@@ -140,7 +140,7 @@ public class ListAction implements BranchWsAction {
private void checkPermission(ProjectDto project) {
if (!userSession.hasEntityPermission(USER, project) &&
- !userSession.hasEntityPermission(UserRole.SCAN, project) &&
+ !userSession.hasEntityPermission(ProjectPermission.SCAN, project) &&
!userSession.hasPermission(SCAN)) {
throw insufficientPrivilegesException();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java
index d3ad68198f1..7510a607584 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/RenameAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewController;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -95,7 +95,7 @@ public class RenameAction implements BranchWsAction {
}
private void checkPermission(ProjectDto project) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java
index f9686401dca..f93e667e341 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetAutomaticDeletionProtectionAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.branch.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -93,6 +93,6 @@ public class SetAutomaticDeletionProtectionAction implements BranchWsAction {
}
private void checkPermission(ProjectDto project) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetMainBranchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetMainBranchAction.java
index 0e72d0bb8f1..21d7fb4270f 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetMainBranchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/branch/ws/SetMainBranchAction.java
@@ -27,7 +27,7 @@ import org.slf4j.LoggerFactory;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -138,6 +138,6 @@ public class SetMainBranchAction implements BranchWsAction {
}
private void checkPermission(ProjectDto project) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java
index 52bd1e347d2..5775ea89960 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/queue/ReportSubmitter.java
@@ -28,7 +28,7 @@ import javax.annotation.Nullable;
import org.sonar.db.component.ComponentQualifiers;
import org.sonar.db.component.ComponentScopes;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.ce.queue.CeQueue;
import org.sonar.ce.queue.CeTaskSubmit;
import org.sonar.ce.task.CeTask;
@@ -138,7 +138,7 @@ public class ReportSubmitter {
// they don't have the direct permission on the project.
// That means that dropping the permission on the project does not have any effects
// if user has still the global permission
- if (!userSession.hasComponentPermission(UserRole.SCAN, project) && !userSession.hasPermission(GlobalPermission.SCAN)) {
+ if (!userSession.hasComponentPermission(ProjectPermission.SCAN, project) && !userSession.hasPermission(GlobalPermission.SCAN)) {
throw insufficientPrivilegesException();
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
index b5b33674615..a61b14c38b9 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityAction.java
@@ -37,7 +37,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.Paging;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.ce.task.taskprocessor.CeTaskProcessor;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -250,7 +250,7 @@ public class ActivityAction implements CeWsAction {
if (entity == null) {
userSession.checkIsSystemAdministrator();
} else {
- userSession.checkEntityPermission(UserRole.ADMIN, entity);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, entity);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityStatusAction.java
index 4d2308229f4..8c2a3ee511f 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityStatusAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ActivityStatusAction.java
@@ -26,7 +26,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.ce.CeActivityDto;
@@ -116,7 +116,7 @@ public class ActivityStatusAction implements CeWsAction {
private void checkPermissions(@Nullable EntityDto entity) {
if (entity != null) {
- userSession.checkEntityPermission(UserRole.ADMIN, entity);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, entity);
} else {
userSession.checkIsSystemAdministrator();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java
index 9e6fb10f345..685f6dd9850 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/AnalysisStatusAction.java
@@ -24,7 +24,7 @@ import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.ce.CeActivityDto;
@@ -95,7 +95,7 @@ public class AnalysisStatusAction implements CeWsAction {
private void doHandle(Request request, Response response, String projectKey, @Nullable String branchKey, @Nullable String pullRequestKey) {
try (DbSession dbSession = dbClient.openSession(false)) {
ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey);
- userSession.checkEntityPermission(UserRole.USER, project);
+ userSession.checkEntityPermission(ProjectPermission.USER, project);
BranchDto branch = componentFinder.getBranchOrPullRequest(dbSession, project, branchKey, pullRequestKey);
AnalysisStatusWsResponse.Builder responseBuilder = AnalysisStatusWsResponse.newBuilder();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/CancelAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/CancelAction.java
index b204dd95b98..a62f3a9f653 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/CancelAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/CancelAction.java
@@ -23,7 +23,7 @@ import java.util.Optional;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.ce.queue.CeQueue;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
@@ -95,6 +95,6 @@ public class CancelAction implements CeWsAction {
if (!component.isPresent()) {
throw insufficientPrivilegesException();
}
- userSession.checkComponentPermission(UserRole.ADMIN, component.get());
+ userSession.checkComponentPermission(ProjectPermission.ADMIN, component.get());
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ComponentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ComponentAction.java
index e321c42a4fd..490bc9ad93a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ComponentAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/ComponentAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.ce.CeActivityDto;
@@ -82,7 +82,7 @@ public class ComponentAction implements CeWsAction {
try (DbSession dbSession = dbClient.openSession(false)) {
String entityKey = wsRequest.mandatoryParam(PARAM_COMPONENT);
EntityDto entityDto = componentFinder.getEntityByKey(dbSession, entityKey);
- userSession.checkEntityPermission(UserRole.USER, entityDto);
+ userSession.checkEntityPermission(ProjectPermission.USER, entityDto);
List<CeQueueDto> queueDtos = dbClient.ceQueueDao().selectByEntityUuid(dbSession, entityDto.getUuid());
CeTaskQuery activityQuery = new CeTaskQuery()
.setEntityUuid(entityDto.getUuid())
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/DismissAnalysisWarningAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/DismissAnalysisWarningAction.java
index 61d9db62f10..a99f98ca7ae 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/DismissAnalysisWarningAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/DismissAnalysisWarningAction.java
@@ -23,7 +23,7 @@ import java.util.Optional;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -81,7 +81,7 @@ public class DismissAnalysisWarningAction implements CeWsAction {
try (DbSession dbSession = dbClient.openSession(false)) {
ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey);
- userSession.checkEntityPermission(UserRole.USER, project);
+ userSession.checkEntityPermission(ProjectPermission.USER, project);
CeTaskMessageDto messageDto = dbClient.ceTaskMessageDao()
.selectByUuid(dbSession, messageKey)
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskAction.java
index 4be63960ed0..b26f54a52a2 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ce/ws/TaskAction.java
@@ -33,7 +33,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -139,8 +139,8 @@ public class TaskAction implements CeWsAction {
private void checkComponentPermission(ComponentDto component) {
if (userSession.hasPermission(GlobalPermission.ADMINISTER) ||
userSession.hasPermission(GlobalPermission.SCAN) ||
- userSession.hasComponentPermission(UserRole.ADMIN, component) ||
- userSession.hasComponentPermission(UserRole.SCAN, component)) {
+ userSession.hasComponentPermission(ProjectPermission.ADMIN, component) ||
+ userSession.hasComponentPermission(ProjectPermission.SCAN, component)) {
return;
}
throw insufficientPrivilegesException();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java
index 29c79b99c33..2e8a1a89d6e 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ComponentService.java
@@ -22,7 +22,7 @@ package org.sonar.server.component;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -55,7 +55,7 @@ public class ComponentService {
}
public void updateKey(DbSession dbSession, ProjectDto project, String newKey) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
checkProjectKey(newKey);
dbClient.componentKeyUpdaterDao().updateKey(dbSession, project.getUuid(), project.getKey(), newKey);
indexers.commitAndIndexEntities(dbSession, singletonList(project), Indexers.EntityEvent.PROJECT_KEY_UPDATE);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/AppAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/AppAction.java
index 0e213e31918..3c5c27a1f36 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/AppAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/AppAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -89,7 +89,7 @@ public class AppAction implements ComponentsWsAction {
public void handle(Request request, Response response) {
try (DbSession session = dbClient.openSession(false)) {
ComponentDto component = loadComponent(session, request);
- userSession.checkComponentPermission(UserRole.USER, component);
+ userSession.checkComponentPermission(ProjectPermission.USER, component);
EntityDto entity = dbClient.entityDao().selectByComponentUuid(session, component.uuid())
.orElseThrow(() -> new IllegalStateException("Couldn't find entity for component " + component.uuid()));
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java
index 4bb6086d373..c79ec7a21f3 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java
@@ -45,7 +45,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.platform.EditionProvider.Edition;
import org.sonar.core.platform.PlatformEditionProvider;
import org.sonar.db.DbClient;
@@ -262,7 +262,7 @@ public class SearchProjectsAction implements ComponentsWsAction {
List<String> projectUuids = esResults.getUuids();
Ordering<ProjectDto> ordering = Ordering.explicit(projectUuids).onResultOf(ProjectDto::getUuid);
List<ProjectDto> projects = ordering.immutableSortedCopy(dbClient.projectDao().selectByUuids(dbSession, new HashSet<>(projectUuids)));
- projects = userSession.keepAuthorizedEntities(UserRole.USER, projects);
+ projects = userSession.keepAuthorizedEntities(ProjectPermission.USER, projects);
Map<String, BranchDto> mainBranchByUuid = dbClient.branchDao().selectMainBranchesByProjectUuids(dbSession, projectUuids)
.stream()
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ShowAction.java
index 04d461921cb..95595c53915 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ShowAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/ShowAction.java
@@ -28,7 +28,7 @@ import javax.annotation.Nullable;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -111,7 +111,7 @@ public class ShowAction implements ComponentsWsAction {
private ShowWsResponse doHandle(Request request) {
try (DbSession dbSession = dbClient.openSession(false)) {
ComponentDto component = loadComponent(dbSession, request);
- userSession.checkComponentPermission(UserRole.USER, component);
+ userSession.checkComponentPermission(ProjectPermission.USER, component);
Optional<SnapshotDto> lastAnalysis;
if (component.getCopyComponentUuid() != null) {
lastAnalysis = dbClient.snapshotDao().selectLastAnalysisByComponentUuid(dbSession, component.getCopyComponentUuid());
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SuggestionsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SuggestionsAction.java
index 2983cc138d2..1196f57b5da 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SuggestionsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/SuggestionsAction.java
@@ -61,7 +61,7 @@ import static java.util.Arrays.stream;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptySet;
import static java.util.Collections.singletonList;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.component.index.SuggestionQuery.DEFAULT_LIMIT;
import static org.sonar.server.es.newindex.DefaultIndexSettings.MINIMUM_NGRAM_LENGTH;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/TreeAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/TreeAction.java
index bad5feb7d15..c541e01731c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/TreeAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/component/ws/TreeAction.java
@@ -40,7 +40,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.Paging;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.i18n.I18n;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -190,7 +190,7 @@ public class TreeAction implements ComponentsWsAction {
}
private List<ComponentDto> filterAuthorizedComponents(List<ComponentDto> components) {
- return userSession.keepAuthorizedComponents(UserRole.USER, components);
+ return userSession.keepAuthorizedComponents(ProjectPermission.USER, components);
}
private ComponentDto loadComponent(DbSession dbSession, Request request) {
@@ -214,7 +214,7 @@ public class TreeAction implements ComponentsWsAction {
}
private void checkPermissions(ComponentDto baseComponent) {
- userSession.checkComponentPermission(UserRole.USER, baseComponent);
+ userSession.checkComponentPermission(ProjectPermission.USER, baseComponent);
}
private TreeWsResponse buildResponse(DbSession dbSession, ComponentDto baseComponent, List<ComponentDto> components,
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/developers/ws/SearchEventsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/developers/ws/SearchEventsAction.java
index 6f1e030a897..71c4e362f50 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/developers/ws/SearchEventsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/developers/ws/SearchEventsAction.java
@@ -35,7 +35,7 @@ import org.sonar.api.platform.Server;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -207,7 +207,7 @@ public class SearchEventsAction implements DevelopersWsAction {
private List<ProjectDto> searchProjects(DbSession dbSession, List<String> projectKeys) {
List<ProjectDto> projects = dbClient.projectDao().selectProjectsByKeys(dbSession, new HashSet<>(projectKeys));
- return userSession.keepAuthorizedEntities(UserRole.USER, projects);
+ return userSession.keepAuthorizedEntities(ProjectPermission.USER, projects);
}
private String computeIssuesSearchLink(ProjectDto project, BranchDto branch, long functionalFromDate, String login) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/duplication/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
index 13f6ea17626..88bca5dadc4 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
@@ -27,7 +27,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -100,7 +100,7 @@ public class ShowAction implements DuplicationsWsAction {
BranchDto branchDto = loadBranch(dbSession, component);
String branch = branchDto.isMain() ? null : branchDto.getBranchKey();
String pullRequest = branchDto.getPullRequestKey();
- userSession.checkComponentPermission(UserRole.CODEVIEWER, component);
+ userSession.checkComponentPermission(ProjectPermission.CODEVIEWER, component);
String duplications = findDataFromComponent(dbSession, component);
List<DuplicationsParser.Block> blocks = parser.parse(dbSession, component, branch, pullRequest, duplications);
writeProtobuf(responseBuilder.build(dbSession, blocks, branch, pullRequest), request, response);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/AddAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/AddAction.java
index 18538c895e9..773a36b0a8d 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/AddAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/AddAction.java
@@ -41,7 +41,7 @@ import static org.sonar.db.component.ComponentQualifiers.APP;
import static org.sonar.db.component.ComponentQualifiers.PROJECT;
import static org.sonar.db.component.ComponentQualifiers.SUBVIEW;
import static org.sonar.db.component.ComponentQualifiers.VIEW;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.favorite.ws.FavoritesWsParameters.PARAM_COMPONENT;
public class AddAction implements FavoritesWsAction {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/SearchAction.java
index a9bb90c7ff9..659a9962dbf 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/favorite/ws/SearchAction.java
@@ -25,7 +25,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.Paging;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.entity.EntityDto;
import org.sonar.server.favorite.FavoriteFinder;
import org.sonar.server.user.UserSession;
@@ -88,7 +88,7 @@ public class SearchAction implements FavoritesWsAction {
private List<EntityDto> getAuthorizedFavorites() {
List<EntityDto> entities = favoriteFinder.list();
- return userSession.keepAuthorizedEntities(UserRole.USER, entities);
+ return userSession.keepAuthorizedEntities(ProjectPermission.USER, entities);
}
private static class SearchResults {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AddCommentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AddCommentAction.java
index 693c761b6f8..21ec5531c9d 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AddCommentAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AddCommentAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.hotspot.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.core.util.Uuids;
@@ -80,7 +80,7 @@ public class AddCommentAction implements HotspotsWsAction {
String comment = request.mandatoryParam(PARAM_COMMENT);
try (DbSession dbSession = dbClient.openSession(false)) {
IssueDto hotspot = hotspotWsSupport.loadHotspot(dbSession, hotspotKey);
- hotspotWsSupport.loadAndCheckBranch(dbSession, hotspot, UserRole.USER);
+ hotspotWsSupport.loadAndCheckBranch(dbSession, hotspot, ProjectPermission.USER);
DefaultIssue defaultIssue = hotspot.toDefaultIssue();
IssueChangeContext context = hotspotWsSupport.newIssueChangeContextWithoutMeasureRefresh();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AssignAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AssignAction.java
index f460faf6b19..2374b84c5e9 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AssignAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/AssignAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.core.util.Uuids;
@@ -110,7 +110,7 @@ public class AssignAction implements HotspotsWsAction {
IssueDto hotspotDto = hotspotWsSupport.loadHotspot(dbSession, hotspotKey);
checkHotspotStatusAndResolution(hotspotDto);
- hotspotWsSupport.loadAndCheckBranch(dbSession, hotspotDto, UserRole.USER);
+ hotspotWsSupport.loadAndCheckBranch(dbSession, hotspotDto, ProjectPermission.USER);
UserDto assignee = isNullOrEmpty(login) ? null : getAssignee(dbSession, login);
IssueChangeContext context = hotspotWsSupport.newIssueChangeContextWithoutMeasureRefresh();
@@ -157,7 +157,7 @@ public class AssignAction implements HotspotsWsAction {
}
private boolean hasProjectPermission(DbSession dbSession, String userUuid, String projectUuid) {
- return dbClient.authorizationDao().selectEntityPermissions(dbSession, projectUuid, userUuid).contains(UserRole.USER);
+ return dbClient.authorizationDao().selectEntityPermissions(dbSession, projectUuid, userUuid).contains(ProjectPermission.USER.getKey());
}
private static HotspotChangedEvent buildEventData(DefaultIssue defaultIssue, @Nullable UserDto assignee, String filePath) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ChangeStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ChangeStatusAction.java
index c6dd61044f0..4f38005eac4 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ChangeStatusAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ChangeStatusAction.java
@@ -27,7 +27,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.core.util.Uuids;
@@ -115,7 +115,7 @@ public class ChangeStatusAction implements HotspotsWsAction {
String newResolution = resolutionParam(request, newStatus);
try (DbSession dbSession = dbClient.openSession(false)) {
IssueDto hotspot = hotspotWsSupport.loadHotspot(dbSession, hotspotKey);
- hotspotWsSupport.loadAndCheckBranch(dbSession, hotspot, UserRole.SECURITYHOTSPOT_ADMIN);
+ hotspotWsSupport.loadAndCheckBranch(dbSession, hotspot, ProjectPermission.SECURITYHOTSPOT_ADMIN);
if (needStatusUpdate(hotspot, newStatus, newResolution)) {
String transitionKey = toTransitionKey(newStatus, newResolution);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/HotspotWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/HotspotWsSupport.java
index f7760ee6c66..43a16020ebb 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/HotspotWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/HotspotWsSupport.java
@@ -21,9 +21,9 @@ package org.sonar.server.hotspot.ws;
import java.util.Date;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -55,7 +55,7 @@ public class HotspotWsSupport {
ProjectAndBranch loadAndCheckBranch(DbSession dbSession, String hotspotKey) {
IssueDto hotspot = loadHotspot(dbSession, hotspotKey);
- return loadAndCheckBranch(dbSession, hotspot, UserRole.USER);
+ return loadAndCheckBranch(dbSession, hotspot, ProjectPermission.USER);
}
IssueDto loadHotspot(DbSession dbSession, String hotspotKey) {
@@ -65,7 +65,7 @@ public class HotspotWsSupport {
.orElseThrow(() -> new NotFoundException(format("Hotspot '%s' does not exist", hotspotKey)));
}
- ProjectAndBranch loadAndCheckBranch(DbSession dbSession, IssueDto hotspot, String userRole) {
+ ProjectAndBranch loadAndCheckBranch(DbSession dbSession, IssueDto hotspot, ProjectPermission projectPermission) {
String branchUuid = hotspot.getProjectUuid();
checkArgument(branchUuid != null, "Hotspot '%s' has no branch", hotspot.getKee());
@@ -74,12 +74,12 @@ public class HotspotWsSupport {
ProjectDto project = dbClient.projectDao().selectByUuid(dbSession, branch.getProjectUuid())
.orElseThrow(() -> new NotFoundException(format("Project with uuid '%s' does not exist", branch.getProjectUuid())));
- userSession.checkEntityPermission(userRole, project);
+ userSession.checkEntityPermission(projectPermission, project);
return new ProjectAndBranch(project, branch);
}
boolean canChangeStatus(ProjectDto project) {
- return userSession.hasEntityPermission(UserRole.SECURITYHOTSPOT_ADMIN, project);
+ return userSession.hasEntityPermission(ProjectPermission.SECURITYHOTSPOT_ADMIN, project);
}
IssueChangeContext newIssueChangeContextWithoutMeasureRefresh() {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ListAction.java
index e7e6fa7fbaa..e6251032515 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ListAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ListAction.java
@@ -27,7 +27,7 @@ import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Nullable;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
@@ -61,7 +61,7 @@ import static org.sonar.api.issue.Issue.STATUS_TO_REVIEW;
import static org.sonar.api.server.ws.WebService.Param.PAGE;
import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
import static org.sonar.api.utils.Paging.forPageIndex;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.es.SearchOptions.MAX_PAGE_SIZE;
import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGenerator.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGenerator.java
index f61dc86b5c4..e87271575f7 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGenerator.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGenerator.java
@@ -43,12 +43,15 @@ public class PullHotspotsActionProtobufObjectGenerator implements ProtobufObject
public Hotspots.HotspotLite generateIssueMessage(IssueDto hotspotDto, RuleDto ruleDto) {
Hotspots.HotspotLite.Builder builder = Hotspots.HotspotLite.newBuilder()
.setKey(hotspotDto.getKey())
- .setFilePath(hotspotDto.getFilePath())
.setStatus(hotspotDto.getStatus())
.setRuleKey(hotspotDto.getRuleKey().toString())
.setStatus(hotspotDto.getStatus())
.setVulnerabilityProbability(getVulnerabilityProbability(ruleDto));
+ if (hotspotDto.getFilePath() != null) {
+ builder.setFilePath(hotspotDto.getFilePath());
+ }
+
if (hotspotDto.getIssueCreationTime() != null) {
builder.setCreationDate(hotspotDto.getIssueCreationTime());
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java
index 85b7a1b0800..fe62670c143 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/SearchAction.java
@@ -37,7 +37,7 @@ import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;
import org.jetbrains.annotations.NotNull;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
@@ -80,7 +80,7 @@ import static org.sonar.api.server.ws.WebService.Param.PAGE;
import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE;
import static org.sonar.api.utils.DateUtils.longToDate;
import static org.sonar.api.utils.Paging.forPageIndex;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.newcodeperiod.NewCodePeriodType.REFERENCE_BRANCH;
import static org.sonar.server.es.SearchOptions.MAX_PAGE_SIZE;
import static org.sonar.server.security.SecurityStandards.SANS_TOP_25_INSECURE_INTERACTION;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ShowAction.java
index d866ce9b7ac..158dabc13d1 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ShowAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/hotspot/ws/ShowAction.java
@@ -33,7 +33,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -296,7 +296,7 @@ public class ShowAction implements HotspotsWsAction {
String componentUuid = hotspot.getComponentUuid();
checkArgument(componentUuid != null, "Hotspot '%s' has no component", hotspot.getKee());
- ProjectAndBranch projectAndBranch = hotspotWsSupport.loadAndCheckBranch(dbSession, hotspot, UserRole.USER);
+ ProjectAndBranch projectAndBranch = hotspotWsSupport.loadAndCheckBranch(dbSession, hotspot, ProjectPermission.USER);
BranchDto branch = projectAndBranch.getBranch();
ComponentDto component = dbClient.componentDao().selectByUuid(dbSession, componentUuid)
.orElseThrow(() -> new NotFoundException(format("Component with uuid '%s' does not exist", componentUuid)));
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/IssueFinder.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/IssueFinder.java
index b0bfdf33f50..b697eb34424 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/IssueFinder.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/IssueFinder.java
@@ -19,8 +19,8 @@
*/
package org.sonar.server.issue;
-import org.sonar.api.rules.RuleType;
-import org.sonar.api.web.UserRole;
+import org.sonar.core.rule.RuleType;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.issue.IssueDto;
@@ -29,7 +29,7 @@ import org.sonar.server.user.UserSession;
import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
public class IssueFinder {
@@ -49,7 +49,7 @@ public class IssueFinder {
throw new NotFoundException(format("Issue with key '%s' does not exist", issueKey));
}
- userSession.checkComponentUuidPermission(UserRole.USER, requireNonNull(issue.getProjectUuid()));
+ userSession.checkComponentUuidPermission(ProjectPermission.USER, requireNonNull(issue.getProjectUuid()));
return issue;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetSeverityAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetSeverityAction.java
index ebd4f63483b..4dc6c359df1 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetSeverityAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetSeverityAction.java
@@ -23,17 +23,18 @@ import java.util.Collection;
import java.util.Map;
import org.sonar.api.issue.Issue;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.api.server.rule.internal.ImpactMapper;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.rule.ImpactSeverityMapper;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.server.issue.workflow.IsUnResolved;
import org.sonar.server.user.UserSession;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
@ServerSide
public class SetSeverityAction extends Action {
@@ -67,7 +68,7 @@ public class SetSeverityAction extends Action {
String severity = verifySeverityParameter(properties);
boolean updated = issueUpdater.setManualSeverity(context.issue(), severity, context.issueChangeContext());
- SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(context.issue().type());
+ SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(RuleTypeMapper.toApiRuleType(context.issue().type()));
if (updated
&& context.issueDto().getEffectiveImpacts().containsKey(softwareQuality)) {
createImpactsIfMissing(context.issue(), context.issueDto().getEffectiveImpacts());
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetTypeAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetTypeAction.java
index fc9ab370bca..58e1ca76c3a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetTypeAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/SetTypeAction.java
@@ -22,8 +22,8 @@ package org.sonar.server.issue;
import java.util.Collection;
import java.util.Map;
import org.sonar.api.issue.Issue;
-import org.sonar.api.rules.RuleType;
-import org.sonar.api.web.UserRole;
+import org.sonar.core.rule.RuleType;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.issue.workflow.IsUnResolved;
import org.sonar.server.user.UserSession;
@@ -47,7 +47,7 @@ public class SetTypeAction extends Action {
}
private boolean isCurrentUserIssueAdmin(Issue issue) {
- return userSession.hasComponentUuidPermission(UserRole.ISSUE_ADMIN, issue.projectUuid());
+ return userSession.hasComponentUuidPermission(ProjectPermission.ISSUE_ADMIN, issue.projectUuid());
}
@Override
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/TransitionService.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/TransitionService.java
index 966becac02a..3d4004caf47 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/TransitionService.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/TransitionService.java
@@ -47,8 +47,8 @@ public class TransitionService {
String projectUuid = requireNonNull(issue.projectUuid());
return workflow.outTransitions(issue)
.stream()
- .filter(transition -> (userSession.isLoggedIn() && isBlank(transition.requiredProjectPermission()))
- || userSession.hasComponentUuidPermission(transition.requiredProjectPermission(), projectUuid))
+ .filter(transition -> (userSession.isLoggedIn() && transition.requiredProjectPermission() == null)
+ || (transition.requiredProjectPermission() != null && userSession.hasComponentUuidPermission(transition.requiredProjectPermission(), projectUuid)))
.toList();
}
@@ -60,7 +60,7 @@ public class TransitionService {
String projectUuid = requireNonNull(defaultIssue.projectUuid());
workflow.outTransitions(defaultIssue)
.stream()
- .filter(transition -> transition.key().equals(transitionKey) && isNotBlank(transition.requiredProjectPermission()))
+ .filter(transition -> transition.key().equals(transitionKey) && transition.requiredProjectPermission() != null)
.forEach(transition -> userSession.checkComponentUuidPermission(transition.requiredProjectPermission(), projectUuid));
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/AuthorsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/AuthorsAction.java
index 89cdfbc18ea..419bdf94d2f 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/AuthorsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/AuthorsAction.java
@@ -26,7 +26,7 @@ import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
import org.sonar.db.component.ComponentQualifiers;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BasePullAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BasePullAction.java
index 1bfc7f7ca46..b0af75458a1 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BasePullAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BasePullAction.java
@@ -50,7 +50,7 @@ import org.sonar.server.ws.WsAction;
import static java.lang.String.format;
import static java.util.Collections.emptyList;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
public abstract class BasePullAction implements WsAction {
protected static final String PROJECT_KEY_PARAM = "projectKey";
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java
index cbb4504c7d4..e714011ccc4 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java
@@ -38,13 +38,13 @@ import org.slf4j.LoggerFactory;
import org.sonar.api.issue.DefaultTransitions;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbClient;
@@ -89,8 +89,8 @@ import static org.sonar.api.issue.DefaultTransitions.SET_AS_IN_REVIEW;
import static org.sonar.api.issue.DefaultTransitions.UNCONFIRM;
import static org.sonar.api.issue.DefaultTransitions.WONT_FIX;
import static org.sonar.api.rule.Severity.BLOCKER;
-import static org.sonar.api.rules.RuleType.BUG;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.BUG;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_02;
@@ -421,7 +421,7 @@ public class BulkChangeAction implements IssuesWsAction {
}
private List<ComponentDto> getAuthorizedComponents(List<ComponentDto> projectDtos) {
- return userSession.keepAuthorizedComponents(UserRole.USER, projectDtos);
+ return userSession.keepAuthorizedComponents(ProjectPermission.USER, projectDtos);
}
private List<IssueDto> getAuthorizedIssues(List<IssueDto> allIssues) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueUpdater.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueUpdater.java
index 6895d06b3cf..23147ea023f 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueUpdater.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueUpdater.java
@@ -26,7 +26,7 @@ import javax.annotation.Nullable;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbClient;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/ListAction.java
index 21d236842da..abbad77f06a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/ListAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/ListAction.java
@@ -23,13 +23,13 @@ import com.google.common.base.Preconditions;
import java.util.EnumSet;
import java.util.List;
import javax.annotation.Nullable;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.Paging;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.Pagination;
@@ -189,13 +189,13 @@ public class ListAction implements IssuesWsAction {
.orElseThrow(() -> new IllegalStateException("Branch does not exist: " + componentDto.branchUuid()));
ProjectDto projectDto = dbClient.projectDao().selectByUuid(dbSession, branchDto.getProjectUuid())
.orElseThrow(() -> new IllegalArgumentException("Project does not exist: " + wsRequest.project));
- userSession.checkEntityPermission(UserRole.USER, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.USER, projectDto);
return new ProjectAndBranch(projectDto, branchDto);
}
private ProjectAndBranch checkProjectAndBranchPermission(WsRequest wsRequest, DbSession dbSession) {
ProjectAndBranch projectAndBranch = componentFinder.getProjectAndBranch(dbSession, wsRequest.project, wsRequest.branch, wsRequest.pullRequest);
- userSession.checkEntityPermission(UserRole.USER, projectAndBranch.getProject());
+ userSession.checkEntityPermission(ProjectPermission.USER, projectAndBranch.getProject());
return projectAndBranch;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java
index 1d768a960ce..6a8f8dd6ea0 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchAction.java
@@ -38,7 +38,7 @@ import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttributeCategory;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
index 860b9c34f64..cfac4cf5e7a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
@@ -33,7 +33,7 @@ import org.sonar.api.resources.Language;
import org.sonar.api.resources.Languages;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.Duration;
import org.sonar.api.utils.Durations;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseLoader.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseLoader.java
index aea18c74de8..ba73952b41c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseLoader.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseLoader.java
@@ -32,7 +32,7 @@ import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -57,7 +57,7 @@ import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Stream.concat;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.server.issue.AssignAction.ASSIGN_KEY;
import static org.sonar.server.issue.CommentAction.COMMENT_KEY;
import static org.sonar.server.issue.SetSeverityAction.SET_SEVERITY_KEY;
@@ -248,7 +248,7 @@ public class SearchResponseLoader {
if (login == null) {
return Collections.emptySet();
}
- RuleType ruleType = RuleType.valueOf(issue.getType());
+ RuleType ruleType = RuleType.fromDbConstant(issue.getType());
availableActions.add(COMMENT_KEY);
availableActions.add("set_tags");
if (issue.getResolution() != null) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java
index d62254085f4..674b2cf96cd 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java
@@ -32,6 +32,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.IssueChangeContext;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -46,9 +47,10 @@ import org.sonar.server.user.UserSession;
import static org.sonar.api.server.rule.internal.ImpactMapper.convertToRuleSeverity;
import static org.sonar.api.server.rule.internal.ImpactMapper.convertToRuleType;
import static org.sonar.api.server.rule.internal.ImpactMapper.convertToSoftwareQuality;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.core.rule.ImpactSeverityMapper.mapImpactSeverity;
+import static org.sonar.core.rule.RuleTypeMapper.toApiRuleType;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonar.server.common.ParamParsingUtils.parseImpact;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.ACTION_SET_SEVERITY;
@@ -163,7 +165,7 @@ public class SetSeverityAction implements IssuesWsAction {
if (issueFieldsSetter.setImpactManualSeverity(issue, softwareQuality, manualImpactSeverity, context)) {
String manualSeverity = null;
boolean severityHasChanged = false;
- if (convertToRuleType(softwareQuality).equals(issue.type())) {
+ if (convertToRuleType(softwareQuality) == RuleTypeMapper.toApiRuleType(issue.type())) {
manualSeverity = convertToRuleSeverity(manualImpactSeverity);
severityHasChanged = issueFieldsSetter.setManualSeverity(issue, manualSeverity, context);
}
@@ -181,7 +183,7 @@ public class SetSeverityAction implements IssuesWsAction {
private SearchResponseData setManualSeverity(DbSession session, DefaultIssue issue, IssueDto issueDto, String severity,
IssueChangeContext context) {
if (issueFieldsSetter.setManualSeverity(issue, severity, context)) {
- SoftwareQuality softwareQuality = convertToSoftwareQuality(issue.type());
+ SoftwareQuality softwareQuality = convertToSoftwareQuality(toApiRuleType(issue.type()));
boolean impactHasChanged = false;
if (issueDto.getEffectiveImpacts().containsKey(softwareQuality)) {
createImpactsIfMissing(issue, issueDto.getEffectiveImpacts());
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetTypeAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetTypeAction.java
index 30666f17ae8..c459d1990ce 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetTypeAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SetTypeAction.java
@@ -23,7 +23,7 @@ import com.google.common.io.Resources;
import java.util.Date;
import java.util.EnumSet;
import java.util.Map;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
@@ -41,7 +41,7 @@ import org.sonar.server.issue.IssueFinder;
import org.sonar.server.pushapi.issues.IssueChangeEventService;
import org.sonar.server.user.UserSession;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.core.issue.IssueChangeContext.issueChangeContextByUserBuilder;
import static org.sonar.db.component.BranchType.BRANCH;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.ACTION_SET_TYPE;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidator.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidator.java
index abf52786137..9363cc87f98 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidator.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidator.java
@@ -27,7 +27,7 @@ import org.sonar.server.component.ComponentFinder;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.user.UserSession;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
public class AnticipatedTransitionsActionValidator {
@@ -60,7 +60,7 @@ public class AnticipatedTransitionsActionValidator {
public void validateUserHasAdministerIssuesPermission(String projectUuid) {
try (DbSession dbSession = dbClient.openSession(false)) {
String userUuid = Objects.requireNonNull(userSession.getUuid());
- if (!dbClient.authorizationDao().selectEntityPermissions(dbSession, projectUuid, userUuid).contains(ISSUE_ADMIN)){
+ if (!dbClient.authorizationDao().selectEntityPermissions(dbSession, projectUuid, userUuid).contains(ISSUE_ADMIN.getKey())){
throw insufficientPrivilegesException();
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/IssueCounter.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/IssueCounter.java
index 5488b926719..1eca839514c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/IssueCounter.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/IssueCounter.java
@@ -29,7 +29,7 @@ import javax.annotation.Nullable;
import org.sonar.api.issue.IssueStatus;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.db.issue.IssueGroupDto;
import org.sonar.db.issue.IssueImpactGroupDto;
import org.sonar.db.issue.IssueImpactSeverityGroupDto;
@@ -37,7 +37,7 @@ import org.sonar.db.rule.SeverityUtil;
import org.sonar.server.measure.ImpactMeasureBuilder;
import static org.sonar.api.rule.Severity.INFO;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
class IssueCounter {
@@ -59,7 +59,7 @@ class IssueCounter {
IssueCounter(Collection<IssueGroupDto> groups, Collection<IssueImpactGroupDto> impactGroups,
Collection<IssueImpactSeverityGroupDto> impactSeverityGroups) {
for (IssueGroupDto group : groups) {
- if (RuleType.valueOf(group.getRuleType()).equals(SECURITY_HOTSPOT)) {
+ if (RuleType.fromDbConstant(group.getRuleType()).equals(SECURITY_HOTSPOT)) {
processHotspotGroup(group);
} else {
processGroup(group);
@@ -90,7 +90,7 @@ class IssueCounter {
private void processGroup(IssueGroupDto group) {
if (group.getResolution() == null) {
- RuleType ruleType = RuleType.valueOf(group.getRuleType());
+ RuleType ruleType = RuleType.fromDbConstant(group.getRuleType());
highestSeverityOfUnresolved
.computeIfAbsent(ruleType, k -> new HighestSeverity())
.add(group);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImpl.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImpl.java
index a7c07b46118..42fe43f788c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImpl.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImpl.java
@@ -29,7 +29,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.metric.SoftwareQualitiesMetrics;
import org.sonar.server.measure.ImpactMeasureBuilder;
import org.sonar.server.measure.Rating;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentAction.java
index f57d384d416..0afe402240e 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentAction.java
@@ -32,7 +32,6 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -43,6 +42,7 @@ import org.sonar.db.measure.MeasureDto;
import org.sonar.db.metric.MetricDto;
import org.sonar.db.metric.MetricDtoFunctions;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.component.ComponentFinder;
import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.user.UserSession;
@@ -289,8 +289,8 @@ public class ComponentAction implements MeasuresWsAction {
}
private void checkPermissions(ComponentDto baseComponent) {
- if (!userSession.hasComponentPermission(UserRole.USER, baseComponent) &&
- !userSession.hasComponentPermission(UserRole.SCAN, baseComponent) &&
+ if (!userSession.hasComponentPermission(ProjectPermission.USER, baseComponent) &&
+ !userSession.hasComponentPermission(ProjectPermission.SCAN, baseComponent) &&
!userSession.hasPermission(GlobalPermission.SCAN)) {
throw insufficientPrivilegesException();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java
index c53aac85e9e..6e7e8fa2039 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java
@@ -49,7 +49,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.utils.Paging;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.i18n.I18n;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -657,7 +657,7 @@ public class ComponentTreeAction implements MeasuresWsAction {
}
private List<ComponentDto> filterAuthorizedComponents(List<ComponentDto> components) {
- return userSession.keepAuthorizedComponents(UserRole.USER, components);
+ return userSession.keepAuthorizedComponents(ProjectPermission.USER, components);
}
private static boolean componentWithMeasuresOnly(ComponentTreeRequest wsRequest) {
@@ -715,10 +715,10 @@ public class ComponentTreeAction implements MeasuresWsAction {
}
private void checkPermissions(ComponentDto baseComponent) {
- userSession.checkComponentPermission(UserRole.USER, baseComponent);
+ userSession.checkComponentPermission(ProjectPermission.USER, baseComponent);
if (ComponentScopes.PROJECT.equals(baseComponent.scope()) && ComponentQualifiers.APP.equals(baseComponent.qualifier())) {
- userSession.checkChildProjectsPermission(UserRole.USER, baseComponent);
+ userSession.checkChildProjectsPermission(ProjectPermission.USER, baseComponent);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchAction.java
index 789c2d77e53..067b0f5ca39 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchAction.java
@@ -31,7 +31,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -171,7 +171,7 @@ public class SearchAction implements MeasuresWsAction {
}
private List<ComponentDto> getAuthorizedProjects(List<ComponentDto> componentDtos) {
- return userSession.keepAuthorizedComponents(UserRole.USER, componentDtos);
+ return userSession.keepAuthorizedComponents(ProjectPermission.USER, componentDtos);
}
private List<MetricDto> searchMetrics() {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java
index 28fba47792e..bec33db5fd8 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java
@@ -37,7 +37,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -227,9 +227,9 @@ public class SearchHistoryAction implements MeasuresWsAction {
private ComponentDto searchComponent(SearchHistoryRequest request, DbSession dbSession) {
ComponentDto component = loadComponent(dbSession, request);
- userSession.checkComponentPermission(UserRole.USER, component);
+ userSession.checkComponentPermission(ProjectPermission.USER, component);
if (ComponentScopes.PROJECT.equals(component.scope()) && ComponentQualifiers.APP.equals(component.qualifier())) {
- userSession.checkChildProjectsPermission(UserRole.USER, component);
+ userSession.checkChildProjectsPermission(ProjectPermission.USER, component);
}
return component;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java
index ccb9c2ea0b6..09cd48af9d1 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ListAction.java
@@ -31,7 +31,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.DateUtils;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -90,7 +90,7 @@ public class ListAction implements NewCodePeriodsWsAction {
try (DbSession dbSession = dbClient.openSession(false)) {
ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey);
- userSession.checkEntityPermission(UserRole.USER, project);
+ userSession.checkEntityPermission(ProjectPermission.USER, project);
Collection<BranchDto> branches = dbClient.branchDao().selectByProject(dbSession, project).stream()
.filter(b -> b.getBranchType() == BranchType.BRANCH)
.sorted(Comparator.comparing(BranchDto::getKey))
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java
index 7182d433a1a..4b27fbde77d 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/SetAction.java
@@ -27,7 +27,7 @@ import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.core.platform.EditionProvider;
import org.sonar.core.platform.PlatformEditionProvider;
@@ -156,7 +156,7 @@ public class SetAction implements NewCodePeriodsWsAction {
if (projectKey != null) {
project = getProject(dbSession, projectKey);
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
if (branchKey != null) {
branch = getBranch(dbSession, project, branchKey);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java
index 75303cd6a29..011d21312bd 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/ShowAction.java
@@ -24,7 +24,7 @@ import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -127,8 +127,8 @@ public class ShowAction implements NewCodePeriodsWsAction {
}
private void checkPermission(ProjectDto project) {
- if (userSession.hasEntityPermission(UserRole.SCAN, project) ||
- userSession.hasEntityPermission(UserRole.ADMIN, project) ||
+ if (userSession.hasEntityPermission(ProjectPermission.SCAN, project) ||
+ userSession.hasEntityPermission(ProjectPermission.ADMIN, project) ||
userSession.hasPermission(SCAN)) {
return;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java
index e3e2d32a4b0..29045b6dc75 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/newcodeperiod/ws/UnsetAction.java
@@ -23,7 +23,7 @@ import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.documentation.DocumentationLinkGenerator;
import org.sonar.core.platform.EditionProvider;
import org.sonar.core.platform.PlatformEditionProvider;
@@ -102,7 +102,7 @@ public class UnsetAction implements NewCodePeriodsWsAction {
if (projectKey != null) {
ProjectDto project = getProject(dbSession, projectKey);
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
projectUuid = project.getUuid();
if (branchKey != null) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/AddAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/AddAction.java
index 7c00532aff9..e78b170934a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/AddAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/AddAction.java
@@ -24,7 +24,7 @@ import java.util.Optional;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -128,7 +128,7 @@ public class AddAction implements NotificationsWsAction {
private Optional<ProjectDto> searchProject(DbSession dbSession, AddRequest request) {
Optional<ProjectDto> project = request.getProject() == null ? empty() : Optional.of(componentFinder.getProjectByKey(dbSession, request.getProject()));
- project.ifPresent(p -> userSession.checkEntityPermission(UserRole.USER, p));
+ project.ifPresent(p -> userSession.checkEntityPermission(ProjectPermission.USER, p));
return project;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/ListAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/ListAction.java
index 7c0c801d546..6ea7a2525ce 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/ListAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/notification/ws/ListAction.java
@@ -34,7 +34,7 @@ import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
@@ -218,7 +218,7 @@ public class ListAction implements NotificationsWsAction {
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Set<String> authorizedProjectUuids = dbClient.authorizationDao().keepAuthorizedEntityUuids(dbSession, entityUuids,
- userSession.getUuid(), UserRole.USER);
+ userSession.getUuid(), ProjectPermission.USER);
return dbClient.entityDao().selectByUuids(dbSession, entityUuids)
.stream()
.filter(c -> authorizedProjectUuids.contains(c.getUuid()))
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/PermissionPrivilegeChecker.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/PermissionPrivilegeChecker.java
index b7f0aa3f9f3..add804fe588 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/PermissionPrivilegeChecker.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/PermissionPrivilegeChecker.java
@@ -21,7 +21,7 @@ package org.sonar.server.permission;
import javax.annotation.Nullable;
import org.sonar.api.config.Configuration;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.server.user.UserSession;
@@ -55,7 +55,7 @@ public class PermissionPrivilegeChecker {
boolean allowChangingPermissionsByProjectAdmins = config.getBoolean(CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY)
.orElse(CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_DEFAULT_VALUE);
if (entity != null && allowChangingPermissionsByProjectAdmins) {
- userSession.checkEntityPermission(UserRole.ADMIN, entity);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, entity);
} else {
throw insufficientPrivilegesException();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/RequestValidator.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/RequestValidator.java
index 35724a5107d..0568a042408 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/RequestValidator.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/RequestValidator.java
@@ -25,9 +25,10 @@ import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.server.component.ComponentType;
import org.sonar.server.component.ComponentTypes;
-import org.sonar.db.permission.GlobalPermission;
import org.sonar.server.exceptions.BadRequestException;
import static com.google.common.base.Strings.isNullOrEmpty;
@@ -39,16 +40,14 @@ import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_Q
public class RequestValidator {
public static final String MSG_TEMPLATE_WITH_SAME_NAME = "A template with the name '%s' already exists (case insensitive).";
- private final PermissionService permissionService;
private final String allProjectsPermissionsOnOneLine;
public RequestValidator(PermissionService permissionService) {
- this.permissionService = permissionService;
allProjectsPermissionsOnOneLine = Joiner.on(", ").join(permissionService.getAllProjectPermissions());
}
public String validateProjectPermission(String permission) {
- BadRequestException.checkRequest(permissionService.getAllProjectPermissions().contains(permission),
+ BadRequestException.checkRequest(ProjectPermission.contains(permission),
String.format("The '%s' parameter for project permissions must be one of %s. '%s' was passed.", PARAM_PERMISSION,
allProjectsPermissionsOnOneLine, permission));
return permission;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/PermissionWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/PermissionWsSupport.java
index 52a6def7353..e2f3648c996 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/PermissionWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/PermissionWsSupport.java
@@ -28,7 +28,7 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.config.Configuration;
import org.sonar.api.server.ws.Request;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentQualifiers;
@@ -138,7 +138,7 @@ public class PermissionWsSupport {
return;
}
- if (hasBrowsePermissionViaUser(dbSession, userSession, entityDto).contains(UserRole.USER)) {
+ if (hasBrowsePermissionViaUser(dbSession, userSession, entityDto).contains(ProjectPermission.USER.getKey())) {
return;
}
@@ -171,7 +171,7 @@ public class PermissionWsSupport {
}
public static boolean isUpdatingBrowsePermissionOnPrivateProject(String permission, @Nullable EntityDto entityDto) {
- return entityDto != null && entityDto.isPrivate() && permission.equals(UserRole.USER);
+ return entityDto != null && entityDto.isPrivate() && permission.equals(ProjectPermission.USER.getKey());
}
private boolean userHasBrowsePermissionViaGroup(DbSession dbSession, Collection<GroupDto> groups, EntityDto entityDto) {
@@ -184,7 +184,7 @@ public class PermissionWsSupport {
}
private Set<String> findGroupsWithBrowsePermission(DbSession dbSession,EntityDto entityDto) {
- return dbClient.groupPermissionDao().selectGroupUuidsWithPermissionOnEntity(dbSession, entityDto.getUuid(), UserRole.USER);
+ return dbClient.groupPermissionDao().selectGroupUuidsWithPermissionOnEntity(dbSession, entityDto.getUuid(), ProjectPermission.USER.getKey());
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java
index be1ad364011..1690ec5cb3a 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/permission/ws/template/SearchTemplatesAction.java
@@ -25,7 +25,6 @@ import java.util.List;
import java.util.Locale;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-import org.sonar.db.component.ComponentQualifiers;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
@@ -33,6 +32,8 @@ import org.sonar.api.server.ws.WebService.Param;
import org.sonar.core.i18n.I18n;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
+import org.sonar.db.component.ComponentQualifiers;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.template.CountByTemplateAndPermissionDto;
import org.sonar.db.permission.template.PermissionTemplateCharacteristicDto;
import org.sonar.db.permission.template.PermissionTemplateDto;
@@ -130,14 +131,14 @@ public class SearchTemplatesAction implements PermissionsWsAction {
.setUpdatedAt(formatDateTime(templateDto.getUpdatedAt()));
ofNullable(templateDto.getKeyPattern()).ifPresent(templateBuilder::setProjectKeyPattern);
ofNullable(templateDto.getDescription()).ifPresent(templateBuilder::setDescription);
- for (String permission : permissionService.getAllProjectPermissions()) {
+ for (ProjectPermission permission : permissionService.getAllProjectPermissions()) {
templateBuilder.addPermissions(
permissionResponse
.clear()
- .setKey(permission)
- .setUsersCount(data.userCount(templateDto.getUuid(), permission))
- .setGroupsCount(data.groupCount(templateDto.getUuid(), permission))
- .setWithProjectCreator(data.withProjectCreator(templateDto.getUuid(), permission)));
+ .setKey(permission.getKey())
+ .setUsersCount(data.userCount(templateDto.getUuid(), permission.getKey()))
+ .setGroupsCount(data.groupCount(templateDto.getUuid(), permission.getKey()))
+ .setWithProjectCreator(data.withProjectCreator(templateDto.getUuid(), permission.getKey())));
}
response.addPermissionTemplates(templateBuilder);
}
@@ -155,13 +156,13 @@ public class SearchTemplatesAction implements PermissionsWsAction {
private void buildPermissionsResponse(SearchTemplatesWsResponse.Builder response) {
Permission.Builder permissionResponse = Permission.newBuilder();
- for (String permissionKey : permissionService.getAllProjectPermissions()) {
+ for (ProjectPermission permissionKey : permissionService.getAllProjectPermissions()) {
response.addPermissions(
permissionResponse
.clear()
- .setKey(permissionKey)
- .setName(i18nName(permissionKey))
- .setDescription(i18nDescriptionMessage(permissionKey)));
+ .setKey(permissionKey.getKey())
+ .setName(i18nName(permissionKey.getKey()))
+ .setDescription(i18nDescriptionMessage(permissionKey.getKey())));
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java
index b36e6e41cf5..f66038a79ac 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/DeleteAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.project.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -92,7 +92,7 @@ public class DeleteAction implements ProjectsWsAction {
}
private void checkPermission(ProjectDto project) {
- if (!userSession.hasEntityPermission(UserRole.ADMIN, project)) {
+ if (!userSession.hasEntityPermission(ProjectPermission.ADMIN, project)) {
userSession.checkPermission(GlobalPermission.ADMINISTER);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectFinder.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectFinder.java
index 844ce0d6b01..4febb5d6e54 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectFinder.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/ProjectFinder.java
@@ -25,7 +25,7 @@ import java.util.Set;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.permission.GlobalPermission;
@@ -52,7 +52,7 @@ public class ProjectFinder {
public SearchResult search(DbSession dbSession, @Nullable String searchQuery) {
List<ProjectDto> allProjects = dbClient.projectDao().selectProjects(dbSession);
- Set<String> projectsUserHasAccessTo = userSession.keepAuthorizedEntities(UserRole.SCAN, allProjects)
+ Set<String> projectsUserHasAccessTo = userSession.keepAuthorizedEntities(ProjectPermission.SCAN, allProjects)
.stream()
.map(ProjectDto::getKey)
.collect(toSet());
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchMyProjectsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchMyProjectsAction.java
index 851e51b7ba5..c08dee76ceb 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchMyProjectsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/SearchMyProjectsAction.java
@@ -32,7 +32,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DatabaseUtils;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -202,7 +202,8 @@ public class SearchMyProjectsAction implements ProjectsWsAction {
private ProjectsResult searchProjects(DbSession dbSession, SearchMyProjectsRequest request) {
String userUuid = requireNonNull(userSession.getUuid(), "Current user must be authenticated");
- List<String> entitiesUuid = dbClient.roleDao().selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession, UserRole.ADMIN, userUuid, Set.of(ComponentQualifiers.PROJECT));
+ List<String> entitiesUuid = dbClient.roleDao()
+ .selectEntityUuidsByPermissionAndUserUuidAndQualifier(dbSession, ProjectPermission.ADMIN, userUuid, Set.of(ComponentQualifiers.PROJECT));
ImmutableSet<String> subSetEntityUuids = ImmutableSet.copyOf(entitiesUuid.subList(0, Math.min(entitiesUuid.size(), DatabaseUtils.PARTITION_SIZE_FOR_ORACLE)));
Pagination pagination = Pagination.forPage(request.page).andSize(request.pageSize);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java
index 44e7116747f..82b5e589ed2 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java
@@ -35,7 +35,7 @@ import org.sonarqube.ws.client.project.ProjectsWsParameters;
import static org.sonar.api.CoreProperties.CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_DEFAULT_VALUE;
import static org.sonar.api.CoreProperties.CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
import static org.sonarqube.ws.client.project.ProjectsWsParameters.PARAM_PROJECT;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java
index 0f356fffed8..957e900b893 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java
@@ -27,7 +27,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactory;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
@@ -140,7 +140,7 @@ public class CreateEventAction implements ProjectAnalysesWsAction {
}
private void checkRequest(CreateEventRequest request, ProjectDto project) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
checkArgument(EventCategory.VERSION != request.getCategory() || ComponentQualifiers.PROJECT.equals(project.getQualifier()), "A version event must be created on a project");
checkVersionName(request.getCategory(), request.getName());
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java
index 374936d49a7..506f20896c5 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.projectanalysis.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -73,7 +73,7 @@ public class DeleteAction implements ProjectAnalysesWsAction {
if (STATUS_UNPROCESSED.equals(analysis.getStatus())) {
throw analysisNotFoundException(analysisUuid);
}
- userSession.checkComponentUuidPermission(UserRole.ADMIN, analysis.getRootComponentUuid());
+ userSession.checkComponentUuidPermission(ProjectPermission.ADMIN, analysis.getRootComponentUuid());
checkArgument(!analysis.getLast(), "The last analysis '%s' cannot be deleted", analysisUuid);
checkNotUsedInNewCodePeriod(dbSession, analysis);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteEventAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteEventAction.java
index 04930564149..951db943837 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteEventAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/DeleteEventAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.projectanalysis.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -73,7 +73,7 @@ public class DeleteEventAction implements ProjectAnalysesWsAction {
String eventP = request.mandatoryParam(PARAM_EVENT);
try (DbSession dbSession = dbClient.openSession(false)) {
EventDto event = getEvent(dbSession, eventP);
- userSession.checkComponentUuidPermission(UserRole.ADMIN, event.getComponentUuid());
+ userSession.checkComponentUuidPermission(ProjectPermission.ADMIN, event.getComponentUuid());
checkModifiable().accept(event);
deleteEvent(dbSession, event);
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java
index f1c74898238..99bf60a1f5c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java
@@ -29,7 +29,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.Param;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.config.CorePropertyDefinitions;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -191,9 +191,9 @@ public class SearchAction implements ProjectAnalysesWsAction {
}
private void checkPermission(ComponentDto project) {
- userSession.checkComponentPermission(UserRole.USER, project);
+ userSession.checkComponentPermission(ProjectPermission.USER, project);
if (ComponentScopes.PROJECT.equals(project.scope()) && ComponentQualifiers.APP.equals(project.qualifier())) {
- userSession.checkChildProjectsPermission(UserRole.USER, project);
+ userSession.checkChildProjectsPermission(ProjectPermission.USER, project);
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UpdateEventAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UpdateEventAction.java
index 770d45fc35c..3dc690e7257 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UpdateEventAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectanalysis/ws/UpdateEventAction.java
@@ -28,7 +28,7 @@ import java.util.stream.Stream;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -131,7 +131,7 @@ public class UpdateEventAction implements ProjectAnalysesWsAction {
}
private Consumer<EventDto> checkPermissions() {
- return event -> userSession.checkComponentUuidPermission(UserRole.ADMIN, event.getComponentUuid());
+ return event -> userSession.checkComponentUuidPermission(ProjectPermission.ADMIN, event.getComponentUuid());
}
private Consumer<EventDto> checkNonConflictingOtherEvents(DbSession dbSession) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/ProjectDumpWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/ProjectDumpWsSupport.java
index 2dbcaaad38b..7c1f67fcfdc 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/ProjectDumpWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/ProjectDumpWsSupport.java
@@ -20,7 +20,7 @@
package org.sonar.server.projectdump.ws;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -43,7 +43,7 @@ public class ProjectDumpWsSupport {
public void verifyAdminOfProjectByKey(String projectKey) {
try (DbSession dbSession = dbClient.openSession(false)) {
ProjectDto project = componentFinder.getProjectByKey(dbSession, projectKey);
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
}
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/StatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/StatusAction.java
index d09d217d09a..db89815bc57 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/StatusAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectdump/ws/StatusAction.java
@@ -29,7 +29,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -98,7 +98,7 @@ public class StatusAction implements ProjectDumpAction {
try (DbSession dbSession = dbClient.openSession(false)) {
ProjectDto project = getProject(dbSession, uuid, key);
BranchDto mainBranch = componentFinder.getMainBranch(dbSession, project);
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
WsResponse wsResponse = new WsResponse();
checkDumps(project, wsResponse);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java
index 3c2ad917de1..9fd56ec29cb 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/CreateAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.projectlink.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -106,7 +106,7 @@ public class CreateAction implements ProjectLinksWsAction {
try (DbSession dbSession = dbClient.openSession(false)) {
ProjectDto project = getProject(dbSession, createWsRequest);
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
ProjectLinkDto link = new ProjectLinkDto()
.setUuid(uuidFactory.create())
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/DeleteAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/DeleteAction.java
index 42de4a8da32..3d9f8ba0882 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/DeleteAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/DeleteAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.projectlink.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ProjectLinkDto;
@@ -90,7 +90,7 @@ public class DeleteAction implements ProjectLinksWsAction {
if (userSession.hasPermission(GlobalPermission.ADMINISTER)) {
return;
}
- userSession.checkEntityPermission(UserRole.ADMIN, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, projectDto);
}
private static void checkNotProvided(ProjectLinkDto link) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java
index 53caf9afebf..e52a11046b8 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projectlink/ws/SearchAction.java
@@ -23,7 +23,7 @@ import java.util.List;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ProjectLinkDto;
@@ -118,8 +118,8 @@ public class SearchAction implements ProjectLinksWsAction {
request.getProjectId(),
request.getProjectKey(),
ComponentFinder.ParamNames.PROJECT_ID_AND_KEY);
- if (!userSession.hasEntityPermission(UserRole.ADMIN, project) &&
- !userSession.hasEntityPermission(UserRole.USER, project)) {
+ if (!userSession.hasEntityPermission(ProjectPermission.ADMIN, project) &&
+ !userSession.hasEntityPermission(ProjectPermission.USER, project)) {
throw insufficientPrivilegesException();
}
return project;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/TagsWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/TagsWsSupport.java
index 508fdfafca6..d8d29a08ab3 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/TagsWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/projecttag/TagsWsSupport.java
@@ -24,7 +24,7 @@ import java.util.Locale;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.sonar.api.utils.System2;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -70,7 +70,7 @@ public class TagsWsSupport {
}
private void updateTagsForProjectsOrApplication(DbSession dbSession, List<String> tags, ProjectDto projectOrApplication) {
- userSession.checkEntityPermission(UserRole.ADMIN, projectOrApplication);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, projectOrApplication);
projectOrApplication.setTags(tags);
projectOrApplication.setUpdatedAt(system2.now());
dbClient.projectDao().updateTags(dbSession, projectOrApplication);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java
index f56ad77cf50..2e409544b36 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/GetByProjectAction.java
@@ -32,8 +32,8 @@ import org.sonar.server.qualitygate.QualityGateFinder.QualityGateData;
import org.sonar.server.user.UserSession;
import org.sonarqube.ws.Qualitygates.GetByProjectResponse;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.ACTION_GET_BY_PROJECT;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java
index e921191adc0..963a2f35716 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java
@@ -29,7 +29,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -220,9 +220,9 @@ public class ProjectStatusAction implements QualityGatesWsAction {
}
private void checkPermission(ProjectDto project) {
- if (!userSession.hasEntityPermission(UserRole.ADMIN, project) &&
- !userSession.hasEntityPermission(UserRole.USER, project) &&
- !userSession.hasEntityPermission(UserRole.SCAN, project) &&
+ if (!userSession.hasEntityPermission(ProjectPermission.ADMIN, project) &&
+ !userSession.hasEntityPermission(ProjectPermission.USER, project) &&
+ !userSession.hasEntityPermission(ProjectPermission.SCAN, project) &&
!userSession.hasPermission(GlobalPermission.SCAN)) {
throw insufficientPrivilegesException();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java
index 571c1ad303e..9ff333275da 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWsSupport.java
@@ -28,7 +28,7 @@ import org.sonar.server.component.ComponentFinder;
import org.sonar.server.user.UserSession;
import static com.google.common.base.Preconditions.checkArgument;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
import static org.sonar.server.exceptions.NotFoundException.checkFound;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java
index 83f14614c26..7bdec76255b 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java
@@ -27,7 +27,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.Paging;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.qualitygate.ProjectQgateAssociationDto;
@@ -156,7 +156,7 @@ public class SearchAction implements QualityGatesWsAction {
private List<ProjectQgateAssociationDto> keepAuthorizedProjects(DbSession dbSession, List<ProjectQgateAssociationDto> projects) {
List<String> projectUuids = projects.stream().map(ProjectQgateAssociationDto::getUuid).toList();
- Collection<String> authorizedProjectUuids = dbClient.authorizationDao().keepAuthorizedEntityUuids(dbSession, projectUuids, userSession.getUuid(), UserRole.USER);
+ Collection<String> authorizedProjectUuids = dbClient.authorizationDao().keepAuthorizedEntityUuids(dbSession, projectUuids, userSession.getUuid(), ProjectPermission.USER);
return projects.stream().filter(project -> authorizedProjectUuids.contains(project.getUuid())).toList();
}
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileBackuperImpl.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileBackuperImpl.java
index 23e17a9d550..4a03fd7bb88 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileBackuperImpl.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileBackuperImpl.java
@@ -35,7 +35,7 @@ import org.apache.commons.lang3.builder.CompareToBuilder;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapper.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapper.java
index fbe081ba1c7..318d159cc26 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapper.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapper.java
@@ -25,9 +25,11 @@ import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import org.sonar.api.issue.impact.Severity;
import org.sonar.api.issue.impact.SoftwareQuality;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.server.rule.internal.ImpactMapper;
import org.sonar.core.rule.ImpactSeverityMapper;
+import org.sonar.core.rule.RuleType;
+
+import static org.sonar.core.rule.RuleTypeMapper.toApiRuleType;
/**
* Class to map impact severity and rule severity during the override of severity of quality profile.
@@ -43,7 +45,7 @@ public class QProfileImpactSeverityMapper {
if (severity == null || ruleImpacts.isEmpty()) {
return result;
}
- SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(ruleType);
+ SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(toApiRuleType(ruleType));
if (ruleImpacts.containsKey(softwareQuality)) {
result.put(softwareQuality, ImpactSeverityMapper.mapImpactSeverity(severity));
}
@@ -52,7 +54,7 @@ public class QProfileImpactSeverityMapper {
@CheckForNull
public static String mapSeverity(Map<SoftwareQuality, Severity> impacts, RuleType ruleType, @Nullable String ruleSeverity) {
- SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(ruleType);
+ SoftwareQuality softwareQuality = ImpactMapper.convertToSoftwareQuality(toApiRuleType(ruleType));
if (impacts.containsKey(softwareQuality)) {
return ImpactSeverityMapper.mapRuleSeverity(impacts.get(softwareQuality));
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java
index 6f916e10d04..f03d2426ff1 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/AddProjectAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewAction;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -117,7 +117,7 @@ public class AddProjectAction implements QProfileWsAction {
}
private void checkPermissions(QProfileDto profile, ProjectDto project) {
- if (wsSupport.canAdministrate(profile) || userSession.hasEntityPermission(UserRole.ADMIN, project)) {
+ if (wsSupport.canAdministrate(profile) || userSession.hasEntityPermission(ProjectPermission.ADMIN, project)) {
return;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/ProjectsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/ProjectsAction.java
index c570cf431df..4c4c9442ca5 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/ProjectsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/ProjectsAction.java
@@ -32,7 +32,7 @@ import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.server.ws.WebService.SelectionMode;
import org.sonar.api.utils.Paging;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.qualityprofile.ProjectQprofileAssociationDto;
@@ -108,7 +108,7 @@ public class ProjectsAction implements QProfileWsAction {
.map(ProjectQprofileAssociationDto::getProjectUuid)
.collect(Collectors.toSet());
- Set<String> authorizedProjectUuids = dbClient.authorizationDao().keepAuthorizedEntityUuids(session, projectUuids, userSession.getUuid(), UserRole.USER);
+ Set<String> authorizedProjectUuids = dbClient.authorizationDao().keepAuthorizedEntityUuids(session, projectUuids, userSession.getUuid(), ProjectPermission.USER);
Paging paging = forPageIndex(page).withPageSize(pageSize).andTotal(authorizedProjectUuids.size());
List<ProjectQprofileAssociationDto> authorizedProjects = projects.stream()
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java
index fe64070e2bb..43225264f84 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/qualityprofile/ws/RemoveProjectAction.java
@@ -24,7 +24,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.server.ws.WebService.NewAction;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -110,7 +110,7 @@ public class RemoveProjectAction implements QProfileWsAction {
}
private void checkPermissions(QProfileDto profile, ProjectDto project) {
- if (wsSupport.canAdministrate(profile) || userSession.hasEntityPermission(UserRole.ADMIN, project)) {
+ if (wsSupport.canAdministrate(profile) || userSession.hasEntityPermission(ProjectPermission.ADMIN, project)) {
return;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/RuleUpdater.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/RuleUpdater.java
index faf70bcea0c..21f8a47a1f5 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/RuleUpdater.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/RuleUpdater.java
@@ -27,7 +27,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
@@ -36,11 +35,12 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.api.server.debt.DebtRemediationFunction;
import org.sonar.api.server.rule.internal.ImpactMapper;
import org.sonar.api.utils.System2;
+import org.sonar.core.rule.RuleType;
+import org.sonar.core.rule.RuleTypeMapper;
import org.sonar.core.util.UuidFactory;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -136,7 +136,7 @@ public class RuleUpdater {
private static void updateImpactSeverity(RuleDto rule, String severity) {
rule.getDefaultImpacts()
.stream()
- .filter(i -> i.getSoftwareQuality().equals(ImpactMapper.convertToSoftwareQuality(rule.getEnumType())))
+ .filter(i -> i.getSoftwareQuality() == ImpactMapper.convertToSoftwareQuality(RuleTypeMapper.toApiRuleType(rule.getEnumType())))
.findFirst()
.ifPresent(i -> i.setSeverity(mapImpactSeverity(severity)));
}
@@ -148,11 +148,11 @@ public class RuleUpdater {
}
impacts.forEach((key, value) -> rule.getDefaultImpacts()
.stream()
- .filter(i -> i.getSoftwareQuality().equals(key))
+ .filter(i -> i.getSoftwareQuality() == key)
.findFirst()
.ifPresent(i -> {
i.setSeverity(value);
- if (Objects.equals(convertToRuleType(key), RuleType.valueOf(rule.getType()))) {
+ if (RuleTypeMapper.toRuleType(convertToRuleType(key)) == RuleType.fromDbConstant(rule.getType())) {
rule.setSeverity(convertToDeprecatedSeverity(value));
}
}));
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/CreateAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/CreateAction.java
index 23036091585..01c0e7eb966 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/CreateAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/CreateAction.java
@@ -30,7 +30,7 @@ import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java
index d55d0b68f86..831558dcc11 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java
@@ -22,7 +22,7 @@ package org.sonar.server.rule.ws;
import java.util.Date;
import java.util.List;
import org.sonar.api.rule.RuleStatus;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.WebService;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleWsSupport.java
index 26d7902e471..2f1504032b4 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/RuleWsSupport.java
@@ -30,7 +30,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttributeCategory;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ServerSide;
import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java
index 1ff20c90db7..d0bfa57b855 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/SearchAction.java
@@ -38,7 +38,7 @@ import javax.annotation.Nullable;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttributeCategory;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/scannercache/ws/GetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/scannercache/ws/GetAction.java
index f3ce8dd2380..3c236a6154c 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/scannercache/ws/GetAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/scannercache/ws/GetAction.java
@@ -28,7 +28,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbInputStream;
import org.sonar.db.DbSession;
@@ -121,8 +121,8 @@ public class GetAction implements AnalysisCacheWsAction {
}
private void checkPermission(ProjectDto project) {
- if (userSession.hasEntityPermission(UserRole.SCAN, project) ||
- userSession.hasEntityPermission(UserRole.ADMIN, project) ||
+ if (userSession.hasEntityPermission(ProjectPermission.SCAN, project) ||
+ userSession.hasEntityPermission(ProjectPermission.ADMIN, project) ||
userSession.hasPermission(SCAN)) {
return;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ListDefinitionsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ListDefinitionsAction.java
index da9b8a8a232..0e483c79b92 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ListDefinitionsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ListDefinitionsAction.java
@@ -42,7 +42,7 @@ import static com.google.common.base.Strings.emptyToNull;
import static java.lang.String.format;
import static java.util.Comparator.comparing;
import static java.util.Optional.ofNullable;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.setting.ws.SettingsWsParameters.PARAM_COMPONENT;
import static org.sonar.server.ws.KeyExamples.KEY_PROJECT_EXAMPLE_001;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ResetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ResetAction.java
index 423e01bade5..5cf0b66b6b0 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ResetAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ResetAction.java
@@ -31,7 +31,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
@@ -142,7 +142,7 @@ public class ResetAction implements SettingsWsAction {
private void checkPermissions(Optional<EntityDto> component) {
if (component.isPresent()) {
- userSession.checkEntityPermission(UserRole.ADMIN, component.get());
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, component.get());
} else {
userSession.checkIsSystemAdministrator();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SetAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SetAction.java
index ceeadd31feb..d1febba4564 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SetAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SetAction.java
@@ -43,7 +43,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
@@ -300,7 +300,7 @@ public class SetAction implements SettingsWsAction {
private void checkPermissions(Optional<EntityDto> entity) {
if (entity.isPresent()) {
- userSession.checkEntityPermission(UserRole.ADMIN, entity.get());
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, entity.get());
} else {
userSession.checkIsSystemAdministrator();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SettingsWsSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SettingsWsSupport.java
index a2ab37c1f20..dbc6864fee7 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SettingsWsSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/SettingsWsSupport.java
@@ -23,15 +23,15 @@ import com.google.common.annotations.VisibleForTesting;
import java.util.Optional;
import java.util.Set;
import org.sonar.api.server.ServerSide;
-import org.sonar.api.web.UserRole;
import org.sonar.db.entity.EntityDto;
import org.sonar.db.permission.GlobalPermission;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.process.ProcessProperties;
import org.sonar.server.user.UserSession;
import static java.lang.String.format;
import static java.util.Arrays.stream;
-import static org.sonar.api.web.UserRole.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
@ServerSide
public class SettingsWsSupport {
@@ -58,7 +58,7 @@ public class SettingsWsSupport {
if (isAdmin(component)) {
return true;
}
- return hasPermission(GlobalPermission.SCAN, UserRole.SCAN, component) || !isProtected(key);
+ return hasPermission(GlobalPermission.SCAN, ProjectPermission.SCAN, component) || !isProtected(key);
}
private boolean isAdmin(Optional<EntityDto> component) {
@@ -77,7 +77,7 @@ public class SettingsWsSupport {
return ADMIN_ONLY_SETTINGS.contains(key);
}
- private boolean hasPermission(GlobalPermission orgPermission, String projectPermission, Optional<EntityDto> component) {
+ private boolean hasPermission(GlobalPermission orgPermission, ProjectPermission projectPermission, Optional<EntityDto> component) {
if (userSession.hasPermission(orgPermission)) {
return true;
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ValuesAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ValuesAction.java
index ffeee3203da..0de63dcaf31 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ValuesAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/setting/ws/ValuesAction.java
@@ -40,7 +40,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.entity.EntityDto;
@@ -59,7 +59,7 @@ import static org.sonar.api.CoreProperties.SERVER_ID;
import static org.sonar.api.CoreProperties.SERVER_STARTTIME;
import static org.sonar.api.PropertyType.FORMATTED_TEXT;
import static org.sonar.api.PropertyType.PROPERTY_SET;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.setting.ws.PropertySetExtractor.extractPropertySetKeys;
import static org.sonar.server.setting.ws.SettingsWsParameters.PARAM_COMPONENT;
import static org.sonar.server.setting.ws.SettingsWsParameters.PARAM_KEYS;
@@ -148,7 +148,7 @@ public class ValuesAction implements SettingsWsAction {
.orElseThrow(() -> new NotFoundException(format("Component key '%s' not found", componentKey)));
if (!userSession.hasEntityPermission(USER, entity) &&
- !userSession.hasEntityPermission(UserRole.SCAN, entity) &&
+ !userSession.hasEntityPermission(ProjectPermission.SCAN, entity) &&
!userSession.hasPermission(GlobalPermission.SCAN)) {
throw insufficientPrivilegesException();
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IndexAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IndexAction.java
index 2e28f46afd1..859266e4017 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IndexAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IndexAction.java
@@ -25,7 +25,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -79,7 +79,7 @@ public class IndexAction implements SourcesWsAction {
Integer to = request.paramAsInt("to");
try (DbSession session = dbClient.openSession(false)) {
ComponentDto component = componentFinder.getByKey(session, fileKey);
- userSession.checkComponentPermission(UserRole.CODEVIEWER, component);
+ userSession.checkComponentPermission(ProjectPermission.CODEVIEWER, component);
Optional<Iterable<String>> lines = sourceService.getLinesAsRawText(session, component.uuid(), from, to == null ? Integer.MAX_VALUE : (to - 1));
try (JsonWriter json = response.newJsonWriter()) {
json.beginArray().beginObject();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IssueSnippetsAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IssueSnippetsAction.java
index d6973d725e5..f046f34a5e5 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IssueSnippetsAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/IssueSnippetsAction.java
@@ -31,7 +31,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.BranchDto;
@@ -91,7 +91,7 @@ public class IssueSnippetsAction implements SourcesWsAction {
ProjectDto projectDto = dbClient.projectDao().selectByBranchUuid(dbSession, issueDto.getProjectUuid())
.orElseThrow(() -> new NotFoundException(format("Project with uuid '%s' does not exist", issueDto.getProjectUuid())));
- userSession.checkEntityPermission(UserRole.CODEVIEWER, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.CODEVIEWER, projectDto);
DbIssues.Locations locations = issueDto.parseLocations();
String componentUuid = issueDto.getComponentUuid();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/LinesAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/LinesAction.java
index 1b8b1e50767..49332baf0b0 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/LinesAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/LinesAction.java
@@ -28,7 +28,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -142,7 +142,7 @@ public class LinesAction implements SourcesWsAction {
.selectLastAnalysisByComponentUuid(dbSession, file.branchUuid())
.map(SnapshotDto::getPeriodDate);
- userSession.checkComponentPermission(UserRole.CODEVIEWER, file);
+ userSession.checkComponentPermission(ProjectPermission.CODEVIEWER, file);
int from = request.mandatoryParamAsInt(PARAM_FROM);
int to = MoreObjects.firstNonNull(request.paramAsInt(PARAM_TO), Integer.MAX_VALUE);
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/RawAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/RawAction.java
index 4497f789a94..5a00fdb32f6 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/RawAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/RawAction.java
@@ -27,7 +27,7 @@ import java.util.Optional;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -89,7 +89,7 @@ public class RawAction implements SourcesWsAction {
String pullRequest = request.param(PARAM_PULL_REQUEST);
try (DbSession dbSession = dbClient.openSession(false)) {
ComponentDto file = componentFinder.getByKeyAndOptionalBranchOrPullRequest(dbSession, fileKey, branch, pullRequest);
- userSession.checkComponentPermission(UserRole.CODEVIEWER, file);
+ userSession.checkComponentPermission(ProjectPermission.CODEVIEWER, file);
Optional<Iterable<String>> lines = sourceService.getLinesAsRawText(dbSession, file.uuid(), 1, Integer.MAX_VALUE);
response.stream().setMediaType("text/plain");
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ScmAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ScmAction.java
index e6cd8ef6ab7..10317138e8d 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ScmAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ScmAction.java
@@ -29,7 +29,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.DateUtils;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -103,7 +103,7 @@ public class ScmAction implements SourcesWsAction {
try (DbSession dbSession = dbClient.openSession(false)) {
ComponentDto file = componentFinder.getByKey(dbSession, fileKey);
- userSession.checkComponentPermission(UserRole.CODEVIEWER, file);
+ userSession.checkComponentPermission(ProjectPermission.CODEVIEWER, file);
Iterable<DbFileSources.Line> sourceLines = checkFoundWithOptional(sourceService.getLines(dbSession, file.uuid(), from, to), "File " +
"'%s' has no sources", fileKey);
try (JsonWriter json = response.newJsonWriter()) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ShowAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ShowAction.java
index 56a7d1d8930..3d20808c60f 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ShowAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/source/ws/ShowAction.java
@@ -25,7 +25,7 @@ import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.component.ComponentDto;
@@ -88,7 +88,7 @@ public class ShowAction implements SourcesWsAction {
try (DbSession dbSession = dbClient.openSession(false)) {
ComponentDto file = componentFinder.getByKey(dbSession, fileKey);
- userSession.checkComponentPermission(UserRole.CODEVIEWER, file);
+ userSession.checkComponentPermission(ProjectPermission.CODEVIEWER, file);
Iterable<String> linesHtml = checkFoundWithOptional(sourceService.getLinesAsHtml(dbSession, file.uuid(), from, to), "No source found for file '%s'", fileKey);
try (JsonWriter json = response.newJsonWriter()) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
index 2025d57fc8c..8e156b69a04 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/ui/ws/ComponentAction.java
@@ -40,7 +40,7 @@ import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService.NewAction;
import org.sonar.api.server.ws.WebService.NewController;
import org.sonar.api.utils.text.JsonWriter;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.api.web.page.Page;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -66,8 +66,8 @@ import static org.sonar.api.CoreProperties.CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_
import static org.sonar.api.CoreProperties.CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY;
import static org.sonar.api.measures.CoreMetrics.QUALITY_PROFILES_KEY;
import static org.sonar.api.utils.DateUtils.formatDateTime;
-import static org.sonar.api.web.UserRole.ADMIN;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.ADMIN;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
import static org.sonar.server.user.AbstractUserSession.insufficientPrivilegesException;
@@ -271,7 +271,7 @@ public class ComponentAction implements NavigationWsAction {
private void writeExtensions(JsonWriter json, ComponentDto component, List<Page> pages) {
json.name("extensions").beginArray();
Predicate<Page> isAuthorized = page -> {
- String requiredPermission = page.isAdmin() ? UserRole.ADMIN : UserRole.USER;
+ ProjectPermission requiredPermission = page.isAdmin() ? ProjectPermission.ADMIN : ProjectPermission.USER;
return userSession.hasComponentPermission(requiredPermission, component);
};
pages.stream()
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java
index aabb5ff63a4..c7e0774f6bb 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/user/ws/CurrentAction.java
@@ -48,7 +48,7 @@ import static java.util.Optional.empty;
import static java.util.Optional.of;
import static java.util.Optional.ofNullable;
import static org.apache.commons.lang3.StringUtils.EMPTY;
-import static org.sonar.api.web.UserRole.USER;
+import static org.sonar.db.permission.ProjectPermission.USER;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.APPLICATION;
import static org.sonarqube.ws.Users.CurrentWsResponse.HomepageType.PORTFOLIO;
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/UserTokenSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/UserTokenSupport.java
index 9cafc8c3518..fdc84304f12 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/UserTokenSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/usertoken/ws/UserTokenSupport.java
@@ -22,7 +22,7 @@ package org.sonar.server.usertoken.ws;
import java.util.Optional;
import javax.annotation.Nullable;
import org.sonar.api.server.ws.Request;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.project.ProjectDto;
@@ -97,7 +97,7 @@ public class UserTokenSupport {
}
private void validateProjectScanPermission(ProjectDto projectDto) {
- if (userSession.hasEntityPermission(UserRole.SCAN, projectDto) || userSession.hasPermission(SCAN)) {
+ if (userSession.hasEntityPermission(ProjectPermission.SCAN, projectDto) || userSession.hasPermission(SCAN)) {
return;
}
throw insufficientPrivilegesException();
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java
index b05b3c39841..59e1b48e466 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveriesAction.java
@@ -31,7 +31,7 @@ import org.sonar.api.server.ws.Change;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -181,7 +181,7 @@ public class WebhookDeliveriesAction implements WebhooksWsAction {
void ensureAdminPermission(UserSession userSession) {
if (!projectUuidMap.isEmpty()) {
- List<ProjectDto> projectsUserHasAccessTo = userSession.keepAuthorizedEntities(UserRole.ADMIN, projectUuidMap.values());
+ List<ProjectDto> projectsUserHasAccessTo = userSession.keepAuthorizedEntities(ProjectPermission.ADMIN, projectUuidMap.values());
if (projectsUserHasAccessTo.size() != projectUuidMap.size()) {
throw new ForbiddenException("Insufficient privileges");
}
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java
index 4300158a622..ee9f7f18120 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookDeliveryAction.java
@@ -22,7 +22,7 @@ package org.sonar.server.webhook.ws;
import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
@@ -96,7 +96,7 @@ public class WebhookDeliveryAction implements WebhooksWsAction {
}
void ensureAdminPermission(UserSession userSession) {
- userSession.checkEntityPermission(UserRole.ADMIN, project);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, project);
}
void writeTo(Request request, Response response) {
diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java
index 858e7d5b968..6160140239f 100644
--- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java
+++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/webhook/ws/WebhookSupport.java
@@ -24,7 +24,7 @@ import java.net.SocketException;
import java.net.UnknownHostException;
import okhttp3.HttpUrl;
import org.sonar.api.config.Configuration;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.user.UserSession;
@@ -45,7 +45,7 @@ public class WebhookSupport {
}
void checkPermission(ProjectDto projectDto) {
- userSession.checkEntityPermission(UserRole.ADMIN, projectDto);
+ userSession.checkEntityPermission(ProjectPermission.ADMIN, projectDto);
}
void checkPermission() {
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGeneratorTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGeneratorTest.java
index 290be53f4ae..011496672ff 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGeneratorTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/PullHotspotsActionProtobufObjectGeneratorTest.java
@@ -31,6 +31,7 @@ import org.sonarqube.ws.Hotspots.HotspotLite;
import org.sonarqube.ws.Hotspots.HotspotPullQueryTimestamp;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
public class PullHotspotsActionProtobufObjectGeneratorTest {
@@ -81,6 +82,32 @@ public class PullHotspotsActionProtobufObjectGeneratorTest {
}
@Test
+ public void generateIssueMessage_whenFilePathIsNull_shouldMapDtoFields() {
+ Date creationDate = new Date();
+ IssueDto issueDto = new IssueDto()
+ .setKee("key")
+ .setProjectKey("my-project-key")
+ .setStatus("REVIEWED")
+ .setResolution("FIXED")
+ .setRuleKey("repo", "rule")
+ .setRuleUuid("rule-uuid-1")
+ .setMessage("Look at me, I'm the issue now!")
+ .setAssigneeLogin("assignee-login")
+ .setIssueCreationDate(creationDate);
+
+ DbIssues.Locations locations = DbIssues.Locations.newBuilder()
+ .setTextRange(range(2, 3))
+ .build();
+ issueDto.setLocations(locations);
+
+ RuleDto ruleDto = new RuleDto()
+ .setSecurityStandards(Set.of("cwe:489,cwe:570,cwe:571"));
+
+ HotspotLite result = underTest.generateIssueMessage(issueDto, ruleDto);
+ assertEquals("", result.getFilePath());
+ }
+
+ @Test
public void generateClosedIssueMessage_shouldMapClosedHotspotFields() {
HotspotLite result = underTest.generateClosedIssueMessage("uuid");
assertThat(result).extracting(HotspotLite::getKey, HotspotLite::getClosed)
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/ComponentTagsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/ComponentTagsActionTest.java
index e3db9cbef74..9d9af15e75e 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/ComponentTagsActionTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/ComponentTagsActionTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.stubbing.Answer;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.api.server.ws.WebService.Action;
import org.sonar.api.server.ws.WebService.Param;
import org.sonar.db.DbClient;
@@ -49,7 +49,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.test.JsonAssert.assertJson;
public class ComponentTagsActionTest {
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchResponseFormatFormatOperationTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchResponseFormatFormatOperationTest.java
index 469fd20ef81..aabb315a43f 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchResponseFormatFormatOperationTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchResponseFormatFormatOperationTest.java
@@ -60,8 +60,8 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.sonar.db.component.ComponentQualifiers.UNIT_TEST_FILE;
import static org.sonar.api.rule.RuleKey.EXTERNAL_RULE_REPO_PREFIX;
-import static org.sonar.api.rules.RuleType.CODE_SMELL;
-import static org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+import static org.sonar.core.rule.RuleType.CODE_SMELL;
+import static org.sonar.core.rule.RuleType.SECURITY_HOTSPOT;
import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.issue.IssueTesting.newIssue;
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidatorTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidatorTest.java
index 857164e79d7..76b2a8f0f3c 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidatorTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/anticipatedtransition/AnticipatedTransitionsActionValidatorTest.java
@@ -38,7 +38,7 @@ import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
+import static org.sonar.db.permission.ProjectPermission.ISSUE_ADMIN;
public class AnticipatedTransitionsActionValidatorTest {
@@ -98,7 +98,7 @@ public class AnticipatedTransitionsActionValidatorTest {
String projectUuid = "projectUuid";
DbSession dbSession = mockDbSession();
AuthorizationDao authorizationDao = mockAuthorizationDao();
- doReturn(Set.of("permission1", ISSUE_ADMIN)).when(authorizationDao).selectEntityPermissions(dbSession, projectUuid, userUuid);
+ doReturn(Set.of("permission1", ISSUE_ADMIN.getKey())).when(authorizationDao).selectEntityPermissions(dbSession, projectUuid, userUuid);
// when, then
assertThatCode(() -> underTest.validateUserHasAdministerIssuesPermission(projectUuid))
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImplTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImplTest.java
index c31b58c190c..aa4f902e759 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImplTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/measure/live/MeasureUpdateFormulaFactoryImplTest.java
@@ -41,7 +41,7 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import org.sonar.core.metric.SoftwareQualitiesMetrics;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueGroupDto;
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapperTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapperTest.java
index 60bfb890ad9..e6359c0f1d8 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapperTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/QProfileImpactSeverityMapperTest.java
@@ -23,7 +23,7 @@ import java.util.Map;
import org.junit.jupiter.api.Test;
import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.Severity;
-import org.sonar.api.rules.RuleType;
+import org.sonar.core.rule.RuleType;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SettingsWsSupportTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SettingsWsSupportTest.java
index f1dacc57d2e..7ad2cf8fcfc 100644
--- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SettingsWsSupportTest.java
+++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/setting/ws/SettingsWsSupportTest.java
@@ -27,7 +27,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mockito.InjectMocks;
-import org.sonar.api.web.UserRole;
+import org.sonar.db.permission.ProjectPermission;
import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.user.UserSession;
@@ -92,7 +92,7 @@ public class SettingsWsSupportTest {
openMocks(this);
when(userSession.isSystemAdministrator()).thenReturn(isAdmin);
when(userSession.hasPermission(GlobalPermission.SCAN)).thenReturn(hasGlobalPermission);
- when(userSession.hasEntityPermission(UserRole.SCAN, componentDto)).thenReturn(hasComponentPermission);
+ when(userSession.hasEntityPermission(ProjectPermission.SCAN, componentDto)).thenReturn(hasComponentPermission);
boolean isVisible = settingsWsSupport.isVisible(property, Optional.of(componentDto));
assertThat(isVisible).isEqualTo(expectedIsVisible);
diff --git a/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java b/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java
index 1946ec0c0a4..ddbca714b76 100644
--- a/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java
+++ b/sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java
@@ -48,13 +48,13 @@ import org.sonar.api.issue.impact.SoftwareQuality;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
import org.sonar.api.rules.CleanCodeAttribute;
-import org.sonar.api.rules.RuleType;
import org.sonar.api.utils.Duration;
import org.sonar.core.issue.tracking.Trackable;
+import org.sonar.core.rule.RuleType;
import static org.sonar.api.utils.DateUtils.truncateToSeconds;
-public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.Issue {
+public class DefaultIssue implements Issue, Trackable {
private String key = null;
private RuleType type = null;
@@ -151,12 +151,10 @@ public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.
return this;
}
- @Override
public RuleType type() {
return type;
}
- @Override
public Map<SoftwareQuality, org.sonar.api.issue.impact.Severity> impacts() {
return impacts.values().stream().collect(Collectors.toMap(DefaultImpact::softwareQuality, DefaultImpact::severity));
}
@@ -356,7 +354,6 @@ public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.
}
@Nullable
- @Override
public IssueStatus issueStatus() {
return IssueStatus.of(status, resolution);
}
diff --git a/sonar-core/src/main/java/org/sonar/core/rule/RuleType.java b/sonar-core/src/main/java/org/sonar/core/rule/RuleType.java
new file mode 100644
index 00000000000..89fa04deab3
--- /dev/null
+++ b/sonar-core/src/main/java/org/sonar/core/rule/RuleType.java
@@ -0,0 +1,77 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2025 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.core.rule;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+
+import static java.lang.String.format;
+import static java.util.Arrays.stream;
+import static java.util.Collections.unmodifiableSet;
+
+public enum RuleType {
+ CODE_SMELL(1), BUG(2), VULNERABILITY(3), SECURITY_HOTSPOT(4);
+
+ private static final Set<String> ALL_NAMES = unmodifiableSet(new LinkedHashSet<>(stream(values())
+ .map(Enum::name)
+ .toList()));
+
+ private final int dbConstant;
+
+ RuleType(int dbConstant) {
+ this.dbConstant = dbConstant;
+ }
+
+ public int getDbConstant() {
+ return dbConstant;
+ }
+
+ public static Set<String> names() {
+ return ALL_NAMES;
+ }
+
+ /**
+ * Returns the enum constant of the specified DB column value.
+ */
+ public static RuleType fromDbConstant(int dbConstant) {
+ // iterating the array is fast-enough as size is small. No need for a map.
+ for (RuleType type : values()) {
+ if (type.getDbConstant() == dbConstant) {
+ return type;
+ }
+ }
+ throw new IllegalArgumentException(format("Unsupported type value : %d", dbConstant));
+ }
+
+ @CheckForNull
+ public static RuleType valueOfNullable(int dbConstant) {
+ // iterating the array is fast-enough as size is small. No need for a map.
+ for (RuleType type : values()) {
+ if (type.getDbConstant() == dbConstant) {
+ return type;
+ }
+ }
+ if (dbConstant == 0) {
+ return null;
+ }
+ throw new IllegalArgumentException(format("Unsupported type value : %d", dbConstant));
+ }
+}
diff --git a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMapping.java b/sonar-core/src/main/java/org/sonar/core/rule/RuleTypeMapper.java
index 292fd2e6cad..06eca3785a5 100644
--- a/server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v107/RenameGithubRoleInDevopsPermsMapping.java
+++ b/sonar-core/src/main/java/org/sonar/core/rule/RuleTypeMapper.java
@@ -17,22 +17,30 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-package org.sonar.server.platform.db.migration.version.v107;
+package org.sonar.core.rule;
-import com.google.common.annotations.VisibleForTesting;
-import org.sonar.db.Database;
-import org.sonar.server.platform.db.migration.step.RenameVarcharColumnChange;
+public class RuleTypeMapper {
-import static org.sonar.server.platform.db.migration.version.v107.RenameGithubPermsMappingTable.DEVOPS_PERMS_MAPPING_TABLE_NAME;
-
-public class RenameGithubRoleInDevopsPermsMapping extends RenameVarcharColumnChange {
+ private RuleTypeMapper() {
+ throw new UnsupportedOperationException("Utility class");
+ }
- @VisibleForTesting
- static final String OLD_COLUMN_NAME = "github_role";
- @VisibleForTesting
- static final String NEW_COLUMN_NAME = "devops_platform_role";
+ public static org.sonar.api.rules.RuleType toApiRuleType(RuleType ruleType) {
+ return switch (ruleType) {
+ case BUG -> org.sonar.api.rules.RuleType.BUG;
+ case CODE_SMELL -> org.sonar.api.rules.RuleType.CODE_SMELL;
+ case SECURITY_HOTSPOT -> org.sonar.api.rules.RuleType.SECURITY_HOTSPOT;
+ case VULNERABILITY -> org.sonar.api.rules.RuleType.VULNERABILITY;
+ };
+ }
- public RenameGithubRoleInDevopsPermsMapping(Database db) {
- super(db, DEVOPS_PERMS_MAPPING_TABLE_NAME, OLD_COLUMN_NAME, NEW_COLUMN_NAME);
+ public static RuleType toRuleType(org.sonar.api.rules.RuleType ruleType) {
+ return switch (ruleType) {
+ case BUG -> RuleType.BUG;
+ case CODE_SMELL -> RuleType.CODE_SMELL;
+ case SECURITY_HOTSPOT -> RuleType.SECURITY_HOTSPOT;
+ case VULNERABILITY -> RuleType.VULNERABILITY;
+ };
}
+
}
diff --git a/sonar-core/src/test/java/org/sonar/core/rule/RuleTypeMapperTest.java b/sonar-core/src/test/java/org/sonar/core/rule/RuleTypeMapperTest.java
new file mode 100644
index 00000000000..7c05d0033f8
--- /dev/null
+++ b/sonar-core/src/test/java/org/sonar/core/rule/RuleTypeMapperTest.java
@@ -0,0 +1,44 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2025 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.core.rule;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class RuleTypeMapperTest {
+
+ @Test
+ void toApiRuleType_shouldMapToApiRuleType() {
+ assertThat(RuleTypeMapper.toApiRuleType(org.sonar.core.rule.RuleType.BUG)).isEqualTo(org.sonar.api.rules.RuleType.BUG);
+ assertThat(RuleTypeMapper.toApiRuleType(org.sonar.core.rule.RuleType.CODE_SMELL)).isEqualTo(org.sonar.api.rules.RuleType.CODE_SMELL);
+ assertThat(RuleTypeMapper.toApiRuleType(org.sonar.core.rule.RuleType.SECURITY_HOTSPOT)).isEqualTo(org.sonar.api.rules.RuleType.SECURITY_HOTSPOT);
+ assertThat(RuleTypeMapper.toApiRuleType(org.sonar.core.rule.RuleType.VULNERABILITY)).isEqualTo(org.sonar.api.rules.RuleType.VULNERABILITY);
+ }
+
+ @Test
+ void toRuleType_shouldMapToCoreRuleType() {
+ assertThat(RuleTypeMapper.toRuleType(org.sonar.api.rules.RuleType.BUG)).isEqualTo(org.sonar.core.rule.RuleType.BUG);
+ assertThat(RuleTypeMapper.toRuleType(org.sonar.api.rules.RuleType.CODE_SMELL)).isEqualTo(org.sonar.core.rule.RuleType.CODE_SMELL);
+ assertThat(RuleTypeMapper.toRuleType(org.sonar.api.rules.RuleType.SECURITY_HOTSPOT)).isEqualTo(org.sonar.core.rule.RuleType.SECURITY_HOTSPOT);
+ assertThat(RuleTypeMapper.toRuleType(org.sonar.api.rules.RuleType.VULNERABILITY)).isEqualTo(org.sonar.core.rule.RuleType.VULNERABILITY);
+ }
+
+}
diff --git a/sonar-core/src/test/java/org/sonar/core/rule/RuleTypeTest.java b/sonar-core/src/test/java/org/sonar/core/rule/RuleTypeTest.java
new file mode 100644
index 00000000000..dd156073c9f
--- /dev/null
+++ b/sonar-core/src/test/java/org/sonar/core/rule/RuleTypeTest.java
@@ -0,0 +1,70 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2025 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.core.rule;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+
+class RuleTypeTest {
+
+ @Test
+ void fromDbConstant_shouldReturnCorrectEnum() {
+ assertThat(RuleType.fromDbConstant(1)).isEqualTo(RuleType.CODE_SMELL);
+ assertThat(RuleType.fromDbConstant(2)).isEqualTo(RuleType.BUG);
+ assertThat(RuleType.fromDbConstant(3)).isEqualTo(RuleType.VULNERABILITY);
+ assertThat(RuleType.fromDbConstant(4)).isEqualTo(RuleType.SECURITY_HOTSPOT);
+ }
+
+ @Test
+ void fromDbConstant_shouldThrowExceptionForInvalidValue() {
+ assertThatThrownBy(() -> RuleType.fromDbConstant(99))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("Unsupported type value : 99");
+ }
+
+ @Test
+ void valueOfNullable_shouldReturnCorrectEnumOrNull() {
+ assertThat(RuleType.valueOfNullable(1)).isEqualTo(RuleType.CODE_SMELL);
+ assertThat(RuleType.valueOfNullable(0)).isNull();
+ }
+
+ @Test
+ void valueOfNullable_shouldThrowExceptionForInvalidValue() {
+ assertThatThrownBy(() -> RuleType.valueOfNullable(99))
+ .isInstanceOf(IllegalArgumentException.class)
+ .hasMessage("Unsupported type value : 99");
+ }
+
+ @Test
+ void names_shouldReturnAllEnumNames() {
+ assertThat(RuleType.names()).containsExactly("CODE_SMELL", "BUG", "VULNERABILITY", "SECURITY_HOTSPOT");
+ }
+
+ @Test
+ void getDbConstant_shouldReturnCorrectDbConstant() {
+ assertThat(RuleType.CODE_SMELL.getDbConstant()).isEqualTo(1);
+ assertThat(RuleType.BUG.getDbConstant()).isEqualTo(2);
+ assertThat(RuleType.VULNERABILITY.getDbConstant()).isEqualTo(3);
+ assertThat(RuleType.SECURITY_HOTSPOT.getDbConstant()).isEqualTo(4);
+ }
+}
diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scm/git/JGitUtils.java b/sonar-scanner-engine/src/main/java/org/sonar/scm/git/JGitUtils.java
index 5b3b3257142..bc38a55e619 100644
--- a/sonar-scanner-engine/src/main/java/org/sonar/scm/git/JGitUtils.java
+++ b/sonar-scanner-engine/src/main/java/org/sonar/scm/git/JGitUtils.java
@@ -48,8 +48,20 @@ public class JGitUtils {
// Return a list of scm ignored paths relative to the baseDir.
public static List<String> getAllIgnoredPaths(Path baseDir) {
try (Repository repo = buildRepository(baseDir)) {
+ Path workTreePath = repo.getWorkTree().toPath();
+ Path baseDirAbs = baseDir.toAbsolutePath().normalize();
+
try (Git git = new Git(repo)) {
- return git.status().call().getIgnoredNotInIndex().stream().sorted().toList();
+ return git.status().call().getIgnoredNotInIndex().stream()
+ // Convert to absolute path
+ .map(filePathStr -> workTreePath.resolve(filePathStr).normalize())
+ // Exclude any outside of the baseDir
+ .filter(filePath -> filePath.startsWith(baseDirAbs))
+ // Make path relative to the baseDir
+ .map(baseDir::relativize)
+ .map(Path::toString)
+ .sorted()
+ .toList();
} catch (GitAPIException e) {
throw new RuntimeException(e);
}
diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scm/git/JGitUtilsTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scm/git/JGitUtilsTest.java
index 3578a3c60f7..383e2a1d643 100644
--- a/sonar-scanner-engine/src/test/java/org/sonar/scm/git/JGitUtilsTest.java
+++ b/sonar-scanner-engine/src/test/java/org/sonar/scm/git/JGitUtilsTest.java
@@ -19,10 +19,12 @@
*/
package org.sonar.scm.git;
+import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.errors.GitAPIException;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.sonar.api.utils.MessageException;
@@ -37,18 +39,7 @@ class JGitUtilsTest {
@Test
void getAllIgnoredPaths_ReturnsIgnoredFiles() throws Exception {
- Git.init().setDirectory(rootModuleDir.toFile()).call();
- Files.createDirectories(rootModuleDir.resolve("directory1"));
- Files.createDirectories(rootModuleDir.resolve("directory2"));
- Files.createDirectories(rootModuleDir.resolve("directory3"));
- Files.write(rootModuleDir.resolve("directory1/file_a.txt"), "content".getBytes());
- Files.write(rootModuleDir.resolve("directory1/file_b.txt"), "content".getBytes());
- Files.write(rootModuleDir.resolve("directory2/file_a.txt"), "content".getBytes());
- Files.write(rootModuleDir.resolve("directory2/file_b.txt"), "content".getBytes());
- Files.write(rootModuleDir.resolve("directory3/file_a.txt"), "content".getBytes());
- Files.write(rootModuleDir.resolve("directory3/file_b.txt"), "content".getBytes());
- Files.write(rootModuleDir.resolve(".gitignore"), "ignored.txt\ndirectory1\ndirectory2/file_a.txt".getBytes());
- Files.write(rootModuleDir.resolve("directory3/.gitignore"), "file_b.txt".getBytes());
+ setupTestDirectory();
List<String> result = JGitUtils.getAllIgnoredPaths(rootModuleDir);
@@ -64,4 +55,42 @@ class JGitUtilsTest {
.isInstanceOf(MessageException.class)
.hasMessageStartingWith("Not inside a Git work tree: ");
}
+
+ @Test
+ void getIgnoredPaths_WithDifferentBaseDir_ReturnsIgnoredFilesRelativeToBaseDir() throws Exception {
+ Path baseDir = rootModuleDir.resolve("directory2");
+ setupTestDirectory();
+
+ List<String> result = JGitUtils.getAllIgnoredPaths(baseDir);
+
+ assertThat(result).isEqualTo(List.of("file_a.txt"));
+ }
+
+ @Test
+ void getIgnoredPaths_WithSubDirBaseDirContainingGitIgnore_ReturnsIgnoredFilesRelativeToBaseDir() throws Exception {
+ Path baseDir = rootModuleDir.resolve("directory3");
+ setupTestDirectory();
+
+ List<String> result = JGitUtils.getAllIgnoredPaths(baseDir);
+
+ assertThat(result).isEqualTo(List.of("file_b.txt"));
+ }
+
+ private void setupTestDirectory() throws GitAPIException, IOException {
+ Git.init().setDirectory(rootModuleDir.toFile()).call();
+
+ var directories = List.of("directory1", "directory2", "directory3");
+ var fileNames = List.of("file_a.txt", "file_b.txt");
+
+ for (String dir : directories) {
+ Path directoryPath = rootModuleDir.resolve(dir);
+ Files.createDirectories(directoryPath);
+ for (String fileName : fileNames) {
+ Files.write(directoryPath.resolve(fileName), "content".getBytes());
+ }
+ }
+
+ Files.write(rootModuleDir.resolve(".gitignore"), "ignored.txt\ndirectory1\ndirectory2/file_a.txt".getBytes());
+ Files.write(rootModuleDir.resolve("directory3/.gitignore"), "file_b.txt".getBytes());
+ }
}