package edu.mayo.cts2.framework.webapp.rest.query; import java.util.HashSet; import java.util.Set; import org.apache.commons.collections.CollectionUtils; import edu.mayo.cts2.framework.model.command.ResolvedFilter; import edu.mayo.cts2.framework.model.command.ResolvedReadContext; import edu.mayo.cts2.framework.model.service.core.Query; import edu.mayo.cts2.framework.service.profile.BaseQueryService; import edu.mayo.cts2.framework.service.profile.ResourceQuery; import edu.mayo.cts2.framework.webapp.rest.command.RestFilter; import edu.mayo.cts2.framework.webapp.rest.command.RestFilters; import edu.mayo.cts2.framework.webapp.rest.command.RestReadContext; import edu.mayo.cts2.framework.webapp.rest.resolver.FilterResolver; import edu.mayo.cts2.framework.webapp.rest.resolver.ReadContextResolver; public abstract class AbstractResourceQueryBuilder<T, Q extends ResourceQuery> { private FilterResolver filterResolver; private ReadContextResolver readContextResolver; private BaseQueryService baseQueryService; private Query query; private RestReadContext restReadContext; private Set<RestFilter> restFilter = new HashSet<RestFilter>(); public AbstractResourceQueryBuilder(BaseQueryService baseQueryService, FilterResolver filterResolver, ReadContextResolver readContextResolver) { super(); this.filterResolver = filterResolver; this.readContextResolver = readContextResolver; this.baseQueryService = baseQueryService; } public T addQuery(Query query) { this.query = query; return this.getThis(); } public T addRestReadContext(RestReadContext restReadContext) { this.restReadContext = restReadContext; return this.getThis(); } public T addRestFilters(RestFilters restFilters) { if (restFilters != null && CollectionUtils.isNotEmpty(restFilters.getRestFilters())) { for (RestFilter filter : restFilters.getRestFilters()) { this.addRestFilter(filter); } } return this.getThis(); } public T addRestFilter(RestFilter restFilter) { this.restFilter.add(restFilter); return this.getThis(); } public abstract Q build(); protected abstract T getThis(); protected class DefaultResourceQuery implements ResourceQuery { private ResolvedReadContext resolvedReadContext; private Set<ResolvedFilter> resolvedFilters = new HashSet<ResolvedFilter>(); public DefaultResourceQuery() { super(); this.resolvedReadContext = readContextResolver .resolveRestReadContext(restReadContext); for (RestFilter filter : restFilter) { ResolvedFilter resolvedfilter = filterResolver .resolveRestFilter(filter, baseQueryService); if (resolvedfilter != null) { resolvedFilters.add(filterResolver.resolveRestFilter( filter, baseQueryService)); } } } @Override public Query getQuery() { return query; } @Override public Set<ResolvedFilter> getFilterComponent() { return resolvedFilters; } @Override public ResolvedReadContext getReadContext() { return resolvedReadContext; } } }