support nuget tools reference in nuget trigger
[teamcity/dotNetPackagesSupport.git] / nuget-server / src / jetbrains / buildServer / nuget / server / trigger / NamedPackagesUpdateChecker.java
1 package jetbrains.buildServer.nuget.server.trigger;\r
2 \r
3 import com.intellij.openapi.diagnostic.Logger;\r
4 import jetbrains.buildServer.buildTriggers.BuildTriggerDescriptor;\r
5 import jetbrains.buildServer.buildTriggers.BuildTriggerException;\r
6 import jetbrains.buildServer.nuget.server.exec.ListPackagesCommand;\r
7 import jetbrains.buildServer.nuget.server.exec.SourcePackageInfo;\r
8 import jetbrains.buildServer.nuget.server.toolRegistry.NuGetToolManager;\r
9 import jetbrains.buildServer.serverSide.CustomDataStorage;\r
10 import jetbrains.buildServer.util.StringUtil;\r
11 import org.jetbrains.annotations.NotNull;\r
12 \r
13 import java.io.File;\r
14 import java.util.*;\r
15 \r
16 /**\r
17  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
18  * Date: 14.07.11 15:41\r
19  */\r
20 public class NamedPackagesUpdateChecker implements TriggerUpdateChecker {\r
21   private static final Logger LOG = Logger.getInstance(NamedPackagesUpdateChecker.class.getName());\r
22 \r
23   public static final String KEY = "hash";\r
24   private final ListPackagesCommand myCommand;\r
25   private final NuGetToolManager myManager;\r
26 \r
27   public NamedPackagesUpdateChecker(@NotNull final ListPackagesCommand command,\r
28                                     @NotNull final NuGetToolManager manager) {\r
29     myCommand = command;\r
30     myManager = manager;\r
31   }\r
32 \r
33   public BuildStartReason checkChanges(@NotNull BuildTriggerDescriptor descriptor,\r
34                                        @NotNull CustomDataStorage storage) throws BuildTriggerException {\r
35     final String path = myManager.getNuGetPath(descriptor.getProperties().get(TriggerConstants.NUGET_EXE));\r
36     final String pkgId = descriptor.getProperties().get(TriggerConstants.PACKAGE);\r
37     final String version = descriptor.getProperties().get(TriggerConstants.VERSION);\r
38     final String source = descriptor.getProperties().get(TriggerConstants.SOURCE);\r
39 \r
40     if (StringUtil.isEmptyOrSpaces(path)) {\r
41       throw new BuildTriggerException("Path to NuGet.exe must be specified");\r
42     }\r
43 \r
44     if (StringUtil.isEmptyOrSpaces(pkgId)) {\r
45       throw new BuildTriggerException("Package Id must be specified");\r
46     }\r
47 \r
48     File nugetPath = new File(path);\r
49     if (!nugetPath.isFile()) {\r
50       throw new BuildTriggerException("Failed to find NuGet.exe at: " + nugetPath);\r
51     }\r
52 \r
53     Collection<SourcePackageInfo> result;\r
54     try {\r
55       result = myCommand.checkForChanges(nugetPath, source, pkgId, version);\r
56     } catch (Throwable t) {\r
57       throw new BuildTriggerException("Failed to check for package versions. " + t.getMessage(), t);\r
58     }\r
59     final String hash = serializeHashcode(result);\r
60     final String oldHash = storage.getValue(KEY);\r
61 \r
62     LOG.debug("Recieved packages hash: " + hash);\r
63     LOG.debug("          old hash was: " + oldHash);\r
64     if (!hash.equals(oldHash)) {\r
65       storage.putValue(KEY, hash);\r
66       storage.flush();\r
67 \r
68       if (oldHash != null) {\r
69         return new BuildStartReason("NuGet Package " + pkgId + " updated");\r
70       }\r
71     }\r
72 \r
73     return null;\r
74   }\r
75 \r
76   private String serializeHashcode(@NotNull final Collection<SourcePackageInfo> _packages) {\r
77     List<SourcePackageInfo> sorted = new ArrayList<SourcePackageInfo>(_packages);\r
78     Collections.sort(sorted, new Comparator<SourcePackageInfo>() {\r
79       public int compare(SourcePackageInfo o1, SourcePackageInfo o2) {\r
80         int i;\r
81         String s1 = o1.getSource();\r
82         String s2 = o2.getSource();\r
83         if (s1 == null && s2 == null) return 0;\r
84         if (s1 == null ^ s2 == null) return 1;\r
85         if (0 != (i = s1.compareTo(s2))) return i;\r
86         if (0 != (i = o1.getPackageId().compareTo(o2.getPackageId()))) return i;\r
87         if (0 != (i = o1.getVersion().compareTo(o2.getVersion()))) return i;\r
88         return 0;\r
89       }\r
90     });\r
91 \r
92     StringBuilder sb = new StringBuilder();\r
93     for (SourcePackageInfo info : sorted) {\r
94       String source = info.getSource();\r
95       if (source != null) {\r
96         sb.append("|s:").append(source);\r
97       }\r
98       sb.append("|p:").append(info.getPackageId());\r
99       sb.append("|v:").append(info.getVersion());\r
100     }\r
101     return sb.toString();\r
102   }\r
103 }\r