fc52a33e0f1668f166a4c0a614568d9d0b671ee5
[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.NuGetParameters;\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 NuGetParameters myContext;\r
45   private final BuildProgressLogger myLogger;\r
46   private final Callback myCallback;\r
47 \r
48   public LocateNuGetConfigBuildProcess(@NotNull final NuGetParameters 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      */\r
62     void onPackagesConfigFound(@NotNull final File config, @NotNull final File targetFolder);\r
63   }\r
64 \r
65   @NotNull\r
66   @Override\r
67   protected BuildFinishedStatus waitForImpl() throws RunBuildException {\r
68     final File sln = myContext.getSolutionFile();\r
69     final File packages = new File(sln.getParentFile(), "packages");\r
70     final File repositoriesConfig = new File(packages, "repositories.config");\r
71 \r
72     LOG.debug("resources.config path is " + repositoriesConfig);\r
73 \r
74     if (!repositoriesConfig.isFile()) {\r
75       throw new RunBuildException("Failed to find repositories.config at " + repositoriesConfig);\r
76     }\r
77 \r
78     myLogger.message("Found packages folder: " + packages);\r
79     myLogger.message("Found list of packages.config files: " + repositoriesConfig);\r
80     Collection<File> files = listPackagesConfigs(repositoriesConfig);\r
81 \r
82     if (files.isEmpty()) {\r
83       myLogger.warning("No packages.config files were found under solution. Nothing to install");\r
84       return BuildFinishedStatus.FINISHED_SUCCESS;\r
85     }\r
86 \r
87     for (File file : files) {\r
88       myCallback.onPackagesConfigFound(file, packages);\r
89     }\r
90 \r
91     return BuildFinishedStatus.FINISHED_SUCCESS;\r
92   }\r
93 \r
94   @NotNull\r
95   private Collection<File> listPackagesConfigs(@NotNull final File repositoriesConfig) throws RunBuildException {\r
96     final Collection<File> files = new ArrayList<File>();\r
97     try {\r
98       new XmlXppAbstractParser(){\r
99         @Override\r
100         protected List<XmlHandler> getRootHandlers() {\r
101           return Arrays.asList(elementsPath(new Handler() {\r
102             public XmlReturn processElement(@NotNull XmlElementInfo xmlElementInfo) {\r
103               final String relPath = xmlElementInfo.getAttribute("path");\r
104               if (relPath != null && !StringUtil.isEmptyOrSpaces(relPath)) {\r
105                 files.add(FileUtil.resolvePath(repositoriesConfig.getParentFile(), relPath));\r
106               }\r
107               return xmlElementInfo.noDeep();\r
108             }\r
109           }, "repositories", "repository"));\r
110         }\r
111       }.parse(repositoriesConfig);\r
112     } catch (IOException e) {\r
113       throw new RunBuildException("Failed to parse repositories.config at " + repositoriesConfig + ". " + e.getMessage(), e);\r
114     }\r
115 \r
116     return files;\r
117   }\r
118 }\r