From a191092f576c231b428779fd5547cc2e2b31787e Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 12:18:01 +0200 Subject: [PATCH 01/12] SONARJAVA-6825: Implemented rule S9360 - Javadoc references should point to existing types --- ...cReferencesExistingSymbolsCheckSample.java | 37 ++++ ...JavadocReferencesExistingSymbolsCheck.java | 162 ++++++++++++++++++ ...docReferencesExistingSymbolsCheckTest.java | 42 +++++ .../org/sonar/l10n/java/rules/java/S9360.html | 50 ++++++ .../org/sonar/l10n/java/rules/java/S9360.json | 23 +++ .../main/resources/profiles/Sonar_way/S9360 | 0 6 files changed, 314 insertions(+) create mode 100644 java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java create mode 100644 java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java create mode 100644 java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java create mode 100644 sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.html create mode 100644 sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.json create mode 100644 sonar-java-plugin/src/main/resources/profiles/Sonar_way/S9360 diff --git a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java new file mode 100644 index 00000000000..9fc75066933 --- /dev/null +++ b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java @@ -0,0 +1,37 @@ +package checks; + +import java.util.List; +import java.util.Map; + +/** @see java.util.List + */ // Compliant - existing type +class JavadocReferencesExistingSymbolsCheckSample { + + /** @see java.util.NonExistentClass + */ // Noncompliant {{Make sure this reference is valid.}} + void nonExistentClass() { + } + + /** @see java.util.NonExistentClass + */ // Noncompliant {{Make sure this reference is valid.}} + void nonExistentClass2() { + } + + /** @see http://example.com + */ + void externalUrl() { + } + + /** @see #existingMethod + */ + void methodReference() { + } + + /** @see java.util.List#size() + */ + void validMethodReference() { + } + + void existingMethod() { + } +} diff --git a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java new file mode 100644 index 00000000000..7050a34d25e --- /dev/null +++ b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java @@ -0,0 +1,162 @@ +/* + * SonarQube Java + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.java.checks; + +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.sonar.check.Rule; +import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; +import org.sonar.plugins.java.api.JavaFileScannerContext; +import org.sonar.plugins.java.api.semantic.Sema; +import org.sonar.plugins.java.api.semantic.Type; +import org.sonar.plugins.java.api.tree.CompilationUnitTree; +import org.sonar.plugins.java.api.tree.SyntaxTrivia; +import org.sonar.plugins.java.api.tree.Tree; + +@Rule(key = "S9360") +public class JavadocReferencesExistingSymbolsCheck extends IssuableSubscriptionVisitor { + + private static final String MESSAGE = "Make sure this reference is valid."; + private static final Pattern SEE_TAG_PATTERN = Pattern.compile("@see\\s++(\\S++)"); + private static final Pattern SEE_ANCHOR_PATTERN = Pattern.compile("\\{@see\\s++([^\\s}]+)"); + + private String currentPackage = ""; + + @Override + public void setContext(JavaFileScannerContext context) { + super.setContext(context); + Tree tree = context.getTree(); + if (tree != null && tree.is(Tree.Kind.COMPILATION_UNIT)) { + Tree pkg = ((CompilationUnitTree) tree).packageDeclaration(); + if (pkg != null) { + currentPackage = pkg.toString(); + } + } + } + + @Override + public List nodesToVisit() { + return Collections.singletonList(Tree.Kind.TRIVIA); + } + + @Override + public void visitNode(Tree tree) { + // intentionally empty - we only care about trivia + } + + @Override + public void visitTrivia(SyntaxTrivia syntaxTrivia) { + if (!syntaxTrivia.isComment(SyntaxTrivia.CommentKind.JAVADOC)) { + return; + } + + Object semanticModel = context.getSemanticModel(); + if (semanticModel == null) { + return; + } + + Sema sema = (Sema) semanticModel; + + for (String reference : extractSeeReferences(syntaxTrivia.comment())) { + String resolvedRef = resolveReference(reference); + if (resolvedRef == null) { + continue; + } + + Type type = sema.getClassType(resolvedRef); + if (type != null && !type.isUnknown()) { + continue; + } + + addIssue(syntaxTrivia.range().end().line(), MESSAGE); + return; + } + } + + @Override + public void leaveNode(Tree tree) { + // intentionally empty - no cleanup needed + } + + static List extractSeeReferences(String javadocText) { + if (javadocText == null || javadocText.isEmpty()) { + return Collections.emptyList(); + } + + List references = new java.util.ArrayList<>(); + Matcher matcher = SEE_TAG_PATTERN.matcher(javadocText); + while (matcher.find()) { + String ref = matcher.group(1); + if (!ref.startsWith("http://") && !ref.startsWith("https://")) { + references.add(ref); + } + } + + Matcher anchorMatcher = SEE_ANCHOR_PATTERN.matcher(javadocText); + while (anchorMatcher.find()) { + String ref = anchorMatcher.group(1); + if (!ref.startsWith("http://") && !ref.startsWith("https://")) { + references.add(ref); + } + } + + return references; + } + + String resolveReference(String reference) { + if (reference == null || reference.isEmpty()) { + return null; + } + + // Skip method references (starting with #) + if (reference.startsWith("#")) { + return null; + } + + // Remove method signature if present (e.g., "MyClass#myMethod()") + if (reference.contains("(")) { + int parenIdx = reference.indexOf('('); + reference = reference.substring(0, parenIdx); + } + + // Remove member reference if present (e.g., "MyClass#myField") + int hashIdx = reference.indexOf('#'); + if (hashIdx > 0) { + reference = reference.substring(0, hashIdx); + } + + // If already fully qualified, use as-is + if (reference.contains(".")) { + return reference; + } + + // Skip simple method names (e.g., "existingMethod()") + // These are handled by a different rule + if (!reference.contains(".")) { + return null; + } + + // Resolve relative reference against current package + if (!currentPackage.isEmpty()) { + return currentPackage + "." + reference; + } + + return reference; + } +} diff --git a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java new file mode 100644 index 00000000000..3e2cec7ae10 --- /dev/null +++ b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java @@ -0,0 +1,42 @@ +/* + * SonarQube Java + * Copyright (C) SonarSource Sàrl + * mailto:info AT sonarsource DOT com + * + * You can redistribute and/or modify this program under the terms of + * the Sonar Source-Available License Version 1, as published by SonarSource Sàrl. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the Sonar Source-Available License for more details. + * + * You should have received a copy of the Sonar Source-Available License + * along with this program; if not, see https://sonarsource.com/license/ssal/ + */ +package org.sonar.java.checks; + +import org.junit.jupiter.api.Test; +import org.sonar.java.checks.verifier.CheckVerifier; + +import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; + +class JavadocReferencesExistingSymbolsCheckTest { + + @Test + void test() { + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/JavadocReferencesExistingSymbolsCheckSample.java")) + .withCheck(new JavadocReferencesExistingSymbolsCheck()) + .verifyIssues(); + } + + @Test + void test_without_semantic() { + CheckVerifier.newVerifier() + .onFile(mainCodeSourcesPath("checks/JavadocReferencesExistingSymbolsCheckSample.java")) + .withCheck(new JavadocReferencesExistingSymbolsCheck()) + .withoutSemantic() + .verifyNoIssues(); + } +} diff --git a/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.html b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.html new file mode 100644 index 00000000000..049d754191b --- /dev/null +++ b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.html @@ -0,0 +1,50 @@ +

This rule detects @see references in Javadoc comments that point to non-existent types or members.

+

Why is this an issue?

+

Javadoc @see tags are used to create cross-references between documentation. When these references point to non-existent types or members, they result in broken links in the generated documentation, reducing its usefulness.

+

The following patterns are detected:

+
    +
  • References to classes that cannot be resolved (e.g., @see com.example.NonExistentClass)
  • +
  • References to methods or fields that don't exist in the referenced class
  • +
  • Relative references to classes that don't exist in the current package
  • +
+

