diff --git a/its/ruling/src/test/resources/commons-beanutils/java-S2143.json b/its/ruling/src/test/resources/commons-beanutils/java-S2143.json index 489244212c4..3d5a2818895 100644 --- a/its/ruling/src/test/resources/commons-beanutils/java-S2143.json +++ b/its/ruling/src/test/resources/commons-beanutils/java-S2143.json @@ -1,11 +1,62 @@ { -"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/DateTimeConverter.java": [ -235, -376, -398, -400, -402, -404, -406 -] + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/ConvertUtilsBean.java": [ + 27, + 28 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/JDBCDynaClass.java": [ + 21, + 25, + 26 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/LazyDynaBean.java": [ + 24 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/CalendarConverter.java": [ + 19 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/DateConverter.java": [ + 19 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/DateTimeConverter.java": [ + 22, + 23, + 235, + 376, + 381, + 386, + 391, + 398, + 400, + 402, + 404, + 406 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/NumberConverter.java": [ + 25, + 26 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/SqlDateConverter.java": [ + 19 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/SqlTimeConverter.java": [ + 19 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/converters/SqlTimestampConverter.java": [ + 19 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/SqlDateLocaleConverter.java": [ + 20, + 219 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/SqlTimeLocaleConverter.java": [ + 20, + 218 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/SqlTimestampLocaleConverter.java": [ + 20, + 217 + ], + "commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/locale/converters/StringLocaleConverter.java": [ + 26 + ] } diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2143.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2143.json new file mode 100644 index 00000000000..1860250e7ad --- /dev/null +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S2143.json @@ -0,0 +1,9 @@ +{ + "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/DateGenerator.java": [ + 21, + 22 + ], + "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/DateParser.java": [ + 22 + ] +} diff --git a/its/ruling/src/test/resources/eclipse-jetty/java-S2143.json b/its/ruling/src/test/resources/eclipse-jetty/java-S2143.json index f90710ae470..1dd0506d147 100644 --- a/its/ruling/src/test/resources/eclipse-jetty/java-S2143.json +++ b/its/ruling/src/test/resources/eclipse-jetty/java-S2143.json @@ -1,9 +1,24 @@ { -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java": [ -252, -273 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java": [ -681 -] + "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/DateGenerator.java": [ + 21, + 22 + ], + "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/DateParser.java": [ + 22 + ], + "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSONDateConvertor.java": [ + 23 + ], + "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/DateCache.java": [ + 25 + ], + "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/RolloverFileOutputStream.java": [ + 29, + 252, + 273 + ], + "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/resource/Resource.java": [ + 39, + 681 + ] } diff --git a/its/ruling/src/test/resources/sonar-server/java-S2143.json b/its/ruling/src/test/resources/sonar-server/java-S2143.json index 1748cbdbf4f..e301d6d4ef9 100644 --- a/its/ruling/src/test/resources/sonar-server/java-S2143.json +++ b/its/ruling/src/test/resources/sonar-server/java-S2143.json @@ -1,180 +1,303 @@ { -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/JwtHttpHandler.java": [ -134, -155 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/JwtSerializer.java": [ -92, -93, -132 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/SsoAuthenticator.java": [ -152, -155 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/batch/ProjectDataLoader.java": [ -91 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ce/ws/ActivityAction.java": [ -142, -145 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ce/ws/TaskFormatter.java": [ -91, -128 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ComponentUpdater.java": [ -103 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java": [ -213, -221 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueAssigner.java": [ -68 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueCreationDateCalculator.java": [ -61 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueLifecycle.java": [ -48 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MovedIssueVisitor.java": [ -60 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/NewEffortCalculator.java": [ -82 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java": [ -63 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PeriodResolver.java": [ -115, -207 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistComponentsStep.java": [ -372 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/SendIssueNotificationsStep.java": [ -117, -133 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java": [ -153, -153 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssueQuery.java": [ -200, -205, -210, -392, -397, -402 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIndex.java": [ -347 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java": [ -202 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/AddCommentAction.java": [ -98 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/AssignAction.java": [ -121 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java": [ -194 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/DoTransitionAction.java": [ -99 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java": [ -273 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java": [ -108 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SetTagsAction.java": [ -106 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SetTypeAction.java": [ -108 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/custom/ws/CustomMeasureJsonWriter.java": [ -73, -74 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java": [ -135 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java": [ -201, -226 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/CreateTemplateAction.java": [ -130 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/UpdateTemplateAction.java": [ -136 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/ServerImpl.java": [ -71 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/StartupMetadataPersister.java": [ -52 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/db/migration/DatabaseMigrationImpl.java": [ -100 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/monitoring/SystemMonitor.java": [ -57, -58 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/UpdateCenterClient.java": [ -99 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQProfileInsertImpl.java": [ -81 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQualityProfilesNotificationTemplate.java": [ -66, -68 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QProfileFactoryImpl.java": [ -90 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QualityProfile.java": [ -60 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/RuleActivatorContext.java": [ -46 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/CachingRuleFinder.java": [ -172, -173 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/DefaultRuleFinder.java": [ -143, -144 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/source/ws/LinesAction.java": [ -140 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/source/ws/ScmAction.java": [ -126 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java": [ -78, -79 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/test/index/TestResultSetIterator.java": [ -81 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ui/ws/ComponentAction.java": [ -185 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/usertoken/ws/SearchAction.java": [ -97 -] + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/JwtHttpHandler.java": [ + 25, + 134, + 155 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/JwtSerializer.java": [ + 31, + 92, + 93, + 132 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/SsoAuthenticator.java": [ + 25, + 152, + 155 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/batch/ProjectAction.java": [ + 22 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/batch/ProjectDataLoader.java": [ + 26, + 91 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ce/ws/ActivityAction.java": [ + 27, + 142, + 145 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ce/ws/TaskFormatter.java": [ + 25, + 91, + 128 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ComponentUpdater.java": [ + 23, + 103 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java": [ + 24, + 213, + 221 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueAssigner.java": [ + 24, + 68 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueCreationDateCalculator.java": [ + 23, + 61 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueLifecycle.java": [ + 23, + 48 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/MovedIssueVisitor.java": [ + 23, + 60 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/NewEffortCalculator.java": [ + 27, + 30, + 82 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java": [ + 24, + 63 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PeriodResolver.java": [ + 23, + 115, + 207 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistComponentsStep.java": [ + 24, + 372 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/QualityProfileEventsStep.java": [ + 25 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/SendIssueNotificationsStep.java": [ + 23, + 117, + 133 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java": [ + 25, + 153, + 153 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/BaseDoc.java": [ + 22 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/EsUtils.java": [ + 25, + 43 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssueFieldsSetter.java": [ + 26 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssueQuery.java": [ + 25, + 200, + 205, + 210, + 392, + 397, + 402 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssueQueryFactory.java": [ + 32, + 41, + 42 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssuesFinderSort.java": [ + 25 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueDoc.java": [ + 25 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIndex.java": [ + 27, + 56, + 347 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIteratorForSingleChunk.java": [ + 31, + 202 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/notification/AbstractNewIssuesEmailTemplate.java": [ + 25 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/notification/MyNewIssuesEmailTemplate.java": [ + 28 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/notification/NewIssuesNotification.java": [ + 23 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/AddCommentAction.java": [ + 23, + 98 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/AssignAction.java": [ + 24, + 121 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java": [ + 23, + 194 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/DoTransitionAction.java": [ + 23, + 99 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java": [ + 26, + 273 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SetSeverityAction.java": [ + 23, + 108 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SetTagsAction.java": [ + 25, + 106 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SetTypeAction.java": [ + 23, + 108 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/custom/ws/CustomMeasureJsonWriter.java": [ + 24, + 73, + 74 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/index/ProjectMeasuresDoc.java": [ + 24 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/index/ProjectMeasuresIndexer.java": [ + 23, + 135 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java": [ + 23 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java": [ + 23, + 201, + 226 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/CreateTemplateAction.java": [ + 22, + 130 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/UpdateTemplateAction.java": [ + 22, + 136 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/ServerImpl.java": [ + 23, + 71 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/StartupMetadataPersister.java": [ + 22, + 52 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/db/migration/DatabaseMigrationImpl.java": [ + 22, + 100 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/monitoring/SystemMonitor.java": [ + 27, + 57, + 58 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/ws/IndexAction.java": [ + 22 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/UpdateCenterClient.java": [ + 27, + 99 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/project/ws/GhostsAction.java": [ + 23 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/project/ws/ProvisionedAction.java": [ + 23 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQProfileInsertImpl.java": [ + 27, + 81 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQualityProfilesNotificationTemplate.java": [ + 25, + 66, + 68 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QProfileFactoryImpl.java": [ + 24, + 90 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QualityProfile.java": [ + 23, + 60 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/RuleActivatorContext.java": [ + 24, + 46 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/ChangelogAction.java": [ + 22 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/CachingRuleFinder.java": [ + 28, + 172, + 173 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/DefaultRuleFinder.java": [ + 28, + 143, + 144 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/Rule.java": [ + 28 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java": [ + 23 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/source/ws/LinesAction.java": [ + 24, + 140 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/source/ws/ScmAction.java": [ + 24, + 126 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java": [ + 22, + 78, + 79 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/test/index/TestResultSetIterator.java": [ + 30, + 81 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ui/ws/ComponentAction.java": [ + 24, + 185 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/usertoken/ws/SearchAction.java": [ + 22, + 97 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/DateCollector.java": [ + 24 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/RubyUtils.java": [ + 30 + ], + "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ws/JsonWriterUtils.java": [ + 23 + ] } diff --git a/java-checks/src/main/java/org/sonar/java/checks/DateAndTimesCheck.java b/java-checks/src/main/java/org/sonar/java/checks/DateAndTimesCheck.java index 70a8ed07fd6..c6aeb01d644 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/DateAndTimesCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/DateAndTimesCheck.java @@ -16,11 +16,17 @@ */ package org.sonar.java.checks; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import org.sonar.check.Rule; -import org.sonar.plugins.java.api.JavaVersionAwareVisitor; +import org.sonar.java.checks.helpers.ExpressionsHelper; import org.sonar.java.checks.methods.AbstractMethodDetection; +import org.sonar.plugins.java.api.JavaVersionAwareVisitor; import org.sonar.plugins.java.api.JavaVersion; import org.sonar.plugins.java.api.semantic.MethodMatchers; +import org.sonar.plugins.java.api.tree.ExpressionTree; +import org.sonar.plugins.java.api.tree.ImportTree; import org.sonar.plugins.java.api.tree.MethodInvocationTree; import org.sonar.plugins.java.api.tree.NewClassTree; import org.sonar.plugins.java.api.tree.Tree; @@ -28,33 +34,68 @@ @Rule(key = "S2143") public class DateAndTimesCheck extends AbstractMethodDetection implements JavaVersionAwareVisitor { - private static final MethodMatchers METHOD_MATCHERS = MethodMatchers.or( - MethodMatchers.create().ofTypes("java.util.Calendar").names("getInstance").withAnyParameters().build(), - MethodMatchers.create().ofTypes("java.util.Date").constructor().withAnyParameters().build()); + private static final MethodMatchers CALENDAR_GET_INSTANCE = + MethodMatchers.create() + .ofSubTypes("java.util.Calendar") + .names("getInstance") + .withAnyParameters() + .build(); + + private static final MethodMatchers DATE_CONSTRUCTOR = + MethodMatchers.create() + .ofSubTypes("java.util.Date") + .constructor() + .withAnyParameters() + .build(); + + private static final Set KNOWN_JAVA_UTIL_DATE_TIME_CLASSES = Set.of( + "java.util.Date", "java.util.Calendar", + "java.sql.Date", "java.sql.Time", "java.sql.Timestamp", + "java.util.GregorianCalendar" + ); + + private void reportIssue(Tree tree) { + reportIssue(tree, "Use the Java 8 Date and Time API instead." + context.getJavaVersion().java8CompatibilityMessage()); + } @Override - protected MethodMatchers getMethodInvocationMatchers() { - return METHOD_MATCHERS; + public boolean isCompatibleWithJavaVersion(JavaVersion version) { + return version.isJava8Compatible(); } @Override - protected void onConstructorFound(NewClassTree newClassTree) { - reportIssue(newClassTree); + public List nodesToVisit() { + List nodes = new ArrayList<>(super.nodesToVisit()); + nodes.add(Tree.Kind.IMPORT); + return nodes; } @Override - protected void onMethodInvocationFound(MethodInvocationTree mit) { - reportIssue(mit); + public void visitNode(Tree tree) { + if (tree instanceof ImportTree importTree) { + String concatenatedName = ExpressionsHelper.concatenate((ExpressionTree) importTree.qualifiedIdentifier()); + String qualifiedName = importTree.isStatic() ? concatenatedName.substring(0, concatenatedName.lastIndexOf('.')) : concatenatedName; + if (qualifiedName.startsWith("org.joda.time.") + || KNOWN_JAVA_UTIL_DATE_TIME_CLASSES.stream().anyMatch(qualifiedName::startsWith)){ + reportIssue(importTree); + } + } + super.visitNode(tree); } - private void reportIssue(Tree tree) { - reportIssue(tree, "Use the Java 8 Date and Time API instead." + context.getJavaVersion().java8CompatibilityMessage()); + @Override + protected MethodMatchers getMethodInvocationMatchers() { + return MethodMatchers.or(CALENDAR_GET_INSTANCE, DATE_CONSTRUCTOR); + } + @Override + protected void onConstructorFound(NewClassTree newClassTree) { + reportIssue(newClassTree); } @Override - public boolean isCompatibleWithJavaVersion(JavaVersion version) { - return version.isJava8Compatible(); + protected void onMethodInvocationFound(MethodInvocationTree mit) { + reportIssue(mit); } } diff --git a/java-checks/src/test/files/checks/DateAndTimesCheck.java b/java-checks/src/test/files/checks/DateAndTimesCheck.java index a9198692e08..4a08ca99f41 100644 --- a/java-checks/src/test/files/checks/DateAndTimesCheck.java +++ b/java-checks/src/test/files/checks/DateAndTimesCheck.java @@ -1,14 +1,29 @@ -import java.util.Date; -import java.util.Locale; -import java.util.Calendar; +import java.util.Date; // Noncompliant {{Use the Java 8 Date and Time API instead.}} +import java.util.Calendar; // Noncompliant + +// java.util.Date and java.util.Calendar subclasses +import java.sql.Date; // Noncompliant +import java.util.GregorianCalendar; // Noncompliant + +import java.util.Locale; // Compliant (locale can be used in other contexts than date and time) + +import org.joda.time.DateTime; // Noncompliant {{Use the Java 8 Date and Time API instead.}} +import org.joda.time.*; // Noncompliant {{Use the Java 8 Date and Time API instead.}} + +import java.time.LocalDateTime; // Compliant +import java.time.Instant; // Compliant + +import static java.util.Date.from; // Noncompliant +import static java.sql.Date.from; // Noncompliant +import static org.joda.time.Minutes.minutesBetween; // Noncompliant class A { - void foo() { - Date now = new Date(); // Noncompliant {{Use the Java 8 Date and Time API instead.}} - now = new Date(1499159427440L); // Noncompliant - DateFormat df = new SimpleDateFormat("dd.MM.yyyy"); + void javaUtil() { + Date now = new Date(); // Noncompliant + // ^^^^^^^^^^ + Date date = new Date(1499159427440L); // Noncompliant Calendar christmas = Calendar.getInstance(); // Noncompliant - christmas = Calendar.getInstance(Locale.CANADA); // Noncompliant - christmas.setTime(df.parse("25.12.2020")); + // ^^^^^^^^^^^^^^^^^^^^^^ + Date epochDate = from(Instant.EPOCH); } } diff --git a/java-checks/src/test/files/checks/DateAndTimesCheckWildcardImport.java b/java-checks/src/test/files/checks/DateAndTimesCheckWildcardImport.java new file mode 100644 index 00000000000..5ad4ceb7547 --- /dev/null +++ b/java-checks/src/test/files/checks/DateAndTimesCheckWildcardImport.java @@ -0,0 +1,12 @@ +import java.util.*; // Compliant, java.util.* is not directly flagged by the rule + +class A { + void javaUtil() { + Date now = new Date(); // Noncompliant {{Use the Java 8 Date and Time API instead.}} + // ^^^^^^^^^^ + Calendar christmas = Calendar.getInstance(); // Noncompliant + // ^^^^^^^^^^^^^^^^^^^^^^ + Calendar gregorianCalendar = GregorianCalendar.getInstance(); // Noncompliant + Timestamp timestamp = new Timestamp(1735689600000L); // Compliant, the rule ignores this case (known limitation) + } +} diff --git a/java-checks/src/test/java/org/sonar/java/checks/DateAndTimesCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/DateAndTimesCheckTest.java index 66fde657a13..700e731b5b6 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/DateAndTimesCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/DateAndTimesCheckTest.java @@ -30,4 +30,23 @@ void test() { .verifyIssues(); } + @Test + void test_wildcard_import() { + CheckVerifier.newVerifier() + .onFile("src/test/files/checks/DateAndTimesCheckWildcardImport.java") + .withCheck(new DateAndTimesCheck()) + .withJavaVersion(8) + .verifyIssues(); + } + + @Test + void test_without_semantic() { + CheckVerifier.newVerifier() + .onFile("src/test/files/checks/DateAndTimesCheck.java") + .withCheck(new DateAndTimesCheck()) + .withJavaVersion(8) + .withoutSemantic() + .verifyIssues(); + } + }