gresockj commented on a change in pull request #5113:
URL: https://github.com/apache/nifi/pull/5113#discussion_r658196372



##########
File path: 
nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/stateless/parameters/ParameterProviderWithProperties.java
##########
@@ -0,0 +1,63 @@
+/*

Review comment:
       Did you mean to put this in src/main instead of src/test?

##########
File path: 
nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/resources/META-INF/services/org.apache.nifi.stateless.parameter.ParameterProvider
##########
@@ -0,0 +1,18 @@
+# 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.
+
+org.apache.nifi.stateless.parameters.InvalidParameterProvider
+org.apache.nifi.stateless.parameters.NumericParameterProvider
+org.apache.nifi.stateless.parameters.ParameterProviderWithProperties

Review comment:
       Unless I'm missing something, isn't this just a test provider?

##########
File path: 
nifi-stateless/nifi-stateless-bundle/nifi-stateless-engine/src/main/java/org/apache/nifi/stateless/engine/StandardStatelessEngine.java
##########
@@ -182,6 +197,98 @@ public StatelessDataflow createFlow(final 
DataflowDefinition<VersionedFlowSnapsh
         return dataflow;
     }
 
+    private ParameterProvider createParameterProvider(final 
DataflowDefinition<?> dataflowDefinition) {
+        // Create a Provider for each definition
+        final List<ParameterProvider> providers = new ArrayList<>();
+        for (final ParameterProviderDefinition definition : 
dataflowDefinition.getParameterProviderDefinitions()) {
+            providers.add(createParameterProvider(definition));
+        }
+
+        // Create a Composite Parameter Provider that wraps all of the others.
+        final CompositeParameterProvider provider = new 
CompositeParameterProvider(providers);
+        final ParameterProviderInitializationContext initializationContext = 
new StandardParameterProviderInitializationContext(provider, 
Collections.emptyMap(), UUID.randomUUID().toString());
+        provider.initialize(initializationContext);
+        return provider;
+    }
+
+    private ParameterProvider createParameterProvider(final 
ParameterProviderDefinition definition) {
+        final BundleCoordinate bundleCoordinate = 
determineBundleCoordinate(definition, "Parameter Provider");
+        final Bundle bundle = extensionManager.getBundle(bundleCoordinate);
+        if (bundle == null) {
+            throw new IllegalStateException("Unable to find bundle for 
coordinate " + bundleCoordinate.getCoordinate());
+        }
+
+        final String providerType = definition.getType();
+
+        final String providerId = UUID.randomUUID().toString();
+        final InstanceClassLoader classLoader = 
extensionManager.createInstanceClassLoader(providerType, providerId, bundle, 
Collections.emptySet());
+
+        try {
+            final Class<?> rawClass = Class.forName(providerType, true, 
classLoader);
+            Thread.currentThread().setContextClassLoader(classLoader);
+
+            final ParameterProvider parameterProvider = (ParameterProvider) 
rawClass.newInstance();
+
+            // Initialize the provider
+            final Map<String, String> properties = 
resolveProperties(definition.getPropertyValues(), parameterProvider, 
parameterProvider.getPropertyDescriptors());
+            final ParameterProviderInitializationContext initializationContext 
= new StandardParameterProviderInitializationContext(parameterProvider, 
properties, providerId);
+            parameterProvider.initialize(initializationContext);
+
+            // Ensure that the Parameter Provider is valid.
+            final List<ValidationResult> validationResults = 
validate(parameterProvider, properties, providerId);
+            if (!validationResults.isEmpty()) {
+                throw new IllegalStateException("Parameter Provider with name 
<" + definition.getName() + "> is not valid: " + validationResults);
+            }
+
+            return parameterProvider;
+        } catch (final Exception e) {
+            throw new IllegalStateException("Could not create Parameter 
Provider " + definition.getName() + " of type " + definition.getType(), e);
+        }
+    }
+
+    private List<ValidationResult> validate(final ConfigurableComponent 
component, final Map<String, String> properties, final String componentId) {
+        final Map<PropertyDescriptor, PropertyConfiguration> 
explicitlyConfiguredPropertyMap = new HashMap<>();
+
+        for (final Map.Entry<String, String> property : properties.entrySet()) 
{
+            final String propertyName = property.getKey();
+            final String propertyValue = property.getValue();
+
+            final PropertyDescriptor descriptor = 
component.getPropertyDescriptor(propertyName);
+            final PropertyConfiguration propertyConfiguration = new 
PropertyConfiguration(propertyValue, null, Collections.emptyList());

Review comment:
       Nice, that appears to have fixed it.  However.. one more problem when I 
try to override the parameter from the command line:
   
   ```
   Exception in thread "main" java.lang.IllegalStateException: Could not create 
Parameter Provider Parameter Override Provider of type 
org.apache.nifi.stateless.parameter.ParameterOverrideProvider
        at 
org.apache.nifi.stateless.engine.StandardStatelessEngine.createParameterProvider(StandardStatelessEngine.java:245)
        at 
org.apache.nifi.stateless.engine.StandardStatelessEngine.createParameterProvider(StandardStatelessEngine.java:204)
        at 
org.apache.nifi.stateless.engine.StandardStatelessEngine.createFlow(StandardStatelessEngine.java:175)
        at 
org.apache.nifi.stateless.flow.StandardStatelessDataflowFactory.createDataflow(StandardStatelessDataflowFactory.java:223)
        at 
org.apache.nifi.stateless.bootstrap.StatelessBootstrap.createDataflow(StatelessBootstrap.java:66)
        at 
org.apache.nifi.stateless.bootstrap.RunStatelessFlow.createDataflow(RunStatelessFlow.java:94)
        at 
org.apache.nifi.stateless.bootstrap.RunStatelessFlow.main(RunStatelessFlow.java:56)
   Caused by: java.lang.IllegalStateException: Parameter Provider with name 
<Parameter Override Provider> is not valid: ['Context:param' validated against 
'joe' is invalid because 'Context:param' is not a supported property or has no 
Validator associated with it]
        at 
org.apache.nifi.stateless.engine.StandardStatelessEngine.createParameterProvider(StandardStatelessEngine.java:240)
        ... 6 more
   ```
   




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to