diff --git a/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main-small/java-S9397.json b/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main-small/java-S9397.json index 30002e79bc8..2c63c085104 100644 --- a/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main-small/java-S9397.json +++ b/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main-small/java-S9397.json @@ -1,5 +1,2 @@ { -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/AbstractPathSpec.java": [ -64 -] } diff --git a/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main/java-S9397.json b/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main/java-S9397.json index a133ec0f8ff..4f2cee9285e 100644 --- a/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main/java-S9397.json +++ b/its/ruling/src/test/resources/expected/eclipse-jetty-similar-to-main/java-S9397.json @@ -2,24 +2,12 @@ "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ 249 ], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ -1972, -1974 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/AbstractPathSpec.java": [ -64 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/MappedResource.java": [ -99 -], "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java": [ 462 ], "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ 217, -218, -219, -220 +218 ], "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ 368 @@ -34,40 +22,10 @@ "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ 139 ], -"org.eclipse.jetty:jetty-project:jetty-jmx/src/main/java/org/eclipse/jetty/jmx/MetaData.java": [ -249, -257 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ 308 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ -339 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ -931 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ -667, -712, -714 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ 480 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java": [ -610 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandlerCollection.java": [ -374 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/DatabaseAdaptor.java": [ -311 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/DefaultSessionIdManager.java": [ -488 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionDataStore.java": [ -599 ] } diff --git a/its/ruling/src/test/resources/expected/eclipse-jetty/java-S9397.json b/its/ruling/src/test/resources/expected/eclipse-jetty/java-S9397.json index 0f2be8af36e..29a7b06873a 100644 --- a/its/ruling/src/test/resources/expected/eclipse-jetty/java-S9397.json +++ b/its/ruling/src/test/resources/expected/eclipse-jetty/java-S9397.json @@ -2,24 +2,12 @@ "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ 249 ], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ -1972, -1974 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/AbstractPathSpec.java": [ -64 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/MappedResource.java": [ -99 -], "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/AbstractEndPoint.java": [ 462 ], "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ 217, -218, -219, -220 +218 ], "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ 368 @@ -34,69 +22,18 @@ "org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ 139 ], -"org.eclipse.jetty:jetty-project:jetty-jmx/src/main/java/org/eclipse/jetty/jmx/MetaData.java": [ -249, -257 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ 308 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ -339 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ -931 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ -667, -712, -714 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ 480 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ServerConnector.java": [ -610 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandlerCollection.java": [ -374 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/DatabaseAdaptor.java": [ -311 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/DefaultSessionIdManager.java": [ -488 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/session/JDBCSessionDataStore.java": [ -599 -], "org.eclipse.jetty:jetty-project:jetty-slf4j-impl/src/main/java/org/eclipse/jetty/logging/JettyLogger.java": [ 685 ], "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Fields.java": [ 339 ], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java": [ -289, -295, -309, -411, -495 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/SharedBlockingCallback.java": [ -160 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/ContainerLifeCycle.java": [ -793 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java": [ -1647, -1671, -1696, -1723, -1750, -1773 -], "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslSelectionDump.java": [ 171 ], @@ -107,8 +44,5 @@ ], "org.eclipse.jetty:jetty-project:jetty-util/src/test/java/org/eclipse/jetty/util/component/LifeCycleListenerNestedTest.java": [ 116 -], -"org.eclipse.jetty:jetty-project:jetty-xml/src/main/java/org/eclipse/jetty/xml/XmlConfiguration.java": [ -396 ] } diff --git a/its/ruling/src/test/resources/expected/guava/java-S9397.json b/its/ruling/src/test/resources/expected/guava/java-S9397.json index 34f81cc8ea8..2c63c085104 100644 --- a/its/ruling/src/test/resources/expected/guava/java-S9397.json +++ b/its/ruling/src/test/resources/expected/guava/java-S9397.json @@ -1,11 +1,2 @@ { -"com.google.guava:guava:src/com/google/common/eventbus/EventBus.java": [ -177 -], -"com.google.guava:guava:src/com/google/common/io/ByteStreams.java": [ -394 -], -"com.google.guava:guava:src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java": [ -67 -] } diff --git a/its/ruling/src/test/resources/expected/sonar-server/java-S9397.json b/its/ruling/src/test/resources/expected/sonar-server/java-S9397.json index b424aee6428..8d555463dd0 100644 --- a/its/ruling/src/test/resources/expected/sonar-server/java-S9397.json +++ b/its/ruling/src/test/resources/expected/sonar-server/java-S9397.json @@ -1,790 +1,44 @@ { -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/ce/http/CeHttpClient.java": [ -112 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/app/ProcessCommandWrapperImpl.java": [ -89, -93 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/app/TomcatConnectors.java": [ -51 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/app/TomcatContexts.java": [ -75, -85 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/AuthenticationError.java": [ -69, -81 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/AuthenticationFilter.java": [ -58 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/IdentityProviderRepository.java": [ -54 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/InitFilter.java": [ -82, -88 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/OAuth2CallbackFilter.java": [ -77, -83 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/OAuth2ContextFactory.java": [ -81, -106 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/OAuthCsrfVerifier.java": [ -53 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/authentication/UserIdentityAuthenticator.java": [ -94, -95, -104, -105 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/batch/IssuesAction.java": [ -130 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ComponentFinder.java": [ -124 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ws/FilterParser.java": [ -69, -198 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ws/ProjectMeasuresQueryFactory.java": [ -129, -151 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ws/SearchProjectsAction.java": [ -114, -118 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/component/ws/SuggestionCategory.java": [ -51 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/queue/ReportSubmitter.java": [ -98 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureComputerContextImpl.java": [ -177 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/measurecomputer/MeasureImpl.java": [ -80 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/ConditionToCondition.java": [ -72, -89 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/PostProjectAnalysisTasksExecutor.java": [ -162 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java": [ -105 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/PathAwareCrawler.java": [ -117, -138, -177 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/PathAwareVisitorWrapper.java": [ -116 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/VisitorsCrawler.java": [ -141 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/formula/AverageFormula.java": [ -157 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryImpl.java": [ -49 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/EffortAggregator.java": [ -122 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IntegrateIssuesVisitor.java": [ -83 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/NewEffortAggregator.java": [ -150 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ScmAccountToUserLoader.java": [ -59 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/commonrule/CommonRule.java": [ -86, -90 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/filter/IssueFilter.java": [ -116, -118 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/measure/MapBasedRawMeasureRepository.java": [ -79, -95, -106 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/measure/Measure.java": [ -308 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/metric/MetricRepositoryImpl.java": [ -72, -83 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/Condition.java": [ -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/ConditionEvaluator.java": [ -62, -90, -108, -138 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitymodel/NewMaintainabilityMeasuresVisitor.java": [ -167 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitymodel/RatingGrid.java": [ -77 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitymodel/RatingSettings.java": [ -85 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/scm/ScmInfoImpl.java": [ -66 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/HighlightingLineReader.java": [ -81, -128 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/SymbolsLineReader.java": [ -73 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/AbstractComputationSteps.java": [ -45 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/ComputeMeasureVariationsStep.java": [ -146 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/CustomMeasuresCopyStep.java": [ -106 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadQualityGateStep.java": [ -94 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/LoadReportAnalysisMetadataHolderStep.java": [ -116, -125, -130, -142, -147 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistComponentsStep.java": [ -128 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistEventsStep.java": [ -137 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistFileSourcesStep.java": [ -124 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/PersistProjectLinksStep.java": [ -114, -145 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/QualityGateEventsStep.java": [ -95, -103, -124 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/QualityGateMeasuresStep.java": [ -135, -150 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/QualityProfileEventsStep.java": [ -159 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/UnitTestMeasuresStep.java": [ -97 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/ValidateProjectStep.java": [ -130 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookCallerImpl.java": [ -107, -113 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/webhook/WebhookPostTask.java": [ 73, 81, 82 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/debt/DebtRulesXMLImporter.java": [ -159, -185, -189 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/BaseDoc.java": [ -57 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/BulkIndexer.java": [ -273 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexCreator.java": [ -61, -77, -92 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexDefinition.java": [ -35 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexerStartupTask.java": [ -131 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/NewIndex.java": [ -83 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyBulkRequestBuilder.java": [ -50, -164 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyClearCacheRequestBuilder.java": [ -44, -72, -76 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyClusterHealthRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyClusterStateRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyClusterStatsRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyCreateIndexRequestBuilder.java": [ -46, -71 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyDeleteRequestBuilder.java": [ -43 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyFlushRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyGetRequestBuilder.java": [ -43, -69, -70, -71 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyIndexRequestBuilder.java": [ -43, -69, -70, -71 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyIndicesExistsRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyIndicesStatsRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyMultiGetRequestBuilder.java": [ -44, -72, -73, -76 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyNodesStatsRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyPutMappingRequestBuilder.java": [ -44, -72, -76, -80 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxyRefreshRequestBuilder.java": [ -44, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxySearchRequestBuilder.java": [ -48, -74, -76, -79 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/request/ProxySearchScrollRequestBuilder.java": [ -43, -68 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssueFinder.java": [ -43 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/IssueQueryFactory.java": [ -147 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/index/IssueIndex.java": [ -665 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/notification/AbstractNewIssuesEmailTemplate.java": [ -97, -149, -178 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/notification/MyNewIssuesEmailTemplate.java": [ -51, -63 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/workflow/Transition.java": [ 118 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/AssignAction.java": [ -149, -151, -153 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/BulkChangeAction.java": [ -223 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/DeleteCommentAction.java": [ -113 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/EditCommentAction.java": [ -74, -136 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/issue/ws/SearchAction.java": [ 187 ], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/custom/ws/CustomMeasureValueDescription.java": [ 35 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/ComponentAction.java": [ -195 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/ComponentTreeAction.java": [ -140, -164, -169 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/ComponentTreeDataLoader.java": [ -170 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/ComponentTreeSort.java": [ -148 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/MeasureValueFormatter.java": [ -84 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/measure/ws/SearchHistoryAction.java": [ -178 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/notification/NotificationService.java": [ -70 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/organization/OrganizationCreationImpl.java": [ -95 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/organization/ws/UpdateAction.java": [ -120 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/PermissionTemplateService.java": [ -212, -223 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/AddUserAction.java": [ -99 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/PermissionRequestValidator.java": [ -52, -58, -63, -72, -83, -94 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/PermissionWsSupport.java": [ -110 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/AddGroupToTemplateAction.java": [ -78 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/Platform.java": [ 229, 232 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/db/EmbeddedDatabase.java": [ -114 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/MasterServletFilter.java": [ -71 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/RedirectFilter.java": [ -67, 80, -118, 134, 153 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/RootFilter.java": [ -64 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/PluginDownloader.java": [ -132 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ServerExtensionInstaller.java": [ -88, -101 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ServerPluginJarExploder.java": [ -62 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ServerPluginRepository.java": [ -177, -181, -206, -252, -309, -363 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/StaticResourcesServlet.java": [ -72, -74, -95 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/privileged/PrivilegedPluginsBootstraper.java": [ -49 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/privileged/PrivilegedPluginsStopper.java": [ 54 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ws/InstallAction.java": [ -95 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ws/PluginUpdateAggregator.java": [ -90 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ws/UninstallAction.java": [ -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/plugins/ws/UpdateAction.java": [ -98 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/project/ws/UpdateVisibilityAction.java": [ -103 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/projectanalysis/ws/CreateEventAction.java": [ -133, -197, -201 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/projectanalysis/ws/DeleteAction.java": [ -102 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/projectanalysis/ws/DeleteEventAction.java": [ -92, -98 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/projectanalysis/ws/UpdateEventAction.java": [ -127, -142, -151 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualitygate/QualityGateConditionsUpdater.java": [ -99, -107, -176, -177, -185, -188, -203 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualitygate/QualityGateFinder.java": [ -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualitygate/ws/ProjectStatusAction.java": [ -62 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualitygate/ws/QualityGateDetailsFormatter.java": [ -174, -184 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQProfileRepositoryImpl.java": [ -99, -105 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQualityProfilesNotification.java": [ -97 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQualityProfilesNotificationTemplate.java": [ -99 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QProfileCopier.java": [ -82 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/QProfileName.java": [ 69 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/ActivateRuleAction.java": [ -81, -85 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/BackupAction.java": [ -73 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/ChangeParentAction.java": [ -94 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/CreateAction.java": [ -108 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/DeleteAction.java": [ -106 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/ProjectsAction.java": [ -129 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/RenameAction.java": [ -106 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/SearchAction.java": [ -94, -178 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/ws/SetDefaultAction.java": [ -72 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/root/ws/SetRootAction.java": [ -70 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/root/ws/UnsetRootAction.java": [ -71 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/DefaultRuleFinder.java": [ -81 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java": [ -136 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/RegisterRules.java": [ -206, -340, -371, -439, -510 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/RuleCreator.java": [ -76, -78, -206, -213 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/RuleUpdater.java": [ -219 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/index/RuleQuery.java": [ -224 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/CreateAction.java": [ -167 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/RuleMapper.java": [ -250 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/RuleQueryFactory.java": [ -129, -143 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/SearchAction.java": [ 139, 152 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/ShowAction.java": [ -109 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/UpdateAction.java": [ -230, -275 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/setting/ws/SettingValidations.java": [ -136 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/setting/ws/ValuesAction.java": [ -173 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/source/ws/HashAction.java": [ -104 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/startup/RegisterMetrics.java": [ -123, -127 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/startup/RegisterPermissionTemplates.java": [ -105, -107 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/test/index/TestIndex.java": [ -87 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/test/index/TestResultSetIterator.java": [ -92 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/SecurityRealmFactory.java": [ -51, -58 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/UserUpdater.java": [ -349 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/ws/DeactivateAction.java": [ -142 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/usergroups/DefaultGroupFinder.java": [ -40, -41 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/usergroups/ws/AddUserAction.java": [ -102 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/AbstractStoppableExecutorService.java": [ -57, -61 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/FloatTypeValidation.java": [ -41 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/IntegerTypeValidation.java": [ -41 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/LongTypeValidation.java": [ -40 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/MetricKeyValidator.java": [ -55 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/util/OkHttpClientProvider.java": [ 64 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/view/index/ViewIndexer.java": [ -128 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ws/RemovedWebServiceHandler.java": [ -40 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/ws/RequestVerifier.java": [ -42 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/batch/ProjectDataLoaderTest.java": [ -123 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/component/ViewsPathAwareVisitorTest.java": [ -206 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepositoryRule.java": [ -61, -80, -82 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/issue/FillComponentIssuesVisitorRule.java": [ -75 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/measure/MapBasedRawMeasureRepositoryTest.java": [ -193 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/measure/MeasureRepositoryImplTest.java": [ -250 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/measure/MeasureRepositoryRule.java": [ -102, -113, -153, -175, -226, -238 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/metric/MetricRepositoryImplTest.java": [ -60, -69, -97, -106 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/metric/MetricRepositoryRule.java": [ -77, -78, -95, -102 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesRepositoryRule.java": [ -47, -50 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/step/QualityGateLoadingStepTest.java": [ -83 -], "org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/es/EsClientProviderTest.java": [ -80, -101, -104, 125 ], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/organization/ws/AddMemberActionTest.java": [ -176 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/organization/ws/EnableSupportActionTest.java": [ -242 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/permission/ws/template/AddGroupToTemplateActionTest.java": [ -123 -], "org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/plugins/TestProjectUtils.java": [ 33 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/project/ws/UpdateVisibilityActionTest.java": [ -159, -269 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/qualityprofile/ws/ExportActionTest.java": [ -295, -308 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/qualityprofile/ws/QProfileWsSupportTest.java": [ -101 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/qualityprofile/ws/SearchActionTest.java": [ -337, -349 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/rule/RegisterRulesMediumTest.java": [ -94 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/test/index/TestIndexerTest.java": [ -185 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/user/ws/GroupsActionTest.java": [ -228 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/usergroups/DefaultGroupCreatorImplTest.java": [ -65 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/usergroups/DefaultGroupFinderTest.java": [ -60, -72 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/usergroups/ws/SearchActionTest.java": [ -196 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/ws/WsTester.java": [ -334, -339 ] } diff --git a/java-checks-test-sources/default/src/main/java/checks/StringFormatCheckSample.java b/java-checks-test-sources/default/src/main/java/checks/StringFormatCheckSample.java index 56afb5d4e2c..f4c7fca3c51 100644 --- a/java-checks-test-sources/default/src/main/java/checks/StringFormatCheckSample.java +++ b/java-checks-test-sources/default/src/main/java/checks/StringFormatCheckSample.java @@ -18,7 +18,7 @@ String label(String key, Object value) { } String wrapped(String value) { - return String.format("prefix-%s-suffix", value); // Noncompliant {{Use string concatenation instead of String.format().}} + return String.format("prefix-%s-suffix", value); // compliant: format string is too long (>= 15 chars) } String localized(Object value) { @@ -152,4 +152,72 @@ String nonLocalizedFormattableConcat(String prefix, Formattable value) { String escapeSequenceInFormat(int value) { return String.format("\045s", value); // compliant } + + String longFormatString(String a, String b) { + return String.format("long prefix %s/%s", a, b); // compliant: format string is too long (>= 15 chars) + } + + String inBraces(String value) { + return String.format("{%s}", value); // compliant: %s is inside brackets + } + + String inParentheses(String value) { + return String.format("(%s)", value); // compliant: %s is inside brackets + } + + String inSquareBrackets(String value) { + return String.format("[%s]", value); // compliant: %s is inside brackets + } + + String inSingleQuotes(String value) { + return String.format("'%s'", value); // compliant: %s is between single quotes + } + + String inDoubleQuotes(String value) { + return String.format("\"%s\"", value); // compliant: contains escape sequences + } + + String inBackticks(String value) { + return String.format("`%s`", value); // compliant: %s is between backticks + } + + String escapedPercentInBrackets(String value) { + return String.format("[%%s] %s", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String escapedPercentInQuotes(String value) { + return String.format("'%%s' %s", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String apostropheInFormat(String owner, String item) { + return String.format("%s's %s", owner, item); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String itsFormat(String value) { + return String.format("it's %s", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String unmatchedClosingBracket(String value) { + return String.format(")%s", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String escapedPercentInBackticks(String value) { + return String.format("`%%s` %s", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String nestedBrackets(String value) { + return String.format("({%s})", value); // compliant: %s is inside brackets + } + + String backtickNoPlaceholder(String value) { + return String.format("`x` %s", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String betweenQuotedSpans(String value) { + return String.format("'x' %s 'y'", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } + + String betweenBacktickSpans(String value) { + return String.format("`x` %s `y`", value); // Noncompliant {{Use string concatenation instead of String.format().}} + } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/StringFormatCheck.java b/java-checks/src/main/java/org/sonar/java/checks/StringFormatCheck.java index 14b923f7ba9..e41bcf96b57 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/StringFormatCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/StringFormatCheck.java @@ -60,11 +60,11 @@ protected void onMethodInvocationFound(MethodInvocationTree invocation) { } LiteralTree literal = (LiteralTree) formatArgument; String rawValue = LiteralUtils.trimQuotes(literal.value()); - if (rawValue.contains("\\")) { + if (rawValue.length() >= 15 || rawValue.contains("\\")) { return; } int placeholders = countSimplePlaceholders(rawValue); - if (placeholders <= 0 || invocation.arguments().size() != formatIndex + placeholders + 1) { + if (placeholders <= 0 || hasPlaceholderInBracketsOrQuotes(rawValue) || invocation.arguments().size() != formatIndex + placeholders + 1) { return; } List valueArguments = invocation.arguments().subList(formatIndex + 1, invocation.arguments().size()); @@ -86,6 +86,68 @@ private static boolean isJustPlaceholder(String rawValue) { return "%s".equals(rawValue); } + private static boolean hasPlaceholderInBracketsOrQuotes(String value) { + return hasPlaceholderInBrackets(value) || hasPlaceholderInMatchingQuotes(value); + } + + private static boolean hasPlaceholderInBrackets(String value) { + int depth = 0; + int i = 0; + while (i < value.length() - 1) { + char c = value.charAt(i); + if (c == '%') { + if (value.charAt(i + 1) == 's' && depth > 0) { + return true; + } + i += 2; + } else { + if (c == '{' || c == '(' || c == '[') { + depth++; + } else if ((c == '}' || c == ')' || c == ']') && depth > 0) { + depth--; + } + i++; + } + } + return false; + } + + private static boolean hasPlaceholderInMatchingQuotes(String value) { + int i = 0; + while (i < value.length()) { + char c = value.charAt(i); + if (c == '\'' || c == '`') { + int close = value.indexOf(c, i + 1); + if (close != -1) { + if (containsPlaceholder(value, i + 1, close)) { + return true; + } + i = close + 1; + } else { + i++; + } + } else { + i++; + } + } + return false; + } + + private static boolean containsPlaceholder(String value, int from, int to) { + int i = from; + while (i < to - 1) { + if (value.charAt(i) == '%') { + if (value.charAt(i + 1) == 's') { + return true; + } + i += 2; + } else { + i++; + } + } + return false; + } + private static int countSimplePlaceholders(String value) { int placeholders = 0; int index = 0;