blob: 1f0fbd16da62c6cb649b5fcca0ae80ad144a2652 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* 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 org.onosproject.config;
import com.google.common.annotations.Beta;
import org.onosproject.yang.model.ResourceId;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* Abstraction for Filters that can be used while traversing the dynamic config store.
* This abstraction allows to select entries of interest based on various criteria
* defined by this interface.
* NOTE: Only criteria based on {@code ResourceId} are supported currently.
* This is a placeholder for a filter; Set of ResourceId becomes inefficient when
* using a large number of filtering criteria;
*/
@Beta
public class Filter {
/**
* Traversal modes.
*/
public enum TraversalMode {
SUB_TREE(-1),
NODE_ONLY(0),
GIVEN_DEPTH;
/**
* SUB_TREE => if the node points to a subtree, the entire subtree will
* be traversed; if pointing to a leaf, just the leaf will be retrieved.
* NODE_ONLY => tree will not be traversed; will retrieve just the
* specific node, irrespective of it being a subtree root or a leaf node
* GIVEN_DEPTH => as many levels of the subtree as indicated by depth
* field of filter that will be traversed; if depth > the number of
* levels of children, the entire subtree will be traversed and end
* the traversal, without throwing any errors.
*/
int val;
TraversalMode() {
}
TraversalMode(int val) {
this.val = val;
}
int val() {
return val;
}
}
/** Filtering criteria.
*/
Set<ResourceId> criteria = new LinkedHashSet<ResourceId>();
/** Traversal mode; default is to read just the given node(NODE_ONLY).
*/
TraversalMode mode = TraversalMode.NODE_ONLY;
/** depth of traversal; default value is 0.
*/
int depth = TraversalMode.NODE_ONLY.val();
/**
* Creates a new Filter object.
*/
public Filter() {
}
/**
* Creates a new Filter object.
*
* @param criteria set of filtering criteria
* @param mode traversal mode
* @param depth depth of traversal
*/
public Filter(Set<ResourceId> criteria, TraversalMode mode, int depth) {
this.criteria = criteria;
this.mode = mode;
this.depth = depth;
}
/**
* Returns the traversal mode.
*
*@return traversal mode
*/
TraversalMode mode() {
return mode;
}
/**
* Sets the traversal mode.
*
* @param mode traversal mode
*/
void mode(TraversalMode mode) {
this.mode = mode;
}
/**
* Returns the depth.
*
*@return depth
*/
int depth() {
return depth;
}
/**
* Sets the depth.
*
* @param depth of traversal
*/
void mode(int depth) {
this.depth = depth;
}
/**
* Adds a new ResourceId filtering criterion to a Filter object.
* If the same ResourceId is already part of the criteria
* for the object, it will not be added again, but will not throw any exceptions.
* This will not check for the validity of the ResourceId.
*
* @param add new criterion
*/
void addCriteria(ResourceId add) {
criteria.add(add);
}
/**
* Adds new ResourceId filtering criteria to a Filter object.
* If the same ResourceId is already part of the criteria
* for the object, it will not be added again, but will not throw any exceptions.
* This will not check for the validity of the ResourceId.
*
* @param addAll new criteria
*/
void addCriteria(Set<ResourceId> addAll) {
criteria.addAll(addAll);
}
/**
* Removes the given ResourceId filtering criterion from a Filter object.
* If the ResourceId was NOT already part of the criteria for
* the object, it will not be removed, but will not throw any exceptions.
* This will not check for the validity of the ResourceId.
*
* @param remove criterion to be removed
*/
void removeCriteria(ResourceId remove) {
criteria.remove(remove);
}
/**
* Removes the given ResourceId filtering criteria from a Filter object.
* If the ResourceId was NOT already part of the criteria for
* the object, it will not be removed, but will not throw any exceptions.
* This will not check for the validity of the ResourceId.
*
* @param removeAll criteria to be removed
*/
void removeCriteria(Set<ResourceId> removeAll) {
criteria.removeAll(removeAll);
}
/**
* Returns the criteria that are in place for a Filter.
*
* @return Set of ResourceId criteria
*/
Set<ResourceId> criteria() {
return this.criteria;
}
/**
* Method to create a filter that include all entries rejected by the criteria.
*
* @param original Filter object with a criteria set
* @return Filter object with negated criteria set
* @throws InvalidFilterException if the received Filter object
* was null or if it had an empty criteria set
*/
Filter negateFilter(Filter original) {
throw new FailedException("Not yet implemented");
}
/**
* Returns if the Filter has an empty criteria set.
*
* @return {@code true} if criteria set is empty, {@code false} otherwise.
*/
boolean isEmptyFilter() {
return criteria.isEmpty();
}
}