View Javadoc
1   /*
2    * Licensed to The Apereo Foundation under one or more contributor license
3    * agreements. See the NOTICE file distributed with this work for additional
4    * information regarding copyright ownership.
5    *
6    *
7    * The Apereo Foundation licenses this file to you under the Educational
8    * Community License, Version 2.0 (the "License"); you may not use this file
9    * except in compliance with the License. You may obtain a copy of the License
10   * at:
11   *
12   *   http://opensource.org/licenses/ecl2.txt
13   *
14   * Unless required by applicable law or agreed to in writing, software
15   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
17   * License for the specific language governing permissions and limitations under
18   * the License.
19   *
20   */
21  
22  package org.opencastproject.list.common.query;
23  
24  import org.opencastproject.list.api.DefaultResourceListQuery;
25  import org.opencastproject.list.api.ResourceListFilter;
26  import org.opencastproject.list.api.ResourceListFilter.SourceType;
27  import org.opencastproject.list.common.provider.ContributorsListProvider;
28  import org.opencastproject.list.common.provider.SeriesListProvider;
29  import org.opencastproject.list.util.FiltersUtils;
30  import org.opencastproject.util.data.Tuple;
31  
32  import java.util.Date;
33  import java.util.Optional;
34  
35  /**
36   * Query for the series list.
37   *
38   * The following filters can be used:
39   * <ul>
40   * <li>contributors</li>
41   * <li>subject</li>
42   * <li>language</li>
43   * <li>creator</li>
44   * <li>license</li>
45   * <li>access policy</li>
46   * <li>creation date</li>
47   * </ul>
48   */
49  public class SeriesListQuery extends DefaultResourceListQuery {
50  
51    public static final String FILTER_ACL_NAME = "managedAcl";
52    private static final String FILTER_ACL_LABEL = "FILTERS.SERIES.ACCESS_POLICY.LABEL";
53  
54    public static final String FILTER_ACL_PERMISSION_READ_NAME = "acl_permission_read";
55    private static final String FILTER_ACL_PERMISSION_READ_LABEL = "FILTERS.SERIES.ACL_PREMISSION_READ.LABEL";
56  
57    public static final String FILTER_ACL_PERMISSION_WRITE_NAME = "acl_permission_write";
58    private static final String FILTER_ACL_PERMISSION_WRITE_LABEL = "FILTERS.SERIES.ACL_PREMISSION_WRITE.LABEL";
59  
60    public static final String FILTER_CONTRIBUTORS_NAME = "contributors";
61    private static final String FILTER_CONTRIBUTORS_LABEL = "FILTERS.SERIES.CONTRIBUTORS.LABEL";
62  
63    public static final String FILTER_CREATIONDATE_NAME = "CreationDate";
64    private static final String FILTER_CREATIONDATE_LABEL = "FILTERS.SERIES.CREATION_DATE.LABEL";
65  
66    public static final String FILTER_CREATOR_NAME = "Creator";
67    private static final String FILTER_CREATOR_LABEL = "FILTERS.SERIES.CREATOR.LABEL";
68  
69    public static final String FILTER_TEXT_NAME = "textFilter";
70  
71    public static final String FILTER_LANGUAGE_NAME = "language";
72    private static final String FILTER_LANGUAGE_LABEL = "FILTERS.SERIES.LANGUAGE.LABEL";
73  
74    public static final String FILTER_LICENSE_NAME = "license";
75    private static final String FILTER_LICENSE_LABEL = "FILTERS.SERIES.LICENSE.LABEL";
76  
77    public static final String FILTER_ORGANIZERS_NAME = "organizers";
78    private static final String FILTER_ORGANIZERS_LABEL = "FILTERS.SERIES.ORGANIZERS.LABEL";
79  
80    public static final String FILTER_SUBJECT_NAME = "subject";
81    private static final String FILTER_SUBJECT_LABEL = "FILTERS.SERIES.SUBJECT.LABEL";
82  
83    public static final String FILTER_TITLE_NAME = "title";
84    private static final String FILTER_TITLE_LABEL = "FILTERS.SERIES.TITLE.LABEL";
85  
86    public static final String FILTER_READ_ACCESS_NAME = "readAccess";
87    public static final String FILTER_READ_ACCESS_LABEL = "FILTERS.SERIES.READ_ACCESS.LABEL";
88  
89    public static final String FILTER_WRITE_ACCESS_NAME = "writeAccess";
90    public static final String FILTER_WRITE_ACCESS_LABEL = "FILTERS.SERIES.WRITE_ACCESS.LABEL";
91  
92  
93    public SeriesListQuery() {
94      super();
95      this.availableFilters.add(createCreationDateFilter(Optional.<Tuple<Date, Date>> empty()));
96      this.availableFilters.add(createOrganizersFilter(Optional.empty()));
97      this.availableFilters.add(createContributorsFilter(Optional.empty()));
98      this.availableFilters.add(createReadAccessFilter(Optional.empty()));
99      this.availableFilters.add(createWriteAccessFilter(Optional.empty()));
100   }
101 
102   public void withoutPermissions() {
103     ResourceListFilter filter = this.getFilter(FILTER_ACL_PERMISSION_READ_NAME);
104     if (filter != null) {
105       this.removeFilter(filter);
106     }
107     filter = this.getFilter(FILTER_ACL_PERMISSION_WRITE_NAME);
108     if (filter != null) {
109       this.removeFilter(filter);
110     }
111   }
112 
113   public void withReadPermission(boolean value) {
114     this.addFilter(createReadPermissionFilter(Optional.ofNullable(value)));
115   }
116 
117   public void withWritePermission(boolean value) {
118     this.addFilter(createWritePermissionFilter(Optional.ofNullable(value)));
119   }
120 
121   public Optional<Boolean> getReadPermission() {
122     return this.getFilterValue(FILTER_ACL_PERMISSION_READ_NAME);
123   }
124 
125   public Optional<Boolean> getWritePermission() {
126     return this.getFilterValue(FILTER_ACL_PERMISSION_WRITE_NAME);
127   }
128 
129   /**
130    * Add a {@link ResourceListFilter} filter to the query with the given contributor
131    *
132    * @param contributor
133    *          the contributor to filter for
134    */
135   public void withContributor(String contributor) {
136     this.addFilter(createContributorsFilter(Optional.ofNullable(contributor)));
137   }
138 
139   /**
140    * Returns an {@link Optional} containing the contributor used to filter if set
141    *
142    * @return an {@link Optional} containing the contributor or none.
143    */
144   public Optional<String> getContributor() {
145     return this.getFilterValue(FILTER_CONTRIBUTORS_NAME);
146   }
147 
148   /**
149    * Add a {@link ResourceListFilter} filter to the query with the given creation date period
150    *
151    * @param creationDate
152    *          the creation date period as {@link Tuple} with two {@link Date}.
153    */
154   public void withCreationDate(Tuple<Date, Date> creationDate) {
155     this.addFilter(createCreationDateFilter(Optional.ofNullable(creationDate)));
156   }
157 
158   /**
159    * Returns an {@link Optional} containing the creation date period used to filter if set
160    *
161    * @return an {@link Optional} containing the creation date period or none.
162    */
163   public Optional<Tuple<Date, Date>> getCreationDate() {
164     return this.getFilterValue(FILTER_CREATIONDATE_NAME);
165   }
166 
167   /**
168    * Add a {@link ResourceListFilter} filter to the query with the given creator
169    *
170    * @param creator
171    *          the creator to filter for
172    */
173   public void withCreator(String creator) {
174     this.addFilter(createCreatorFilter(Optional.ofNullable(creator)));
175   }
176 
177   /**
178    * Returns an {@link Optional} containing the creator used to filter if set
179    *
180    * @return an {@link Optional} containing the creator or none.
181    */
182   public Optional<String> getCreator() {
183     return this.getFilterValue(FILTER_CREATOR_NAME);
184   }
185 
186   /**
187    * Add a {@link ResourceListFilter} filter to the query with the given language
188    *
189    * @param language
190    *          the language to filter for
191    */
192   public void withLanguage(String language) {
193     this.addFilter(createLanguageFilter(Optional.ofNullable(language)));
194   }
195 
196   /**
197    * Returns an {@link Optional} containing the language used to filter if set
198    *
199    * @return an {@link Optional} containing the language or none.
200    */
201   public Optional<String> getLanguage() {
202     return this.getFilterValue(FILTER_LANGUAGE_NAME);
203   }
204 
205   /**
206    * Add a {@link ResourceListFilter} filter to the query with the given license
207    *
208    * @param license
209    *          the license to filter for
210    */
211   public void withLicense(String license) {
212     this.addFilter(createLicenseFilter(Optional.ofNullable(license)));
213   }
214 
215   /**
216    * Returns an {@link Optional} containing the license used to filter if set
217    *
218    * @return an {@link Optional} containing the license or none.
219    */
220   public Optional<String> getLicense() {
221     return this.getFilterValue(FILTER_LICENSE_NAME);
222   }
223 
224   /**
225    * Add a {@link ResourceListFilter} filter to the query with the given organizer
226    *
227    * @param organizer
228    *          the organizer to filter for
229    */
230   public void withOrganizer(String organizer) {
231     this.addFilter(createOrganizersFilter(Optional.ofNullable(organizer)));
232   }
233 
234   /**
235    * Returns an {@link Optional} containing the organizer used to filter if set
236    *
237    * @return an {@link Optional} containing the organizer or none.
238    */
239   public Optional<String> getOrganizer() {
240     return this.getFilterValue(FILTER_ORGANIZERS_NAME);
241   }
242 
243   /**
244    * Add a {@link ResourceListFilter} filter to the query with the given subject
245    *
246    * @param subject
247    *          the subject to filter for
248    */
249   public void withSubject(String subject) {
250     this.addFilter(createSubjectFilter(Optional.ofNullable(subject)));
251   }
252 
253   /**
254    * Returns an {@link Optional} containing the subject used to filter if set
255    *
256    * @return an {@link Optional} containing the subject or none.
257    */
258   public Optional<String> getSubject() {
259     return this.getFilterValue(FILTER_SUBJECT_NAME);
260   }
261 
262   /**
263    * Add a {@link ResourceListFilter} filter to the query with the given title
264    *
265    * @param title
266    *          the subject to filter for
267    */
268   public void withTitle(String title) {
269     this.addFilter(createTitleFilter(Optional.ofNullable(title)));
270   }
271 
272   /**
273    * Returns an {@link Optional} containing the title used to filter if set
274    *
275    * @return an {@link Optional} containing the title or none.
276    */
277   public Optional<String> getTitle() {
278     return this.getFilterValue(FILTER_TITLE_NAME);
279   }
280 
281   public static ResourceListFilter<Boolean> createReadPermissionFilter(Optional<Boolean> value) {
282     return FiltersUtils.generateFilter(value, FILTER_ACL_PERMISSION_READ_NAME, FILTER_ACL_PERMISSION_READ_LABEL,
283         SourceType.SELECT, Optional.empty());
284   }
285 
286   public static ResourceListFilter<Boolean> createWritePermissionFilter(Optional<Boolean> value) {
287     return FiltersUtils.generateFilter(value, FILTER_ACL_PERMISSION_WRITE_NAME, FILTER_ACL_PERMISSION_WRITE_LABEL,
288         SourceType.SELECT, Optional.empty());
289   }
290 
291   /**
292    * Create a new {@link ResourceListFilter} based on a contributor
293    *
294    * @param contributor
295    *          the contributor's name to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
296    * @return a new {@link ResourceListFilter} for a contributor based query
297    */
298   public static ResourceListFilter<String> createContributorsFilter(Optional<String> contributor) {
299     return FiltersUtils.generateFilter(contributor, FILTER_CONTRIBUTORS_NAME, FILTER_CONTRIBUTORS_LABEL,
300             SourceType.SELECT, Optional.of(ContributorsListProvider.DEFAULT));
301   }
302 
303   /**
304    * Create a new {@link ResourceListFilter} based on a creator
305    *
306    * @param creator
307    *          the creator to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
308    * @return a new {@link ResourceListFilter} for a creator based query
309    */
310   public static ResourceListFilter<String> createCreatorFilter(Optional<String> creator) {
311     return FiltersUtils.generateFilter(creator, FILTER_CREATOR_NAME, FILTER_CREATOR_LABEL, SourceType.SELECT,
312             Optional.of(ContributorsListProvider.DEFAULT));
313   }
314 
315   /**
316    * Create a new {@link ResourceListFilter} based on creation date period
317    *
318    * @param period
319    *          the period to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
320    * @return a new {@link ResourceListFilter} for the given period
321    */
322   public static ResourceListFilter<Tuple<Date, Date>> createCreationDateFilter(Optional<Tuple<Date, Date>> period) {
323     return FiltersUtils.generateFilter(period, FILTER_CREATIONDATE_NAME, FILTER_CREATIONDATE_LABEL, SourceType.PERIOD,
324             Optional.empty());
325   }
326 
327   /**
328    * Create a new {@link ResourceListFilter} based on a language
329    *
330    * @param language
331    *          the language to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
332    * @return a new {@link ResourceListFilter} for a language based query
333    */
334   public static ResourceListFilter<String> createLanguageFilter(Optional<String> language) {
335     return FiltersUtils.generateFilter(language, FILTER_LANGUAGE_NAME, FILTER_LANGUAGE_LABEL, SourceType.SELECT,
336             Optional.of("LANGUAGES"));
337   }
338 
339   /**
340    * Create a new {@link ResourceListFilter} based on a license
341    *
342    * @param license
343    *          the license to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
344    * @return a new {@link ResourceListFilter} for a license based query
345    */
346   public static ResourceListFilter<String> createLicenseFilter(Optional<String> license) {
347     return FiltersUtils.generateFilter(license, FILTER_LICENSE_NAME, FILTER_LICENSE_LABEL, SourceType.SELECT,
348             Optional.of("LICENSES"));
349   }
350 
351   /**
352    * Create a new {@link ResourceListFilter} based on a organizer
353    *
354    * @param organizer
355    *          the organizer to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
356    * @return a new {@link ResourceListFilter} for a organizer based query
357    */
358   public static ResourceListFilter<String> createOrganizersFilter(Optional<String> organizer) {
359     return FiltersUtils.generateFilter(organizer, FILTER_ORGANIZERS_NAME, FILTER_ORGANIZERS_LABEL, SourceType.SELECT,
360             Optional.of(ContributorsListProvider.DEFAULT));
361   }
362 
363   /**
364    * Create a new {@link ResourceListFilter} based on a subject
365    *
366    * @param subject
367    *          the subject to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
368    * @return a new {@link ResourceListFilter} for a subject based query
369    */
370   public static ResourceListFilter<String> createSubjectFilter(Optional<String> subject) {
371     return FiltersUtils.generateFilter(subject, FILTER_SUBJECT_NAME, FILTER_SUBJECT_LABEL, SourceType.SELECT,
372             Optional.of(SeriesListProvider.SUBJECT));
373   }
374 
375   /**
376    * Create a new {@link ResourceListFilter} based on a title
377    *
378    * @param title
379    *          the title to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
380    * @return a new {@link ResourceListFilter} for a title based query
381    */
382   public static ResourceListFilter<String> createTitleFilter(Optional<String> title) {
383     return FiltersUtils.generateFilter(title, FILTER_TITLE_NAME, FILTER_TITLE_LABEL, SourceType.SELECT,
384             Optional.of(SeriesListProvider.TITLE));
385   }
386 
387   /**
388    * Create a new {@link ResourceListFilter} based on a read role
389    *
390    * @param readAccess
391    *          the read role to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
392    * @return a new {@link ResourceListFilter} for a read role based query
393    */
394   public static ResourceListFilter<String> createReadAccessFilter(Optional<String> readAccess) {
395     return FiltersUtils.generateFilter(readAccess, FILTER_READ_ACCESS_NAME, FILTER_READ_ACCESS_LABEL,
396         SourceType.FREETEXT, Optional.of("ROLES.TARGET.ACL"));
397   }
398 
399   /**
400    * Create a new {@link ResourceListFilter} based on a write role
401    *
402    * @param writeAccess
403    *          the write role to filter on wrapped in an {@link Optional} or {@link Optional#empty()}
404    * @return a new {@link ResourceListFilter} for a write role based query
405    */
406   public static ResourceListFilter<String> createWriteAccessFilter(Optional<String> writeAccess) {
407     return FiltersUtils.generateFilter(writeAccess, FILTER_WRITE_ACCESS_NAME, FILTER_WRITE_ACCESS_LABEL,
408         SourceType.FREETEXT, Optional.of("ROLES.TARGET.ACL"));
409   }
410 
411 }