package org.axway.grapes.server.core.options;
import org.axway.grapes.commons.api.ServerAPI;
import org.axway.grapes.server.core.options.filters.*;
import org.axway.grapes.server.db.datamodel.DbDependency;
import org.axway.grapes.server.db.datamodel.DbLicense;
import javax.ws.rs.core.MultivaluedMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Holds the filters.
*
* @author jdcoffre
*/
public class FiltersHolder {
private final List<Filter> filters = new ArrayList<Filter>();
private final ScopeHandler scopeHandler = new ScopeHandler();
private final Decorator decorator = new Decorator();
private final DepthHandler depthHandler = new DepthHandler();
private CorporateFilter corporateFilter;
public ScopeHandler getScopeHandler(){
return scopeHandler;
}
public Decorator getDecorator() {
return decorator;
}
public DepthHandler getDepthHandler() {
return depthHandler;
}
public CorporateFilter getCorporateFilter() {
return corporateFilter;
}
public void setCorporateFilter(final CorporateFilter filter) {
corporateFilter = filter;
}
public void addFilter(final Filter newFilter) {
Filter toRemove = null;
for(Filter filter: filters){
if(filter.getClass().equals(newFilter.getClass())){
toRemove = filter;
}
}
if(toRemove != null){
filters.remove(toRemove);
}
filters.add(newFilter);
}
public void init(final MultivaluedMap<String, String> queryParameters) {
scopeHandler.init(queryParameters);
decorator.init(queryParameters);
depthHandler.init(queryParameters);
final String approved = queryParameters.getFirst(ServerAPI.APPROVED_PARAM);
if(approved != null){
filters.add(new ApprovedFilter(Boolean.valueOf(approved)));
}
final String promoted = queryParameters.getFirst(ServerAPI.PROMOTED_PARAM);
if(promoted != null){
filters.add(new PromotedFilter(Boolean.valueOf(promoted)));
}
final String doNotUse = queryParameters.getFirst(ServerAPI.DO_NOT_USE);
if(doNotUse != null){
filters.add(new DoNotUseFilter(Boolean.valueOf(doNotUse)));
}
final String gavc = queryParameters.getFirst(ServerAPI.GAVC);
if(gavc != null){
filters.add(new GavcFilter(gavc));
}
final String hasLicense = queryParameters.getFirst(ServerAPI.HAS_LICENSE_PARAM);
if(hasLicense != null){
filters.add(new HasLicenseFilter(Boolean.valueOf(hasLicense)));
}
final String toBeValidated = queryParameters.getFirst(ServerAPI.TO_BE_VALIDATED_PARAM);
if(toBeValidated != null){
filters.add(new ToBeValidatedFilter(Boolean.valueOf(toBeValidated)));
}
final String licenseId = queryParameters.getFirst(ServerAPI.LICENSE_ID_PARAM);
if(licenseId != null){
filters.add(new LicenseIdFilter(licenseId));
}
final String classifier = queryParameters.getFirst(ServerAPI.CLASSIFIER_PARAM);
if(classifier != null){
filters.add(new ClassifierFilter(classifier));
}
final String extension = queryParameters.getFirst(ServerAPI.EXTENSION_PARAM);
if(extension != null){
filters.add(new ExtensionFilter(extension));
}
final String type = queryParameters.getFirst(ServerAPI.TYPE_PARAM);
if(type != null){
filters.add(new TypeFilter(type));
}
final String version = queryParameters.getFirst(ServerAPI.VERSION_PARAM);
if(version != null){
filters.add(new VersionFilter(version));
}
final String artifactId = queryParameters.getFirst(ServerAPI.ARTIFACTID_PARAM);
if(artifactId != null){
filters.add(new ArtifactIdFilter(artifactId));
}
final String groupId = queryParameters.getFirst(ServerAPI.GROUPID_PARAM);
if(groupId != null){
filters.add(new GroupIdFilter(groupId));
}
final String name = queryParameters.getFirst(ServerAPI.NAME_PARAM);
if(name != null){
filters.add(new ModuleNameFilter(name));
}
final String organization = queryParameters.getFirst(ServerAPI.ORGANIZATION_PARAM);
if(organization != null){
filters.add(new OrganizationFilter(organization));
}
}
public boolean shouldBeInReport(final DbLicense license) {
for(Filter filter: filters){
if(!filter.filter(license)){
return false;
}
}
return true;
}
/**
* Check if a dependency matches the filters
*
* @param dependency
*
* @return boolean
*/
public boolean shouldBeInReport(final DbDependency dependency) {
if(dependency == null){
return false;
}
if(dependency.getTarget() == null){
return false;
}
if(corporateFilter != null){
if(!decorator.getShowThirdparty() && !corporateFilter.filter(dependency)){
return false;
}
if(!decorator.getShowCorporate() && corporateFilter.filter(dependency)){
return false;
}
}
if(!scopeHandler.filter(dependency)){
return false;
}
return true;
}
/**
* Generates a Map of query parameters for Artifact regarding the filters
*
* @return Map<String, Object>
*/
public Map<String, Object> getArtifactFieldsFilters() {
final Map<String, Object> params = new HashMap<String, Object>();
for(Filter filter: filters){
params.putAll(filter.artifactFilterFields());
}
return params;
}
/**
* Generates a Map of query parameters for Module regarding the filters
*
* @return Map<String, Object>
*/
public Map<String, Object> getModuleFieldsFilters() {
final Map<String, Object> params = new HashMap<String, Object>();
for(Filter filter: filters){
params.putAll(filter.moduleFilterFields());
}
return params;
}
}