/* * 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.HashSet; import java.util.Set; import org.apache.nifi.attribute.expression.language.Query; import org.apache.nifi.attribute.expression.language.StandardExpressionLanguageCompiler; import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException; import org.apache.nifi.expression.AttributeExpression.ResultType; import org.apache.nifi.update.attributes.dto.ActionDTO; import org.apache.nifi.update.attributes.dto.ConditionDTO; import org.apache.nifi.update.attributes.dto.RuleDTO; /** * */ public class UpdateAttributeModelFactory { public UpdateAttributeModelFactory() { } public Rule createRule(final RuleDTO dto) { if (dto == null) { throw new IllegalArgumentException("Rule must be specified."); } if (dto.getName() == null) { throw new IllegalArgumentException("Rule name must be specified."); } if (dto.getName().trim().isEmpty()) { throw new IllegalArgumentException("Rule name cannot be blank."); } final Rule rule = new Rule(); rule.setId(dto.getId()); rule.setName(dto.getName()); rule.setConditions(createConditions(dto.getConditions())); rule.setActions(createActions(dto.getActions())); return rule; } public Set<Condition> createConditions(final Set<ConditionDTO> conditionDtos) { if (conditionDtos == null) { throw new IllegalArgumentException("Conditions must be specified."); } final Set<Condition> conditions = new HashSet<>(conditionDtos.size()); for (final ConditionDTO condition : conditionDtos) { conditions.add(createCondition(condition)); } return conditions; } public Condition createCondition(final ConditionDTO dto) { if (dto == null) { throw new IllegalArgumentException("Condition must be specified."); } if (dto.getExpression() == null) { throw new IllegalArgumentException("Conditions: Expression must be specified."); } // validate the condition's expression final StandardExpressionLanguageCompiler elCompiler = new StandardExpressionLanguageCompiler(); final String syntaxError = elCompiler.validateExpression(dto.getExpression(), false); if (syntaxError != null) { throw new IllegalArgumentException(syntaxError); } final ResultType resultType = elCompiler.getResultType(dto.getExpression()); if (!ResultType.BOOLEAN.equals(resultType)) { throw new IllegalArgumentException("Return type of condition is " + resultType + " but expected type BOOLEAN"); } final Condition condition = new Condition(); condition.setId(dto.getId()); condition.setExpression(dto.getExpression()); return condition; } public Set<Action> createActions(final Set<ActionDTO> actionDtos) { if (actionDtos == null) { throw new IllegalArgumentException("Actions must be specified."); } final Set<Action> actions = new HashSet<>(actionDtos.size()); for (final ActionDTO action : actionDtos) { actions.add(createAction(action)); } return actions; } public Action createAction(final ActionDTO dto) { if (dto == null) { throw new IllegalArgumentException("Action must be specified."); } if (dto.getAttribute() == null) { throw new IllegalArgumentException("Actions: Attribute name must be specified."); } if (dto.getValue() == null) { throw new IllegalArgumentException(String.format("Actions: Value for attribute '%s' must be specified.", dto.getAttribute())); } try { Query.validateExpression(dto.getValue(), true); } catch (final AttributeExpressionLanguageParsingException e) { throw new IllegalArgumentException("Invalid Expression: " + e.toString(), e); } final Action action = new Action(); action.setId(dto.getId()); action.setAttribute(dto.getAttribute()); action.setValue(dto.getValue()); return action; } }