View Javadoc

1   package com.atlassian.marketplace.client.api;
2   
3   import com.atlassian.fugue.Option;
4   
5   import static com.atlassian.fugue.Option.none;
6   import static com.atlassian.marketplace.client.api.QueryProperties.describeOptEnum;
7   import static com.atlassian.marketplace.client.api.QueryProperties.describeParams;
8   import static com.atlassian.marketplace.client.api.QueryProperties.describeValues;
9   import static com.google.common.base.Preconditions.checkNotNull;
10  
11  /**
12   * Encapsulates search parameters that can be passed to {@link Addons#getVersion}.
13   * @since 2.0.0
14   */
15  public final class AddonVersionsQuery implements QueryProperties.AccessToken,
16          QueryProperties.ApplicationCriteria,
17          QueryProperties.Bounds,
18          QueryProperties.Cost,
19          QueryProperties.Hosting
20  {
21      private static final AddonVersionsQuery DEFAULT_QUERY = builder().build();
22  
23      private final Option<String> accessToken;
24      private final QueryBuilderProperties.ApplicationCriteriaHelper app;
25      private final Option<Cost> cost;
26      private final Option<HostingType> hosting;
27      private final QueryBounds bounds;
28      private final Option<String> afterVersionName;
29      
30      /**
31       * Returns a new {@link Builder} for constructing an AddonVersionsQuery.
32       */
33      public static Builder builder()
34      {
35          return new Builder();
36      }
37  
38      /**
39       * Returns an AddonVersionsQuery with no criteria, which will match any available versions.
40       */
41      public static AddonVersionsQuery any()
42      {
43          return DEFAULT_QUERY;
44      }
45      
46      public static Builder fromAddonQuery(AddonQuery aq)
47      {
48          return builder()
49              .accessToken(aq.getAccessToken())
50              .application(aq.getApplication())
51              .appBuildNumber(aq.getAppBuildNumber())
52              .cost(aq.getCost())
53              .hosting(aq.getHosting())
54              .bounds(aq.getBounds());
55      }
56      
57      /**
58       * Returns a new {@link Builder} for constructing an AddonVersionsQuery based on an existing AddonVersionsQuery.
59       */
60      public static Builder builder(AddonVersionsQuery query)
61      {
62          Builder builder = builder()
63              .application(query.getApplication())
64              .appBuildNumber(query.getAppBuildNumber())
65              .cost(query.getCost())
66              .hosting(query.getHosting())
67              .bounds(query.getBounds());
68  
69          return builder;
70      }
71  
72      private AddonVersionsQuery(Builder builder)
73      {
74          accessToken = builder.accessToken;
75          app = builder.app;
76          cost = builder.cost;
77          hosting = builder.hosting;
78          bounds = builder.bounds;
79          afterVersionName = builder.afterVersionName;
80      }
81      
82      @Override
83      public Option<String> getAccessToken()
84      {
85          return accessToken;
86      }
87      
88      @Override
89      public Option<ApplicationKey> getApplication()
90      {
91          return app.application;
92      }
93      
94      @Override
95      public Option<Integer> getAppBuildNumber()
96      {
97          return app.appBuildNumber;
98      }
99      
100     @Override
101     public Option<Cost> getCost()
102     {
103         return cost;
104     }
105     
106     @Override
107     public Option<HostingType> getHosting()
108     {
109         return hosting;
110     }
111     
112     @Override
113     public QueryBounds getBounds()
114     {
115         return bounds;
116     }
117     
118     /**
119      * The version string, if any, that the client has specified in order to search for
120      * later versions.
121      * @see Builder#afterVersion(Option)
122      */
123     public Option<String> getAfterVersionName()
124     {
125         return afterVersionName;
126     }
127 
128     @SuppressWarnings("unchecked")
129     @Override
130     public String toString()
131     {
132         return describeParams("AddonVersionsQuery",
133             describeValues("accessToken", accessToken),
134             app.describe(),
135             describeOptEnum("cost", cost),
136             describeOptEnum("hosting", hosting),
137             bounds.describe(),
138             describeValues("afterVersion", afterVersionName)
139         );
140     }
141     
142     @Override
143     public boolean equals(Object other)
144     {
145         return (other instanceof AddonVersionsQuery) ? toString().equals(other.toString()) : false;
146     }
147 
148     @Override
149     public int hashCode()
150     {
151         return toString().hashCode();
152     }
153     
154     /**
155      * Builder class for {@link AddonVersionsQuery}.  Use {@link AddonVersionsQuery#builder()} to create an instance. 
156      */
157     public static class Builder implements QueryBuilderProperties.AccessToken<Builder>,
158         QueryBuilderProperties.ApplicationCriteria<Builder>,
159         QueryBuilderProperties.Bounds<Builder>,
160         QueryBuilderProperties.Cost<Builder>,
161         QueryBuilderProperties.Hosting<Builder>
162     {
163         private Option<String> accessToken = none();
164         private QueryBuilderProperties.ApplicationCriteriaHelper app = new QueryBuilderProperties.ApplicationCriteriaHelper();
165         private Option<Cost> cost = none();
166         private Option<HostingType> hosting = none();
167         private QueryBounds bounds = QueryBounds.defaultBounds();
168         private Option<String> afterVersionName = none();
169         
170         /**
171          * Returns an immutable {@link AddonVersionsQuery} based on the current builder properties.
172          */
173         public AddonVersionsQuery build()
174         {
175             return new AddonVersionsQuery(this);
176         }
177         
178         @Override
179         public Builder accessToken(Option<String> accessToken)
180         {
181             this.accessToken = checkNotNull(accessToken);
182             return this;
183         }
184         
185         @Override
186         public Builder application(Option<ApplicationKey> application)
187         {
188             app = app.application(application);
189             return this;
190         }
191         
192         @Override
193         public Builder appBuildNumber(Option<Integer> appBuildNumber)
194         {
195             app = app.appBuildNumber(appBuildNumber);
196             return this;
197         }
198         
199         @Override
200         public Builder cost(Option<Cost> cost)
201         {
202             this.cost = checkNotNull(cost);
203             return this;
204         }
205 
206         @Override
207         public Builder hosting(Option<HostingType> hosting)
208         {
209             this.hosting = checkNotNull(hosting);
210             return this;
211         }
212         
213         /**
214          * Specifies an existing version if you want to query versions that are later than that
215          * version.
216          * @param versionName  the version string (for instance, "1.0") of an existing add-on version
217          *   to restrict the query to versions later than this version, or {@link Option#none()} to
218          *   remove any such restriction 
219          * @return  the same query builder
220          * @see AddonVersionsQuery#getAfterVersionName()
221          */
222         public Builder afterVersion(Option<String> versionName)
223         {
224             this.afterVersionName = checkNotNull(versionName);
225             return this;
226         }
227         
228         @Override
229         public Builder bounds(QueryBounds bounds)
230         {
231             this.bounds = checkNotNull(bounds);
232             return this;
233         }
234     }
235 }