Added transient List of ProjectVersions and set Metrics in Project to minimize the number of round trips a client needs to make

Signed-off-by: Walter de Boer <walterdeboer@dbso.nl>
This commit is contained in:
Walter de Boer 2023-03-12 09:22:42 +01:00
parent 6799fc8e0c
commit c02fe38e7b
6 changed files with 141 additions and 23 deletions

View file

@ -31,6 +31,7 @@ import alpine.resources.AlpineRequest;
import com.github.packageurl.PackageURL;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.datanucleus.api.jdo.JDOQuery;
import org.dependencytrack.auth.Permissions;
import org.dependencytrack.event.IndexEvent;
import org.dependencytrack.model.Analysis;
@ -41,6 +42,7 @@ import org.dependencytrack.model.ConfigPropertyConstants;
import org.dependencytrack.model.FindingAttribution;
import org.dependencytrack.model.Project;
import org.dependencytrack.model.ProjectProperty;
import org.dependencytrack.model.ProjectVersion;
import org.dependencytrack.model.ServiceComponent;
import org.dependencytrack.model.Tag;
import org.dependencytrack.model.Vulnerability;
@ -48,7 +50,6 @@ import org.dependencytrack.notification.NotificationConstants;
import org.dependencytrack.notification.NotificationGroup;
import org.dependencytrack.notification.NotificationScope;
import org.dependencytrack.util.NotificationUtil;
import javax.jdo.FetchPlan;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
@ -193,6 +194,23 @@ final class ProjectQueryManager extends QueryManager implements IQueryManager {
return execute(query, params);
}
/**
* Returns a project by its uuid.
* @param uuid the uuid of the Project (required)
* @return a Project object, or null if not found
*/
public Project getProject(final String uuid) {
final Project project = getObjectByUuid(Project.class, uuid, Project.FetchGroup.ALL.name());
if (project != null) {
// set Metrics to minimize the number of round trips a client needs to make
project.setMetrics(getMostRecentProjectMetrics(project));
// set ProjectVersions to minimize the number of round trips a client needs to make
project.setVersions(getProjectVersions(project));
}
return project;
}
/**
* Returns a project by its name and version.
* @param name the name of the Project (required)
@ -212,7 +230,14 @@ final class ProjectQueryManager extends QueryManager implements IQueryManager {
preprocessACLs(query, queryFilter, params, false);
query.setFilter(queryFilter);
query.setRange(0, 1);
return singleResult(query.executeWithMap(params));
final Project project = singleResult(query.executeWithMap(params));
if (project != null) {
// set Metrics to prevent extra round trip
project.setMetrics(getMostRecentProjectMetrics(project));
// set ProjectVersions to prevent extra round trip
project.setVersions(getProjectVersions(project));
}
return project;
}
/**
@ -1095,4 +1120,11 @@ final class ProjectQueryManager extends QueryManager implements IQueryManager {
}
return hasActiveChild;
}
private List<ProjectVersion> getProjectVersions(Project project) {
final Query<Object[]> query = pm.newQuery(JDOQuery.SQL, "SELECT UUID, VERSION FROM PROJECT WHERE NAME = ?");
query.setParameters(project.getName());
final var stream = query.executeList().stream();
return stream.map(i -> new ProjectVersion(i[0].toString(), i[1].toString())).toList();
}
}