| /* |
| * 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.nifi.update.attributes; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.LinkedHashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Criteria for updating flow file attributes |
| */ |
| public class Criteria { |
| |
| // note: this class does not need to be synchronized/locked due to |
| // its usage. a new instance is used for getting or updating the |
| // rule criteria due to the nature of how annotation data is set. |
| // this will be a new instance for each request and the setting of |
| // annotation data is protected by a rest api wide write-lock. |
| // likewise, the processor uses this class as a simple look up. if |
| // this ever changed (not likely) then we would have to introduce |
| // some thread safety here. |
| private Map<String, Rule> rules; |
| private FlowFilePolicy flowFilePolicy; |
| |
| public Criteria() { |
| this(FlowFilePolicy.USE_CLONE, null); |
| } |
| |
| public Criteria(final FlowFilePolicy flowFilePolicy, final List<Rule> ruleList) { |
| this.flowFilePolicy = flowFilePolicy; |
| this.rules = new LinkedHashMap<>(); |
| |
| if (ruleList != null) { |
| for (final Rule rule : ruleList) { |
| this.rules.put(rule.getId(), rule); |
| } |
| } |
| } |
| |
| /** |
| * Adds the specified rule to the end of the rule collection. |
| * |
| * @param rule the rule to add |
| */ |
| public void addRule(final Rule rule) { |
| rules.put(rule.getId(), rule); |
| } |
| |
| /** |
| * Gets the specified rule from the rule collection. |
| * |
| * @param ruleId the identifier of the rule to get |
| * @return the identified rule |
| */ |
| public Rule getRule(final String ruleId) { |
| return rules.get(ruleId); |
| } |
| |
| /** |
| * Deletes the specified rule from the rule collection. |
| * |
| * @param rule the rule to delete |
| */ |
| public void deleteRule(final Rule rule) { |
| rules.remove(rule.getId()); |
| } |
| |
| /** |
| * Returns the rule ordering. |
| * |
| * @return the rule keys in rule order |
| */ |
| public List<String> getRuleOrder() { |
| return Collections.unmodifiableList(new ArrayList<>(rules.keySet())); |
| } |
| |
| /** |
| * Reorders the rule collection. The specified new rule order must contain |
| * the rule id for each rule in the collection. |
| * |
| * @param newRuleOrder the new rule order to use by key |
| */ |
| public void reorder(final List<String> newRuleOrder) { |
| // ensure all known rules are accounted for |
| if (newRuleOrder.size() != rules.size() || !newRuleOrder.containsAll(rules.keySet())) { |
| throw new IllegalArgumentException("New rule order does not account for all known rules or contains unknown rules."); |
| } |
| |
| // create the new rule lookup - using a LinkedHashMap to preserve insertion order |
| final Map<String, Rule> newRuleLookup = new LinkedHashMap<>(); |
| for (final String ruleId : newRuleOrder) { |
| newRuleLookup.put(ruleId, rules.get(ruleId)); |
| } |
| |
| // save the new ordering |
| rules = newRuleLookup; |
| } |
| |
| /** |
| * Returns a listing of all Rules. |
| * |
| * @return all rules |
| */ |
| public List<Rule> getRules() { |
| return Collections.unmodifiableList(new ArrayList<>(rules.values())); |
| } |
| |
| /** |
| * Sets the flow file policy. |
| * |
| * @param flowFilePolicy the new policy |
| */ |
| public void setFlowFilePolicy(FlowFilePolicy flowFilePolicy) { |
| this.flowFilePolicy = flowFilePolicy; |
| } |
| |
| /** |
| * Gets the flow file policy. |
| * |
| * @return the current policy |
| */ |
| public FlowFilePolicy getFlowFilePolicy() { |
| return flowFilePolicy; |
| } |
| } |