NIFI-9211: Fixed NPE when non-existing variable configured for a property with dynamicallyModifiesClasspath (#5382)

This commit is contained in:
Peter Turcsanyi 2021-10-12 17:21:23 +02:00 committed by GitHub
parent f7df326521
commit e681d4767a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 101 additions and 6 deletions

View File

@ -122,7 +122,7 @@ public interface PropertyValue {
ResourceReference asResource();
/**
* @return a ResourceReferences for the configured property value. If no property value is set, a ResourceRferences will be returned that references no resources.
* @return a ResourceReferences for the configured property value. If no property value is set, a ResourceReferences will be returned that references no resources.
* I.e., this method will never return <code>null</code>.
*/
ResourceReferences asResources();

View File

@ -27,18 +27,20 @@ import java.util.Set;
public class StandardResourceReferenceFactory implements ResourceReferenceFactory {
private static final ResourceReferences EMPTY_RESOURCE_REFERENCES = new StandardResourceReferences(Collections.emptyList());
public ResourceReferences createResourceReferences(final String value, final ResourceDefinition resourceDefinition) {
if (value == null) {
return new StandardResourceReferences(Collections.emptyList());
return EMPTY_RESOURCE_REFERENCES;
}
final String trimmed = value.trim();
if (trimmed.isEmpty()) {
return null;
return EMPTY_RESOURCE_REFERENCES;
}
if (resourceDefinition == null) {
return null;
return EMPTY_RESOURCE_REFERENCES;
}
final List<ResourceReference> references;

View File

@ -25,10 +25,10 @@ import java.util.List;
import java.util.Objects;
public class StandardResourceReferences implements ResourceReferences {
public List<ResourceReference> resourceReferences;
public final List<ResourceReference> resourceReferences;
public StandardResourceReferences(final List<ResourceReference> resourceReferences) {
this.resourceReferences = Objects.requireNonNull(resourceReferences);
this.resourceReferences = new ArrayList<>(Objects.requireNonNull(resourceReferences));
}
@Override

View File

@ -0,0 +1,93 @@
/*
* 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.components.resource;
import org.junit.jupiter.api.Test;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class TestStandardResourceReferenceFactory {
private final StandardResourceReferenceFactory subject = new StandardResourceReferenceFactory();
@Test
public void testCreateResourceReferences() {
String value = "/dir1/test1.jar,/dir2/test2.jar";
ResourceDefinition resourceDefinition = createResourceDefinition();
ResourceReferences resourceReferences = subject.createResourceReferences(value, resourceDefinition);
assertNotNull(resourceReferences);
List<ResourceReference> resourceReferencesList = resourceReferences.asList();
assertNotNull(resourceReferencesList);
assertEquals(2, resourceReferencesList.size());
assertResourceReference(resourceReferencesList.get(0), "/dir1/test1.jar");
assertResourceReference(resourceReferencesList.get(1), "/dir2/test2.jar");
}
@Test
public void testCreateResourceReferencesWhenValueIsNull() {
String value = null;
ResourceDefinition resourceDefinition = createResourceDefinition();
ResourceReferences resourceReferences = subject.createResourceReferences(value, resourceDefinition);
assertEmptyResourceReferences(resourceReferences);
}
@Test
public void testCreateResourceReferencesWhenValueIsEmpty() {
String value = "";
ResourceDefinition resourceDefinition = createResourceDefinition();
ResourceReferences resourceReferences = subject.createResourceReferences(value, resourceDefinition);
assertEmptyResourceReferences(resourceReferences);
}
@Test
public void testCreateResourceReferencesWhenResourceDefinitionIsNull() {
String value = "/dir1/test1.jar";
ResourceDefinition resourceDefinition = null;
ResourceReferences resourceReferences = subject.createResourceReferences(value, resourceDefinition);
assertEmptyResourceReferences(resourceReferences);
}
private StandardResourceDefinition createResourceDefinition() {
return new StandardResourceDefinition(ResourceCardinality.SINGLE, Collections.singleton(ResourceType.FILE));
}
private void assertResourceReference(ResourceReference resourceReference, String location) {
assertEquals(location, resourceReference.getLocation());
assertEquals(ResourceType.FILE, resourceReference.getResourceType());
}
private void assertEmptyResourceReferences(ResourceReferences resourceReferences) {
assertNotNull(resourceReferences);
assertNotNull(resourceReferences.asList());
assertTrue(resourceReferences.asList().isEmpty());
}
}