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