/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.ranger.plugin.store;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.apache.ranger.plugin.model.RangerPolicy;
import org.apache.ranger.plugin.model.RangerService;
import org.apache.ranger.plugin.model.RangerServiceDef;
import org.apache.ranger.plugin.util.SearchFilter;
import java.util.List;
public class ServicePredicateUtil extends AbstractPredicateUtil {
private ServiceStore serviceStore;
public ServicePredicateUtil(ServiceStore serviceStore) {
super();
this.serviceStore = serviceStore;
}
@Override
public void addPredicates(SearchFilter filter, List<Predicate> predicates) {
super.addPredicates(filter, predicates);
addPredicateForServiceType(filter.getParam(SearchFilter.SERVICE_TYPE), predicates);
addPredicateForServiceId(filter.getParam(SearchFilter.SERVICE_ID), predicates);
addPredicateForTagSeviceName(filter.getParam(SearchFilter.TAG_SERVICE_NAME), predicates);
addPredicateForTagSeviceId(filter.getParam(SearchFilter.TAG_SERVICE_ID), predicates);
}
private String getServiceType(String serviceName) {
RangerService service = null;
try {
if (serviceStore != null) {
service = serviceStore.getServiceByName(serviceName);
}
} catch(Exception excp) {
// ignore
}
return service != null ? service.getType() : null;
}
private Long getServiceId(String serviceName) {
RangerService service = null;
try {
if (serviceStore != null) {
service = serviceStore.getServiceByName(serviceName);
}
} catch(Exception excp) {
// ignore
}
return service != null ? service.getId() : null;
}
private Predicate addPredicateForServiceType(final String serviceType, List<Predicate> predicates) {
if(StringUtils.isEmpty(serviceType)) {
return null;
}
Predicate ret = new Predicate() {
@Override
public boolean evaluate(Object object) {
if(object == null) {
return false;
}
boolean ret = false;
if(object instanceof RangerPolicy) {
RangerPolicy policy = (RangerPolicy)object;
ret = StringUtils.equals(serviceType, getServiceType(policy.getService()));
} else if(object instanceof RangerService) {
RangerService service = (RangerService)object;
ret = StringUtils.equals(serviceType, service.getType());
} else if(object instanceof RangerServiceDef) {
RangerServiceDef serviceDef = (RangerServiceDef)object;
ret = StringUtils.equals(serviceType, serviceDef.getName());
}
return ret;
}
};
if(predicates != null) {
predicates.add(ret);
}
return ret;
}
private Predicate addPredicateForServiceId(final String serviceId, List<Predicate> predicates) {
if(StringUtils.isEmpty(serviceId)) {
return null;
}
Predicate ret = new Predicate() {
@Override
public boolean evaluate(Object object) {
if(object == null) {
return false;
}
boolean ret = false;
if(object instanceof RangerPolicy) {
RangerPolicy policy = (RangerPolicy)object;
Long svcId = getServiceId(policy.getService());
if(svcId != null) {
ret = StringUtils.equals(serviceId, svcId.toString());
}
} else if(object instanceof RangerService) {
RangerService service = (RangerService)object;
if(service.getId() != null) {
ret = StringUtils.equals(serviceId, service.getId().toString());
}
} else {
ret = true;
}
return ret;
}
};
if(predicates != null) {
predicates.add(ret);
}
return ret;
}
private Predicate addPredicateForTagSeviceName(final String tagServiceName, List<Predicate> predicates) {
if(StringUtils.isEmpty(tagServiceName)) {
return null;
}
Predicate ret = new Predicate() {
@Override
public boolean evaluate(Object object) {
if(object == null) {
return false;
}
boolean ret = false;
if(object instanceof RangerService) {
RangerService service = (RangerService)object;
ret = StringUtils.equals(tagServiceName, service.getTagService());
} else {
ret = true;
}
return ret;
}
};
if(predicates != null) {
predicates.add(ret);
}
return ret;
}
private Predicate addPredicateForTagSeviceId(final String tagServiceId, List<Predicate> predicates) {
if(StringUtils.isEmpty(tagServiceId)) {
return null;
}
Predicate ret = new Predicate() {
@Override
public boolean evaluate(Object object) {
if(object == null) {
return false;
}
boolean ret = false;
if(object instanceof RangerService) {
RangerService service = (RangerService)object;
if(! StringUtils.isEmpty(service.getTagService())) {
RangerService tagService = null;
try {
tagService = serviceStore.getServiceByName(service.getTagService());
} catch(Exception excp) {
}
ret = tagService != null && tagService.getId() != null && StringUtils.equals(tagServiceId, tagService.getId().toString());
}
} else {
ret = true;
}
return ret;
}
};
if(predicates != null) {
predicates.add(ret);
}
return ret;
}
}