SLING-8684 - Add support for validating releases from a staging repository
* merged the StagingRepositoryFinder with the RepositoryDownloader into the
RepositoryService
diff --git a/src/main/java/org/apache/sling/cli/impl/nexus/RepositoryDownloader.java b/src/main/java/org/apache/sling/cli/impl/nexus/RepositoryService.java
similarity index 68%
rename from src/main/java/org/apache/sling/cli/impl/nexus/RepositoryDownloader.java
rename to src/main/java/org/apache/sling/cli/impl/nexus/RepositoryService.java
index 4ef6418..22d21e4 100644
--- a/src/main/java/org/apache/sling/cli/impl/nexus/RepositoryDownloader.java
+++ b/src/main/java/org/apache/sling/cli/impl/nexus/RepositoryService.java
@@ -1,21 +1,19 @@
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- ~ Licensed to the Apache Software Foundation (ASF) under one
- ~ or more contributor license agreements. See the NOTICE file
- ~ distributed with this work for additional information
- ~ regarding copyright ownership. The ASF licenses this file
- ~ to you under the Apache License, Version 2.0 (the
- ~ "License"); you may not use this file except in compliance
- ~ with the License. You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing,
- ~ software distributed under the License is distributed on an
- ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ~ KIND, either express or implied. See the License for the
- ~ specific language governing permissions and limitations
- ~ under the License.
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package org.apache.sling.cli.impl.nexus;
import java.io.IOException;
@@ -25,32 +23,36 @@
import java.nio.file.Path;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.sling.cli.impl.http.HttpClientFactory;
+import org.apache.sling.cli.impl.nexus.StagingRepository.Status;
import org.jetbrains.annotations.NotNull;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
-@Component(
- service = RepositoryDownloader.class
-)
-public class RepositoryDownloader {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryDownloader.class);
+@Component(service = RepositoryService.class)
+public class RepositoryService {
+
+ private static final String REPOSITORY_PREFIX = "orgapachesling-";
+ private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryService.class);
private Map<String, LocalRepository> repositories = new HashMap<>();
private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
@@ -58,6 +60,44 @@
@Reference
private HttpClientFactory httpClientFactory;
+ public List<StagingRepository> list() throws IOException {
+ return this.withStagingRepositories( reader -> {
+ Gson gson = new Gson();
+ return gson.fromJson(reader, StagingRepositories.class).getData().stream()
+ .filter( r -> r.getType() == Status.closed)
+ .filter( r -> r.getRepositoryId().startsWith(REPOSITORY_PREFIX) )
+ .collect(Collectors.toList());
+ });
+ }
+
+ public StagingRepository find(int stagingRepositoryId) throws IOException {
+ return this.withStagingRepositories( reader -> {
+ Gson gson = new Gson();
+ return gson.fromJson(reader, StagingRepositories.class).getData().stream()
+ .filter( r -> r.getType() == Status.closed)
+ .filter( r -> r.getRepositoryId().startsWith(REPOSITORY_PREFIX) )
+ .filter( r -> r.getRepositoryId().endsWith("-" + stagingRepositoryId))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("No repository found with id " + stagingRepositoryId));
+ });
+ }
+
+ private <T> T withStagingRepositories(Function<InputStreamReader, T> function) throws IOException {
+ try ( CloseableHttpClient client = httpClientFactory.newClient() ) {
+ HttpGet get = new HttpGet("https://repository.apache.org/service/local/staging/profile_repositories");
+ get.addHeader("Accept", "application/json");
+ try ( CloseableHttpResponse response = client.execute(get)) {
+ try ( InputStream content = response.getEntity().getContent();
+ InputStreamReader reader = new InputStreamReader(content)) {
+ if ( response.getStatusLine().getStatusCode() != 200 )
+ throw new IOException("Status line : " + response.getStatusLine());
+
+ return function.apply(reader);
+ }
+ }
+ }
+ }
+
@NotNull
public LocalRepository download(@NotNull StagingRepository repository) throws IOException {
readWriteLock.readLock().lock();
@@ -143,5 +183,4 @@
}
}
}
-
}
diff --git a/src/main/java/org/apache/sling/cli/impl/nexus/StagingRepositoryFinder.java b/src/main/java/org/apache/sling/cli/impl/nexus/StagingRepositoryFinder.java
deleted file mode 100644
index 1926181..0000000
--- a/src/main/java/org/apache/sling/cli/impl/nexus/StagingRepositoryFinder.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sling.cli.impl.nexus;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.List;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.sling.cli.impl.http.HttpClientFactory;
-import org.apache.sling.cli.impl.nexus.StagingRepository.Status;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
-
-import com.google.gson.Gson;
-
-@Component(service = StagingRepositoryFinder.class)
-public class StagingRepositoryFinder {
-
- private static final String REPOSITORY_PREFIX = "orgapachesling-";
-
- @Reference
- private HttpClientFactory httpClientFactory;
-
- public List<StagingRepository> list() throws IOException {
- return this.withStagingRepositories( reader -> {
- Gson gson = new Gson();
- return gson.fromJson(reader, StagingRepositories.class).getData().stream()
- .filter( r -> r.getType() == Status.closed)
- .filter( r -> r.getRepositoryId().startsWith(REPOSITORY_PREFIX) )
- .collect(Collectors.toList());
- });
- }
-
- public StagingRepository find(int stagingRepositoryId) throws IOException {
- return this.withStagingRepositories( reader -> {
- Gson gson = new Gson();
- return gson.fromJson(reader, StagingRepositories.class).getData().stream()
- .filter( r -> r.getType() == Status.closed)
- .filter( r -> r.getRepositoryId().startsWith(REPOSITORY_PREFIX) )
- .filter( r -> r.getRepositoryId().endsWith("-" + stagingRepositoryId))
- .findFirst()
- .orElseThrow(() -> new IllegalArgumentException("No repository found with id " + stagingRepositoryId));
- });
- }
-
- private <T> T withStagingRepositories(Function<InputStreamReader, T> function) throws IOException {
- try ( CloseableHttpClient client = httpClientFactory.newClient() ) {
- HttpGet get = new HttpGet("https://repository.apache.org/service/local/staging/profile_repositories");
- get.addHeader("Accept", "application/json");
- try ( CloseableHttpResponse response = client.execute(get)) {
- try ( InputStream content = response.getEntity().getContent();
- InputStreamReader reader = new InputStreamReader(content)) {
- if ( response.getStatusLine().getStatusCode() != 200 )
- throw new IOException("Status line : " + response.getStatusLine());
-
- return function.apply(reader);
- }
- }
- }
- }
-}
diff --git a/src/main/java/org/apache/sling/cli/impl/release/CreateJiraVersionCommand.java b/src/main/java/org/apache/sling/cli/impl/release/CreateJiraVersionCommand.java
index c0bd5d0..09f9f8d 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/CreateJiraVersionCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/CreateJiraVersionCommand.java
@@ -27,7 +27,7 @@
import org.apache.sling.cli.impl.jira.Version;
import org.apache.sling.cli.impl.jira.VersionClient;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
@@ -56,7 +56,7 @@
private Integer repositoryId;
@Reference
- private StagingRepositoryFinder repoFinder;
+ private RepositoryService repoFinder;
@Reference
private VersionClient versionClient;
diff --git a/src/main/java/org/apache/sling/cli/impl/release/ListCommand.java b/src/main/java/org/apache/sling/cli/impl/release/ListCommand.java
index e4115ef..56a1297 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/ListCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/ListCommand.java
@@ -19,7 +19,7 @@
import java.io.IOException;
import org.apache.sling.cli.impl.Command;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
@@ -42,7 +42,7 @@
private final Logger logger = LoggerFactory.getLogger(getClass());
@Reference
- private StagingRepositoryFinder repoFinder;
+ private RepositoryService repoFinder;
@Override
public void run() {
diff --git a/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java b/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java
index 17185c1..076026c 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommand.java
@@ -35,7 +35,7 @@
import org.apache.sling.cli.impl.jira.VersionClient;
import org.apache.sling.cli.impl.mail.Mailer;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.cli.impl.people.Member;
import org.apache.sling.cli.impl.people.MembersFinder;
import org.osgi.service.component.annotations.Component;
@@ -67,7 +67,7 @@
private MembersFinder membersFinder;
@Reference
- private StagingRepositoryFinder repoFinder;
+ private RepositoryService repoFinder;
@Reference
private VersionClient versionClient;
diff --git a/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java b/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java
index 5ca49f2..52c3e28 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/TallyVotesCommand.java
@@ -37,7 +37,7 @@
import org.apache.sling.cli.impl.mail.Mailer;
import org.apache.sling.cli.impl.mail.VoteThreadFinder;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.cli.impl.people.Member;
import org.apache.sling.cli.impl.people.MembersFinder;
import org.osgi.service.component.annotations.Component;
@@ -65,7 +65,7 @@
private MembersFinder membersFinder;
@Reference
- private StagingRepositoryFinder repoFinder;
+ private RepositoryService repoFinder;
@Reference
private VoteThreadFinder voteThreadFinder;
diff --git a/src/main/java/org/apache/sling/cli/impl/release/UpdateLocalSiteCommand.java b/src/main/java/org/apache/sling/cli/impl/release/UpdateLocalSiteCommand.java
index 14cad7e..9f919d6 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/UpdateLocalSiteCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/UpdateLocalSiteCommand.java
@@ -26,7 +26,7 @@
import org.apache.sling.cli.impl.Command;
import org.apache.sling.cli.impl.jbake.JBakeContentUpdater;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand.ResetType;
import org.eclipse.jgit.api.errors.GitAPIException;
@@ -54,7 +54,7 @@
private static final String GIT_CHECKOUT = "/tmp/sling-site";
@Reference
- private StagingRepositoryFinder repoFinder;
+ private RepositoryService repoFinder;
private final Logger logger = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/org/apache/sling/cli/impl/release/UpdateReporterCommand.java b/src/main/java/org/apache/sling/cli/impl/release/UpdateReporterCommand.java
index a78ff22..137d662 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/UpdateReporterCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/UpdateReporterCommand.java
@@ -36,7 +36,7 @@
import org.apache.sling.cli.impl.UserInput;
import org.apache.sling.cli.impl.http.HttpClientFactory;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
@@ -63,7 +63,7 @@
private static final Logger LOGGER = LoggerFactory.getLogger(UpdateReporterCommand.class);
@Reference
- private StagingRepositoryFinder repoFinder;
+ private RepositoryService repoFinder;
@Reference
private HttpClientFactory httpClientFactory;
diff --git a/src/main/java/org/apache/sling/cli/impl/release/VerifyReleasesCommand.java b/src/main/java/org/apache/sling/cli/impl/release/VerifyReleasesCommand.java
index 687e6d5..392f09a 100644
--- a/src/main/java/org/apache/sling/cli/impl/release/VerifyReleasesCommand.java
+++ b/src/main/java/org/apache/sling/cli/impl/release/VerifyReleasesCommand.java
@@ -27,10 +27,9 @@
import org.apache.sling.cli.impl.ci.CIStatusValidator;
import org.apache.sling.cli.impl.nexus.Artifact;
import org.apache.sling.cli.impl.nexus.LocalRepository;
-import org.apache.sling.cli.impl.nexus.RepositoryDownloader;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
-import org.apache.sling.cli.impl.pgp.PGPSignatureValidator;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.cli.impl.pgp.HashValidator;
+import org.apache.sling.cli.impl.pgp.PGPSignatureValidator;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.util.encoders.Hex;
import org.osgi.service.component.annotations.Component;
@@ -52,10 +51,7 @@
static final String NAME = "verify";
@Reference
- private StagingRepositoryFinder stagingRepositoryFinder;
-
- @Reference
- private RepositoryDownloader repositoryDownloader;
+ private RepositoryService repositoryService;
@Reference
private PGPSignatureValidator pgpSignatureValidator;
@@ -77,7 +73,7 @@
int checksRun = 0;
int failedChecks = 0;
try {
- LocalRepository repository = repositoryDownloader.download(stagingRepositoryFinder.find(repositoryId));
+ LocalRepository repository = repositoryService.download(repositoryService.find(repositoryId));
Path repositoryRootPath = repository.getRootFolder();
for (Artifact artifact : repository.getArtifacts()) {
Path artifactFilePath = repositoryRootPath.resolve(artifact.getRepositoryRelativePath());
diff --git a/src/test/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommandTest.java b/src/test/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommandTest.java
index 0daf5ce..ea146fd 100644
--- a/src/test/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommandTest.java
+++ b/src/test/java/org/apache/sling/cli/impl/release/PrepareVoteEmailCommandTest.java
@@ -30,7 +30,7 @@
import org.apache.sling.cli.impl.jira.VersionClient;
import org.apache.sling.cli.impl.mail.Mailer;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.cli.impl.people.Member;
import org.apache.sling.cli.impl.people.MembersFinder;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
@@ -110,8 +110,8 @@
StagingRepository stagingRepository = mock(StagingRepository.class);
when(stagingRepository.getDescription()).thenReturn("Apache Sling CLI Test 1.0.0");
- StagingRepositoryFinder stagingRepositoryFinder = mock(StagingRepositoryFinder.class);
- when(stagingRepositoryFinder.find(123)).thenReturn(stagingRepository);
+ RepositoryService repositoryService = mock(RepositoryService.class);
+ when(repositoryService.find(123)).thenReturn(stagingRepository);
VersionClient versionClient = mock(VersionClient.class);
Version version = mock(Version.class);
@@ -131,7 +131,7 @@
osgiContext.registerService(DateProvider.class, dateProvider);
osgiContext.registerService(MembersFinder.class, membersFinder);
- osgiContext.registerService(StagingRepositoryFinder.class, stagingRepositoryFinder);
+ osgiContext.registerService(RepositoryService.class, repositoryService);
osgiContext.registerService(VersionClient.class, versionClient);
osgiContext.registerService(Mailer.class, mailer);
}
diff --git a/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java b/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java
index 6583e05..c1c9444 100644
--- a/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java
+++ b/src/test/java/org/apache/sling/cli/impl/release/TallyVotesCommandTest.java
@@ -35,7 +35,7 @@
import org.apache.sling.cli.impl.mail.Mailer;
import org.apache.sling.cli.impl.mail.VoteThreadFinder;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.cli.impl.people.Member;
import org.apache.sling.cli.impl.people.MembersFinder;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
@@ -221,15 +221,15 @@
StagingRepository stagingRepository = mock(StagingRepository.class);
when(stagingRepository.getDescription()).thenReturn("Apache Sling CLI Test 1.0.0");
- StagingRepositoryFinder stagingRepositoryFinder = mock(StagingRepositoryFinder.class);
- when(stagingRepositoryFinder.find(123)).thenReturn(stagingRepository);
+ RepositoryService repositoryService = mock(RepositoryService.class);
+ when(repositoryService.find(123)).thenReturn(stagingRepository);
VoteThreadFinder voteThreadFinder = mock(VoteThreadFinder.class);
when(voteThreadFinder.findVoteThread("CLI Test 1.0.0")).thenReturn(thread);
osgiContext.registerService(CredentialsService.class, credentialsService);
osgiContext.registerInjectActivateService(membersFinder);
- osgiContext.registerService(StagingRepositoryFinder.class, stagingRepositoryFinder);
+ osgiContext.registerService(RepositoryService.class, repositoryService);
osgiContext.registerService(VoteThreadFinder.class, voteThreadFinder);
osgiContext.registerService(Mailer.class, mailer);
}
diff --git a/src/test/java/org/apache/sling/cli/impl/release/UpdateReporterCommandTest.java b/src/test/java/org/apache/sling/cli/impl/release/UpdateReporterCommandTest.java
index ece4d18..55f50d2 100644
--- a/src/test/java/org/apache/sling/cli/impl/release/UpdateReporterCommandTest.java
+++ b/src/test/java/org/apache/sling/cli/impl/release/UpdateReporterCommandTest.java
@@ -29,7 +29,7 @@
import org.apache.sling.cli.impl.UserInput;
import org.apache.sling.cli.impl.http.HttpClientFactory;
import org.apache.sling.cli.impl.nexus.StagingRepository;
-import org.apache.sling.cli.impl.nexus.StagingRepositoryFinder;
+import org.apache.sling.cli.impl.nexus.RepositoryService;
import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
import org.junit.Before;
import org.junit.Rule;
@@ -68,7 +68,7 @@
@Before
public void before() throws IOException {
- StagingRepositoryFinder repositoryFinder = mock(StagingRepositoryFinder.class);
+ RepositoryService repositoryFinder = mock(RepositoryService.class);
StagingRepository stagingRepository = mock(StagingRepository.class);
when(stagingRepository.getDescription()).thenReturn("Apache Sling CLI 1, Apache Sling CLI 2");
when(repositoryFinder.find(42)).thenReturn(stagingRepository);