| /* |
| * 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 com.google.common.collect.ImmutableSet; |
| |
| import org.onosproject.yang.model.ResourceId; |
| |
| import static com.google.common.base.Preconditions.checkNotNull; |
| |
| 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 : if the node points to a subtree, the entire subtree will |
| * be traversed; if pointing to a leaf, just the leaf will be retrieved. |
| */ |
| SUB_TREE(-1), |
| /** |
| * NODE_ONLY : tree will not be traversed; will retrieve just the |
| * specific node, irrespective of it being a subtree root or a leaf node. |
| */ |
| NODE_ONLY(0), |
| /** |
| * GIVEN_DEPTH : as many levels of the subtree as indicated by depth |
| * field of filter that will be traversed; if depth is greater than |
| * the number of levels of children, the entire subtree will be |
| * traversed and end the traversal, without throwing any errors. |
| */ |
| GIVEN_DEPTH; |
| |
| int val; |
| TraversalMode() { |
| |
| } |
| TraversalMode(int val) { |
| this.val = val; |
| } |
| int val() { |
| return val; |
| } |
| } |
| |
| /** |
| * Filtering criteria. |
| */ |
| private final Set<ResourceId> criteria; |
| /** |
| * Traversal mode; default is to read just the given node(NODE_ONLY). |
| */ |
| private final TraversalMode mode; |
| /** |
| * depth of traversal; default value is 0. |
| */ |
| private final int depth; |
| |
| /** |
| * Creates a default Filter builder. |
| * |
| * @return Filter builder |
| */ |
| public static FilterBuilder builder() { |
| return new FilterBuilder(); |
| } |
| |
| /** |
| * Creates a Filter builder based on {@code start}. |
| * |
| * @param start Filter to initialize builder with |
| * @return Filter builder |
| * |
| */ |
| public static FilterBuilder builder(Filter start) { |
| return new FilterBuilder(start); |
| } |
| |
| /** |
| * Creates a new Filter object. |
| * |
| * @param criteria set of filtering criteria |
| * @param mode traversal mode |
| * @param depth depth of traversal |
| */ |
| protected Filter(Set<ResourceId> criteria, TraversalMode mode, int depth) { |
| this.criteria = ImmutableSet.copyOf(criteria); |
| this.mode = mode; |
| this.depth = depth; |
| } |
| |
| /** |
| * Returns the traversal mode. |
| * |
| *@return traversal mode |
| */ |
| public TraversalMode mode() { |
| return mode; |
| } |
| |
| /** |
| * Returns the depth. |
| * |
| *@return depth |
| */ |
| public int depth() { |
| return depth; |
| } |
| |
| /** |
| * Returns the criteria that are in place for a Filter. |
| * |
| * @return Set of ResourceId criteria |
| */ |
| public 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 |
| */ |
| public static 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. |
| */ |
| public boolean isEmptyFilter() { |
| return criteria.isEmpty(); |
| } |
| |
| public static final class FilterBuilder extends Builder<FilterBuilder> { |
| |
| private FilterBuilder(Filter start) { |
| super(start.criteria, start.mode, start.depth); |
| } |
| |
| private FilterBuilder() { |
| super(); |
| } |
| |
| public Filter build() { |
| return new Filter(criteria, mode, depth); |
| } |
| } |
| |
| public abstract static class Builder<B extends Builder<B>> { |
| |
| protected Set<ResourceId> criteria; |
| protected TraversalMode mode; |
| protected int depth; |
| |
| protected Builder() { |
| this(ImmutableSet.of(), TraversalMode.NODE_ONLY, 0); |
| } |
| |
| protected Builder(Set<ResourceId> criteria, |
| TraversalMode mode, |
| int depth) { |
| this.criteria = new LinkedHashSet<>(criteria); |
| this.mode = checkNotNull(mode); |
| 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 |
| * @return self |
| */ |
| public B addCriteria(ResourceId add) { |
| criteria.add(add); |
| return (B) this; |
| } |
| |
| /** |
| * 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 |
| * @return self |
| */ |
| public B addAllCriteria(Set<ResourceId> addAll) { |
| criteria.addAll(addAll); |
| return (B) this; |
| } |
| |
| /** |
| * Replaces ResourceId filtering criteria with the one specified. |
| * This will not check for the validity of the ResourceId. |
| * |
| * @param criteria new criteria |
| * @return self |
| */ |
| public B setCriteria(Set<ResourceId> criteria) { |
| this.criteria = (criteria); |
| return (B) this; |
| } |
| |
| /** |
| * Sets the traversal mode. |
| * |
| * @param mode traversal mode |
| * @return self |
| */ |
| public B mode(TraversalMode mode) { |
| this.mode = mode; |
| return (B) this; |
| } |
| |
| /** |
| * Sets the depth. |
| * |
| * @param depth of traversal |
| * @return self |
| */ |
| public B depth(int depth) { |
| this.depth = depth; |
| return (B) this; |
| } |
| /** |
| * 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 |
| * @return self |
| */ |
| public B removeCriteria(ResourceId remove) { |
| criteria.remove(remove); |
| return (B) this; |
| } |
| |
| /** |
| * 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 |
| * @return self |
| */ |
| public B removeAllCriteria(Set<ResourceId> removeAll) { |
| criteria.removeAll(removeAll); |
| return (B) this; |
| } |
| } |
| } |