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