blob: a55159cabc22a56b2ac621f22ca7360a7f13540c [file] [log] [blame]
/**
*
* 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.
*/
#include "minifi-cpp/core/Property.h"
#include <utility>
#include "minifi-cpp/core/PropertyDefinition.h"
#include "minifi-cpp/core/PropertyValidator.h"
#include "utils/PropertyErrors.h"
#include "range/v3/algorithm/none_of.hpp"
#include "range/v3/range/conversion.hpp"
#include "range/v3/view/transform.hpp"
namespace org::apache::nifi::minifi::core {
std::string Property::getName() const {
return name_;
}
std::string Property::getDisplayName() const {
return display_name_.empty() ? name_ : display_name_;
}
std::string Property::getDescription() const {
return description_;
}
std::vector<std::string> Property::getAllowedTypes() const {
return types_;
}
bool Property::getRequired() const {
return is_required_;
}
bool Property::isSensitive() const {
return is_sensitive_;
}
bool Property::supportsExpressionLanguage() const {
return supports_el_;
}
const PropertyValidator& Property::getValidator() const {
return *validator_;
}
void Property::setSupportsExpressionLanguage(bool supportEl) {
supports_el_ = supportEl;
}
bool Property::operator<(const Property& right) const {
return name_ < right.name_;
}
namespace {
inline std::vector<std::string> createStrings(std::span<const std::string_view> string_views) {
return ranges::views::transform(string_views, [](const auto& string_view) { return std::string{string_view}; }) | ranges::to<std::vector>;
}
} // namespace
Property::Property(const PropertyReference& compile_time_property)
: name_(compile_time_property.name),
display_name_(compile_time_property.display_name),
description_(compile_time_property.description),
is_required_(compile_time_property.is_required),
is_sensitive_(compile_time_property.is_sensitive),
is_collection_(false),
default_value_(compile_time_property.default_value),
allowed_values_(createStrings(compile_time_property.allowed_values)),
validator_(compile_time_property.validator),
types_(createStrings(compile_time_property.allowed_types)),
supports_el_(compile_time_property.supports_expression_language),
is_transient_(false) {}
Property::Property(std::string name, std::string description, const std::string& value, bool is_required)
: name_(std::move(name)),
description_(std::move(description)),
is_required_(is_required),
is_collection_(false),
default_value_(value),
validator_(&StandardPropertyValidators::ALWAYS_VALID_VALIDATOR),
supports_el_(false),
is_transient_(false) {}
Property::Property(std::string name, std::string description, const std::string& value)
: name_(std::move(name)),
description_(std::move(description)),
is_required_(false),
is_collection_(false),
default_value_(value),
validator_{&StandardPropertyValidators::ALWAYS_VALID_VALIDATOR},
supports_el_(false),
is_transient_(false) {}
Property::Property(std::string name, std::string description)
: name_(std::move(name)),
description_(std::move(description)),
is_required_(false),
is_collection_(true),
validator_{&StandardPropertyValidators::ALWAYS_VALID_VALIDATOR},
supports_el_(false),
is_transient_(false) {}
Property::Property() : is_required_(false), is_collection_(false), validator_{&StandardPropertyValidators::ALWAYS_VALID_VALIDATOR}, supports_el_(false), is_transient_(false) {}
nonstd::expected<std::string_view, std::error_code> Property::getValue() const {
if (!values_.empty()) { return values_.back(); }
if (default_value_) { return *default_value_; }
return nonstd::make_unexpected(PropertyErrorCode::PropertyNotSet);
}
nonstd::expected<std::span<const std::string>, std::error_code> Property::getAllValues() const {
return std::span{values_};
}
nonstd::expected<void, std::error_code> Property::setValue(std::string value) {
if (!validator_->validate(value)) { return nonstd::make_unexpected(PropertyErrorCode::ValidationFailed); }
if (!allowed_values_.empty() && ranges::none_of(allowed_values_, [&](const auto& allowed_value) -> bool { return utils::string::toLower(allowed_value) == utils::string::toLower(value); })) {
return nonstd::make_unexpected(PropertyErrorCode::ValidationFailed);
}
values_.clear();
values_.push_back(std::move(value));
return {};
}
nonstd::expected<void, std::error_code> Property::appendValue(std::string value) {
if (!validator_->validate(value)) { return nonstd::make_unexpected(PropertyErrorCode::ValidationFailed); }
if (!allowed_values_.empty() && ranges::none_of(allowed_values_, [&](const auto& allowed_value) -> bool { return utils::string::toLower(allowed_value) == utils::string::toLower(value); })) {
return nonstd::make_unexpected(PropertyErrorCode::ValidationFailed);
}
if (values_.empty() && default_value_) { values_.push_back(*default_value_); }
values_.push_back(std::move(value));
return {};
}
void Property::clearValues() {
values_.clear();
}
} // namespace org::apache::nifi::minifi::core