support nuget tools reference in nuget trigger
[teamcity/dotNetPackagesSupport.git] / nuget-server / src / jetbrains / buildServer / nuget / server / toolRegistry / impl / AvailableToolsStateImpl.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.server.toolRegistry.impl;\r
18 \r
19 import jetbrains.buildServer.nuget.common.FeedConstants;\r
20 import jetbrains.buildServer.nuget.server.feed.reader.FeedPackage;\r
21 import jetbrains.buildServer.nuget.server.feed.reader.NuGetFeedReader;\r
22 import jetbrains.buildServer.nuget.server.toolRegistry.FetchException;\r
23 import jetbrains.buildServer.nuget.server.toolRegistry.NuGetTool;\r
24 import jetbrains.buildServer.nuget.server.toolRegistry.ToolsPolicy;\r
25 import jetbrains.buildServer.util.CollectionsUtil;\r
26 import jetbrains.buildServer.util.Converter;\r
27 import jetbrains.buildServer.util.TimeService;\r
28 import jetbrains.buildServer.util.filters.Filter;\r
29 import org.jetbrains.annotations.NotNull;\r
30 import org.jetbrains.annotations.Nullable;\r
31 \r
32 import java.io.IOException;\r
33 import java.util.Collection;\r
34 \r
35 /**\r
36  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
37  * Date: 15.08.11 16:33\r
38  */\r
39 public class AvailableToolsStateImpl implements AvailableToolsState {\r
40   private static final long TIMEOUT = 1000 * 60 * 15; //15 min\r
41 \r
42   private final NuGetFeedReader myReader;\r
43   private final TimeService myTime;\r
44   private Collection<InstallableTool> myTools;\r
45   private long lastRequest = 0;\r
46 \r
47   public AvailableToolsStateImpl(@NotNull final NuGetFeedReader reader,\r
48                                  @NotNull final TimeService time) {\r
49     myReader = reader;\r
50     myTime = time;\r
51   }\r
52 \r
53   @Nullable\r
54   public FeedPackage findTool(@NotNull final String id) {\r
55     final Collection<InstallableTool> tools = myTools;\r
56     if (tools != null) {\r
57       for (InstallableTool tool : tools) {\r
58         if(tool.getPackage().getAtomId().equals(id)) {\r
59           return tool.getPackage();\r
60         }\r
61       }\r
62     }\r
63     return null;\r
64   }\r
65 \r
66   @NotNull\r
67   public Collection<? extends NuGetTool> getAvailable(ToolsPolicy policy) throws FetchException {\r
68     Collection<InstallableTool> nuGetTools = myTools;\r
69     if (policy == ToolsPolicy.FetchNew\r
70             || nuGetTools == null\r
71             || lastRequest + TIMEOUT < myTime.now()) {\r
72       myTools = null;\r
73       myTools = nuGetTools = fetchAvailable();\r
74       lastRequest = myTime.now();\r
75     }\r
76     return nuGetTools;\r
77   }\r
78 \r
79   private Collection<InstallableTool> fetchAvailable() throws FetchException {\r
80     try {\r
81       final Collection<FeedPackage> packages = myReader.queryPackageVersions(FeedConstants.FEED_URL, FeedConstants.NUGET_COMMANDLINE);\r
82       return CollectionsUtil.filterAndConvertCollection(\r
83               packages,\r
84               new Converter<InstallableTool, FeedPackage>() {\r
85                 public InstallableTool createFrom(@NotNull FeedPackage source) {\r
86                   return new InstallableTool(source);\r
87                 }\r
88               },\r
89               new Filter<FeedPackage>() {\r
90                 public boolean accept(@NotNull FeedPackage data) {\r
91                   final String[] version = data.getInfo().getVersion().split("\\.");\r
92                   if (version.length < 2) return false;\r
93                   int major = parse(version[0]);\r
94                   if (major < 1) return false;\r
95 \r
96                   int minor = parse(version[1]);\r
97                   if (minor < 4) return false;\r
98 \r
99                   return true;\r
100                 }\r
101 \r
102                 private int parse(String s) {\r
103                   try {\r
104                     return Integer.parseInt(s.trim());\r
105                   } catch (Exception e) {\r
106                     return -1;\r
107                   }\r
108                 }\r
109               }\r
110       );\r
111 \r
112     } catch (IOException e) {\r
113       throw new FetchException(e.getMessage(), e);\r
114     }\r
115   }\r
116 \r
117   private static class InstallableTool implements NuGetTool {\r
118     private final FeedPackage myPackage;\r
119 \r
120     private InstallableTool(@NotNull final FeedPackage aPackage) {\r
121       myPackage = aPackage;\r
122     }\r
123 \r
124     @NotNull\r
125     public String getId() {\r
126       return myPackage.getAtomId();\r
127     }\r
128 \r
129     @NotNull\r
130     public String getVersion() {\r
131       return myPackage.getInfo().getVersion();\r
132     }\r
133 \r
134     @NotNull\r
135     public FeedPackage getPackage() {\r
136       return myPackage;\r
137     }\r
138   }\r
139 \r
140 }\r