| // 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.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.TagWebLink; |
| import com.google.gerrit.extensions.webui.WebLink; |
| import com.google.inject.Inject; |
| import com.google.inject.Singleton; |
| import java.util.function.Function; |
| import java.util.function.Predicate; |
| |
| @Singleton |
| public class WebLinks { |
| private static final FluentLogger logger = FluentLogger.forEnclosingClass(); |
| |
| private static final Predicate<WebLinkInfo> INVALID_WEBLINK = |
| 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; |
| }; |
| |
| private final DynamicSet<PatchSetWebLink> patchSetLinks; |
| private final DynamicSet<ParentWebLink> parentLinks; |
| 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<ParentWebLink> parentLinks, |
| DynamicSet<FileWebLink> fileLinks, |
| DynamicSet<FileHistoryWebLink> fileLogLinks, |
| DynamicSet<DiffWebLink> diffLinks, |
| DynamicSet<ProjectWebLink> projectLinks, |
| DynamicSet<BranchWebLink> branchLinks, |
| DynamicSet<TagWebLink> tagLinks) { |
| this.patchSetLinks = patchSetLinks; |
| this.parentLinks = parentLinks; |
| this.fileLinks = fileLinks; |
| this.fileHistoryLinks = fileLogLinks; |
| this.diffLinks = diffLinks; |
| this.projectLinks = projectLinks; |
| this.branchLinks = branchLinks; |
| this.tagLinks = tagLinks; |
| } |
| |
| /** |
| * @param project Project name. |
| * @param commit SHA1 of commit. |
| * @return Links for patch sets. |
| */ |
| public ImmutableList<WebLinkInfo> getPatchSetLinks(Project.NameKey project, String commit) { |
| return filterLinks(patchSetLinks, webLink -> webLink.getPatchSetWebLink(project.get(), commit)); |
| } |
| |
| /** |
| * @param project Project name. |
| * @param revision SHA1 of the parent revision. |
| * @return Links for patch sets. |
| */ |
| public ImmutableList<WebLinkInfo> getParentLinks(Project.NameKey project, String revision) { |
| return filterLinks(parentLinks, webLink -> webLink.getParentWebLink(project.get(), revision)); |
| } |
| |
| /** |
| * @param project Project name. |
| * @param revision SHA1 of revision. |
| * @param file File name. |
| * @return Links for files. |
| */ |
| public ImmutableList<WebLinkInfo> getFileLinks(String project, String revision, String file) { |
| return Patch.isMagic(file) |
| ? ImmutableList.of() |
| : filterLinks(fileLinks, webLink -> webLink.getFileWebLink(project, revision, file)); |
| } |
| |
| /** |
| * @param project Project name. |
| * @param revision SHA1 of revision. |
| * @param file File name. |
| * @return Links for file history |
| */ |
| 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(INVALID_WEBLINK) |
| .collect(toImmutableList()); |
| } |
| |
| /** |
| * @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. |
| * @return Links for file diffs. |
| */ |
| 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(INVALID_WEBLINK) |
| .collect(toImmutableList()); |
| } |
| |
| /** |
| * @param project Project name. |
| * @return Links for projects. |
| */ |
| public ImmutableList<WebLinkInfo> getProjectLinks(String project) { |
| return filterLinks(projectLinks, webLink -> webLink.getProjectWeblink(project)); |
| } |
| |
| /** |
| * @param project Project name |
| * @param branch Branch name |
| * @return Links for branches. |
| */ |
| public ImmutableList<WebLinkInfo> getBranchLinks(String project, String branch) { |
| return filterLinks(branchLinks, webLink -> webLink.getBranchWebLink(project, branch)); |
| } |
| |
| /** |
| * @param project Project name |
| * @param tag Tag name |
| * @return Links for tags. |
| */ |
| 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(INVALID_WEBLINK) |
| .collect(toImmutableList()); |
| } |
| } |