TW-50733 specify full path to java in credential helper
[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.buildTriggers.vcs.git.github.GitHubRepo;
21 import jetbrains.buildServer.buildTriggers.vcs.git.github.GitHubUtil;
22 import jetbrains.buildServer.vcs.*;
23 import org.jetbrains.annotations.NotNull;
24
25 public class GitFileContentDispatcher implements VcsFileContentProvider {
26
27   private final GitVcsSupport myVcs;
28   private final CommitLoader myCommitLoader;
29   private final ServerPluginConfig myConfig;
30
31   private VcsFileContentProvider myImplementation;
32
33   public GitFileContentDispatcher(@NotNull GitVcsSupport vcs,
34                                   @NotNull CommitLoader commitLoader,
35                                   @NotNull ServerPluginConfig config) {
36     myVcs = vcs;
37     myCommitLoader = commitLoader;
38     myConfig = config;
39   }
40
41   @NotNull
42   public byte[] getContent(@NotNull VcsModification vcsModification,
43                            @NotNull VcsChangeInfo change,
44                            @NotNull VcsChangeInfo.ContentType contentType,
45                            @NotNull VcsRoot root) throws VcsException {
46     if (myImplementation == null)
47       myImplementation = getContentProvider(root);
48     return myImplementation.getContent(vcsModification, change, contentType, root);
49   }
50
51   @NotNull
52   public byte[] getContent(@NotNull String filePath, @NotNull VcsRoot root, @NotNull String version) throws VcsException {
53     synchronized (this) {
54       if (myImplementation == null)
55         myImplementation = getContentProvider(root);
56     }
57     return myImplementation.getContent(filePath, root, version);
58   }
59
60   private VcsFileContentProvider getContentProvider(@NotNull VcsRoot root) {
61     OperationContext ctx = myVcs.createContext(root, "file content dispatch");
62     GitVcsFileContentProvider genericProvider = new GitVcsFileContentProvider(myVcs, myCommitLoader, myConfig);
63     try {
64       if (GitServerUtil.isCloned(ctx.getRepository()))
65         return genericProvider;
66       GitHubRepo ghRepo = GitHubUtil.getGitHubRepo(ctx.getGitRoot().getRepositoryFetchURL());
67       if (ghRepo == null)
68         return genericProvider;
69       return new GitHubRawFileContentProvider(myVcs, genericProvider, ghRepo.owner(), ghRepo.repo());
70     } catch (Exception e) {
71       //LOG
72       return genericProvider;
73     } finally {
74       ctx.close();
75     }
76   }
77 }