This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new af97ef7037a DefaultPackageRepository: simplify HTTP & JSON (#3253)
af97ef7037a is described below
commit af97ef7037aec0c1fb028e173b6d8931cd12588d
Author: David Smiley <[email protected]>
AuthorDate: Sat Mar 15 01:51:00 2025 -0400
DefaultPackageRepository: simplify HTTP & JSON (#3253)
The use of a SolrClient didn't seem to make sense if the web server isn't
(necessarily) Solr. Seemed to be getting more in the way. There was some double
or even triple(?) JSON back & forth parsing / serializing that I couldn't let
be on principle.
* Don't comment out bats tests (annoying to uncomment); use the "skip"
feature
---
.../packagemanager/DefaultPackageRepository.java | 64 +++++++---------------
solr/packaging/test/test_packages.bats | 28 +++++-----
2 files changed, 34 insertions(+), 58 deletions(-)
diff --git
a/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
b/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
index 62d241d8bce..a7900124e70 100644
---
a/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
+++
b/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
@@ -18,26 +18,21 @@
package org.apache.solr.packagemanager;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.core.type.TypeReference;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.Collection;
+import java.util.List;
import java.util.Map;
-import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.Http2SolrClient;
-import org.apache.solr.client.solrj.impl.JsonMapResponseParser;
-import org.apache.solr.client.solrj.request.GenericSolrRequest;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
-import org.apache.solr.common.util.CollectionUtil;
-import org.apache.solr.common.util.NamedList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -86,10 +81,7 @@ public class DefaultPackageRepository extends
PackageRepository {
public Path download(String artifactName) throws SolrException, IOException {
Path tmpDirectory = Files.createTempDirectory("solr-packages");
tmpDirectory.toFile().deleteOnExit();
- URL url =
- URI.create(repositoryURL.endsWith("/") ? repositoryURL : repositoryURL
+ "/")
- .resolve(artifactName)
- .toURL();
+ URL url = getRepoUri().resolve(artifactName).toURL();
String fileName = FilenameUtils.getName(url.getPath());
Path destination = tmpDirectory.resolve(fileName);
@@ -107,42 +99,24 @@ public class DefaultPackageRepository extends
PackageRepository {
return destination;
}
+ private URI getRepoUri() {
+ return URI.create(repositoryURL.endsWith("/") ? repositoryURL :
repositoryURL + "/");
+ }
+
private void initPackages() {
- // We need http 1.1 protocol here because we are talking to the repository
server and not to
- // an actual Solr server.
- // We use an Http2SolrClient so that we do not need a raw jetty http
client for this GET.
- // We may get a text/plain mimetype for the repository.json (for instance
when looking up a repo
- // on Github), so use custom ResponseParser.
- try (Http2SolrClient client =
- new Http2SolrClient.Builder(repositoryURL).useHttp1_1(true).build()) {
- GenericSolrRequest request =
- new GenericSolrRequest(SolrRequest.METHOD.GET, "/repository.json");
- request.setResponseParser(new TalkToRepoResponseParser());
- NamedList<Object> resp = client.request(request);
- SolrPackage[] items =
- PackageUtils.getMapper().readValue("[" + resp.jsonStr() + "]",
SolrPackage[].class);
- packages = CollectionUtil.newHashMap(items.length);
- for (SolrPackage pkg : items) {
- pkg.setRepository(name);
- packages.put(pkg.name, pkg);
- }
- } catch (SolrServerException | IOException ex) {
+ try {
+ final var url = getRepoUri().resolve("repository.json").toURL();
+ packages =
+ PackageUtils.getMapper()
+ .readValue(url, new TypeReference<List<SolrPackage>>() {})
+ .stream()
+ .peek(pkg -> pkg.setRepository(name))
+ .collect(Collectors.toMap(pkg -> pkg.name, Function.identity()));
+ } catch (IOException ex) {
throw new SolrException(ErrorCode.INVALID_STATE, ex);
}
if (log.isDebugEnabled()) {
- log.debug("Found {} packages in repository '{}'", packages.size(), name);
- }
- }
-
- /**
- * Github links for repository.json are returned in JSON format but with
text/plain mimetype, so
- * this works around that issue.
- */
- private static class TalkToRepoResponseParser extends JsonMapResponseParser {
-
- @Override
- public Collection<String> getContentTypes() {
- return Set.of("application/json", "text/plain");
+ log.debug("Found {} packages in repository '{}'", this.packages.size(),
name);
}
}
}
diff --git a/solr/packaging/test/test_packages.bats
b/solr/packaging/test/test_packages.bats
index d290bc6bc56..cc7cd1b82ce 100644
--- a/solr/packaging/test/test_packages.bats
+++ b/solr/packaging/test/test_packages.bats
@@ -58,22 +58,24 @@ teardown() {
}
# This test is useful if you are debugging/working with packages.
-# We have commented it out for now since it depends on a live internet
+# We have disabled it for now since it depends on a live internet
# connection to run. This could be updated with a local Repo server if we had
# a package that is part of the Solr project to use.
-# @test "deploying and undeploying a cluster level package" {
-# run solr start -Denable.packages=true
+@test "deploying and undeploying a cluster level package" {
+ skip "For developing package infra; requires a connection to github"
+
+ run solr start -Denable.packages=true
-# run solr package add-repo splainer
"https://raw.githubusercontent.com/o19s/splainer/main/solr-splainer-package/repo"
-# assert_output --partial "Added repository: splainer"
+ run solr package add-repo splainer
"https://raw.githubusercontent.com/o19s/splainer/refs/heads/main/solr-splainer-package/repo/"
+ assert_output --partial "Added repository: splainer"
-# run solr package list-available
-# assert_output --partial "solr-splainer Splainer for Solr"
-# run solr package install solr-splainer
-# assert_output --partial "solr-splainer installed."
+ run solr package list-available
+ assert_output --partial "solr-splainer Splainer for Solr"
+ run solr package install solr-splainer
+ assert_output --partial "solr-splainer installed."
-# run solr package deploy solr-splainer -y --cluster
-# assert_output --partial "Deployment successful"
+ run solr package deploy solr-splainer -y --cluster
+ assert_output --partial "Deployment successful"
-# run -0 curl --fail http://localhost:${SOLR_PORT}/v2/splainer/index.html
-# }
+ run -0 curl --fail http://localhost:${SOLR_PORT}/v2/splainer/index.html
+}