Skip to content
Snippets Groups Projects

Iss #13 - Add current modern release return for legacy release endpoint

Merged Iss #13 - Add current modern release return for legacy release endpoint
1 unresolved thread
Merged Martin Lowe requested to merge malowe/eclipsefdn-downloads-api:malowe/main/13 into main
1 unresolved thread
2 files
+ 52
8
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -15,6 +15,9 @@ package org.eclipsefoundation.downloads.resources;
@@ -15,6 +15,9 @@ package org.eclipsefoundation.downloads.resources;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Optional;
import java.util.Optional;
 
import java.util.function.Predicate;
 
import java.util.function.Supplier;
 
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Inject;
@@ -25,6 +28,7 @@ import javax.ws.rs.Path;
@@ -25,6 +28,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.QueryParam;
 
import javax.ws.rs.ServerErrorException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.MultivaluedMap;
@@ -41,6 +45,7 @@ import org.eclipsefoundation.downloads.dto.DownloadFileIndex;
@@ -41,6 +45,7 @@ import org.eclipsefoundation.downloads.dto.DownloadFileIndex;
import org.eclipsefoundation.downloads.models.ReleaseVersionPackages;
import org.eclipsefoundation.downloads.models.ReleaseVersionPackages;
import org.eclipsefoundation.downloads.models.ReleaseVersionPackages.ReleaseTrackerPackages;
import org.eclipsefoundation.downloads.models.ReleaseVersionPackages.ReleaseTrackerPackages;
import org.eclipsefoundation.downloads.models.TrackedReleases.Release;
import org.eclipsefoundation.downloads.models.TrackedReleases.Release;
 
