From f59ac04880cd4cff2ba89e44830da002ae623257 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 24 Apr 2025 21:39:48 -0400 Subject: [PATCH 1/5] Javadoc site crawler --- .github/workflows/javadoc-crawler.yml | 26 +++ javadoc-crawler/README.md | 20 ++ javadoc-crawler/build.gradle.kts | 26 +++ .../io/opentelemetry/javadocs/Artifact.java | 8 + .../javadocs/JavaDocsCrawler.java | 175 ++++++++++++++++++ .../javadocs/JavaDocsCrawlerTest.java | 96 ++++++++++ settings.gradle.kts | 1 + 7 files changed, 352 insertions(+) create mode 100644 .github/workflows/javadoc-crawler.yml create mode 100644 javadoc-crawler/README.md create mode 100644 javadoc-crawler/build.gradle.kts create mode 100644 javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java create mode 100644 javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java create mode 100644 javadoc-crawler/src/test/java/io/opentelemetry/javadocs/JavaDocsCrawlerTest.java diff --git a/.github/workflows/javadoc-crawler.yml b/.github/workflows/javadoc-crawler.yml new file mode 100644 index 00000000000..9275265dd79 --- /dev/null +++ b/.github/workflows/javadoc-crawler.yml @@ -0,0 +1,26 @@ +name: Javadoc.io site crawler (daily) + +on: + schedule: + - cron: "30 1 * * *" # daily at 1:30 UTC + workflow_dispatch: + +permissions: + contents: read + +jobs: + crawl: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + with: + distribution: temurin + java-version: 17 + + - name: Set up gradle + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + + - name: Run crawler + run: ./gradlew :javadoc-crawler:crawl diff --git a/javadoc-crawler/README.md b/javadoc-crawler/README.md new file mode 100644 index 00000000000..4d44d0887bb --- /dev/null +++ b/javadoc-crawler/README.md @@ -0,0 +1,20 @@ +# Javadoc Crawler + +## Context + +The javadocs.io website lazy loads content only when the artifacts have been accessed, which can +lead to inaccuracies and confusion when someone loads the +https://www.javadoc.io/doc/io.opentelemetry page, since the published `Latest version` will only be +accurate if someone has accessed the page for the actual latest version. + +This module provides a simple scraper that pulls the list of all `io.opentelemetry` artifacts from +maven central and then visits each corresponding page on the javadoc.io website in order to trigger +loading them into the site's system. + +See https://github.com/open-telemetry/opentelemetry-java/issues/7294 for more information. + +## How to run + +```bash +./gradlew :javadoc-crawler:crawl +``` diff --git a/javadoc-crawler/build.gradle.kts b/javadoc-crawler/build.gradle.kts new file mode 100644 index 00000000000..4471e5cd604 --- /dev/null +++ b/javadoc-crawler/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + implementation("com.fasterxml.jackson.core:jackson-databind") + testImplementation("org.assertj:assertj-core:3.27.3") +} + +description = "OpenTelemetry Javadoc Crawler" +otelJava.moduleName.set("io.opentelemetry.javadocs") + +tasks { + withType().configureEach { + sourceCompatibility = "17" + targetCompatibility = "17" + options.release.set(17) + } + + val crawl by registering(JavaExec::class) { + dependsOn(classes) + + mainClass.set("io.opentelemetry.javadocs.JavaDocsCrawler") + classpath(sourceSets["main"].runtimeClasspath) + } +} diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java new file mode 100644 index 00000000000..076af84fa09 --- /dev/null +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java @@ -0,0 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javadocs; + +record Artifact(String name, String version) {} diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java new file mode 100644 index 00000000000..6aa3598195b --- /dev/null +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java @@ -0,0 +1,175 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javadocs; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * The javadoc.io site relies on someone accessing the page for an artifact version in order to + * update the contents of the site. This will query Maven Central for all artifacts under + * io.opentelemetry in order to identify the latest versions. Then it will crawl the associated + * pages on the javadoc.io site to trigger updates. + */ +public final class JavaDocsCrawler { + private static final String GROUP = "io.opentelemetry"; + private static final String MAVEN_CENTRAL_BASE_URL = + "https://search.maven.org/solrsearch/select?q=g:"; + private static final String JAVA_DOCS_BASE_URL = "https://javadoc.io/doc/"; + private static final int PAGE_SIZE = 20; + private static final int THROTTLE_MS = 500; + + // visible for testing + static final String JAVA_DOC_DOWNLOADED_TEXT = "Javadoc is being downloaded"; + + private static final Logger logger = Logger.getLogger(JavaDocsCrawler.class.getName()); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public static void main(String[] args) throws Exception { + HttpClient client = HttpClient.newHttpClient(); + List artifacts = getArtifacts(client); + if (artifacts.isEmpty()) { + logger.log(Level.SEVERE, "No artifacts found"); + return; + } + logger.info(String.format(Locale.ROOT, "Found %d artifacts", artifacts.size())); + + List updated = crawlJavaDocs(client, artifacts); + if (updated.isEmpty()) { + logger.info("No updates were needed"); + return; + } + + logger.info("Artifacts that triggered updates:\n" + String.join("\n", updated)); + } + + static List getArtifacts(HttpClient client) throws IOException, InterruptedException { + int start = 0; + Integer numFound; + List result = new ArrayList<>(); + + do { + if (start != 0) { + Thread.sleep(THROTTLE_MS); // try not to DDoS the site, it gets knocked over easily + } + + Map map = queryMavenCentral(client, start); + + numFound = + Optional.ofNullable(map) + .map(mavenResult -> (Map) mavenResult.get("response")) + .map(response -> (Integer) response.get("numFound")) + .orElse(null); + + List artifacts = convertToArtifacts(map); + result.addAll(artifacts); + + start += PAGE_SIZE; + } while (numFound != null && start < numFound); + + return result; + } + + private static List convertToArtifacts(Map map) { + return Optional.ofNullable(map) + .map(mavenResults -> (Map) mavenResults.get("response")) + .map(response -> (List) response.get("docs")) + .map( + docs -> { + List artifacts = new ArrayList<>(); + for (Object doc : docs) { + Map docMap = (Map) doc; + String artifact = (String) docMap.get("a"); + String version = (String) docMap.get("latestVersion"); + if (artifact != null && version != null) { + artifacts.add(new Artifact(artifact, version)); + } + } + return artifacts; + }) + .orElseGet(ArrayList::new); + } + + private static Map queryMavenCentral(HttpClient client, int start) + throws IOException, InterruptedException { + URI uri = + URI.create( + String.format( + Locale.ROOT, + "%s%s&rows=%d&start=%d&wt=json", + MAVEN_CENTRAL_BASE_URL, + GROUP, + PAGE_SIZE, + start)); + + HttpRequest request = HttpRequest.newBuilder(uri).GET().build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() != 200) { + logger.log( + Level.SEVERE, "Unexpected response code: " + response.statusCode() + ": " + response); + throw new IOException("Unable to pull Maven central artifacts list"); + } + return objectMapper.readValue(response.body(), Map.class); + } + + static List crawlJavaDocs(HttpClient client, List artifacts) + throws IOException, InterruptedException { + List updatedArtifacts = new ArrayList<>(); + + for (Artifact artifact : artifacts) { + String[] parts = artifact.name().split("-"); + StringBuilder path = new StringBuilder(); + path.append(JAVA_DOCS_BASE_URL) + .append(GROUP) + .append("/") + .append(artifact.name()) + .append("/") + .append(artifact.version()) + .append("/") + .append(String.join("/", parts)) + .append("/package-summary.html"); + + HttpRequest crawlRequest = HttpRequest.newBuilder(URI.create(path.toString())).GET().build(); + HttpResponse crawlResponse = + client.send(crawlRequest, HttpResponse.BodyHandlers.ofString()); + + // gets a status code 303 when version exists and the site redirects it to use /latest/ + if (crawlResponse.statusCode() != 200 && crawlResponse.statusCode() != 303) { + logger.log( + Level.WARNING, + String.format( + Locale.ROOT, + "Crawl failed for %s with status code %d at URL %s\nResponse: %s", + artifact.name(), + crawlResponse.statusCode(), + path, + crawlResponse.body())); + continue; + } + + if (crawlResponse.body().contains(JAVA_DOC_DOWNLOADED_TEXT)) { + updatedArtifacts.add(artifact.name()); + } + + Thread.sleep(THROTTLE_MS); // some light throttling + } + return updatedArtifacts; + } + + private JavaDocsCrawler() {} +} diff --git a/javadoc-crawler/src/test/java/io/opentelemetry/javadocs/JavaDocsCrawlerTest.java b/javadoc-crawler/src/test/java/io/opentelemetry/javadocs/JavaDocsCrawlerTest.java new file mode 100644 index 00000000000..65ea5e7f9b4 --- /dev/null +++ b/javadoc-crawler/src/test/java/io/opentelemetry/javadocs/JavaDocsCrawlerTest.java @@ -0,0 +1,96 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javadocs; + +import static io.opentelemetry.javadocs.JavaDocsCrawler.JAVA_DOC_DOWNLOADED_TEXT; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class JavaDocsCrawlerTest { + @Mock HttpClient mockClient; + @Mock HttpResponse mockMavenCentralRequest1; + @Mock HttpResponse mockMavenCentralRequest2; + @Mock HttpResponse mockJavaDocResponse; + + @Test + void testGetArtifactsHandlesPagination() throws IOException, InterruptedException { + String page1Response = + """ + { + "response": { + "numFound": 40, + "docs": [ + {"a": "artifact1", "latestVersion": "1.0"}, + {"a": "artifact2", "latestVersion": "1.1"} + ] + } + } + """; + String page2Response = + """ + { + "response": { + "numFound": 40, + "docs": [ + {"a": "artifact3", "latestVersion": "2.0"} + ] + } + } + """; + + when(mockMavenCentralRequest1.body()).thenReturn(page1Response); + when(mockMavenCentralRequest1.statusCode()).thenReturn(200); + when(mockMavenCentralRequest2.body()).thenReturn(page2Response); + when(mockMavenCentralRequest2.statusCode()).thenReturn(200); + + when(mockClient.send(any(), any())) + .thenReturn(mockMavenCentralRequest1) + .thenReturn(mockMavenCentralRequest2); + + List artifacts = JavaDocsCrawler.getArtifacts(mockClient); + + // 2 calls for the pagination + verify(mockClient, times(2)).send(any(), any()); + assertThat(artifacts.size()).isEqualTo(3); + } + + @Test + void testCrawler() throws IOException, InterruptedException { + List artifacts = new ArrayList<>(); + artifacts.add(new Artifact("opentelemetry-context", "1.49.0")); + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(HttpRequest.class); + + when(mockJavaDocResponse.body()).thenReturn(JAVA_DOC_DOWNLOADED_TEXT); + when(mockJavaDocResponse.statusCode()).thenReturn(200); + + when(mockClient.send(any(), any())).thenReturn(mockJavaDocResponse); + + List updated = JavaDocsCrawler.crawlJavaDocs(mockClient, artifacts); + + verify(mockClient, times(1)).send(requestCaptor.capture(), any()); + + assertThat(requestCaptor.getValue().uri().toString()) + .isEqualTo( + "https://javadoc.io/doc/io.opentelemetry/opentelemetry-context/1.49.0/opentelemetry/context/package-summary.html"); + assertThat(updated).containsExactly("opentelemetry-context"); + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 6b251798d11..1ca14a626ad 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -51,6 +51,7 @@ include(":integration-tests:otlp") include(":integration-tests:tracecontext") include(":integration-tests:graal") include(":integration-tests:graal-incubating") +include(":javadoc-crawler") include(":opencensus-shim") include(":opentracing-shim") include(":perf-harness") From 758b8200c0ef6a731ef95de5d5a6b186abb80cb6 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 25 Apr 2025 06:23:27 -0400 Subject: [PATCH 2/5] try and fix ci by removing record type and excluding tests on systems lower than 17 --- javadoc-crawler/build.gradle.kts | 8 ++++++++ .../io/opentelemetry/javadocs/Artifact.java | 18 +++++++++++++++++- .../javadocs/JavaDocsCrawler.java | 10 +++++----- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/javadoc-crawler/build.gradle.kts b/javadoc-crawler/build.gradle.kts index 4471e5cd604..3fa9b1bde43 100644 --- a/javadoc-crawler/build.gradle.kts +++ b/javadoc-crawler/build.gradle.kts @@ -17,6 +17,14 @@ tasks { options.release.set(17) } + // only test on java 17+ + val testJavaVersion: String? by project + if (testJavaVersion != null && Integer.valueOf(testJavaVersion) < 17) { + test { + enabled = false + } + } + val crawl by registering(JavaExec::class) { dependsOn(classes) diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java index 076af84fa09..ca683c30d4e 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java @@ -5,4 +5,20 @@ package io.opentelemetry.javadocs; -record Artifact(String name, String version) {} +public class Artifact { + private final String name; + private final String version; + + public Artifact(String name, String version) { + this.name = name; + this.version = version; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } +} diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java index 6aa3598195b..2dd768bfe0b 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java @@ -132,14 +132,14 @@ static List crawlJavaDocs(HttpClient client, List artifacts) List updatedArtifacts = new ArrayList<>(); for (Artifact artifact : artifacts) { - String[] parts = artifact.name().split("-"); + String[] parts = artifact.getName().split("-"); StringBuilder path = new StringBuilder(); path.append(JAVA_DOCS_BASE_URL) .append(GROUP) .append("/") - .append(artifact.name()) + .append(artifact.getName()) .append("/") - .append(artifact.version()) + .append(artifact.getVersion()) .append("/") .append(String.join("/", parts)) .append("/package-summary.html"); @@ -155,7 +155,7 @@ static List crawlJavaDocs(HttpClient client, List artifacts) String.format( Locale.ROOT, "Crawl failed for %s with status code %d at URL %s\nResponse: %s", - artifact.name(), + artifact.getName(), crawlResponse.statusCode(), path, crawlResponse.body())); @@ -163,7 +163,7 @@ static List crawlJavaDocs(HttpClient client, List artifacts) } if (crawlResponse.body().contains(JAVA_DOC_DOWNLOADED_TEXT)) { - updatedArtifacts.add(artifact.name()); + updatedArtifacts.add(artifact.getName()); } Thread.sleep(THROTTLE_MS); // some light throttling From ad30c97d559f4d681327a50d1dec59330af6ed3e Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 1 May 2025 18:07:36 -0400 Subject: [PATCH 3/5] log response body instead of response object --- .../main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java index 2dd768bfe0b..f1f5b678568 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java @@ -121,7 +121,7 @@ private static List convertToArtifacts(Map map) { HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() != 200) { logger.log( - Level.SEVERE, "Unexpected response code: " + response.statusCode() + ": " + response); + Level.SEVERE, "Unexpected response code: " + response.statusCode() + ": " + response.body()); throw new IOException("Unable to pull Maven central artifacts list"); } return objectMapper.readValue(response.body(), Map.class); From 608de7168667660806d1e7790393bb9d99b15ebe Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 1 May 2025 18:14:48 -0400 Subject: [PATCH 4/5] use record class --- .../io/opentelemetry/javadocs/Artifact.java | 18 +----------------- .../javadocs/JavaDocsCrawler.java | 13 +++++++------ 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java index ca683c30d4e..040c59161e7 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java @@ -5,20 +5,4 @@ package io.opentelemetry.javadocs; -public class Artifact { - private final String name; - private final String version; - - public Artifact(String name, String version) { - this.name = name; - this.version = version; - } - - public String getName() { - return name; - } - - public String getVersion() { - return version; - } -} +public record Artifact(String name, String version) {} diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java index f1f5b678568..9c822f4dc9b 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java @@ -121,7 +121,8 @@ private static List convertToArtifacts(Map map) { HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() != 200) { logger.log( - Level.SEVERE, "Unexpected response code: " + response.statusCode() + ": " + response.body()); + Level.SEVERE, + "Unexpected response code: " + response.statusCode() + ": " + response.body()); throw new IOException("Unable to pull Maven central artifacts list"); } return objectMapper.readValue(response.body(), Map.class); @@ -132,14 +133,14 @@ static List crawlJavaDocs(HttpClient client, List artifacts) List updatedArtifacts = new ArrayList<>(); for (Artifact artifact : artifacts) { - String[] parts = artifact.getName().split("-"); + String[] parts = artifact.name().split("-"); StringBuilder path = new StringBuilder(); path.append(JAVA_DOCS_BASE_URL) .append(GROUP) .append("/") - .append(artifact.getName()) + .append(artifact.name()) .append("/") - .append(artifact.getVersion()) + .append(artifact.version()) .append("/") .append(String.join("/", parts)) .append("/package-summary.html"); @@ -155,7 +156,7 @@ static List crawlJavaDocs(HttpClient client, List artifacts) String.format( Locale.ROOT, "Crawl failed for %s with status code %d at URL %s\nResponse: %s", - artifact.getName(), + artifact.name(), crawlResponse.statusCode(), path, crawlResponse.body())); @@ -163,7 +164,7 @@ static List crawlJavaDocs(HttpClient client, List artifacts) } if (crawlResponse.body().contains(JAVA_DOC_DOWNLOADED_TEXT)) { - updatedArtifacts.add(artifact.getName()); + updatedArtifacts.add(artifact.name()); } Thread.sleep(THROTTLE_MS); // some light throttling From 6d6215deb43ee42c818150d456d9ff239d2928c5 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 1 May 2025 18:20:59 -0400 Subject: [PATCH 5/5] don't use record class --- .../io/opentelemetry/javadocs/Artifact.java | 18 +++++++++++++++++- .../javadocs/JavaDocsCrawler.java | 10 +++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java index 040c59161e7..ca683c30d4e 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/Artifact.java @@ -5,4 +5,20 @@ package io.opentelemetry.javadocs; -public record Artifact(String name, String version) {} +public class Artifact { + private final String name; + private final String version; + + public Artifact(String name, String version) { + this.name = name; + this.version = version; + } + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } +} diff --git a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java index 9c822f4dc9b..6792443666a 100644 --- a/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java +++ b/javadoc-crawler/src/main/java/io/opentelemetry/javadocs/JavaDocsCrawler.java @@ -133,14 +133,14 @@ static List crawlJavaDocs(HttpClient client, List artifacts) List updatedArtifacts = new ArrayList<>(); for (Artifact artifact : artifacts) { - String[] parts = artifact.name().split("-"); + String[] parts = artifact.getName().split("-"); StringBuilder path = new StringBuilder(); path.append(JAVA_DOCS_BASE_URL) .append(GROUP) .append("/") - .append(artifact.name()) + .append(artifact.getName()) .append("/") - .append(artifact.version()) + .append(artifact.getVersion()) .append("/") .append(String.join("/", parts)) .append("/package-summary.html"); @@ -156,7 +156,7 @@ static List crawlJavaDocs(HttpClient client, List artifacts) String.format( Locale.ROOT, "Crawl failed for %s with status code %d at URL %s\nResponse: %s", - artifact.name(), + artifact.getName(), crawlResponse.statusCode(), path, crawlResponse.body())); @@ -164,7 +164,7 @@ static List crawlJavaDocs(HttpClient client, List artifacts) } if (crawlResponse.body().contains(JAVA_DOC_DOWNLOADED_TEXT)) { - updatedArtifacts.add(artifact.name()); + updatedArtifacts.add(artifact.getName()); } Thread.sleep(THROTTLE_MS); // some light throttling