package org.gbif.occurrence.ws.client;
import org.gbif.api.model.common.search.SearchResponse;
import org.gbif.api.model.occurrence.Occurrence;
import org.gbif.api.model.occurrence.search.OccurrenceSearchParameter;
import org.gbif.api.model.occurrence.search.OccurrenceSearchRequest;
import org.gbif.api.service.occurrence.OccurrenceSearchService;
import org.gbif.ws.client.BaseWsFacetedSearchClient;
import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.MoreObjects;
import com.google.inject.Inject;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import static org.gbif.api.model.common.paging.PagingConstants.PARAM_LIMIT;
import static org.gbif.api.model.common.search.SearchConstants.DEFAULT_SUGGEST_LIMIT;
import static org.gbif.api.model.common.search.SearchConstants.QUERY_PARAM;
import static org.gbif.ws.paths.OccurrencePaths.CATALOG_NUMBER_PATH;
import static org.gbif.ws.paths.OccurrencePaths.COLLECTION_CODE_PATH;
import static org.gbif.ws.paths.OccurrencePaths.INSTITUTION_CODE_PATH;
import static org.gbif.ws.paths.OccurrencePaths.OCCURRENCE_PATH;
import static org.gbif.ws.paths.OccurrencePaths.RECORDED_BY_PATH;
import static org.gbif.ws.paths.OccurrencePaths.RECORD_NUMBER_PATH;
import static org.gbif.ws.paths.OccurrencePaths.OCCURRENCE_ID_PATH;
import static org.gbif.ws.paths.OccurrencePaths.ORGANISM_ID_PATH;
import static org.gbif.ws.paths.OccurrencePaths.LOCALITY_PATH;
import static org.gbif.ws.paths.OccurrencePaths.WATER_BODY_PATH;
import static org.gbif.ws.paths.OccurrencePaths.STATE_PROVINCE_PATH;
/**
* Ws client for {@link OccurrenceSearchService}.
*/
public class OccurrenceWsSearchClient extends BaseWsFacetedSearchClient<Occurrence, OccurrenceSearchParameter, OccurrenceSearchRequest>
implements OccurrenceSearchService {
private static final String SEARCH_PATH ="search/";
// Response type.
private static final GenericType<SearchResponse<Occurrence, OccurrenceSearchParameter>> GENERIC_TYPE =
new GenericType<SearchResponse<Occurrence, OccurrenceSearchParameter>>() {
};
// List<String> type
private static final GenericType<List<String>> LIST_OF_STRINGS_TYPE =
new GenericType<List<String>>() {
};
/**
* @param resource to the occurrence webapp
*/
@Inject
protected OccurrenceWsSearchClient(WebResource resource) {
super(resource.path(OCCURRENCE_PATH), GENERIC_TYPE);
}
@Override
public List<String> suggestCatalogNumbers(String prefix, @Nullable Integer limit) {
return suggestTerms(CATALOG_NUMBER_PATH, prefix, limit);
}
@Override
public List<String> suggestCollectionCodes(String prefix, @Nullable Integer limit) {
return suggestTerms(COLLECTION_CODE_PATH, prefix, limit);
}
@Override
public List<String> suggestRecordedBy(String prefix, @Nullable Integer limit) {
return suggestTerms(RECORDED_BY_PATH, prefix, limit);
}
@Override
public List<String> suggestRecordNumbers(String prefix, @Nullable Integer limit) {
return suggestTerms(RECORD_NUMBER_PATH, prefix, limit);
}
@Override
public List<String> suggestInstitutionCodes(String prefix, @Nullable Integer limit) {
return suggestTerms(INSTITUTION_CODE_PATH, prefix, limit);
}
@Override
public List<String> suggestOccurrenceIds(String prefix, @Nullable Integer limit) {
return suggestTerms(OCCURRENCE_ID_PATH, prefix, limit);
}
@Override
public List<String> suggestOrganismIds(String prefix, @Nullable Integer limit) {
return suggestTerms(ORGANISM_ID_PATH, prefix, limit);
}
@Override
public List<String> suggestLocalities(String prefix, @Nullable Integer limit) {
return suggestTerms(LOCALITY_PATH, prefix, limit);
}
@Override
public List<String> suggestWaterBodies(String prefix, @Nullable Integer limit) {
return suggestTerms(WATER_BODY_PATH, prefix, limit);
}
@Override
public List<String> suggestStateProvinces(String prefix, @Nullable Integer limit) {
return suggestTerms(STATE_PROVINCE_PATH, prefix, limit);
}
/**
* Utility function that execute a search term query.
*/
private List<String> suggestTerms(String resourceName, String prefix, @Nullable Integer limit) {
String limitParam = Integer.toString(MoreObjects.firstNonNull(limit, DEFAULT_SUGGEST_LIMIT));
return getResource(SEARCH_PATH + resourceName).queryParam(QUERY_PARAM, prefix).queryParam(PARAM_LIMIT, limitParam)
.get(LIST_OF_STRINGS_TYPE);
}
}