implement build 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 jetbrains.buildServer.buildTriggers.BuildTriggerDescriptor;\r
4 import jetbrains.buildServer.buildTriggers.BuildTriggerException;\r
5 import jetbrains.buildServer.nuget.server.exec.ListPackagesCommand;\r
6 import jetbrains.buildServer.nuget.server.exec.PackageInfo;\r
7 import jetbrains.buildServer.serverSide.CustomDataStorage;\r
8 import org.jetbrains.annotations.NotNull;\r
9 \r
10 import java.util.*;\r
11 \r
12 /**\r
13  * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
14  * Date: 14.07.11 15:41\r
15  */\r
16 public class NamedPackagesUpdateChecker implements TriggerUpdateChecker {\r
17   public static final String KEY = "hash";\r
18   private final ListPackagesCommand myCommand;\r
19 \r
20   public NamedPackagesUpdateChecker(@NotNull final ListPackagesCommand command) {\r
21     myCommand = command;\r
22   }\r
23 \r
24   public BuildStartReason checkChanges(@NotNull BuildTriggerDescriptor descriptor,\r
25                               @NotNull CustomDataStorage storage) throws BuildTriggerException {\r
26     final String pkgId = descriptor.getProperties().get(TriggerConstants.PACKAGE);\r
27     final String version = descriptor.getProperties().get(TriggerConstants.VERSION);\r
28     final String source = descriptor.getProperties().get(TriggerConstants.SOURCE);\r
29     Collection<PackageInfo> result = myCommand.checkForChanges(source, pkgId, version);\r
30     final String hash = serializeHashcode(result);\r
31 \r
32     String oldHash = storage.getValue(KEY);\r
33     if (!hash.equals(oldHash)) {\r
34       storage.putValue(KEY, hash);\r
35       storage.flush();\r
36       return new BuildStartReason("NuGet Package " + pkgId + " updated");\r
37     }\r
38 \r
39     return null;\r
40   }\r
41 \r
42   private String serializeHashcode(@NotNull final Collection<PackageInfo> _packages) {\r
43     List<PackageInfo> sorted = new ArrayList<PackageInfo>(_packages);\r
44     Collections.sort(sorted, new Comparator<PackageInfo>() {\r
45       public int compare(PackageInfo o1, PackageInfo o2) {\r
46         int i;\r
47         if (0 != (i = o1.getSource().compareTo(o2.getSource()))) return i;\r
48         if (0 != (i = o1.getPackageId().compareTo(o2.getPackageId()))) return i;\r
49         if (0 != (i = o1.getVersion().compareTo(o2.getVersion()))) return i;\r
50         return 0;\r
51       }\r
52     });\r
53 \r
54     StringBuilder sb = new StringBuilder();\r
55     for (PackageInfo info : sorted) {\r
56       sb.append("|s:").append(info.getSource());\r
57       sb.append("|p:").append(info.getPackageId());\r
58       sb.append("|v:").append(info.getVersion());\r
59     }\r
60     return sb.toString();\r
61   }\r
62 }\r