75370b2d2fb65cd753f5a56477dc970d5e2609f3
[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.util.BuildProcessBase;\r
24 import jetbrains.buildServer.util.FileUtil;\r
25 import jetbrains.buildServer.util.StringUtil;\r
26 import jetbrains.buildServer.util.XmlXppAbstractParser;\r
27 import org.jetbrains.annotations.NotNull;\r
28 \r
29 import java.io.File;\r
30 import java.io.IOException;\r
31 import java.util.ArrayList;\r
32 import java.util.Arrays;\r
33 import java.util.Collection;\r
34 import java.util.List;\r
35 \r
36 /**\r
37  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
38  * Date: 07.07.11 16:03\r
39  */\r
40 public class LocateNuGetConfigBuildProcess extends BuildProcessBase {\r
41   private static final Logger LOG = Logger.getInstance(LocateNuGetConfigBuildProcess.class.getName());\r
42 \r
43   private final PackagesInstallParameters myContext;\r
44   private final BuildProgressLogger myLogger;\r
45   private final Callback myCallback;\r
46 \r
47   public LocateNuGetConfigBuildProcess(@NotNull final PackagesInstallParameters context,\r
48                                        @NotNull final BuildProgressLogger logger,\r
49                                        @NotNull final Callback callback) {\r
50     myContext = context;\r
51     myLogger = logger;\r
52     myCallback = callback;\r
53   }\r
54 \r
55   public static interface Callback {\r
56     /**\r
57      * Called when packages.config is found\r
58      * @param config full path to packages.config file\r
59      * @param targetFolder target folder to store packages\r
60      * @throws jetbrains.buildServer.RunBuildException if failed to process callback\r
61      */\r
62     void onPackagesConfigFound(@NotNull final File config, @NotNull final File targetFolder) throws RunBuildException;\r
63   }\r
64 \r
65   @Override\r
66   protected BuildFinishedStatus waitForImpl() throws RunBuildException {\r
67     final File sln = myContext.getSolutionFile();\r
68     final File packages = new File(sln, "packages");\r
69     final File repositoriesConfig = new File(packages, "repositories.config");\r
70 \r
71     LOG.debug("resources.config path is " + repositoriesConfig);\r
72 \r
73     if (!repositoriesConfig.isFile()) {\r
74       throw new RunBuildException("Failed to find " + repositoriesConfig);\r
75     }\r
76 \r
77     myLogger.message("Found packages folder: " + packages);\r
78     myLogger.message("Found list of packages.config files: " + repositoriesConfig);\r
79     Collection<File> files = listPackagesConfigs(repositoriesConfig);\r
80 \r
81     if (files.isEmpty()) {\r
82       myLogger.warning("No packages.config files were found under solution. Nothing to install");\r
83       return BuildFinishedStatus.FINISHED_SUCCESS;\r
84     }\r
85 \r
86     for (File file : files) {\r
87       myCallback.onPackagesConfigFound(file, packages);\r
88     }\r
89 \r
90     return null;\r
91   }\r
92 \r
93   @NotNull\r
94   private Collection<File> listPackagesConfigs(@NotNull final File repositoriesConfig) throws RunBuildException {\r
95     final Collection<File> files = new ArrayList<File>();\r
96     try {\r
97       new XmlXppAbstractParser(){\r
98         @Override\r
99         protected List<XmlHandler> getRootHandlers() {\r
100           return Arrays.asList(elementsPath(new Handler() {\r
101             public XmlReturn processElement(@NotNull XmlElementInfo xmlElementInfo) {\r
102               final String relPath = xmlElementInfo.getAttribute("path");\r
103               if (relPath != null && !StringUtil.isEmptyOrSpaces(relPath)) {\r
104                 files.add(FileUtil.resolvePath(repositoriesConfig.getParentFile(), relPath));\r
105               }\r
106               return xmlElementInfo.noDeep();\r
107             }\r
108           }, "repositories", "repository"));\r
109         }\r
110       }.parse(repositoriesConfig);\r
111     } catch (IOException e) {\r
112       throw new RunBuildException("Failed to parse " + repositoriesConfig + ". " + e.getMessage(), e);\r
113     }\r
114 \r
115     return files;\r
116   }\r
117 }\r