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