| // Copyright (C) 2014 The Android Open Source Project | |
| // | |
| // Licensed 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 com.google.gerrit.server; | |
| import static com.google.common.collect.ImmutableList.toImmutableList; | |
| import com.google.common.base.Strings; | |
| import com.google.common.collect.ImmutableList; | |
| import com.google.common.collect.Streams; | |
| import com.google.common.flogger.FluentLogger; | |
| import com.google.gerrit.entities.Patch; | |
| import com.google.gerrit.entities.Project; | |
| import com.google.gerrit.extensions.common.DiffWebLinkInfo; | |
| import com.google.gerrit.extensions.common.WebLinkInfo; | |
| import com.google.gerrit.extensions.registration.DynamicSet; | |
| import com.google.gerrit.extensions.webui.BranchWebLink; | |
| import com.google.gerrit.extensions.webui.DiffWebLink; | |
| import com.google.gerrit.extensions.webui.EditWebLink; | |
| import com.google.gerrit.extensions.webui.FileHistoryWebLink; | |
| import com.google.gerrit.extensions.webui.FileWebLink; | |
| import com.google.gerrit.extensions.webui.ParentWebLink; | |
| import com.google.gerrit.extensions.webui.PatchSetWebLink; | |
| import com.google.gerrit.extensions.webui.ProjectWebLink; | |
| import com.google.gerrit.extensions.webui.ResolveConflictsWebLink; | |
| import com.google.gerrit.extensions.webui.TagWebLink; | |
| import com.google.gerrit.extensions.webui.WebLink; | |
| import com.google.inject.Inject; | |
| import com.google.inject.Singleton; | |
| import java.util.function.Function; | |
| @Singleton | |
| public class WebLinks { | |
| private static final FluentLogger logger = FluentLogger.forEnclosingClass(); | |
| private final DynamicSet<PatchSetWebLink> patchSetLinks; | |
| private final DynamicSet<ResolveConflictsWebLink> resolveConflictsLinks; | |
| private final DynamicSet<ParentWebLink> parentLinks; | |
| private final DynamicSet<EditWebLink> editLinks; | |
| private final DynamicSet<FileWebLink> fileLinks; | |
| private final DynamicSet<FileHistoryWebLink> fileHistoryLinks; | |
| private final DynamicSet<DiffWebLink> diffLinks; | |
| private final DynamicSet<ProjectWebLink> projectLinks; | |
| private final DynamicSet<BranchWebLink> branchLinks; | |
| private final DynamicSet<TagWebLink> tagLinks; | |
| @Inject | |
| public WebLinks( | |
| DynamicSet<PatchSetWebLink> patchSetLinks, | |
| DynamicSet<ResolveConflictsWebLink> resolveConflictsLinks, | |
| DynamicSet<ParentWebLink> parentLinks, | |
| DynamicSet<EditWebLink> editLinks, | |
| DynamicSet<FileWebLink> fileLinks, | |
| DynamicSet<FileHistoryWebLink> fileLogLinks, | |
| DynamicSet<DiffWebLink> diffLinks, | |
| DynamicSet<ProjectWebLink> projectLinks, | |
| DynamicSet<BranchWebLink> branchLinks, | |
| DynamicSet<TagWebLink> tagLinks) { | |
| this.patchSetLinks = patchSetLinks; | |
| this.resolveConflictsLinks = resolveConflictsLinks; | |
| this.parentLinks = parentLinks; | |
| this.editLinks = editLinks; | |
| this.fileLinks = fileLinks; | |
| this.fileHistoryLinks = fileLogLinks; | |
| this.diffLinks = diffLinks; | |
| this.projectLinks = projectLinks; | |
| this.branchLinks = branchLinks; | |
| this.tagLinks = tagLinks; | |
| } | |
| /** | |
| * Returns links for patch sets | |
| * | |
| * @param project Project name. | |
| * @param commit SHA1 of commit. | |
| * @param commitMessage the commit message of the commit. | |
| * @param branchName branch of the commit. | |
| * @param changeKey change Identifier for this change | |
| * @param changeId the numeric changeID for this change | |
| */ | |
| public ImmutableList<WebLinkInfo> getPatchSetLinks( | |
| Project.NameKey project, | |
| String commit, | |
| String commitMessage, | |
| String branchName, | |
| String changeKey, | |
| int changeId) { | |
| return filterLinks( | |
| patchSetLinks, | |
| webLink -> | |
| webLink.getPatchSetWebLink( | |
| project.get(), commit, commitMessage, branchName, changeKey, changeId)); | |
| } | |
| /** | |
| * Returns links for resolving conflicts | |
| * | |
| * @param project Project name. | |
| * @param commit SHA1 of commit. | |
| * @param commitMessage the commit message of the commit. | |
| * @param branchName branch of the commit. | |
| */ | |
| public ImmutableList<WebLinkInfo> getResolveConflictsLinks( | |
| Project.NameKey project, String commit, String commitMessage, String branchName) { | |
| return filterLinks( | |
| resolveConflictsLinks, | |
| webLink -> | |
| webLink.getResolveConflictsWebLink(project.get(), commit, commitMessage, branchName)); | |
| } | |
| /** | |
| * Returns links for patch sets | |
| * | |
| * @param project Project name. | |
| * @param revision SHA1 of the parent revision. | |
| * @param commitMessage the commit message of the parent revision. | |
| * @param branchName branch of the revision (and parent revision). | |
| */ | |
| public ImmutableList<WebLinkInfo> getParentLinks( | |
| Project.NameKey project, String revision, String commitMessage, String branchName) { | |
| return filterLinks( | |
| parentLinks, | |
| webLink -> webLink.getParentWebLink(project.get(), revision, commitMessage, branchName)); | |
| } | |
| /** | |
| * Returns links for editing | |
| * | |
| * @param project Project name. | |
| * @param revision SHA1 of revision. | |
| * @param file File name. | |
| */ | |
| public ImmutableList<WebLinkInfo> getEditLinks(String project, String revision, String file) { | |
| return Patch.isMagic(file) | |
| ? ImmutableList.of() | |
| : filterLinks(editLinks, webLink -> webLink.getEditWebLink(project, revision, file)); | |
| } | |
| /** | |
| * Returns links for files | |
| * | |
| * @param project Project name. | |
| * @param revision Name of the revision (e.g. branch or commit ID) | |
| * @param hash SHA1 of revision. | |
| * @param file File name. | |
| */ | |
| public ImmutableList<WebLinkInfo> getFileLinks( | |
| String project, String revision, String hash, String file) { | |
| return Patch.isMagic(file) | |
| ? ImmutableList.of() | |
| : filterLinks(fileLinks, webLink -> webLink.getFileWebLink(project, revision, hash, file)); | |
| } | |
| /** | |
| * Returns links for file history | |
| * | |
| * @param project Project name. | |
| * @param revision SHA1 of revision. | |
| * @param file File name. | |
| */ | |
| public ImmutableList<WebLinkInfo> getFileHistoryLinks( | |
| String project, String revision, String file) { | |
| if (Patch.isMagic(file)) { | |
| return ImmutableList.of(); | |
| } | |
| return Streams.stream(fileHistoryLinks) | |
| .map(webLink -> webLink.getFileHistoryWebLink(project, revision, file)) | |
| .filter(WebLinks::isValid) | |
| .collect(toImmutableList()); | |
| } | |
| /** | |
| * Returns links for file diffs | |
| * | |
| * @param project Project name. | |
| * @param patchSetIdA Patch set ID of side A, <code>null</code> if no base patch set was selected. | |
| * @param revisionA SHA1 of revision of side A. | |
| * @param fileA File name of side A. | |
| * @param patchSetIdB Patch set ID of side B. | |
| * @param revisionB SHA1 of revision of side B. | |
| * @param fileB File name of side B. | |
| */ | |
| public ImmutableList<DiffWebLinkInfo> getDiffLinks( | |
| String project, | |
| int changeId, | |
| Integer patchSetIdA, | |
| String revisionA, | |
| String fileA, | |
| int patchSetIdB, | |
| String revisionB, | |
| String fileB) { | |
| if (Patch.isMagic(fileA) || Patch.isMagic(fileB)) { | |
| return ImmutableList.of(); | |
| } | |
| return Streams.stream(diffLinks) | |
| .map( | |
| webLink -> | |
| webLink.getDiffLink( | |
| project, | |
| changeId, | |
| patchSetIdA, | |
| revisionA, | |
| fileA, | |
| patchSetIdB, | |
| revisionB, | |
| fileB)) | |
| .filter(WebLinks::isValid) | |
| .collect(toImmutableList()); | |
| } | |
| /** | |
| * Returns links for projects | |
| * | |
| * @param project Project name. | |
| */ | |
| public ImmutableList<WebLinkInfo> getProjectLinks(String project) { | |
| return filterLinks(projectLinks, webLink -> webLink.getProjectWeblink(project)); | |
| } | |
| /** | |
| * Returns links for branches | |
| * | |
| * @param project Project name | |
| * @param branch Branch name | |
| */ | |
| public ImmutableList<WebLinkInfo> getBranchLinks(String project, String branch) { | |
| return filterLinks(branchLinks, webLink -> webLink.getBranchWebLink(project, branch)); | |
| } | |
| /** | |
| * Returns links for the tag | |
| * | |
| * @param project Project name | |
| * @param tag Tag name | |
| */ | |
| public ImmutableList<WebLinkInfo> getTagLinks(String project, String tag) { | |
| return filterLinks(tagLinks, webLink -> webLink.getTagWebLink(project, tag)); | |
| } | |
| private <T extends WebLink> ImmutableList<WebLinkInfo> filterLinks( | |
| DynamicSet<T> links, Function<T, WebLinkInfo> transformer) { | |
| return Streams.stream(links) | |
| .map(transformer) | |
| .filter(WebLinks::isValid) | |
| .collect(toImmutableList()); | |
| } | |
| private static boolean isValid(WebLinkInfo link) { | |
| if (link == null) { | |
| return false; | |
| } else if (Strings.isNullOrEmpty(link.name) || Strings.isNullOrEmpty(link.url)) { | |
| logger.atWarning().log("%s is missing name and/or url", link.getClass().getName()); | |
| return false; | |
| } | |
| return true; | |
| } | |
| } |