/*
* Copyright 2014 Sonoport (Asia) Pte Ltd
*
* Licensed under the Apache 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://www.apache.org/licenses/LICENSE-2.0
*
* 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 com.sonoport.freesound.query;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.sonoport.freesound.response.Sound;
import com.sonoport.freesound.response.mapping.PagingResponseMapper;
import com.sonoport.freesound.response.mapping.SoundMapper;
/**
* Convenience class for dealing with {@link PagingQuery} requests that return a list of {@link Sound}s. There are a
* number of common query elements that can be associated with such queries (fields to include, for example), so these
* are encapsulated in this class.
*
* @param <Q> The type of the {@link SoundPagingQuery} (required to implement Fluent API elements)
*/
public abstract class SoundPagingQuery<Q extends SoundPagingQuery<Q>> extends PagingQuery<Q, Sound> {
/** Name of parameter to include the list of fields to return, if specified. */
public static final String FIELDS_PARAMETER = "fields";
/** The fields to retrieve as part of the query. If values are specified here, only those fields will be returned.
* If no values are specified, freesound will return a default set. */
private Set<String> fields;
/**
* @param httpRequestMethod HTTP method to use for query
* @param path The URI path to the API endpoint
*/
protected SoundPagingQuery(final HTTPRequestMethod httpRequestMethod, final String path) {
super(httpRequestMethod, path, new PagingResponseMapper<>(new SoundMapper()));
}
@Override
public Map<String, Object> getQueryParameters() {
final Map<String, Object> params = super.getQueryParameters();
if ((fields != null) && !fields.isEmpty()) {
final StringBuilder fieldsString = new StringBuilder();
for (final String field : fields) {
fieldsString.append(field.trim());
fieldsString.append(',');
}
fieldsString.deleteCharAt(fieldsString.lastIndexOf(","));
params.put(FIELDS_PARAMETER, fieldsString.toString());
}
return params;
}
/**
* Specify a field to return in the results using the Fluent API approach. Users may specify this method multiple
* times to define the collection of fields they want returning, and/or use
* {@link SoundPagingQuery#includeFields(Set)} to define them as a batch.
*
* @param field The field to include in the results
* @return The current query
*/
@SuppressWarnings("unchecked")
public Q includeField(final String field) {
if (this.fields == null) {
this.fields = new HashSet<>();
}
if (field != null) {
this.fields.add(field);
}
return (Q) this;
}
/**
* Specify the set of fields to return in the results. Defined using the Fluent API approach.
*
* @param fields The fields to return
* @return The current query
*/
@SuppressWarnings("unchecked")
public Q includeFields(final Set<String> fields) {
if (this.fields == null) {
this.fields = new HashSet<>();
}
if (fields != null) {
this.fields.addAll(fields);
}
return (Q) this;
}
}