/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of the License * at: * * http://opensource.org/licenses/ecl2.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * */ package org.opencastproject.index.service.impl.index.theme; import org.opencastproject.matterhorn.search.SearchTerms; import org.opencastproject.matterhorn.search.impl.AbstractSearchQuery; import org.opencastproject.security.api.User; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * This interface defines a fluent api for a query object used to lookup themes in the search index. */ public class ThemeSearchQuery extends AbstractSearchQuery { protected List<Long> identifiers = new ArrayList<Long>(); private User user = null; private String organization = null; private String creator = null; private Date createdFrom = null; private Date createdTo = null; private Boolean isDefault = null; private String description = null; private String name = null; private Boolean bumperActive = null; private String bumperFile = null; private Boolean licenseSlideActive = null; private String licenseSlideBackground = null; private String licenseSlideDescription = null; private Boolean trailerActive = null; private String trailerFile = null; private Boolean titleSlideActive = null; private String titleSlideBackground = null; private String titleSlideMetadata = null; private Boolean watermarkActive = null; private String watermarkFile = null; private String watermarkPosition = null; @SuppressWarnings("unused") private ThemeSearchQuery() { } /** * Creates a query that will return theme documents. The user's organization must match the query's organization. * * @param organization * The organization to run this query with. Cannot be null. * @param user * The user to run this query as. Cannot be null. * @throws IllegalStateException * Thrown if the current user's organization doesn't match the search organization, the organization is * null, or user is null. */ public ThemeSearchQuery(String organization, User user) { super(Theme.DOCUMENT_TYPE); if (organization == null) throw new IllegalStateException("The organization for this query was null."); if (user == null) throw new IllegalStateException("The user for this query was null."); this.organization = organization; this.user = user; if (!user.getOrganization().getId().equals(organization)) throw new IllegalStateException("User's organization must match search organization"); } /** * Selects themes with the given identifier. * <p> * Note that this method may be called multiple times to support selection of multiple themes. * * @param id * the theme identifier * @return the enhanced search query */ public ThemeSearchQuery withIdentifier(long id) { this.identifiers.add(id); return this; } /** * Returns the list of theme identifiers or an empty array if no identifiers have been specified. * * @return the identifiers */ public Long[] getIdentifiers() { return identifiers.toArray(new Long[identifiers.size()]); } /** * Selects themes with the given description. * * @param description * the description * @return the enhanced search query */ public ThemeSearchQuery withDescription(String description) { clearExpectations(); this.description = description; return this; } /** * Returns the description of the theme query. * * @return the description */ public String getDescription() { return description; } /** * Returns the organization of the theme query. * * @return the organization */ public String getOrganization() { return organization; } /** * Returns the user of this search query * * @return the user of this search query */ public User getUser() { return user; } /** * Selects themes with the given creator. * * @param creator * the creator * @return the enhanced search query */ public ThemeSearchQuery withCreator(String creator) { clearExpectations(); this.creator = creator; return this; } /** * Returns the creator of the themes. * * @return the creator */ public String getCreator() { return creator; } /** * The created date to start looking for themes. * * @param createdFrom * The created date to start looking for themes * @return the enhanced search query */ public ThemeSearchQuery withCreatedFrom(Date createdFrom) { this.createdFrom = createdFrom; return this; } /** * @return The Date after which all series returned should have been created */ public Date getCreatedFrom() { return createdFrom; } /** * The created date to stop looking for series. * * @param createdTo * The created date to stop looking for series * @return the enhanced search query */ public ThemeSearchQuery withCreatedTo(Date createdTo) { this.createdTo = createdTo; return this; } /** * @return The Date before which all series returned should have been created */ public Date getCreatedTo() { return createdTo; } /** * Selects themes that are default. * * @param isDefault * Whether to search for themes that are default or not. * @return the enhanced search query */ public ThemeSearchQuery withIsDefault(Boolean isDefault) { clearExpectations(); this.isDefault = isDefault; return this; } /** * Returns whether the theme query is searching for default themes. * * @return whether the search is looking for default themes. */ public Boolean getIsDefault() { return isDefault; } /** * Selects themes with the given name. * * @param name * the name * @return the enhanced search query */ public ThemeSearchQuery withName(String name) { clearExpectations(); this.name = name; return this; } /** * Returns the name looked for by the theme query. * * @return the name */ public String getName() { return name; } /** * Selects themes with where the bumper is active. * * @param bumperActive * Whether the bumperActive * @return the enhanced search query */ public ThemeSearchQuery withBumperActive(Boolean bumperActive) { clearExpectations(); this.bumperActive = bumperActive; return this; } /** * Returns whether the theme query is searching for themes where the bumper is active. * * @return the bumperActive */ public Boolean getBumperActive() { return bumperActive; } /** * Selects themes with the given bumper file id. * * @param bumperFile * the bumper file id * @return the enhanced search query */ public ThemeSearchQuery withBumperFile(String bumperFile) { clearExpectations(); this.bumperFile = bumperFile; return this; } /** * Returns the bumperFile of the theme query. * * @return the bumperFile */ public String getBumperFile() { return bumperFile; } /** * Selects themes where the license slide is active. * * @param licenseSlideActive * If the license slide is active or not. * @return the enhanced search query */ public ThemeSearchQuery withLicenseSlideActive(Boolean licenseSlideActive) { clearExpectations(); this.licenseSlideActive = licenseSlideActive; return this; } /** * Returns whether the theme query is looking for themes where the license slide is active. * * @return the license */ public Boolean getLicenseSlideActive() { return licenseSlideActive; } /** * Selects themes with the given license slide background. * * @param licenseSlideBackground * the license slide background file * @return the enhanced search query */ public ThemeSearchQuery withLicenseSlideBackground(String licenseSlideBackground) { clearExpectations(); this.licenseSlideBackground = licenseSlideBackground; return this; } /** * Returns the license slide background this query is looking for. * * @return the licenseSlideBackground */ public String getLicenseSlideBackground() { return licenseSlideBackground; } /** * Selects themes with the given license slide description. * * @param licenseSlideDescription * the license slide description * @return the enhanced search query */ public ThemeSearchQuery withLicenseSlideDescription(String licenseSlideDescription) { clearExpectations(); this.licenseSlideDescription = licenseSlideDescription; return this; } /** * Returns the license slide description this query is looking for. * * @return the license slide description */ public String getLicenseSlideDescription() { return licenseSlideDescription; } /** * Selects themes that have the trailer active * * @param trailerActive * whether the trailer is active or not * @return the enhanced search query */ public ThemeSearchQuery withTrailerActive(Boolean trailerActive) { clearExpectations(); this.trailerActive = trailerActive; return this; } /** * Returns whether the query is looking for themes where the trailer is active * * @return Whether the query is looking for themes where the trailer is active */ public Boolean getTrailerActive() { return trailerActive; } /** * Selects themes with the given trailer file * * @param trailerFile * the trailer file that should be in the themes * @return the enhanced search query */ public ThemeSearchQuery withTrailerFile(String trailerFile) { clearExpectations(); this.trailerFile = trailerFile; return this; } /** * Returns the trailer file id that is being matched in this query * * @return the trailer file id */ public String getTrailerFile() { return trailerFile; } /** * Selects themes where the title slide is active. * * @param titleSlideActive * Whether to search for themes where the title slide is active * @return the enhanced search query */ public ThemeSearchQuery withTitleSlideActive(Boolean titleSlideActive) { clearExpectations(); this.titleSlideActive = titleSlideActive; return this; } /** * Returns whether this query is searching for themes where the title slide is active. * * @return Whether the query is looking for themes where the title slide is active */ public Boolean getTitleSlideActive() { return titleSlideActive; } /** * Selects themes with matching title slide metadata * * @param titleSlideMetadata * Search themes for this title slide metadata * @return the enhanced search query */ public ThemeSearchQuery withTitleSlideMetadata(String titleSlideMetadata) { clearExpectations(); this.titleSlideMetadata = titleSlideMetadata; return this; } /** * Returns the title slide metadata this query is searching for * * @return the title slide metadata being searched for */ public String getTitleSlideMetadata() { return titleSlideMetadata; } /** * Selects themes with the given title slide background id. * * @param titleSlideBackground * the id for the title slide background file. * @return the enhanced search query */ public ThemeSearchQuery withTitleSlideBackground(String titleSlideBackground) { clearExpectations(); this.titleSlideBackground = titleSlideBackground; return this; } /** * @return Returns the title slide background id this query is searching for. */ public String getTitleSlideBackground() { return titleSlideBackground; } /** * Selects themes where a watermark is active * * @param watermarkActive * Whether to search for themes where the watermark is active * @return the enhanced search query */ public ThemeSearchQuery withWatermarkActive(Boolean watermarkActive) { clearExpectations(); this.watermarkActive = watermarkActive; return this; } /** * @return Returns whether this query is searching for themes where the watermark is active. */ public Boolean getWatermarkActive() { return watermarkActive; } /** * Selects themes with the given watermark file * * @param watermarkFile * the id of the watermark file * @return the enhanced search query */ public ThemeSearchQuery withWatermarkFile(String watermarkFile) { clearExpectations(); this.watermarkFile = watermarkFile; return this; } /** * @return Returns the watermark file id this query is searching for. */ public String getWatermarkFile() { return watermarkFile; } /** * Selects themes with the given watermark position. * * @param watermarkPosition * the watermark position to select * @return the enhanced search query */ public ThemeSearchQuery withLicense(String watermarkPosition) { clearExpectations(); this.watermarkPosition = watermarkPosition; return this; } /** * @return Returns the watermark position this query is searching for. */ public String getWatermarkPosition() { return watermarkPosition; } /** * Defines the sort order for the theme by creator username. * * @param order * the order * @return the enhanced search query */ public ThemeSearchQuery sortByCreator(Order order) { withSortOrder(ThemeIndexSchema.CREATOR, order); return this; } /** * Returns the sort order for the theme creator username. * * @return the sort order */ public Order getThemeCreatorSortOrder() { return getSortOrder(ThemeIndexSchema.CREATOR); } /** * Defines the sort order for the theme created date & time. * * @param order * the order * @return the enhanced search query */ public ThemeSearchQuery sortByCreatedDateTime(Order order) { withSortOrder(ThemeIndexSchema.CREATION_DATE, order); return this; } /** * Defines the sort order for the theme default property * * @param order * the order * @return the enhanced search query */ public ThemeSearchQuery sortByDefault(Order order) { withSortOrder(ThemeIndexSchema.DEFAULT, order); return this; } /** * Returns the sort order for the theme created date. * * @return the sort order */ public Order getSeriesDateSortOrder() { return getSortOrder(ThemeIndexSchema.CREATION_DATE); } /** * Defines the sort order for the theme by names. * * @param order * the order * @return the enhanced search query */ public ThemeSearchQuery sortByName(Order order) { withSortOrder(ThemeIndexSchema.NAME, order); return this; } /** * Returns the sort order for the theme name. * * @return the sort order */ public Order getThemeNameSortOrder() { return getSortOrder(ThemeIndexSchema.NAME); } /** * Defines the sort order for the theme by description. * * @param order * the order * @return the enhanced search query */ public ThemeSearchQuery sortByDescription(Order order) { withSortOrder(ThemeIndexSchema.DESCRIPTION, order); return this; } /** * Returns the sort order for the theme name. * * @return the sort order */ public Order getThemeDescriptionSortOrder() { return getSortOrder(ThemeIndexSchema.DESCRIPTION); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(ThemeSearchQuery.class.getSimpleName() + " "); if (identifiers.size() > 0) { sb.append("ids:'" + identifiers.toString() + "' "); } if (StringUtils.trimToNull(organization) != null) { sb.append("organization:'" + organization + "' "); } if (StringUtils.trimToNull(creator) != null) { sb.append("creator:'" + creator + "' "); } if (createdFrom != null) { sb.append("Created From:'" + createdFrom + "' "); } if (createdTo != null) { sb.append("Created To:'" + createdTo + "' "); } sb.append("Is Default:'" + isDefault + "' "); if (StringUtils.trimToNull(description) != null) { sb.append("description:'" + description + "' "); } if (StringUtils.trimToNull(name) != null) { sb.append("name:'" + name + "' "); } sb.append("bumper active:'" + bumperActive + "' "); if (StringUtils.trimToNull(bumperFile) != null) { sb.append("bumper file:'" + bumperFile + "' "); } sb.append("license slide active:'" + licenseSlideActive + "' "); if (StringUtils.trimToNull(licenseSlideBackground) != null) { sb.append("license slide background:'" + licenseSlideBackground + "' "); } if (StringUtils.trimToNull(licenseSlideDescription) != null) { sb.append("license slide description:'" + licenseSlideDescription + "' "); } sb.append("trailer active:'" + trailerActive + "' "); if (StringUtils.trimToNull(trailerFile) != null) { sb.append("trailer file:'" + trailerFile + "' "); } sb.append("title slide active:'" + titleSlideActive + "' "); if (StringUtils.trimToNull(titleSlideBackground) != null) { sb.append("title slide background:'" + titleSlideBackground + "' "); } if (StringUtils.trimToNull(titleSlideMetadata) != null) { sb.append("title slide metadata:'" + titleSlideMetadata + "' "); } sb.append("watermark active:'" + watermarkActive + "' "); if (StringUtils.trimToNull(watermarkFile) != null) { sb.append("watermark file:'" + watermarkFile + "' "); } if (StringUtils.trimToNull(watermarkPosition) != null) { sb.append("watermark position:'" + watermarkPosition + "' "); } if (getTerms().size() > 0) { sb.append("Text:"); for (SearchTerms<String> searchTerm : getTerms()) { sb.append("'" + searchTerm.getTerms() + "' "); } } return sb.toString(); } }