Merge branch 'Indore-2017.1.x'
[teamcity/git-plugin.git] / git-server / src / jetbrains / buildServer / buildTriggers / vcs / git / GitFileContentDispatcher.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package jetbrains.buildServer.buildTriggers.vcs.git;
18
19 import jetbrains.buildServer.buildTriggers.vcs.git.github.GitHubRawFileContentProvider;
20 import jetbrains.buildServer.vcs.*;
21 import org.jetbrains.annotations.NotNull;
22
23 public class GitFileContentDispatcher implements VcsFileContentProvider {
24
25   private final GitVcsSupport myVcs;
26   private final CommitLoader myCommitLoader;
27   private final ServerPluginConfig myConfig;
28
29   private VcsFileContentProvider myImplementation;
30
31   public GitFileContentDispatcher(@NotNull GitVcsSupport vcs,
32                                   @NotNull CommitLoader commitLoader,
33                                   @NotNull ServerPluginConfig config) {
34     myVcs = vcs;
35     myCommitLoader = commitLoader;
36     myConfig = config;
37   }
38
39   @NotNull
40   public byte[] getContent(@NotNull VcsModification vcsModification,
41                            @NotNull VcsChangeInfo change,
42                            @NotNull VcsChangeInfo.ContentType contentType,
43                            @NotNull VcsRoot root) throws VcsException {
44     if (myImplementation == null)
45       myImplementation = getContentProvider(root);
46     return myImplementation.getContent(vcsModification, change, contentType, root);
47   }
48
49   @NotNull
50   public byte[] getContent(@NotNull String filePath, @NotNull VcsRoot root, @NotNull String version) throws VcsException {
51     synchronized (this) {
52       if (myImplementation == null)
53         myImplementation = getContentProvider(root);
54     }
55     return myImplementation.getContent(filePath, root, version);
56   }
57
58   private VcsFileContentProvider getContentProvider(@NotNull VcsRoot root) {
59     OperationContext ctx = myVcs.createContext(root, "file content dispatch");
60     GitVcsFileContentProvider genericProvider = new GitVcsFileContentProvider(myVcs, myCommitLoader, myConfig);
61     try {
62       if (GitServerUtil.isCloned(ctx.getRepository()))
63         return genericProvider;
64       VcsHostingRepo ghRepo = WellKnownHostingsUtil.getGitHubRepo(ctx.getGitRoot().getRepositoryFetchURL());
65       if (ghRepo == null)
66         return genericProvider;
67       return new GitHubRawFileContentProvider(myVcs, genericProvider, ghRepo.owner(), ghRepo.repoName());
68     } catch (Exception e) {
69       //LOG
70       return genericProvider;
71     } finally {
72       ctx.close();
73     }
74   }
75 }