use of org.apache.nifi.controller.state.ConfigParseException in project nifi by apache.
the class StandardStateManagerProvider method createStateProvider.
private static StateProvider createStateProvider(final File configFile, final Scope scope, final NiFiProperties properties, final VariableRegistry variableRegistry) throws ConfigParseException, IOException {
final String providerId;
final String providerIdPropertyName;
final String providerDescription;
final String providerXmlElementName;
final String oppositeScopeXmlElementName;
switch(scope) {
case CLUSTER:
providerId = properties.getClusterStateProviderId();
providerIdPropertyName = NiFiProperties.STATE_MANAGEMENT_CLUSTER_PROVIDER_ID;
providerDescription = "Cluster State Provider";
providerXmlElementName = "cluster-provider";
oppositeScopeXmlElementName = "local-provider";
break;
case LOCAL:
providerId = properties.getLocalStateProviderId();
providerIdPropertyName = NiFiProperties.STATE_MANAGEMENT_LOCAL_PROVIDER_ID;
providerDescription = "Local State Provider";
providerXmlElementName = "local-provider";
oppositeScopeXmlElementName = "cluster-provider";
break;
default:
throw new AssertionError("Attempted to create State Provider for unknown Scope: " + scope);
}
if (!configFile.exists()) {
throw new IllegalStateException("Cannot create " + providerDescription + " because the State Management Configuration File " + configFile + " does not exist");
}
if (!configFile.canRead()) {
throw new IllegalStateException("Cannot create " + providerDescription + " because the State Management Configuration File " + configFile + " cannot be read");
}
if (providerId == null) {
if (scope == Scope.CLUSTER) {
throw new IllegalStateException("Cannot create Cluster State Provider because the '" + providerIdPropertyName + "' property is missing from the NiFi Properties file. In order to run NiFi in a cluster, the " + providerIdPropertyName + " property must be configured in nifi.properties");
}
throw new IllegalStateException("Cannot create " + providerDescription + " because the '" + providerIdPropertyName + "' property is missing from the NiFi Properties file");
}
if (providerId.trim().isEmpty()) {
throw new IllegalStateException("Cannot create " + providerDescription + " because the '" + providerIdPropertyName + "' property in the NiFi Properties file has no value set. This is a required property and must reference the identifier of one of the " + providerXmlElementName + " elements in the State Management Configuration File (" + configFile + ")");
}
final StateManagerConfiguration config = StateManagerConfiguration.parse(configFile);
final StateProviderConfiguration providerConfig = config.getStateProviderConfiguration(providerId);
if (providerConfig == null) {
throw new IllegalStateException("Cannot create " + providerDescription + " because the '" + providerIdPropertyName + "' property in the NiFi Properties file is set to '" + providerId + "', but there is no " + providerXmlElementName + " entry in the State Management Configuration File (" + configFile + ") with this id");
}
if (providerConfig.getScope() != scope) {
throw new IllegalStateException("Cannot create " + providerDescription + " because the '" + providerIdPropertyName + "' property in the NiFi Properties file is set to '" + providerId + "', but this id is assigned to a " + oppositeScopeXmlElementName + " entry in the State Management Configuration File (" + configFile + "), rather than a " + providerXmlElementName + " entry");
}
final String providerClassName = providerConfig.getClassName();
final StateProvider provider;
try {
provider = instantiateStateProvider(providerClassName);
} catch (final Exception e) {
throw new RuntimeException("Cannot create " + providerDescription + " of type " + providerClassName, e);
}
if (!ArrayUtils.contains(provider.getSupportedScopes(), scope)) {
throw new RuntimeException("Cannot use " + providerDescription + " (" + providerClassName + ") as it only supports scope(s) " + ArrayUtils.toString(provider.getSupportedScopes()) + " but " + "instance" + " is configured to use scope " + scope);
}
// create variable registry
final Map<PropertyDescriptor, PropertyValue> propertyMap = new HashMap<>();
final Map<PropertyDescriptor, String> propertyStringMap = new HashMap<>();
for (final PropertyDescriptor descriptor : provider.getPropertyDescriptors()) {
propertyMap.put(descriptor, new StandardPropertyValue(descriptor.getDefaultValue(), null, variableRegistry));
propertyStringMap.put(descriptor, descriptor.getDefaultValue());
}
for (final Map.Entry<String, String> entry : providerConfig.getProperties().entrySet()) {
final PropertyDescriptor descriptor = provider.getPropertyDescriptor(entry.getKey());
propertyStringMap.put(descriptor, entry.getValue());
propertyMap.put(descriptor, new StandardPropertyValue(entry.getValue(), null, variableRegistry));
}
final SSLContext sslContext = SslContextFactory.createSslContext(properties, false);
final ComponentLog logger = new SimpleProcessLogger(providerId, provider);
final StateProviderInitializationContext initContext = new StandardStateProviderInitializationContext(providerId, propertyMap, sslContext, logger);
synchronized (provider) {
provider.initialize(initContext);
}
final ValidationContext validationContext = new StandardValidationContext(null, propertyStringMap, null, null, null, variableRegistry);
final Collection<ValidationResult> results = provider.validate(validationContext);
final StringBuilder validationFailures = new StringBuilder();
int invalidCount = 0;
for (final ValidationResult result : results) {
if (!result.isValid()) {
validationFailures.append(result.toString()).append("\n");
invalidCount++;
}
}
if (invalidCount > 0) {
throw new IllegalStateException("Could not initialize State Providers because the " + providerDescription + " is not valid. The following " + invalidCount + " Validation Errors occurred:\n" + validationFailures.toString() + "\nPlease check the configuration of the " + providerDescription + " with ID [" + providerId.trim() + "] in the file " + configFile.getAbsolutePath());
}
return provider;
}
use of org.apache.nifi.controller.state.ConfigParseException in project nifi by apache.
the class StateManagerConfiguration method parse.
public static StateManagerConfiguration parse(final File configFile) throws IOException, ConfigParseException {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
final Document document;
DocumentBuilder builder;
try {
builder = factory.newDocumentBuilder();
document = builder.parse(configFile);
} catch (ParserConfigurationException | SAXException e) {
throw new ConfigParseException("Unable to parse file " + configFile + ", as it does not appear to be a valid XML File", e);
}
final Element rootElement = document.getDocumentElement();
final List<Element> localProviderElements = DomUtils.getChildElementsByTagName(rootElement, "local-provider");
if (localProviderElements.isEmpty()) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as it does not contain a 'local-provider' element, or the local-provider element is not the child of the root element");
}
final Map<String, StateProviderConfiguration> configs = new HashMap<>();
for (final Element localProviderElement : localProviderElements) {
final StateProviderConfiguration providerConfig = parseProviderConfiguration(localProviderElement, Scope.LOCAL, configFile);
if (configs.containsKey(providerConfig.getId())) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as it contains multiple providers with the \"id\" of \"" + providerConfig.getId() + "\"");
}
configs.put(providerConfig.getId(), providerConfig);
}
final List<Element> clusterProviderElements = DomUtils.getChildElementsByTagName(rootElement, "cluster-provider");
for (final Element clusterProviderElement : clusterProviderElements) {
final StateProviderConfiguration providerConfig = parseProviderConfiguration(clusterProviderElement, Scope.CLUSTER, configFile);
if (configs.containsKey(providerConfig.getId())) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as it contains multiple providers with the \"id\" of \"" + providerConfig.getId() + "\"");
}
configs.put(providerConfig.getId(), providerConfig);
}
return new StateManagerConfiguration(configs);
}
use of org.apache.nifi.controller.state.ConfigParseException in project nifi by apache.
the class StateManagerConfiguration method parseProviderConfiguration.
private static StateProviderConfiguration parseProviderConfiguration(final Element providerElement, final Scope scope, final File configFile) throws ConfigParseException {
final String elementName = providerElement.getNodeName();
final String id = DomUtils.getChildText(providerElement, "id");
if (id == null) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as a " + elementName + " element does not contain an \"id\" element");
}
if (id.trim().isEmpty()) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as a " + elementName + "'s \"id\" element is empty");
}
final String className = DomUtils.getChildText(providerElement, "class");
if (className == null) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as a " + elementName + " element does not contain an \"class\" element");
}
if (className.trim().isEmpty()) {
throw new ConfigParseException("State Management config file " + configFile + " is not a valid configuration file, " + "as a " + elementName + "'s \"class\" element is empty");
}
final List<Element> propertyElements = DomUtils.getChildElementsByTagName(providerElement, "property");
final Map<String, String> propertyMap = new HashMap<>();
for (final Element propertyElement : propertyElements) {
final String propertyName = propertyElement.getAttribute("name");
final String propertyValue = propertyElement.getTextContent();
propertyMap.put(propertyName, propertyValue);
}
return new StateProviderConfiguration(id, className, scope, propertyMap);
}
Aggregations