more tests on push command
[teamcity/dotNetPackagesSupport.git] / nuget-agent / src / jetbrains / buildServer / nuget / agent / install / LocateNuGetConfigBuildProcess.java
1 /*\r
2  * Copyright 2000-2011 JetBrains s.r.o.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package jetbrains.buildServer.nuget.agent.install;\r
18 \r
19 import com.intellij.openapi.diagnostic.Logger;\r
20 import jetbrains.buildServer.RunBuildException;\r
21 import jetbrains.buildServer.agent.BuildFinishedStatus;\r
22 import jetbrains.buildServer.agent.BuildProgressLogger;\r
23 import jetbrains.buildServer.nuget.agent.parameters.NuGetFetchParameters;\r
24 import jetbrains.buildServer.nuget.agent.util.BuildProcessBase;\r
25 import jetbrains.buildServer.util.FileUtil;\r
26 import jetbrains.buildServer.util.StringUtil;\r
27 import jetbrains.buildServer.util.XmlXppAbstractParser;\r
28 import org.jetbrains.annotations.NotNull;\r
29 \r
30 import java.io.File;\r
31 import java.io.IOException;\r
32 import java.util.ArrayList;\r
33 import java.util.Arrays;\r
34 import java.util.Collection;\r
35 import java.util.List;\r
36 \r
37 /**\r
38  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
39  * Date: 07.07.11 16:03\r
40  */\r
41 public class LocateNuGetConfigBuildProcess extends BuildProcessBase {\r
42   private static final Logger LOG = Logger.getInstance(LocateNuGetConfigBuildProcess.class.getName());\r
43 \r
44   private final NuGetFetchParameters myContext;\r
45   private final BuildProgressLogger myLogger;\r
46   private final Callback myCallback;\r
47 \r
48   public LocateNuGetConfigBuildProcess(@NotNull final NuGetFetchParameters context,\r
49                                        @NotNull final BuildProgressLogger logger,\r
50                                        @NotNull final Callback callback) {\r
51     myContext = context;\r
52     myLogger = logger;\r
53     myCallback = callback;\r
54   }\r
55 \r
56   public static interface Callback {\r
57     /**\r
58      * Called when packages.config is found\r
59      * @param config full path to packages.config file\r
60      * @param targetFolder target folder to store packages\r
61      * @throws RunBuildException on erorr\r
62      */\r
63     void onPackagesConfigFound(@NotNull final File config, @NotNull final File targetFolder) throws RunBuildException;\r
64 \r
65     /**\r
66      * Called when solution file is found\r
67      * @param sln path to sln file\r
68      * @param targetFolder target folder to store packages\r
69      * @throws RunBuildException on error\r
70      */\r
71     void onSolutionFileFound(@NotNull final File sln, @NotNull final File targetFolder) throws RunBuildException;\r
72   }\r
73 \r
74   @NotNull\r
75   @Override\r
76   protected BuildFinishedStatus waitForImpl() throws RunBuildException {\r
77     final File sln = myContext.getSolutionFile();\r
78     final File packages = new File(sln.getParentFile(), "packages");\r
79     final File repositoriesConfig = new File(packages, "repositories.config");\r
80 \r
81     if (sln.isFile()) {\r
82       LOG.debug("Found Visual Studio .sln file: " + sln);\r
83       myCallback.onSolutionFileFound(sln, packages);\r
84     }\r
85 \r
86     LOG.debug("resources.config path is " + repositoriesConfig);\r
87 \r
88     if (!repositoriesConfig.isFile()) {\r
89       throw new RunBuildException("Failed to find repositories.config at " + repositoriesConfig);\r
90     }\r
91 \r
92     myLogger.message("Found packages folder: " + packages);\r
93     myLogger.message("Found list of packages.config files: " + repositoriesConfig);\r
94     Collection<File> files = listPackagesConfigs(repositoriesConfig);\r
95 \r
96     if (files.isEmpty()) {\r
97       myLogger.warning("No packages.config files were found under solution. Nothing to install");\r
98       return BuildFinishedStatus.FINISHED_SUCCESS;\r
99     }\r
100 \r
101     for (File file : files) {\r
102       myCallback.onPackagesConfigFound(file, packages);\r
103     }\r
104 \r
105     return BuildFinishedStatus.FINISHED_SUCCESS;\r
106   }\r
107 \r
108   @NotNull\r
109   private Collection<File> listPackagesConfigs(@NotNull final File repositoriesConfig) throws RunBuildException {\r
110     final Collection<File> files = new ArrayList<File>();\r
111     try {\r
112       new XmlXppAbstractParser(){\r
113         @Override\r
114         protected List<XmlHandler> getRootHandlers() {\r
115           return Arrays.asList(elementsPath(new Handler() {\r
116             public XmlReturn processElement(@NotNull XmlElementInfo xmlElementInfo) {\r
117               final String relPath = xmlElementInfo.getAttribute("path");\r
118               if (relPath != null && !StringUtil.isEmptyOrSpaces(relPath)) {\r
119                 files.add(FileUtil.resolvePath(repositoriesConfig.getParentFile(), relPath));\r
120               }\r
121               return xmlElementInfo.noDeep();\r
122             }\r
123           }, "repositories", "repository"));\r
124         }\r
125       }.parse(repositoriesConfig);\r
126     } catch (IOException e) {\r
127       throw new RunBuildException("Failed to parse repositories.config at " + repositoriesConfig + ". " + e.getMessage(), e);\r
128     }\r
129 \r
130     return files;\r
131   }\r
132 }\r