This rule does not flag references to external URLs (starting with http:// or https://), as these are handled separately.

+

How to fix it

+

Verify that each @see reference points to an existing type or member. If the reference is intentional (e.g., documenting a planned API), consider removing it or adding a note explaining why it's referenced.

+

Code examples

+

Noncompliant code example

+
+import java.util.List;
+
+/**
+ * @see java.util.NonExistentClass
+ */
+public class MyClass { }
+
+

Compliant solution

+
+import java.util.List;
+
+/**
+ * @see java.util.List
+ */
+public class MyClass { }
+
+

Noncompliant code example

+
+/**
+ * @see com.example.NonExistentClass
+ */
+class MyClass { }
+
+

Compliant solution

+
+/**
+ * @see com.example.ExistentClass
+ */
+class MyClass { }
+
+

Resources

+

Documentation

+ diff --git a/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.json b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.json new file mode 100644 index 00000000000..8c789ca15e6 --- /dev/null +++ b/sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S9360.json @@ -0,0 +1,23 @@ +{ + "title": "Javadoc references should point to existing types and members", + "type": "CODE_SMELL", + "status": "ready", + "remediation": { + "func": "Constant/Issue", + "constantCost": "5min" + }, + "tags": [ + "documentation" + ], + "defaultSeverity": "Minor", + "ruleSpecification": "RSPEC-9360", + "sqKey": "S9360", + "scope": "All", + "quickfix": "covered", + "code": { + "impacts": { + "MAINTAINABILITY": "LOW" + }, + "attribute": "CLEAR" + } +} diff --git a/sonar-java-plugin/src/main/resources/profiles/Sonar_way/S9360 b/sonar-java-plugin/src/main/resources/profiles/Sonar_way/S9360 new file mode 100644 index 00000000000..e69de29bb2d From 13a2f6454de90d489f43c9c34fbac116382fb7f4 Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 13:20:23 +0200 Subject: [PATCH 02/12] SONARJAVA-6825: Fix S9360 bugs, improve coverage, and update ruling baselines - Fix dead code in resolveReference(): remove tautological guard that prevented relative (same-package) reference resolution - Fix package name extraction: use ExpressionsHelper.concatenate() instead of unreliable PackageDeclarationTree.toString() - Fix SEE_ANCHOR_PATTERN: match {@link}/{@linkplain} instead of invalid {@see} inline syntax - Refactor visitTrivia loop to reduce break/continue (S135 fix) - Add unit tests for extractSeeReferences and resolveReference methods - Add test cases for {@link}, {@linkplain}, simple name references - Add LITS ruling baselines for S9360 Co-Authored-By: Claude Opus 4.6 --- .../resources/eclipse-jetty/java-S9360.json | 37 +++++++++ .../src/test/resources/guava/java-S9360.json | 5 ++ .../resources/sonar-server/java-S9360.json | 8 ++ ...cReferencesExistingSymbolsCheckSample.java | 36 +++++++++ ...JavadocReferencesExistingSymbolsCheck.java | 42 +++++----- ...docReferencesExistingSymbolsCheckTest.java | 80 +++++++++++++++++++ 6 files changed, 187 insertions(+), 21 deletions(-) create mode 100644 its/ruling/src/test/resources/eclipse-jetty/java-S9360.json create mode 100644 its/ruling/src/test/resources/guava/java-S9360.json create mode 100644 its/ruling/src/test/resources/sonar-server/java-S9360.json diff --git a/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json new file mode 100644 index 00000000000..2a93b923c0d --- /dev/null +++ b/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json @@ -0,0 +1,37 @@ +{ +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSV.java": [ +35 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSVParser.java": [ +28 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedQualityCSV.java": [ +40, +49 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AcceptRateLimit.java": [ +62 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionLimit.java": [ +60 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java": [ +1332 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java": [ +131, +140 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java": [ +104 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java": [ +919 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java": [ +101 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPoolBudget.java": [ +34 +] +} diff --git a/its/ruling/src/test/resources/guava/java-S9360.json b/its/ruling/src/test/resources/guava/java-S9360.json new file mode 100644 index 00000000000..7ac5d09b31a --- /dev/null +++ b/its/ruling/src/test/resources/guava/java-S9360.json @@ -0,0 +1,5 @@ +{ +"com.google.guava:guava:src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java": [ +37 +] +} diff --git a/its/ruling/src/test/resources/sonar-server/java-S9360.json b/its/ruling/src/test/resources/sonar-server/java-S9360.json new file mode 100644 index 00000000000..2f5a96be82e --- /dev/null +++ b/its/ruling/src/test/resources/sonar-server/java-S9360.json @@ -0,0 +1,8 @@ +{ +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/BulkIndexer.java": [ +238 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java": [ +81 +] +} diff --git a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java index 9fc75066933..79da520ef71 100644 --- a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java +++ b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java @@ -22,6 +22,11 @@ void nonExistentClass2() { void externalUrl() { } + /** @see https://example.com + */ + void externalUrlHttps() { + } + /** @see #existingMethod */ void methodReference() { @@ -32,6 +37,37 @@ void methodReference() { void validMethodReference() { } + /** {@link java.util.List} + */ + void validLinkTag() { + } + + /** {@link java.util.NonExistentClass} + */ // Noncompliant {{Make sure this reference is valid.}} + void invalidLinkTag() { + } + + /** {@linkplain java.util.NonExistentClass} + */ // Noncompliant {{Make sure this reference is valid.}} + void invalidLinkplainTag() { + } + + /** {@link java.util.Map#get(Object)} + */ + void validLinkWithMethod() { + } + + /** @see NonExistentSimpleClass + */ // Noncompliant {{Make sure this reference is valid.}} + void simpleNameNonExistent() { + } + + /** @see java.util.List#size() + * {@link java.util.NonExistentClass} + */ // Noncompliant {{Make sure this reference is valid.}} + void mixedValidSeeInvalidLink() { + } + void existingMethod() { } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java index 7050a34d25e..5deb838d2ff 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java @@ -21,11 +21,13 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.sonar.check.Rule; +import org.sonar.java.checks.helpers.ExpressionsHelper; import org.sonar.plugins.java.api.IssuableSubscriptionVisitor; import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.semantic.Sema; import org.sonar.plugins.java.api.semantic.Type; import org.sonar.plugins.java.api.tree.CompilationUnitTree; +import org.sonar.plugins.java.api.tree.PackageDeclarationTree; import org.sonar.plugins.java.api.tree.SyntaxTrivia; import org.sonar.plugins.java.api.tree.Tree; @@ -34,7 +36,7 @@ public class JavadocReferencesExistingSymbolsCheck extends IssuableSubscriptionV private static final String MESSAGE = "Make sure this reference is valid."; private static final Pattern SEE_TAG_PATTERN = Pattern.compile("@see\\s++(\\S++)"); - private static final Pattern SEE_ANCHOR_PATTERN = Pattern.compile("\\{@see\\s++([^\\s}]+)"); + private static final Pattern LINK_TAG_PATTERN = Pattern.compile("\\{@link(?:plain)?\\s++([^\\s}]+)"); private String currentPackage = ""; @@ -43,9 +45,9 @@ public void setContext(JavaFileScannerContext context) { super.setContext(context); Tree tree = context.getTree(); if (tree != null && tree.is(Tree.Kind.COMPILATION_UNIT)) { - Tree pkg = ((CompilationUnitTree) tree).packageDeclaration(); + PackageDeclarationTree pkg = ((CompilationUnitTree) tree).packageDeclaration(); if (pkg != null) { - currentPackage = pkg.toString(); + currentPackage = ExpressionsHelper.concatenate(pkg.packageName()); } } } @@ -73,20 +75,24 @@ public void visitTrivia(SyntaxTrivia syntaxTrivia) { Sema sema = (Sema) semanticModel; - for (String reference : extractSeeReferences(syntaxTrivia.comment())) { - String resolvedRef = resolveReference(reference); - if (resolvedRef == null) { - continue; - } + if (hasInvalidReference(sema, syntaxTrivia.comment())) { + addIssue(syntaxTrivia.range().end().line(), MESSAGE); + } + } - Type type = sema.getClassType(resolvedRef); - if (type != null && !type.isUnknown()) { - continue; + private boolean hasInvalidReference(Sema sema, String javadocText) { + for (String reference : extractSeeReferences(javadocText)) { + String resolvedRef = resolveReference(reference); + if (resolvedRef != null && isUnknownType(sema, resolvedRef)) { + return true; } - - addIssue(syntaxTrivia.range().end().line(), MESSAGE); - return; } + return false; + } + + private static boolean isUnknownType(Sema sema, String fullyQualifiedName) { + Type type = sema.getClassType(fullyQualifiedName); + return type == null || type.isUnknown(); } @Override @@ -108,7 +114,7 @@ static List extractSeeReferences(String javadocText) { } } - Matcher anchorMatcher = SEE_ANCHOR_PATTERN.matcher(javadocText); + Matcher anchorMatcher = LINK_TAG_PATTERN.matcher(javadocText); while (anchorMatcher.find()) { String ref = anchorMatcher.group(1); if (!ref.startsWith("http://") && !ref.startsWith("https://")) { @@ -146,12 +152,6 @@ String resolveReference(String reference) { return reference; } - // Skip simple method names (e.g., "existingMethod()") - // These are handled by a different rule - if (!reference.contains(".")) { - return null; - } - // Resolve relative reference against current package if (!currentPackage.isEmpty()) { return currentPackage + "." + reference; diff --git a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java index 3e2cec7ae10..56aabcdb57a 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java @@ -16,9 +16,11 @@ */ package org.sonar.java.checks; +import java.util.List; import org.junit.jupiter.api.Test; import org.sonar.java.checks.verifier.CheckVerifier; +import static org.assertj.core.api.Assertions.assertThat; import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath; class JavadocReferencesExistingSymbolsCheckTest { @@ -39,4 +41,82 @@ void test_without_semantic() { .withoutSemantic() .verifyNoIssues(); } + + @Test + void extractSeeReferences_returns_empty_for_null_or_empty() { + assertThat(JavadocReferencesExistingSymbolsCheck.extractSeeReferences(null)).isEmpty(); + assertThat(JavadocReferencesExistingSymbolsCheck.extractSeeReferences("")).isEmpty(); + } + + @Test + void extractSeeReferences_extracts_see_tags() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** @see java.util.List */"); + assertThat(refs).containsExactly("java.util.List"); + } + + @Test + void extractSeeReferences_skips_urls() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** @see http://example.com @see https://example.com */"); + assertThat(refs).isEmpty(); + } + + @Test + void extractSeeReferences_extracts_link_tags() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** {@link java.util.List} */"); + assertThat(refs).containsExactly("java.util.List"); + } + + @Test + void extractSeeReferences_extracts_linkplain_tags() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** {@linkplain java.util.Map} */"); + assertThat(refs).containsExactly("java.util.Map"); + } + + @Test + void extractSeeReferences_handles_mixed_tags() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** @see java.util.List {@link java.util.Map} */"); + assertThat(refs).containsExactly("java.util.List", "java.util.Map"); + } + + @Test + void resolveReference_returns_null_for_null_or_empty() { + JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); + assertThat(check.resolveReference(null)).isNull(); + assertThat(check.resolveReference("")).isNull(); + } + + @Test + void resolveReference_returns_null_for_method_references() { + JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); + assertThat(check.resolveReference("#myMethod")).isNull(); + } + + @Test + void resolveReference_returns_fully_qualified_name_as_is() { + JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); + assertThat(check.resolveReference("java.util.List")).isEqualTo("java.util.List"); + } + + @Test + void resolveReference_strips_method_signature() { + JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); + assertThat(check.resolveReference("java.util.List#size()")).isEqualTo("java.util.List"); + } + + @Test + void resolveReference_strips_member_reference() { + JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); + assertThat(check.resolveReference("java.util.List#EMPTY_LIST")).isEqualTo("java.util.List"); + } + + @Test + void resolveReference_returns_simple_name_without_package() { + JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); + assertThat(check.resolveReference("MyClass")).isEqualTo("MyClass"); + } } From 332699f8ab611077d6d2b53ec81e85613a81a97f Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 13:45:32 +0200 Subject: [PATCH 03/12] SONARJAVA-6825: Fix S9360 false positives for simple-name Javadoc references - Resolve unqualified @see/@link names against imports and java.lang before flagging them as invalid. Previously, simple names like `@see List` or `@see String` were incorrectly prepended with the current package name, producing false positives. - Remove dead-code null/empty guards in extractSeeReferences() and resolveReference() flagged by S2589. - Refactor resolveReference into stripMemberReference + isUnresolvableReference for clearer separation of concerns. - Add compliant test cases for imported types, java.lang types, and same-package class references. Co-Authored-By: Claude Opus 4.6 --- ...cReferencesExistingSymbolsCheckSample.java | 20 +++ ...JavadocReferencesExistingSymbolsCheck.java | 122 ++++++++++++------ ...docReferencesExistingSymbolsCheckTest.java | 38 ++---- 3 files changed, 110 insertions(+), 70 deletions(-) diff --git a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java index 79da520ef71..c0ccafad0b5 100644 --- a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java +++ b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java @@ -68,6 +68,26 @@ void simpleNameNonExistent() { void mixedValidSeeInvalidLink() { } + /** @see String + */ // Compliant - java.lang.String is implicitly available + void simpleNameJavaLang() { + } + + /** @see List + */ // Compliant - List is imported + void simpleNameImported() { + } + + /** {@link Map} + */ // Compliant - Map is imported + void simpleNameImportedLink() { + } + + /** @see JavadocReferencesExistingSymbolsCheckSample + */ // Compliant - same-package class + void simpleNameSamePackage() { + } + void existingMethod() { } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java index 5deb838d2ff..62892243615 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java @@ -16,8 +16,11 @@ */ package org.sonar.java.checks; +import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.sonar.check.Rule; @@ -27,6 +30,8 @@ import org.sonar.plugins.java.api.semantic.Sema; import org.sonar.plugins.java.api.semantic.Type; import org.sonar.plugins.java.api.tree.CompilationUnitTree; +import org.sonar.plugins.java.api.tree.ExpressionTree; +import org.sonar.plugins.java.api.tree.ImportTree; import org.sonar.plugins.java.api.tree.PackageDeclarationTree; import org.sonar.plugins.java.api.tree.SyntaxTrivia; import org.sonar.plugins.java.api.tree.Tree; @@ -37,21 +42,42 @@ public class JavadocReferencesExistingSymbolsCheck extends IssuableSubscriptionV private static final String MESSAGE = "Make sure this reference is valid."; private static final Pattern SEE_TAG_PATTERN = Pattern.compile("@see\\s++(\\S++)"); private static final Pattern LINK_TAG_PATTERN = Pattern.compile("\\{@link(?:plain)?\\s++([^\\s}]+)"); + private static final String JAVA_LANG_PREFIX = "java.lang."; private String currentPackage = ""; + private final Map importedSimpleNames = new HashMap<>(); @Override public void setContext(JavaFileScannerContext context) { super.setContext(context); + currentPackage = ""; + importedSimpleNames.clear(); Tree tree = context.getTree(); if (tree != null && tree.is(Tree.Kind.COMPILATION_UNIT)) { - PackageDeclarationTree pkg = ((CompilationUnitTree) tree).packageDeclaration(); + CompilationUnitTree cut = (CompilationUnitTree) tree; + PackageDeclarationTree pkg = cut.packageDeclaration(); if (pkg != null) { currentPackage = ExpressionsHelper.concatenate(pkg.packageName()); } + collectImports(cut); } } + private void collectImports(CompilationUnitTree cut) { + cut.imports().stream() + .filter(importClause -> importClause.is(Tree.Kind.IMPORT)) + .map(ImportTree.class::cast) + .filter(importTree -> !importTree.isStatic()) + .forEach(importTree -> { + String fqn = ExpressionsHelper.concatenate((ExpressionTree) importTree.qualifiedIdentifier()); + if (!fqn.endsWith(".*")) { + int lastDot = fqn.lastIndexOf('.'); + String simpleName = lastDot >= 0 ? fqn.substring(lastDot + 1) : fqn; + importedSimpleNames.put(simpleName, fqn); + } + }); + } + @Override public List nodesToVisit() { return Collections.singletonList(Tree.Kind.TRIVIA); @@ -82,14 +108,64 @@ public void visitTrivia(SyntaxTrivia syntaxTrivia) { private boolean hasInvalidReference(Sema sema, String javadocText) { for (String reference : extractSeeReferences(javadocText)) { - String resolvedRef = resolveReference(reference); - if (resolvedRef != null && isUnknownType(sema, resolvedRef)) { + String typeName = stripMemberReference(reference); + if (typeName != null && isUnresolvableReference(sema, typeName)) { return true; } } return false; } + /** + * Strips method/member references from a Javadoc reference and returns the type name part, + * or null if the reference is a method-only reference (e.g., "#myMethod"). + */ + static String stripMemberReference(String reference) { + // Skip method references (starting with #) + if (reference.startsWith("#")) { + return null; + } + + String result = reference; + + // Remove method signature if present (e.g., "MyClass#myMethod()") + int parenIdx = result.indexOf('('); + if (parenIdx >= 0) { + result = result.substring(0, parenIdx); + } + + // Remove member reference if present (e.g., "MyClass#myField") + int hashIdx = result.indexOf('#'); + if (hashIdx > 0) { + result = result.substring(0, hashIdx); + } + + return result; + } + + private boolean isUnresolvableReference(Sema sema, String typeName) { + // If already fully qualified, check directly + if (typeName.contains(".")) { + return isUnknownType(sema, typeName); + } + + // Simple name: try imports, then java.lang, then current package + String importedFqn = importedSimpleNames.get(typeName); + if (importedFqn != null) { + return isUnknownType(sema, importedFqn); + } + + if (!isUnknownType(sema, JAVA_LANG_PREFIX + typeName)) { + return false; + } + + if (!currentPackage.isEmpty() && !isUnknownType(sema, currentPackage + "." + typeName)) { + return false; + } + + return true; + } + private static boolean isUnknownType(Sema sema, String fullyQualifiedName) { Type type = sema.getClassType(fullyQualifiedName); return type == null || type.isUnknown(); @@ -101,11 +177,8 @@ public void leaveNode(Tree tree) { } static List extractSeeReferences(String javadocText) { - if (javadocText == null || javadocText.isEmpty()) { - return Collections.emptyList(); - } + List references = new ArrayList<>(); - List references = new java.util.ArrayList<>(); Matcher matcher = SEE_TAG_PATTERN.matcher(javadocText); while (matcher.find()) { String ref = matcher.group(1); @@ -124,39 +197,4 @@ static List extractSeeReferences(String javadocText) { return references; } - - String resolveReference(String reference) { - if (reference == null || reference.isEmpty()) { - return null; - } - - // Skip method references (starting with #) - if (reference.startsWith("#")) { - return null; - } - - // Remove method signature if present (e.g., "MyClass#myMethod()") - if (reference.contains("(")) { - int parenIdx = reference.indexOf('('); - reference = reference.substring(0, parenIdx); - } - - // Remove member reference if present (e.g., "MyClass#myField") - int hashIdx = reference.indexOf('#'); - if (hashIdx > 0) { - reference = reference.substring(0, hashIdx); - } - - // If already fully qualified, use as-is - if (reference.contains(".")) { - return reference; - } - - // Resolve relative reference against current package - if (!currentPackage.isEmpty()) { - return currentPackage + "." + reference; - } - - return reference; - } } diff --git a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java index 56aabcdb57a..3430b29ea6f 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java @@ -42,12 +42,6 @@ void test_without_semantic() { .verifyNoIssues(); } - @Test - void extractSeeReferences_returns_empty_for_null_or_empty() { - assertThat(JavadocReferencesExistingSymbolsCheck.extractSeeReferences(null)).isEmpty(); - assertThat(JavadocReferencesExistingSymbolsCheck.extractSeeReferences("")).isEmpty(); - } - @Test void extractSeeReferences_extracts_see_tags() { List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( @@ -84,39 +78,27 @@ void extractSeeReferences_handles_mixed_tags() { } @Test - void resolveReference_returns_null_for_null_or_empty() { - JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); - assertThat(check.resolveReference(null)).isNull(); - assertThat(check.resolveReference("")).isNull(); - } - - @Test - void resolveReference_returns_null_for_method_references() { - JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); - assertThat(check.resolveReference("#myMethod")).isNull(); + void stripMemberReference_returns_null_for_method_references() { + assertThat(JavadocReferencesExistingSymbolsCheck.stripMemberReference("#myMethod")).isNull(); } @Test - void resolveReference_returns_fully_qualified_name_as_is() { - JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); - assertThat(check.resolveReference("java.util.List")).isEqualTo("java.util.List"); + void stripMemberReference_returns_fully_qualified_name_as_is() { + assertThat(JavadocReferencesExistingSymbolsCheck.stripMemberReference("java.util.List")).isEqualTo("java.util.List"); } @Test - void resolveReference_strips_method_signature() { - JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); - assertThat(check.resolveReference("java.util.List#size()")).isEqualTo("java.util.List"); + void stripMemberReference_strips_method_signature() { + assertThat(JavadocReferencesExistingSymbolsCheck.stripMemberReference("java.util.List#size()")).isEqualTo("java.util.List"); } @Test - void resolveReference_strips_member_reference() { - JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); - assertThat(check.resolveReference("java.util.List#EMPTY_LIST")).isEqualTo("java.util.List"); + void stripMemberReference_strips_member_reference() { + assertThat(JavadocReferencesExistingSymbolsCheck.stripMemberReference("java.util.List#EMPTY_LIST")).isEqualTo("java.util.List"); } @Test - void resolveReference_returns_simple_name_without_package() { - JavadocReferencesExistingSymbolsCheck check = new JavadocReferencesExistingSymbolsCheck(); - assertThat(check.resolveReference("MyClass")).isEqualTo("MyClass"); + void stripMemberReference_returns_simple_name() { + assertThat(JavadocReferencesExistingSymbolsCheck.stripMemberReference("MyClass")).isEqualTo("MyClass"); } } From 236b8acd6b961c4806ea2d5385c049cf74ff4290 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 24 Aug 2026 12:01:13 +0000 Subject: [PATCH 04/12] Update ruling results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with GitHub Actions --- .../commons-beanutils/java-S9360.json | 96 +++ .../resources/eclipse-jetty/java-S9360.json | 210 ++++- .../src/test/resources/guava/java-S9360.json | 808 ++++++++++++++++++ .../jboss-ejb3-tutorial/java-S9360.json | 9 + .../resources/sonar-server/java-S9360.json | 154 ++++ 5 files changed, 1276 insertions(+), 1 deletion(-) create mode 100644 its/ruling/src/test/resources/commons-beanutils/java-S9360.json create mode 100644 its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S9360.json diff --git a/its/ruling/src/test/resources/commons-beanutils/java-S9360.json b/its/ruling/src/test/resources/commons-beanutils/java-S9360.json new file mode 100644 index 00000000000..189de505325 --- /dev/null +++ b/its/ruling/src/test/resources/commons-beanutils/java-S9360.json @@ -0,0 +1,96 @@ +{ +"commons-beanutils:commons-beanutils:src/main/java/org/apache/commons/beanutils2/MethodUtils.java": [ +251, +574, +935 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira157TestCase.java": [ +39 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira18TestCase.java": [ +34 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira273TestCase.java": [ +33 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira298TestCase.java": [ +34 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira339TestCase.java": [ +34 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira345TestCase.java": [ +27 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira347TestCase.java": [ +36 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira349TestCase.java": [ +29 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira357TestCase.java": [ +29 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira358TestCase.java": [ +28 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira359TestCase.java": [ +30 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira368TestCase.java": [ +27 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira369TestCase.java": [ +27 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira381TestCase.java": [ +30 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira411TestCase.java": [ +28 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira422TestCase.java": [ +43, +50 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira422bTestCase.java": [ +29 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira458TestCase.java": [ +31 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira463TestCase.java": [ +29 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira465TestCase.java": [ +33 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira492TestCase.java": [ +42 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira493TestCase.java": [ +29 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira520TestCase.java": [ +29 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira61TestCase.java": [ +44 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira87TestCase.java": [ +41 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira92TestCase.java": [ +28 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/other/Jira273BeanFactory.java": [ +32, +47 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/other/Jira492IndexedListsSupport.java": [ +33 +], +"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/other/Jira61BeanFactory.java": [ +34 +] +} diff --git a/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json index 2a93b923c0d..74892f6c460 100644 --- a/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json +++ b/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json @@ -1,4 +1,24 @@ { +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ +42, +133, +205, +224, +238 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java": [ +43 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ +89, +1456 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java": [ +27 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java": [ +51 +], "org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSV.java": [ 35 ], @@ -9,28 +29,216 @@ 40, 49 ], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ +61 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java": [ +109 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/CyclicTimeout.java": [ +50 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java": [ +299 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java": [ +245, +468 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ +400 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ +80 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java": [ +239 +], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AcceptRateLimit.java": [ 62 ], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java": [ +92, +102, +106, +110, +125 +], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionLimit.java": [ 60 ], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ +54 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DetectorConnectionFactory.java": [ +37, +48, +77 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [ +362 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java": [ +63 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java": [ +146, +1068 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [ +32 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ +477 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java": [ +157, +302, +368 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ +322 +], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java": [ +142, 1332 ], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [ +82 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ +39, +192 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java": [ +49 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [ +759, +768, +1576, +1886 +], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java": [ 131, 140 ], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ +285 +], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java": [ 104 ], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/BufferedResponseHandler.java": [ +62 +], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java": [ -919 +114, +645, +919, +1737 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java": [ +148 +], +"org.eclipse.jetty:jetty-project:jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/AsyncJSON.java": [ +71, +79, +157, +170, +183 +], +"org.eclipse.jetty:jetty-project:jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java": [ +82, +529, +540, +551, +562, +577, +603, +1523, +1549, +1565, +1590 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Attributes.java": [ +49, +64 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Fields.java": [ +38, +130, +141, +153, +166, +189, +223 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/IncludeExcludeSet.java": [ +84 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java": [ +56, +89, +158 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/PathWatcher.java": [ +67 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Pool.java": [ +148, +399 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java": [ +64 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ServiceLoaderSpliterator.java": [ +77 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java": [ +803 ], "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java": [ 101 ], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/Graceful.java": [ +148 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/compression/CompressionPool.java": [ +43 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SniX509ExtendedKeyManager.java": [ +89, +250 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java": [ +102 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutionStrategy.java": [ +27 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutorThreadPool.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/Invocable.java": [ +97 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/Sweeper.java": [ +72, +186 +], +"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPool.java": [ +31 +], "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPoolBudget.java": [ 34 ] diff --git a/its/ruling/src/test/resources/guava/java-S9360.json b/its/ruling/src/test/resources/guava/java-S9360.json index 7ac5d09b31a..b55b08a464c 100644 --- a/its/ruling/src/test/resources/guava/java-S9360.json +++ b/its/ruling/src/test/resources/guava/java-S9360.json @@ -1,4 +1,812 @@ { +"com.google.guava:guava:src/com/google/common/annotations/GwtCompatible.java": [ +63, +76, +86 +], +"com.google.guava:guava:src/com/google/common/base/CharMatcher.java": [ +155, +165, +175, +185, +268, +274, +280, +286, +565, +605, +968, +983 +], +"com.google.guava:guava:src/com/google/common/base/Converter.java": [ +92, +135 +], +"com.google.guava:guava:src/com/google/common/base/Equivalence.java": [ +151, +245, +325 +], +"com.google.guava:guava:src/com/google/common/base/FinalizableReferenceQueue.java": [ +190 +], +"com.google.guava:guava:src/com/google/common/base/FinalizableSoftReference.java": [ +29 +], +"com.google.guava:guava:src/com/google/common/base/FinalizableWeakReference.java": [ +29 +], +"com.google.guava:guava:src/com/google/common/base/Functions.java": [ +110, +211, +258 +], +"com.google.guava:guava:src/com/google/common/base/Joiner.java": [ +331, +389, +401 +], +"com.google.guava:guava:src/com/google/common/base/MoreObjects.java": [ +97, +112, +125, +156 +], +"com.google.guava:guava:src/com/google/common/base/Objects.java": [ +128, +146, +162, +201, +222, +389 +], +"com.google.guava:guava:src/com/google/common/base/Optional.java": [ +148, +184 +], +"com.google.guava:guava:src/com/google/common/base/Preconditions.java": [ +95 +], +"com.google.guava:guava:src/com/google/common/base/Splitter.java": [ +101, +371 +], +"com.google.guava:guava:src/com/google/common/base/Stopwatch.java": [ +75 +], +"com.google.guava:guava:src/com/google/common/base/Strings.java": [ +76 +], +"com.google.guava:guava:src/com/google/common/base/Throwables.java": [ +87, +109, +126, +157 +], +"com.google.guava:guava:src/com/google/common/cache/AbstractCache.java": [ +142, +189, +203 +], +"com.google.guava:guava:src/com/google/common/cache/CacheBuilder.java": [ +150, +513, +568, +730 +], +"com.google.guava:guava:src/com/google/common/cache/LocalCache.java": [ +1806, +1820, +1830, +1857, +1884, +2807 +], +"com.google.guava:guava:src/com/google/common/cache/LongAdder.java": [ +48, +138 +], +"com.google.guava:guava:src/com/google/common/collect/AbstractIterator.java": [ +60, +113 +], +"com.google.guava:guava:src/com/google/common/collect/AbstractMapBasedMultimap.java": [ +90, +353 +], +"com.google.guava:guava:src/com/google/common/collect/AbstractMapBasedMultiset.java": [ +78 +], +"com.google.guava:guava:src/com/google/common/collect/AbstractMultiset.java": [ +227 +], +"com.google.guava:guava:src/com/google/common/collect/ArrayListMultimap.java": [ +65 +], +"com.google.guava:guava:src/com/google/common/collect/ArrayTable.java": [ +85, +448 +], +"com.google.guava:guava:src/com/google/common/collect/ClassToInstanceMap.java": [ +47 +], +"com.google.guava:guava:src/com/google/common/collect/ComparisonChain.java": [ +63, +193, +221, +228 +], +"com.google.guava:guava:src/com/google/common/collect/DiscreteDomain.java": [ +214, +225, +242 +], +"com.google.guava:guava:src/com/google/common/collect/EnumMultiset.java": [ +53 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingCollection.java": [ +46, +128, +139, +162, +181, +193, +205, +228, +239, +251 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingDeque.java": [ +36 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingList.java": [ +53, +144, +155, +203, +239 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingMap.java": [ +57, +145, +161, +197, +213, +228, +258 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingMapEntry.java": [ +53, +96, +126 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingMultiset.java": [ +152, +165, +179, +192, +205, +219, +248, +300, +311 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingNavigableMap.java": [ +349 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingObject.java": [ +51, +64 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingQueue.java": [ +43 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingSet.java": [ +47 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingSortedMap.java": [ +54 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingSortedMultiset.java": [ +67 +], +"com.google.guava:guava:src/com/google/common/collect/ForwardingSortedSet.java": [ +55 +], +"com.google.guava:guava:src/com/google/common/collect/GenericMapMaker.java": [ +46, +106 +], +"com.google.guava:guava:src/com/google/common/collect/GwtTransient.java": [ +32 +], +"com.google.guava:guava:src/com/google/common/collect/HashBasedTable.java": [ +54 +], +"com.google.guava:guava:src/com/google/common/collect/HashMultimap.java": [ +48 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableBiMap.java": [ +96 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableClassToInstanceMap.java": [ +64 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableCollection.java": [ +150 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableEnumMap.java": [ +33 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableEnumSet.java": [ +30 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableList.java": [ +613 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableListMultimap.java": [ +117 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableMap.java": [ +119, +127 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableMultimap.java": [ +67, +124, +133 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableMultiset.java": [ +413 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSet.java": [ +58, +231, +261, +396 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSetMultimap.java": [ +132, +140 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMap.java": [ +55, +363, +375 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMapFauxverideShim.java": [ +49, +63, +78, +93, +108 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMultiset.java": [ +47, +362 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java": [ +98, +113, +128 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSortedSet.java": [ +55, +199, +347, +397, +416 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java": [ +58, +72, +86, +101, +116, +131, +145 +], +"com.google.guava:guava:src/com/google/common/collect/ImmutableTable.java": [ +75, +111, +149, +191 +], +"com.google.guava:guava:src/com/google/common/collect/Interners.java": [ +61 +], +"com.google.guava:guava:src/com/google/common/collect/Iterables.java": [ +536, +564, +699 +], +"com.google.guava:guava:src/com/google/common/collect/Iterators.java": [ +115, +126, +730, +1043, +1085, +1113, +1135 +], +"com.google.guava:guava:src/com/google/common/collect/LinkedHashMultimap.java": [ +81 +], +"com.google.guava:guava:src/com/google/common/collect/LinkedListMultimap.java": [ +101, +269, +712, +761 +], +"com.google.guava:guava:src/com/google/common/collect/Lists.java": [ +86, +108, +140, +182, +230, +255, +311, +445, +507 +], +"com.google.guava:guava:src/com/google/common/collect/MapConstraint.java": [ +52 +], +"com.google.guava:guava:src/com/google/common/collect/MapConstraints.java": [ +49, +189, +215, +249, +267, +290, +518 +], +"com.google.guava:guava:src/com/google/common/collect/MapDifference.java": [ +69 +], +"com.google.guava:guava:src/com/google/common/collect/MapMaker.java": [ +103, +143, +260, +328, +476, +673, +721, +732 +], +"com.google.guava:guava:src/com/google/common/collect/MapMakerInternalMap.java": [ +1825, +1834, +1844, +1871, +1896, +2473 +], +"com.google.guava:guava:src/com/google/common/collect/Maps.java": [ +163, +218, +232, +266, +299, +315, +1167, +1201, +1252, +1266, +1281, +1692, +1753, +1812, +2284, +2320, +2362, +2399, +2434, +2469, +2514, +2561, +2599 +], +"com.google.guava:guava:src/com/google/common/collect/MinMaxPriorityQueue.java": [ +102, +167, +394, +902 +], +"com.google.guava:guava:src/com/google/common/collect/Multimap.java": [ +162, +282, +337, +351 +], +"com.google.guava:guava:src/com/google/common/collect/Multimaps.java": [ +113, +846, +1171, +1379 +], +"com.google.guava:guava:src/com/google/common/collect/Multiset.java": [ +87, +128, +233 +], +"com.google.guava:guava:src/com/google/common/collect/Multisets.java": [ +55, +196, +798, +803, +816 +], +"com.google.guava:guava:src/com/google/common/collect/MutableClassToInstanceMap.java": [ +43 +], +"com.google.guava:guava:src/com/google/common/collect/Ordering.java": [ +262, +854, +950 +], +"com.google.guava:guava:src/com/google/common/collect/PeekingIterator.java": [ +53, +66 +], +"com.google.guava:guava:src/com/google/common/collect/Range.java": [ +112, +373, +384, +401, +412, +529 +], +"com.google.guava:guava:src/com/google/common/collect/RangeMap.java": [ +34 +], +"com.google.guava:guava:src/com/google/common/collect/RowSortedTable.java": [ +36 +], +"com.google.guava:guava:src/com/google/common/collect/Serialization.java": [ +45 +], +"com.google.guava:guava:src/com/google/common/collect/SetMultimap.java": [ +53 +], +"com.google.guava:guava:src/com/google/common/collect/Sets.java": [ +220, +238, +290, +345, +364, +543, +1089, +1149, +1263 +], +"com.google.guava:guava:src/com/google/common/collect/SortedLists.java": [ +253 +], +"com.google.guava:guava:src/com/google/common/collect/StandardRowSortedTable.java": [ +48 +], +"com.google.guava:guava:src/com/google/common/collect/StandardTable.java": [ +67 +], +"com.google.guava:guava:src/com/google/common/collect/Table.java": [ +56, +292 +], +"com.google.guava:guava:src/com/google/common/collect/Tables.java": [ +138 +], +"com.google.guava:guava:src/com/google/common/collect/TransformedIterator.java": [ +30 +], +"com.google.guava:guava:src/com/google/common/collect/TreeBasedTable.java": [ +76 +], +"com.google.guava:guava:src/com/google/common/collect/TreeMultimap.java": [ +77 +], +"com.google.guava:guava:src/com/google/common/collect/package-info.java": [ +224 +], +"com.google.guava:guava:src/com/google/common/escape/CharEscaper.java": [ +44 +], +"com.google.guava:guava:src/com/google/common/escape/Escaper.java": [ +58 +], +"com.google.guava:guava:src/com/google/common/escape/UnicodeEscaper.java": [ +56, +149 +], +"com.google.guava:guava:src/com/google/common/escape/package-info.java": [ +28 +], +"com.google.guava:guava:src/com/google/common/eventbus/package-info.java": [ +253 +], +"com.google.guava:guava:src/com/google/common/hash/AbstractNonStreamingHashFunction.java": [ +31 +], +"com.google.guava:guava:src/com/google/common/io/BaseEncoding.java": [ +234 +], +"com.google.guava:guava:src/com/google/common/io/CharStreams.java": [ +250 +], +"com.google.guava:guava:src/com/google/common/io/FileBackedOutputStream.java": [ +89 +], +"com.google.guava:guava:src/com/google/common/io/Files.java": [ +81, +98, +272, +327, +342, +358, +373, +520, +540, +571, +645, +676 +], +"com.google.guava:guava:src/com/google/common/io/LineBuffer.java": [ +32 +], +"com.google.guava:guava:src/com/google/common/io/Resources.java": [ +111, +126, +146 +], +"com.google.guava:guava:src/com/google/common/math/IntMath.java": [ +349 +], +"com.google.guava:guava:src/com/google/common/math/LongMath.java": [ +418, +442 +], +"com.google.guava:guava:src/com/google/common/net/InternetDomainName.java": [ +74 +], +"com.google.guava:guava:src/com/google/common/net/PercentEscaper.java": [ +56 +], +"com.google.guava:guava:src/com/google/common/primitives/Booleans.java": [ +96, +119, +280, +317, +346 +], +"com.google.guava:guava:src/com/google/common/primitives/Bytes.java": [ +50, +260 +], +"com.google.guava:guava:src/com/google/common/primitives/Chars.java": [ +82, +397, +460 +], +"com.google.guava:guava:src/com/google/common/primitives/Doubles.java": [ +97, +384, +451 +], +"com.google.guava:guava:src/com/google/common/primitives/Floats.java": [ +93, +380, +447 +], +"com.google.guava:guava:src/com/google/common/primitives/Ints.java": [ +89, +445, +509 +], +"com.google.guava:guava:src/com/google/common/primitives/Longs.java": [ +81, +481, +545 +], +"com.google.guava:guava:src/com/google/common/primitives/Shorts.java": [ +88, +444, +508 +], +"com.google.guava:guava:src/com/google/common/primitives/SignedBytes.java": [ +62, +101, +185 +], +"com.google.guava:guava:src/com/google/common/primitives/UnsignedBytes.java": [ +284 +], +"com.google.guava:guava:src/com/google/common/primitives/UnsignedInts.java": [ +159 +], +"com.google.guava:guava:src/com/google/common/primitives/UnsignedLongs.java": [ +160 +], +"com.google.guava:guava:src/com/google/common/reflect/AbstractInvocationHandler.java": [ +62 +], +"com.google.guava:guava:src/com/google/common/reflect/ImmutableTypeToInstanceMap.java": [ +31 +], +"com.google.guava:guava:src/com/google/common/reflect/Invokable.java": [ +58 +], +"com.google.guava:guava:src/com/google/common/reflect/TypeResolver.java": [ +89 +], +"com.google.guava:guava:src/com/google/common/reflect/TypeToken.java": [ +273 +], +"com.google.guava:guava:src/com/google/common/reflect/Types.java": [ +353 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AbstractExecutionThreadService.java": [ +115 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AbstractFuture.java": [ +62, +289, +466, +501, +775, +835, +838, +856, +926 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AbstractScheduledService.java": [ +95, +111, +121, +142, +264, +284, +301, +412, +418, +567 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AbstractService.java": [ +295, +329, +354 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AggregateFuture.java": [ +260 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AtomicDouble.java": [ +54 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/AtomicDoubleArray.java": [ +41 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/CycleDetectingLockFactory.java": [ +163, +174, +196, +607, +723 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ExecutionError.java": [ +34 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ExecutionList.java": [ +45, +53, +140 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ForwardingCheckedFuture.java": [ +39 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ForwardingFuture.java": [ +37 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ForwardingListenableFuture.java": [ +35 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/FutureCallback.java": [ +49 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/Futures.java": [ +495, +806, +827, +871, +1055, +1269, +1426, +1446, +1482, +1745, +1821, +1879, +1934, +1988 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/JdkFutureAdapters.java": [ +38, +57, +89 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ListenableFuture.java": [ +88, +138 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/Monitor.java": [ +200 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/MoreExecutors.java": [ +65, +279, +426, +447, +947 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/RateLimiter.java": [ +92 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/Service.java": [ +53, +64, +69, +86, +98, +114, +123, +136, +145, +170, +182, +260, +266, +275, +287, +299 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ServiceManager.java": [ +121, +144, +154, +160, +167, +177, +188, +236, +256, +268, +296, +311, +333, +346, +356, +396, +487, +710 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/SimpleTimeLimiter.java": [ +65, +78 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/Striped.java": [ +86 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/ThreadFactoryBuilder.java": [ +45, +114 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/UncaughtExceptionHandlers.java": [ +32 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/UncheckedExecutionException.java": [ +39 +], +"com.google.guava:guava:src/com/google/common/util/concurrent/package-info.java": [ +31 +], "com.google.guava:guava:src/com/google/thirdparty/publicsuffix/PublicSuffixPatterns.java": [ 37 ] diff --git a/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S9360.json b/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S9360.json new file mode 100644 index 00000000000..4eefb0764d5 --- /dev/null +++ b/its/ruling/src/test/resources/jboss-ejb3-tutorial/java-S9360.json @@ -0,0 +1,9 @@ +{ +"jboss-ejb3-tutorial:partial_deployment_descriptor/src/org/jboss/tutorial/partial_deployment_descriptor/bean/CompleteXMLDDBean.java": [ +53, +64, +74, +84, +97 +] +} diff --git a/its/ruling/src/test/resources/sonar-server/java-S9360.json b/its/ruling/src/test/resources/sonar-server/java-S9360.json index 2f5a96be82e..0eee3a01d16 100644 --- a/its/ruling/src/test/resources/sonar-server/java-S9360.json +++ b/its/ruling/src/test/resources/sonar-server/java-S9360.json @@ -1,8 +1,162 @@ { +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/ce/queue/CeQueue.java": [ +66, +76 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/ce/queue/CeTaskResult.java": [ +29 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/ConditionToCondition.java": [ +35 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java": [ +92, +99, +106, +113 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java": [ +57 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/FileAttributes.java": [ +30 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/PathAwareCrawler.java": [ +147 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/PathAwareVisitor.java": [ +35, +40, +45, +50, +55, +60, +65, +118 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/TypeAwareVisitor.java": [ +28, +33, +38, +43, +48, +53, +58 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/TypeAwareVisitorAdapter.java": [ +49, +57, +65, +73, +81, +89, +97 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/duplication/DuplicationRepository.java": [ +41, +49 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/event/EventRepository.java": [ +30 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/filemove/MutableMovedFilesRepository.java": [ +32 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/formula/Counter.java": [ +38 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepository.java": [ +33 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueCounter.java": [ +267 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/commonrule/CommonRule.java": [ +66 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/measure/Measure.java": [ +239, +249, +259, +269, +279, +289, +300 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/metric/Metric.java": [ +55 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/ConditionStatus.java": [ +55 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/MutableQualityGateHolder.java": [ +40 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/scm/DbScmInfo.java": [ +87 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/scm/ScmInfoRepository.java": [ +42 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/DuplicationLineReader.java": [ +66, +82 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceHashRepository.java": [ +36 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesRepository.java": [ +39 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/AbstractComputationSteps.java": [ +30 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/NewCoverageMeasuresStep.java": [ +141 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/step/ComputationStepExecutor.java": [ +38 +], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/BulkIndexer.java": [ 238 ], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexDefinitions.java": [ +70 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexingResult.java": [ +67 +], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java": [ 81 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/DefaultTemplatesResolver.java": [ +39 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/requestid/RequestIdGeneratorBase.java": [ +27 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/requestid/RequestIdGeneratorImpl.java": [ +39, +54, +87 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQProfileRepositoryImpl.java": [ +153, +168 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/RuleMapper.java": [ +71 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/setting/ThreadLocalSettings.java": [ +51 +], +"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/DoPrivileged.java": [ +41 +], +"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/authentication/OAuth2CallbackFilterTest.java": [ +221 +], +"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStepTest.java": [ +85 ] } From ca1bb9c2b1f74baed39c051f1c91306e75095be4 Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 14:01:58 +0200 Subject: [PATCH 05/12] SONARJAVA-6825: Fix S1126 code smell in S9360 implementation Co-Authored-By: Claude Opus 4.6 --- .../java/checks/JavadocReferencesExistingSymbolsCheck.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java index 62892243615..9b59eb54f19 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java @@ -159,11 +159,7 @@ private boolean isUnresolvableReference(Sema sema, String typeName) { return false; } - if (!currentPackage.isEmpty() && !isUnknownType(sema, currentPackage + "." + typeName)) { - return false; - } - - return true; + return currentPackage.isEmpty() || isUnknownType(sema, currentPackage + "." + typeName); } private static boolean isUnknownType(Sema sema, String fullyQualifiedName) { From 6c17f7c5676ebe3fc34f5548fe833a1637008820 Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 14:39:31 +0200 Subject: [PATCH 06/12] SONARJAVA-6825: Fix S9360 false positives and add missing ruling baseline - Fix false positives for inner/nested type references by collecting declared types from the compilation unit - Fix false positives for dotted inner class references (e.g., Map.Entry) by trying $ notation with imports and package prefix - Filter out HTML anchor @see tags (e.g., @see ) - Filter out quoted string @see tags (e.g., @see "text") - Add missing ruling baseline for eclipse-jetty-similar-to-main Co-Authored-By: Claude Opus 4.6 --- .../java-S9360.json | 153 ++++++++++++++++++ ...cReferencesExistingSymbolsCheckSample.java | 32 ++++ ...JavadocReferencesExistingSymbolsCheck.java | 72 ++++++++- ...docReferencesExistingSymbolsCheckTest.java | 14 ++ 4 files changed, 266 insertions(+), 5 deletions(-) create mode 100644 its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json new file mode 100644 index 00000000000..ffaa98e75da --- /dev/null +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json @@ -0,0 +1,153 @@ +{ +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ +42, +133, +205, +224, +238 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java": [ +43 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ +89, +1456 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java": [ +27 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java": [ +51 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSV.java": [ +35 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSVParser.java": [ +28 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedQualityCSV.java": [ +40, +49 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ +61 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java": [ +109 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/CyclicTimeout.java": [ +50 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java": [ +299 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java": [ +245, +468 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ +400 +], +"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ +80 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java": [ +239 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AcceptRateLimit.java": [ +62 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java": [ +92, +102, +106, +110, +125 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionLimit.java": [ +60 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ +54 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DetectorConnectionFactory.java": [ +37, +48, +77 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [ +362 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java": [ +63 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java": [ +40 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java": [ +146, +1068 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [ +32 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ +477 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java": [ +157, +302, +368 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ +322 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java": [ +142, +1332 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [ +82 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ +39, +192 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java": [ +49 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [ +759, +768, +1576, +1886 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java": [ +131, +140 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ +285 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java": [ +104 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/BufferedResponseHandler.java": [ +62 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java": [ +114, +645, +919, +1737 +], +"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java": [ +148 +] +} diff --git a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java index c0ccafad0b5..e5fcb6510b5 100644 --- a/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java +++ b/java-checks-test-sources/default/src/main/java/checks/JavadocReferencesExistingSymbolsCheckSample.java @@ -88,6 +88,38 @@ void simpleNameImportedLink() { void simpleNameSamePackage() { } + /** @see Example + */ // Compliant - HTML anchor @see tag + void htmlAnchorSeeTag() { + } + + /** @see "The Java Programming Language" + */ // Compliant - quoted string @see tag + void quotedStringSeeTag() { + } + + /** @see InnerClass + */ // Compliant - inner type of the current class + void innerTypeReference() { + } + + /** {@link InnerEnum} + */ // Compliant - inner enum of the current class + void innerEnumReference() { + } + + /** @see Map.Entry + */ // Compliant - inner type via imported outer class + void innerTypeViaImport() { + } + void existingMethod() { } + + static class InnerClass { + } + + enum InnerEnum { + VALUE + } } diff --git a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java index 9b59eb54f19..0e701179d1b 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java @@ -19,8 +19,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.sonar.check.Rule; @@ -29,6 +31,7 @@ import org.sonar.plugins.java.api.JavaFileScannerContext; import org.sonar.plugins.java.api.semantic.Sema; import org.sonar.plugins.java.api.semantic.Type; +import org.sonar.plugins.java.api.tree.ClassTree; import org.sonar.plugins.java.api.tree.CompilationUnitTree; import org.sonar.plugins.java.api.tree.ExpressionTree; import org.sonar.plugins.java.api.tree.ImportTree; @@ -46,12 +49,14 @@ public class JavadocReferencesExistingSymbolsCheck extends IssuableSubscriptionV private String currentPackage = ""; private final Map importedSimpleNames = new HashMap<>(); + private final Set declaredTypeSimpleNames = new HashSet<>(); @Override public void setContext(JavaFileScannerContext context) { super.setContext(context); currentPackage = ""; importedSimpleNames.clear(); + declaredTypeSimpleNames.clear(); Tree tree = context.getTree(); if (tree != null && tree.is(Tree.Kind.COMPILATION_UNIT)) { CompilationUnitTree cut = (CompilationUnitTree) tree; @@ -60,6 +65,7 @@ public void setContext(JavaFileScannerContext context) { currentPackage = ExpressionsHelper.concatenate(pkg.packageName()); } collectImports(cut); + collectDeclaredTypes(cut); } } @@ -78,6 +84,25 @@ private void collectImports(CompilationUnitTree cut) { }); } + private void collectDeclaredTypes(CompilationUnitTree cut) { + for (Tree typeTree : cut.types()) { + collectDeclaredTypesFromTree(typeTree); + } + } + + private void collectDeclaredTypesFromTree(Tree tree) { + if (!tree.is(Tree.Kind.CLASS_KINDS.toArray(new Tree.Kind[0]))) { + return; + } + ClassTree classTree = (ClassTree) tree; + if (classTree.simpleName() != null) { + declaredTypeSimpleNames.add(classTree.simpleName().name()); + } + for (Tree member : classTree.members()) { + collectDeclaredTypesFromTree(member); + } + } + @Override public List nodesToVisit() { return Collections.singletonList(Tree.Kind.TRIVIA); @@ -144,12 +169,16 @@ static String stripMemberReference(String reference) { } private boolean isUnresolvableReference(Sema sema, String typeName) { - // If already fully qualified, check directly + // If already fully qualified (contains dots), check directly and with inner-class $ notation if (typeName.contains(".")) { - return isUnknownType(sema, typeName); + if (!isUnknownType(sema, typeName)) { + return false; + } + // Try interpreting dots as inner class separators (e.g., Outer.Inner -> pkg.Outer$Inner) + return isUnresolvableInnerClassReference(sema, typeName); } - // Simple name: try imports, then java.lang, then current package + // Simple name: try imports, then java.lang, then current package, then locally declared types String importedFqn = importedSimpleNames.get(typeName); if (importedFqn != null) { return isUnknownType(sema, importedFqn); @@ -159,7 +188,40 @@ private boolean isUnresolvableReference(Sema sema, String typeName) { return false; } - return currentPackage.isEmpty() || isUnknownType(sema, currentPackage + "." + typeName); + if (!currentPackage.isEmpty() && !isUnknownType(sema, currentPackage + "." + typeName)) { + return false; + } + + // Check if it matches a type declared in the current file (handles inner types) + return !declaredTypeSimpleNames.contains(typeName); + } + + private boolean isUnresolvableInnerClassReference(Sema sema, String typeName) { + // For dotted references like "Outer.Inner", try replacing dots with $ for inner class resolution + // Try with current package prefix and $ notation + int lastDot = typeName.lastIndexOf('.'); + while (lastDot > 0) { + String withDollar = typeName.substring(0, lastDot) + "$" + typeName.substring(lastDot + 1); + if (!isUnknownType(sema, withDollar)) { + return false; + } + if (!currentPackage.isEmpty() && !isUnknownType(sema, currentPackage + "." + withDollar)) { + return false; + } + // Try imported prefix + String outerName = typeName.substring(0, lastDot); + int outerLastDot = outerName.lastIndexOf('.'); + String outerSimple = outerLastDot >= 0 ? outerName.substring(outerLastDot + 1) : outerName; + String importedOuter = importedSimpleNames.get(outerSimple); + if (importedOuter != null) { + String resolvedInner = importedOuter + "$" + typeName.substring(lastDot + 1); + if (!isUnknownType(sema, resolvedInner)) { + return false; + } + } + lastDot = typeName.lastIndexOf('.', lastDot - 1); + } + return true; } private static boolean isUnknownType(Sema sema, String fullyQualifiedName) { @@ -178,7 +240,7 @@ static List extractSeeReferences(String javadocText) { Matcher matcher = SEE_TAG_PATTERN.matcher(javadocText); while (matcher.find()) { String ref = matcher.group(1); - if (!ref.startsWith("http://") && !ref.startsWith("https://")) { + if (!ref.startsWith("http://") && !ref.startsWith("https://") && !ref.startsWith("<") && !ref.startsWith("\"")) { references.add(ref); } } diff --git a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java index 3430b29ea6f..6f886c45a7e 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java @@ -56,6 +56,20 @@ void extractSeeReferences_skips_urls() { assertThat(refs).isEmpty(); } + @Test + void extractSeeReferences_skips_html_anchors() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** @see Example */"); + assertThat(refs).isEmpty(); + } + + @Test + void extractSeeReferences_skips_quoted_strings() { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( + "/** @see \"The Java Programming Language\" */"); + assertThat(refs).isEmpty(); + } + @Test void extractSeeReferences_extracts_link_tags() { List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( From 2768a74b87dc096c73295de09c44e2f4598d07d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 13:54:29 +0100 Subject: [PATCH 07/12] Update ruling results for PR #6005 (#6013) Co-authored-by: github-actions[bot] From 138c3b098d11df46ccc1f38d3ffec7176d8cd25e Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 14:58:26 +0200 Subject: [PATCH 08/12] SONARJAVA-6825: Fix SonarQube issues and improve S9360 inner class handling - Remove dead-code condition in setContext (S2589: getTree() is non-null) - Hoist Tree.Kind[] allocation to static final constant - Fix multi-level nested inner class resolution (e.g., Outer.Inner.Deep) - Convert skip tests to parameterized test (S5976) Co-Authored-By: Claude Opus 4.6 --- ...JavadocReferencesExistingSymbolsCheck.java | 40 +++++++++---------- ...docReferencesExistingSymbolsCheckTest.java | 30 +++++++------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java index 0e701179d1b..293c4e57d7b 100644 --- a/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java +++ b/java-checks/src/main/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheck.java @@ -46,6 +46,7 @@ public class JavadocReferencesExistingSymbolsCheck extends IssuableSubscriptionV private static final Pattern SEE_TAG_PATTERN = Pattern.compile("@see\\s++(\\S++)"); private static final Pattern LINK_TAG_PATTERN = Pattern.compile("\\{@link(?:plain)?\\s++([^\\s}]+)"); private static final String JAVA_LANG_PREFIX = "java.lang."; + private static final Tree.Kind[] CLASS_KINDS = Tree.Kind.CLASS_KINDS.toArray(new Tree.Kind[0]); private String currentPackage = ""; private final Map importedSimpleNames = new HashMap<>(); @@ -57,16 +58,13 @@ public void setContext(JavaFileScannerContext context) { currentPackage = ""; importedSimpleNames.clear(); declaredTypeSimpleNames.clear(); - Tree tree = context.getTree(); - if (tree != null && tree.is(Tree.Kind.COMPILATION_UNIT)) { - CompilationUnitTree cut = (CompilationUnitTree) tree; - PackageDeclarationTree pkg = cut.packageDeclaration(); - if (pkg != null) { - currentPackage = ExpressionsHelper.concatenate(pkg.packageName()); - } - collectImports(cut); - collectDeclaredTypes(cut); + CompilationUnitTree cut = context.getTree(); + PackageDeclarationTree pkg = cut.packageDeclaration(); + if (pkg != null) { + currentPackage = ExpressionsHelper.concatenate(pkg.packageName()); } + collectImports(cut); + collectDeclaredTypes(cut); } private void collectImports(CompilationUnitTree cut) { @@ -91,7 +89,7 @@ private void collectDeclaredTypes(CompilationUnitTree cut) { } private void collectDeclaredTypesFromTree(Tree tree) { - if (!tree.is(Tree.Kind.CLASS_KINDS.toArray(new Tree.Kind[0]))) { + if (!tree.is(CLASS_KINDS)) { return; } ClassTree classTree = (ClassTree) tree; @@ -197,11 +195,14 @@ private boolean isUnresolvableReference(Sema sema, String typeName) { } private boolean isUnresolvableInnerClassReference(Sema sema, String typeName) { - // For dotted references like "Outer.Inner", try replacing dots with $ for inner class resolution - // Try with current package prefix and $ notation - int lastDot = typeName.lastIndexOf('.'); - while (lastDot > 0) { - String withDollar = typeName.substring(0, lastDot) + "$" + typeName.substring(lastDot + 1); + // For dotted references like "Outer.Inner" or "pkg.Outer.Inner.Deep", + // try interpreting trailing dots as inner class separators (replacing with $). + // We split on dots and try each possible split point between package/outer and inner classes. + int firstDot = typeName.indexOf('.'); + while (firstDot > 0 && firstDot < typeName.length() - 1) { + String prefix = typeName.substring(0, firstDot); + String suffix = typeName.substring(firstDot + 1).replace('.', '$'); + String withDollar = prefix + "$" + suffix; if (!isUnknownType(sema, withDollar)) { return false; } @@ -209,17 +210,16 @@ private boolean isUnresolvableInnerClassReference(Sema sema, String typeName) { return false; } // Try imported prefix - String outerName = typeName.substring(0, lastDot); - int outerLastDot = outerName.lastIndexOf('.'); - String outerSimple = outerLastDot >= 0 ? outerName.substring(outerLastDot + 1) : outerName; + int prefixLastDot = prefix.lastIndexOf('.'); + String outerSimple = prefixLastDot >= 0 ? prefix.substring(prefixLastDot + 1) : prefix; String importedOuter = importedSimpleNames.get(outerSimple); if (importedOuter != null) { - String resolvedInner = importedOuter + "$" + typeName.substring(lastDot + 1); + String resolvedInner = importedOuter + "$" + suffix; if (!isUnknownType(sema, resolvedInner)) { return false; } } - lastDot = typeName.lastIndexOf('.', lastDot - 1); + firstDot = typeName.indexOf('.', firstDot + 1); } return true; } diff --git a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java index 6f886c45a7e..860718eec5a 100644 --- a/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java +++ b/java-checks/src/test/java/org/sonar/java/checks/JavadocReferencesExistingSymbolsCheckTest.java @@ -17,7 +17,11 @@ package org.sonar.java.checks; import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.sonar.java.checks.verifier.CheckVerifier; import static org.assertj.core.api.Assertions.assertThat; @@ -49,24 +53,18 @@ void extractSeeReferences_extracts_see_tags() { assertThat(refs).containsExactly("java.util.List"); } - @Test - void extractSeeReferences_skips_urls() { - List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( - "/** @see http://example.com @see https://example.com */"); - assertThat(refs).isEmpty(); - } - - @Test - void extractSeeReferences_skips_html_anchors() { - List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( - "/** @see Example */"); - assertThat(refs).isEmpty(); + static Stream nonReferenceInputs() { + return Stream.of( + Arguments.of("URLs", "/** @see http://example.com @see https://example.com */"), + Arguments.of("HTML anchors", "/** @see Example */"), + Arguments.of("quoted strings", "/** @see \"The Java Programming Language\" */") + ); } - @Test - void extractSeeReferences_skips_quoted_strings() { - List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences( - "/** @see \"The Java Programming Language\" */"); + @ParameterizedTest(name = "extractSeeReferences skips {0}") + @MethodSource("nonReferenceInputs") + void extractSeeReferences_skips_non_references(String description, String javadoc) { + List refs = JavadocReferencesExistingSymbolsCheck.extractSeeReferences(javadoc); assertThat(refs).isEmpty(); } From c66f3c6ddc6be6316bc427fad6246bdf9750c897 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:13:13 +0100 Subject: [PATCH 09/12] Update ruling results for PR #6005 (#6015) Co-authored-by: github-actions[bot] --- .../commons-beanutils/java-S9360.json | 89 -------- .../resources/eclipse-jetty/java-S9360.json | 214 +----------------- .../src/test/resources/guava/java-S9360.json | 174 +------------- .../resources/sonar-server/java-S9360.json | 130 ----------- 4 files changed, 13 insertions(+), 594 deletions(-) diff --git a/its/ruling/src/test/resources/commons-beanutils/java-S9360.json b/its/ruling/src/test/resources/commons-beanutils/java-S9360.json index 189de505325..02372bac91b 100644 --- a/its/ruling/src/test/resources/commons-beanutils/java-S9360.json +++ b/its/ruling/src/test/resources/commons-beanutils/java-S9360.json @@ -3,94 +3,5 @@ 251, 574, 935 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira157TestCase.java": [ -39 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira18TestCase.java": [ -34 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira273TestCase.java": [ -33 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira298TestCase.java": [ -34 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira339TestCase.java": [ -34 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira345TestCase.java": [ -27 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira347TestCase.java": [ -36 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira349TestCase.java": [ -29 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira357TestCase.java": [ -29 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira358TestCase.java": [ -28 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira359TestCase.java": [ -30 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira368TestCase.java": [ -27 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira369TestCase.java": [ -27 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira381TestCase.java": [ -30 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira411TestCase.java": [ -28 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira422TestCase.java": [ -43, -50 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira422bTestCase.java": [ -29 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira458TestCase.java": [ -31 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira463TestCase.java": [ -29 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira465TestCase.java": [ -33 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira492TestCase.java": [ -42 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira493TestCase.java": [ -29 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira520TestCase.java": [ -29 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira61TestCase.java": [ -44 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira87TestCase.java": [ -41 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/Jira92TestCase.java": [ -28 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/other/Jira273BeanFactory.java": [ -32, -47 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/other/Jira492IndexedListsSupport.java": [ -33 -], -"commons-beanutils:commons-beanutils:src/test/java/org/apache/commons/beanutils2/bugs/other/Jira61BeanFactory.java": [ -34 ] } diff --git a/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json index 74892f6c460..40c3e4c3556 100644 --- a/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json +++ b/its/ruling/src/test/resources/eclipse-jetty/java-S9360.json @@ -1,78 +1,7 @@ { -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ -42, -133, -205, -224, -238 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java": [ -43 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ -89, -1456 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java": [ -27 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java": [ -51 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSV.java": [ -35 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSVParser.java": [ -28 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedQualityCSV.java": [ -40, -49 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [ -40 -], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ 61 ], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java": [ -109 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/CyclicTimeout.java": [ -50 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java": [ -299 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java": [ -245, -468 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ -400 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ -80 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java": [ -239 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AcceptRateLimit.java": [ -62 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java": [ -92, -102, -106, -110, -125 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionLimit.java": [ -60 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ 54 ], @@ -81,74 +10,15 @@ 48, 77 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [ -362 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java": [ -63 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java": [ -146, -1068 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [ -32 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ -477 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java": [ -157, -302, -368 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ 322 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java": [ -142, -1332 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [ -82 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ -39, 192 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java": [ -49 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [ 759, -768, -1576, -1886 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java": [ -131, -140 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ -285 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java": [ -104 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/BufferedResponseHandler.java": [ -62 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java": [ -114, -645, -919, -1737 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java": [ -148 +768 ], "org.eclipse.jetty:jetty-project:jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/AsyncJSON.java": [ 71, @@ -157,89 +27,7 @@ 170, 183 ], -"org.eclipse.jetty:jetty-project:jetty-util-ajax/src/main/java/org/eclipse/jetty/util/ajax/JSON.java": [ -82, -529, -540, -551, -562, -577, -603, -1523, -1549, -1565, -1590 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Attributes.java": [ -49, -64 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Fields.java": [ -38, -130, -141, -153, -166, -189, -223 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/IncludeExcludeSet.java": [ -84 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/IteratingCallback.java": [ -56, -89, -158 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/PathWatcher.java": [ -67 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Pool.java": [ -148, -399 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java": [ -64 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ServiceLoaderSpliterator.java": [ -77 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/TypeUtil.java": [ -803 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/Container.java": [ -101 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/component/Graceful.java": [ -148 -], "org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/compression/CompressionPool.java": [ 43 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SniX509ExtendedKeyManager.java": [ -89, -250 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/ssl/SslContextFactory.java": [ -102 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutionStrategy.java": [ -27 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ExecutorThreadPool.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/Invocable.java": [ -97 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/Sweeper.java": [ -72, -186 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPool.java": [ -31 -], -"org.eclipse.jetty:jetty-project:jetty-util/src/main/java/org/eclipse/jetty/util/thread/ThreadPoolBudget.java": [ -34 ] } diff --git a/its/ruling/src/test/resources/guava/java-S9360.json b/its/ruling/src/test/resources/guava/java-S9360.json index b55b08a464c..80b6ef94754 100644 --- a/its/ruling/src/test/resources/guava/java-S9360.json +++ b/its/ruling/src/test/resources/guava/java-S9360.json @@ -1,8 +1,6 @@ { "com.google.guava:guava:src/com/google/common/annotations/GwtCompatible.java": [ -63, -76, -86 +63 ], "com.google.guava:guava:src/com/google/common/base/CharMatcher.java": [ 155, @@ -14,16 +12,13 @@ 280, 286, 565, -605, -968, -983 +605 ], "com.google.guava:guava:src/com/google/common/base/Converter.java": [ 92, 135 ], "com.google.guava:guava:src/com/google/common/base/Equivalence.java": [ -151, 245, 325 ], @@ -38,7 +33,6 @@ ], "com.google.guava:guava:src/com/google/common/base/Functions.java": [ 110, -211, 258 ], "com.google.guava:guava:src/com/google/common/base/Joiner.java": [ @@ -47,17 +41,10 @@ 401 ], "com.google.guava:guava:src/com/google/common/base/MoreObjects.java": [ -97, 112, -125, -156 +125 ], "com.google.guava:guava:src/com/google/common/base/Objects.java": [ -128, -146, -162, -201, -222, 389 ], "com.google.guava:guava:src/com/google/common/base/Optional.java": [ @@ -85,8 +72,7 @@ ], "com.google.guava:guava:src/com/google/common/cache/AbstractCache.java": [ 142, -189, -203 +189 ], "com.google.guava:guava:src/com/google/common/cache/CacheBuilder.java": [ 150, @@ -95,11 +81,6 @@ 730 ], "com.google.guava:guava:src/com/google/common/cache/LocalCache.java": [ -1806, -1820, -1830, -1857, -1884, 2807 ], "com.google.guava:guava:src/com/google/common/cache/LongAdder.java": [ @@ -114,9 +95,6 @@ 90, 353 ], -"com.google.guava:guava:src/com/google/common/collect/AbstractMapBasedMultiset.java": [ -78 -], "com.google.guava:guava:src/com/google/common/collect/AbstractMultiset.java": [ 227 ], @@ -191,9 +169,6 @@ 300, 311 ], -"com.google.guava:guava:src/com/google/common/collect/ForwardingNavigableMap.java": [ -349 -], "com.google.guava:guava:src/com/google/common/collect/ForwardingObject.java": [ 51, 64 @@ -226,12 +201,6 @@ "com.google.guava:guava:src/com/google/common/collect/HashMultimap.java": [ 48 ], -"com.google.guava:guava:src/com/google/common/collect/ImmutableBiMap.java": [ -96 -], -"com.google.guava:guava:src/com/google/common/collect/ImmutableClassToInstanceMap.java": [ -64 -], "com.google.guava:guava:src/com/google/common/collect/ImmutableCollection.java": [ 150 ], @@ -241,33 +210,13 @@ "com.google.guava:guava:src/com/google/common/collect/ImmutableEnumSet.java": [ 30 ], -"com.google.guava:guava:src/com/google/common/collect/ImmutableList.java": [ -613 -], -"com.google.guava:guava:src/com/google/common/collect/ImmutableListMultimap.java": [ -117 -], -"com.google.guava:guava:src/com/google/common/collect/ImmutableMap.java": [ -119, -127 -], "com.google.guava:guava:src/com/google/common/collect/ImmutableMultimap.java": [ -67, -124, -133 -], -"com.google.guava:guava:src/com/google/common/collect/ImmutableMultiset.java": [ -413 +67 ], "com.google.guava:guava:src/com/google/common/collect/ImmutableSet.java": [ 58, 231, -261, -396 -], -"com.google.guava:guava:src/com/google/common/collect/ImmutableSetMultimap.java": [ -132, -140 +261 ], "com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMap.java": [ 55, @@ -282,8 +231,7 @@ 108 ], "com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMultiset.java": [ -47, -362 +47 ], "com.google.guava:guava:src/com/google/common/collect/ImmutableSortedMultisetFauxverideShim.java": [ 98, @@ -294,7 +242,6 @@ 55, 199, 347, -397, 416 ], "com.google.guava:guava:src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java": [ @@ -307,8 +254,6 @@ 145 ], "com.google.guava:guava:src/com/google/common/collect/ImmutableTable.java": [ -75, -111, 149, 191 ], @@ -358,8 +303,7 @@ 215, 249, 267, -290, -518 +290 ], "com.google.guava:guava:src/com/google/common/collect/MapDifference.java": [ 69 @@ -369,17 +313,10 @@ 143, 260, 328, -476, -673, 721, 732 ], "com.google.guava:guava:src/com/google/common/collect/MapMakerInternalMap.java": [ -1825, -1834, -1844, -1871, -1896, 2473 ], "com.google.guava:guava:src/com/google/common/collect/Maps.java": [ @@ -410,13 +347,11 @@ "com.google.guava:guava:src/com/google/common/collect/MinMaxPriorityQueue.java": [ 102, 167, -394, 902 ], "com.google.guava:guava:src/com/google/common/collect/Multimap.java": [ 162, 282, -337, 351 ], "com.google.guava:guava:src/com/google/common/collect/Multimaps.java": [ @@ -432,10 +367,7 @@ ], "com.google.guava:guava:src/com/google/common/collect/Multisets.java": [ 55, -196, -798, -803, -816 +196 ], "com.google.guava:guava:src/com/google/common/collect/MutableClassToInstanceMap.java": [ 43 @@ -477,11 +409,7 @@ 364, 543, 1089, -1149, -1263 -], -"com.google.guava:guava:src/com/google/common/collect/SortedLists.java": [ -253 +1149 ], "com.google.guava:guava:src/com/google/common/collect/StandardRowSortedTable.java": [ 48 @@ -527,9 +455,6 @@ "com.google.guava:guava:src/com/google/common/hash/AbstractNonStreamingHashFunction.java": [ 31 ], -"com.google.guava:guava:src/com/google/common/io/BaseEncoding.java": [ -234 -], "com.google.guava:guava:src/com/google/common/io/CharStreams.java": [ 250 ], @@ -558,13 +483,6 @@ 126, 146 ], -"com.google.guava:guava:src/com/google/common/math/IntMath.java": [ -349 -], -"com.google.guava:guava:src/com/google/common/math/LongMath.java": [ -418, -442 -], "com.google.guava:guava:src/com/google/common/net/InternetDomainName.java": [ 74 ], @@ -620,12 +538,6 @@ "com.google.guava:guava:src/com/google/common/primitives/UnsignedBytes.java": [ 284 ], -"com.google.guava:guava:src/com/google/common/primitives/UnsignedInts.java": [ -159 -], -"com.google.guava:guava:src/com/google/common/primitives/UnsignedLongs.java": [ -160 -], "com.google.guava:guava:src/com/google/common/reflect/AbstractInvocationHandler.java": [ 62 ], @@ -649,25 +561,11 @@ ], "com.google.guava:guava:src/com/google/common/util/concurrent/AbstractFuture.java": [ 62, -289, -466, 501, -775, -835, -838, -856, -926 +775 ], "com.google.guava:guava:src/com/google/common/util/concurrent/AbstractScheduledService.java": [ 95, -111, -121, -142, -264, -284, -301, -412, -418, 567 ], "com.google.guava:guava:src/com/google/common/util/concurrent/AbstractService.java": [ @@ -675,22 +573,12 @@ 329, 354 ], -"com.google.guava:guava:src/com/google/common/util/concurrent/AggregateFuture.java": [ -260 -], "com.google.guava:guava:src/com/google/common/util/concurrent/AtomicDouble.java": [ 54 ], "com.google.guava:guava:src/com/google/common/util/concurrent/AtomicDoubleArray.java": [ 41 ], -"com.google.guava:guava:src/com/google/common/util/concurrent/CycleDetectingLockFactory.java": [ -163, -174, -196, -607, -723 -], "com.google.guava:guava:src/com/google/common/util/concurrent/ExecutionError.java": [ 34 ], @@ -699,27 +587,14 @@ 53, 140 ], -"com.google.guava:guava:src/com/google/common/util/concurrent/ForwardingCheckedFuture.java": [ -39 -], -"com.google.guava:guava:src/com/google/common/util/concurrent/ForwardingFuture.java": [ -37 -], -"com.google.guava:guava:src/com/google/common/util/concurrent/ForwardingListenableFuture.java": [ -35 -], "com.google.guava:guava:src/com/google/common/util/concurrent/FutureCallback.java": [ 49 ], "com.google.guava:guava:src/com/google/common/util/concurrent/Futures.java": [ 495, -806, -827, 871, 1055, 1269, -1426, -1446, 1482, 1745, 1821, @@ -749,43 +624,18 @@ "com.google.guava:guava:src/com/google/common/util/concurrent/RateLimiter.java": [ 92 ], -"com.google.guava:guava:src/com/google/common/util/concurrent/Service.java": [ -53, -64, -69, -86, -98, -114, -123, -136, -145, -170, -182, -260, -266, -275, -287, -299 -], "com.google.guava:guava:src/com/google/common/util/concurrent/ServiceManager.java": [ -121, 144, 154, 160, 167, -177, 188, -236, -256, 268, 296, 311, 333, -346, 356, -396, -487, -710 +487 ], "com.google.guava:guava:src/com/google/common/util/concurrent/SimpleTimeLimiter.java": [ 65, diff --git a/its/ruling/src/test/resources/sonar-server/java-S9360.json b/its/ruling/src/test/resources/sonar-server/java-S9360.json index 0eee3a01d16..305898623dd 100644 --- a/its/ruling/src/test/resources/sonar-server/java-S9360.json +++ b/its/ruling/src/test/resources/sonar-server/java-S9360.json @@ -1,61 +1,7 @@ { -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/ce/queue/CeQueue.java": [ -66, -76 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/ce/queue/CeTaskResult.java": [ 29 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/api/posttask/ConditionToCondition.java": [ -35 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/Component.java": [ -92, -99, -106, -113 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/ComponentRootBuilder.java": [ -57 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/FileAttributes.java": [ -30 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/PathAwareCrawler.java": [ -147 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/PathAwareVisitor.java": [ -35, -40, -45, -50, -55, -60, -65, -118 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/TypeAwareVisitor.java": [ -28, -33, -38, -43, -48, -53, -58 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/component/TypeAwareVisitorAdapter.java": [ -49, -57, -65, -73, -81, -89, -97 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/duplication/DuplicationRepository.java": [ -41, -49 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/event/EventRepository.java": [ 30 ], @@ -65,97 +11,21 @@ "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/formula/Counter.java": [ 38 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ComponentIssuesRepository.java": [ -33 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/IssueCounter.java": [ -267 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/issue/commonrule/CommonRule.java": [ -66 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/measure/Measure.java": [ -239, -249, -259, -269, -279, -289, -300 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/metric/Metric.java": [ -55 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/ConditionStatus.java": [ -55 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/qualitygate/MutableQualityGateHolder.java": [ 40 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/scm/DbScmInfo.java": [ -87 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/scm/ScmInfoRepository.java": [ -42 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/DuplicationLineReader.java": [ -66, 82 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceHashRepository.java": [ -36 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/source/SourceLinesRepository.java": [ 39 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/AbstractComputationSteps.java": [ -30 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/projectanalysis/step/NewCoverageMeasuresStep.java": [ -141 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/computation/task/step/ComputationStepExecutor.java": [ -38 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/BulkIndexer.java": [ -238 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexDefinitions.java": [ -70 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/es/IndexingResult.java": [ 67 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/index/AuthorizationTypeSupport.java": [ -81 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/permission/ws/template/DefaultTemplatesResolver.java": [ -39 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/requestid/RequestIdGeneratorBase.java": [ -27 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/platform/web/requestid/RequestIdGeneratorImpl.java": [ -39, -54, -87 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/qualityprofile/BuiltInQProfileRepositoryImpl.java": [ -153, -168 -], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/rule/ws/RuleMapper.java": [ -71 -], "org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/setting/ThreadLocalSettings.java": [ 51 ], -"org.sonarsource.sonarqube:sonar-server:src/main/java/org/sonar/server/user/DoPrivileged.java": [ -41 -], -"org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/authentication/OAuth2CallbackFilterTest.java": [ -221 -], "org.sonarsource.sonarqube:sonar-server:src/test/java/org/sonar/server/computation/task/projectanalysis/step/PersistScannerContextStepTest.java": [ 85 ] From c1bcd9bd668cc7da09d003a07b6870df91b07fcc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 24 Aug 2026 13:32:03 +0000 Subject: [PATCH 10/12] Update ruling results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with GitHub Actions --- .../java-S9360.json | 132 +----------------- 1 file changed, 1 insertion(+), 131 deletions(-) diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json index ffaa98e75da..20dc4c8ec75 100644 --- a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json @@ -1,78 +1,7 @@ { -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ -42, -133, -205, -224, -238 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java": [ -43 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ -89, -1456 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java": [ -27 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java": [ -51 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSV.java": [ -35 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSVParser.java": [ -28 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedQualityCSV.java": [ -40, -49 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [ -40 -], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ 61 ], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java": [ -109 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/CyclicTimeout.java": [ -50 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java": [ -299 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java": [ -245, -468 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ -400 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ -80 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java": [ -239 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AcceptRateLimit.java": [ -62 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java": [ -92, -102, -106, -110, -125 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionLimit.java": [ -60 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ 54 ], @@ -81,73 +10,14 @@ 48, 77 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [ -362 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java": [ -63 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java": [ -146, -1068 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [ -32 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ -477 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java": [ -157, -302, -368 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ 322 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java": [ -142, -1332 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [ -82 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ -39, 192 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java": [ -49 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [ 759, -768, -1576, -1886 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java": [ -131, -140 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ -285 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java": [ -104 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/BufferedResponseHandler.java": [ -62 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java": [ -114, -645, -919, -1737 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java": [ -148 +768 ] } From 9e7b106c89143421e7963d17ff5e37094206b797 Mon Sep 17 00:00:00 2001 From: Romain Brenguier Date: Mon, 24 Aug 2026 15:36:38 +0200 Subject: [PATCH 11/12] SONARJAVA-6825: Update eclipse-jetty-similar-to-main ruling baseline for S9360 Remove false positives from the ruling baseline that were eliminated by the improved import resolution and inner class handling in S9360. Co-Authored-By: Claude Opus 4.6 --- .../java-S9360.json | 133 +----------------- 1 file changed, 1 insertion(+), 132 deletions(-) diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json index ffaa98e75da..219c626e68d 100644 --- a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json @@ -1,153 +1,22 @@ { -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpCompliance.java": [ -42, -133, -205, -224, -238 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpFields.java": [ -43 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpParser.java": [ -89, -1456 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpStatus.java": [ -27 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/HttpURI.java": [ -51 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSV.java": [ -35 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedCSVParser.java": [ -28 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/QuotedQualityCSV.java": [ -40, -49 -], -"org.eclipse.jetty:jetty-project:jetty-http/src/main/java/org/eclipse/jetty/http/pathmap/UriTemplatePathSpec.java": [ -40 -], "org.eclipse.jetty:jetty-project:jetty-http/src/test/java/org/eclipse/jetty/http/HttpParserTest.java": [ 61 ], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/Connection.java": [ -109 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ConnectionStatistics.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/CyclicTimeout.java": [ -50 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/EndPoint.java": [ -299 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ManagedSelector.java": [ -245, -468 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/SelectorManager.java": [ -400 -], -"org.eclipse.jetty:jetty-project:jetty-io/src/main/java/org/eclipse/jetty/io/ssl/SslConnection.java": [ -80 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java": [ -239 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/AcceptRateLimit.java": [ -62 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java": [ -92, -102, -106, -110, -125 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionLimit.java": [ -60 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DebugListener.java": [ 54 ], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DetectorConnectionFactory.java": [ -37, 48, 77 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Dispatcher.java": [ -362 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ForwardedRequestCustomizer.java": [ -63 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HostHeaderCustomizer.java": [ -40 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java": [ -146, -1068 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelListeners.java": [ -32 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannelOverHttp.java": [ -477 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java": [ -157, -302, -368 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java": [ 322 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/HttpOutput.java": [ -142, -1332 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartFormInputStream.java": [ -82 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/MultiPartParser.java": [ -39, 192 ], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/ProxyConnectionFactory.java": [ -49 -], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Request.java": [ 759, -768, -1576, -1886 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java": [ -131, -140 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/Server.java": [ -285 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/SslConnectionFactory.java": [ -104 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/BufferedResponseHandler.java": [ -62 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java": [ -114, -645, -919, -1737 -], -"org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java": [ -148 +768 ] } From fb011773ae743265101a15e3eaf3cd5ec68a58b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 15:08:20 +0100 Subject: [PATCH 12/12] Update ruling results for PR #6005 (#6017) Co-authored-by: github-actions[bot] --- .../test/resources/eclipse-jetty-similar-to-main/java-S9360.json | 1 + 1 file changed, 1 insertion(+) diff --git a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json index 219c626e68d..20dc4c8ec75 100644 --- a/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json +++ b/its/ruling/src/test/resources/eclipse-jetty-similar-to-main/java-S9360.json @@ -6,6 +6,7 @@ 54 ], "org.eclipse.jetty:jetty-project:jetty-server/src/main/java/org/eclipse/jetty/server/DetectorConnectionFactory.java": [ +37, 48, 77 ],