1   package com.atlassian.plugins.codegen;
2   
3   import com.atlassian.fugue.Option;
4   
5   import static com.atlassian.fugue.Option.none;
6   import static com.atlassian.fugue.Option.some;
7   import static com.google.common.base.Preconditions.checkNotNull;
8   
9   /**
10   * Simple wrapper for an artifact version string.  This can also be a Maven property name, in which
11   * case the version string is used as the default value for the property.
12   */
13  public final class VersionId
14  {
15      private final Option<String> version;
16      private final Option<String> propertyName;
17      
18      public static VersionId version(String version)
19      {
20          return new VersionId(some(version), none(String.class)); 
21      }
22      
23      public static VersionId versionProperty(String propertyName, String defaultVersion)
24      {
25          return new VersionId(some(defaultVersion), some(propertyName));
26      }
27  
28      public static VersionId noVersion()
29      {
30          return new VersionId(none(String.class), none(String.class));
31      }
32      
33      private VersionId(Option<String> version, Option<String> propertyName)
34      {
35          this.version = checkNotNull(version, "version");
36          this.propertyName = checkNotNull(propertyName, "propertyName");
37      }
38      
39      public Option<String> getVersion()
40      {
41          return version;
42      }
43      
44      public Option<String> getPropertyName()
45      {
46          return propertyName;
47      }
48  
49      public boolean isDefined()
50      {
51          return version.isDefined() || propertyName.isDefined();
52      }
53      
54      /**
55       * Returns the version string, unless a property name was specified, in which case it returns
56       * "${propertyName}".  Returns none() if neither was specified.
57       */
58      public Option<String> getVersionOrPropertyPlaceholder()
59      {
60          for (String p : propertyName)
61          {
62              return some(placeholder(p));
63          }
64          return version;
65      }
66      
67      @Override
68      public String toString()
69      {
70          for (String p : propertyName)
71          {
72              for (String v : version)
73              {
74                  return placeholder(p) + " (" + v + ")";
75              }
76              return placeholder(p);
77          }
78          for (String v : version)
79          {
80              return v;
81          }
82          return "?";
83      }
84      
85      private String placeholder(String p)
86      {
87          return "${" + p + "}";
88      }
89      
90      @Override
91      public boolean equals(Object other)
92      {
93          if (other instanceof VersionId)
94          {
95              VersionId v = (VersionId) other;
96              return version.equals(v.version) && propertyName.equals(v.propertyName);
97          }
98          return false;
99      }
100     
101     @Override
102     public int hashCode()
103     {
104         return toString().hashCode();
105     }
106 }