import org.eclipsefoundation.downloads.models.TrackedReleases.ReleaseVersion;
import org.eclipsefoundation.downloads.namespaces.DownloadsUrlParameterNames;
import org.eclipsefoundation.downloads.namespaces.DownloadsUrlParameterNames;
import org.eclipsefoundation.downloads.services.ReleaseTrackerService;
import org.eclipsefoundation.downloads.services.ReleaseTrackerService;
import org.eclipsefoundation.persistence.dao.impl.DefaultHibernateDao;
import org.eclipsefoundation.persistence.dao.impl.DefaultHibernateDao;
@@ -55,6 +60,10 @@ import org.slf4j.LoggerFactory;
@@ -55,6 +60,10 @@ import org.slf4j.LoggerFactory;
public class DownloadsResource {
public class DownloadsResource {
private static final Logger LOGGER = LoggerFactory.getLogger(DownloadsResource.class);
private static final Logger LOGGER = LoggerFactory.getLogger(DownloadsResource.class);
 
private static final Pattern MODERN_RELEASE_PATTERN = Pattern.compile("^\\d");
 
 
private static final String RELEASE_TYPE_ERROR_MESSAGE_FORMAT = "Invalid release type: %s";
 
@Inject
@Inject
DefaultHibernateDao dao;
DefaultHibernateDao dao;
@Inject
@Inject
@@ -108,7 +117,7 @@ public class DownloadsResource {
@@ -108,7 +117,7 @@ public class DownloadsResource {
@QueryParam(DownloadsUrlParameterNames.RELEASE_VERSION_VALUE) String releaseVersion) {
@QueryParam(DownloadsUrlParameterNames.RELEASE_VERSION_VALUE) String releaseVersion) {
if (!isValidType(releaseType)) {
if (!isValidType(releaseType)) {
throw new BadRequestException(String.format("Invalid release type: %s", releaseType));
throw new BadRequestException(String.format(RELEASE_TYPE_ERROR_MESSAGE_FORMAT, releaseType));
}
}
// use existing calls and route according to what query params are provided
// use existing calls and route according to what query params are provided
@@ -116,9 +125,11 @@ public class DownloadsResource {
@@ -116,9 +125,11 @@ public class DownloadsResource {
return releaseVersion(releaseType, releaseName, releaseVersion);
return releaseVersion(releaseType, releaseName, releaseVersion);
} else if (StringUtils.isNotBlank(releaseName)) {
} else if (StringUtils.isNotBlank(releaseName)) {
return release(releaseType, releaseName);
return release(releaseType, releaseName);
 
} else if (StringUtils.isNotBlank(releaseVersion)) {
 
throw new BadRequestException("Cannot retrieve a release solely by version name");
 
} else {
 
return getLatestReleaseVersionPackages(releaseType);
}
}
throw new BadRequestException("At least the release_name query parameter is required to use this endpoint");
}
}
@GET
@GET
@@ -133,7 +144,7 @@ public class DownloadsResource {
@@ -133,7 +144,7 @@ public class DownloadsResource {
@PathParam("releaseName") String releaseName) {
@PathParam("releaseName") String releaseName) {
if (!isValidType(releaseType)) {
if (!isValidType(releaseType)) {
throw new BadRequestException(String.format("Invalid release type: %s", releaseType));
throw new BadRequestException(String.format(RELEASE_TYPE_ERROR_MESSAGE_FORMAT, releaseType));
}
}
// check that the release name is valid
// check that the release name is valid
@@ -172,7 +183,7 @@ public class DownloadsResource {
@@ -172,7 +183,7 @@ public class DownloadsResource {
public Response releaseVersion(@PathParam("releaseType") String releaseType,
public Response releaseVersion(@PathParam("releaseType") String releaseType,
@PathParam("releaseName") String releaseName, @PathParam("releaseVersion") String releaseVersion) {
@PathParam("releaseName") String releaseName, @PathParam("releaseVersion") String releaseVersion) {
if (!isValidType(releaseType)) {
if (!isValidType(releaseType)) {
throw new BadRequestException(String.format("Invalid release type: %s", releaseType));
throw new BadRequestException(String.format(RELEASE_TYPE_ERROR_MESSAGE_FORMAT, releaseType));
}
}
// check that the release name is valid
// check that the release name is valid
@@ -207,12 +218,45 @@ public class DownloadsResource {
@@ -207,12 +218,45 @@ public class DownloadsResource {
.build();
.build();
}
}
 
/**
 
* Iterates over the current active releases to find the most recent one, and then converts it to the release
 
* packages output.
 
*
 
* @param releaseType the release type for the current request
 
* @return response containing the most recent release packages
 
*/
 
private Response getLatestReleaseVersionPackages(String releaseType) {
 
// set up the reused predicates
 
Predicate<ReleaseVersion> isLatestReleaseVersion = rv -> rv.getIsCurrent()
 
&& "release".equalsIgnoreCase(rv.getType());
 
Supplier<ServerErrorException> errorForMissingCurrentRelease = () -> new ServerErrorException(
 
"Could not find any active modern releases", 500);
 
// get the latest modern release
 
Release latestRelease = releaseTrackerService
 
.getActiveReleases()
 
.stream()
 
.filter(release -> release.getVersions().stream().anyMatch(isLatestReleaseVersion)
 
&& MODERN_RELEASE_PATTERN.matcher(release.getName()).find())
 
.sorted((r1, r2) -> r2.getName().compareTo(r1.getName()))
 
.findFirst()
 
.orElseThrow(errorForMissingCurrentRelease);
 
// convert the data to the release version output
 
return releaseVersion(releaseType, latestRelease.getName(),
 
latestRelease
 
.getVersions()
 
.stream()
 
.filter(isLatestReleaseVersion)
 
.findFirst()
 
.orElseThrow(errorForMissingCurrentRelease)
 
.getName());
 
}
 
/**
/**
* @param type the type of the release
* @param type the type of the release
* @return True if valid, false if not
* @return True if valid, false if not
*/
*/
private boolean isValidType(String type) {
private boolean isValidType(String type) {
return (!type.equals("epp") && !type.equals("eclipse_packages")) ? false : true;
return "epp".equalsIgnoreCase(type) || "eclipse_packages".equalsIgnoreCase(type);
}
}
/**
/**
Loading