Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public class SearchResultsDTO {
private List<ComponentSearchResultDTO> outputPortResults = new ArrayList<>();
private List<ComponentSearchResultDTO> remoteProcessGroupResults = new ArrayList<>();
private List<ComponentSearchResultDTO> funnelResults = new ArrayList<>();
private List<ComponentSearchResultDTO> parameterContextResults = new ArrayList<>();
private List<ComponentSearchResultDTO> parameterResults = new ArrayList<>();

/**
* @return The processors that matched the search
Expand Down Expand Up @@ -134,4 +136,31 @@ public void setFunnelResults(List<ComponentSearchResultDTO> funnelResults) {
this.funnelResults = funnelResults;
}

/**
* @return parameter contexts that matched the search.
*/
@ApiModelProperty(
value = "The parameter contexts that matched the search."
)
public List<ComponentSearchResultDTO> getParameterContextResults() {
return parameterContextResults;
}

public void setParameterContextResults(List<ComponentSearchResultDTO> parameterContextResults) {
this.parameterContextResults = parameterContextResults;
}

/**
* @return parameters that matched the search.
*/
@ApiModelProperty(
value = "The parameters that matched the search."
)
public List<ComponentSearchResultDTO> getParameterResults() {
return parameterResults;
}

public void setParameterResults(List<ComponentSearchResultDTO> parameterResults) {
this.parameterResults = parameterResults;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1619,6 +1619,7 @@ public SearchResultsDTO search(final String search) {
final SearchResultsDTO results = new SearchResultsDTO();

controllerSearchService.search(results, search, rootGroup);
controllerSearchService.searchParameters(results, search);

return results;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
import org.apache.nifi.groups.ProcessGroup;
import org.apache.nifi.groups.RemoteProcessGroup;
import org.apache.nifi.nar.NarCloseable;
import org.apache.nifi.parameter.Parameter;
import org.apache.nifi.parameter.ParameterContext;
import org.apache.nifi.parameter.ParameterContextManager;
import org.apache.nifi.processor.DataUnit;
import org.apache.nifi.processor.Processor;
import org.apache.nifi.processor.Relationship;
Expand All @@ -56,6 +59,7 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
Expand Down Expand Up @@ -163,6 +167,39 @@ public void search(final SearchResultsDTO results, final String search, final Pr
}
}

/**
* Searches all parameter contexts and parameters
* @param results Search results
* @param search The search term
*/
public void searchParameters(final SearchResultsDTO results, final String search) {
final NiFiUser user = NiFiUserUtils.getNiFiUser();
ParameterContextManager parameterContextManager = flowController.getFlowManager().getParameterContextManager();

final Set<ParameterContext> parameterContexts = parameterContextManager.getParameterContexts();
for (final ParameterContext parameterContext : parameterContexts) {
if (parameterContext.isAuthorized(authorizer, RequestAction.READ, user)) {
ComponentSearchResultDTO parameterContextMatch = search(search, parameterContext);
if (parameterContextMatch != null) {
results.getParameterContextResults().add(parameterContextMatch);
}

// search each parameter within the context as well
for (Parameter parameter : parameterContext.getParameters().values()) {
ComponentSearchResultDTO parameterMatch = search(search, parameter);
if (parameterMatch != null) {
final SearchResultGroupDTO paramContextGroup = new SearchResultGroupDTO();
paramContextGroup.setId(parameterContext.getIdentifier());
paramContextGroup.setName(parameterContext.getName());
parameterMatch.setParentGroup(paramContextGroup);

results.getParameterResults().add(parameterMatch);
}
}
}
}
}

private ComponentSearchResultDTO search(final String searchStr, final Port port) {
final List<String> matches = new ArrayList<>();

Expand Down Expand Up @@ -474,6 +511,42 @@ private ComponentSearchResultDTO search(final String searchStr, final Funnel fun
return dto;
}

private ComponentSearchResultDTO search(final String searchString, final ParameterContext parameterContext) {
final List<String> matches = new ArrayList<>();
addIfAppropriate(searchString, parameterContext.getIdentifier(), "Id", matches);
addIfAppropriate(searchString, parameterContext.getName(), "Name", matches);
addIfAppropriate(searchString, parameterContext.getDescription(), "Description", matches);

if (matches.isEmpty()) {
return null;
}

final ComponentSearchResultDTO dto = new ComponentSearchResultDTO();
dto.setId(parameterContext.getIdentifier());
dto.setName(parameterContext.getName());
dto.setMatches(matches);
return dto;
}

private ComponentSearchResultDTO search(final String searchString, final Parameter parameter) {
final List<String> matches = new ArrayList<>();
addIfAppropriate(searchString, parameter.getDescriptor().getName(), "Name", matches);
addIfAppropriate(searchString, parameter.getDescriptor().getDescription(), "Description", matches);
if (!parameter.getDescriptor().isSensitive()) {
addIfAppropriate(searchString, parameter.getValue(), "Value", matches);
}

if (matches.isEmpty()) {
return null;
}

final ComponentSearchResultDTO dto = new ComponentSearchResultDTO();
dto.setId(parameter.getDescriptor().getName());
dto.setName(parameter.getDescriptor().getName());
dto.setMatches(matches);
return dto;
}

/**
* Builds the nearest versioned parent result group for a given user.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,15 @@
import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.user.NiFiUser;
import org.apache.nifi.controller.FlowController;
import org.apache.nifi.controller.ProcessorNode;
import org.apache.nifi.controller.StandardProcessorNode;
import org.apache.nifi.controller.flow.FlowManager;
import org.apache.nifi.groups.ProcessGroup;
import org.apache.nifi.parameter.Parameter;
import org.apache.nifi.parameter.ParameterContext;
import org.apache.nifi.parameter.ParameterContextManager;
import org.apache.nifi.parameter.ParameterDescriptor;
import org.apache.nifi.processor.Processor;
import org.apache.nifi.registry.VariableRegistry;
import org.apache.nifi.registry.flow.StandardVersionControlInformation;
Expand All @@ -33,25 +39,39 @@
import org.mockito.AdditionalMatchers;
import org.mockito.Mockito;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;

public class ControllerSearchServiceTest {
private MutableVariableRegistry variableRegistry;
private ControllerSearchService service;
private SearchResultsDTO searchResultsDTO;
private FlowController flowController;
private ParameterContextManager parameterContextManager;

@Before
public void setUp() {
variableRegistry = mock(MutableVariableRegistry.class);
service = new ControllerSearchService();
searchResultsDTO = new SearchResultsDTO();
flowController = mock(FlowController.class);

FlowManager mockFlowManager = mock(FlowManager.class);
parameterContextManager = mock(ParameterContextManager.class);

doReturn(mockFlowManager).when(flowController).getFlowManager();
doReturn(parameterContextManager).when(mockFlowManager).getParameterContextManager();
service.setFlowController(flowController);
}

@Test
Expand Down Expand Up @@ -339,6 +359,83 @@ public void testSearchInThirdLevelParentNotAuthorizedWithVersionControlInTheGrou
assertTrue(searchResultsDTO.getProcessorResults().get(0).getVersionedGroup().getName() == null);
}

@Test
public void testSearchParameterContext() {
final ParameterContext paramContext1 = setupMockedParameterContext("foo", "description for parameter context foo", 1, "foo_param", true);
final ParameterContext paramContext2 = setupMockedParameterContext("bar", "description for parameter context bar", 2, "bar_param", true);
final Set<ParameterContext> mockedParameterContexts = new HashSet<ParameterContext>();
mockedParameterContexts.add(paramContext1);
mockedParameterContexts.add(paramContext2);

Mockito.doReturn(mockedParameterContexts).when(parameterContextManager).getParameterContexts();

service.searchParameters(searchResultsDTO, "foo");

assertTrue(searchResultsDTO.getParameterContextResults().size() == 1);
assertTrue(searchResultsDTO.getParameterContextResults().get(0).getId().equals("fooId"));
assertTrue(searchResultsDTO.getParameterContextResults().get(0).getName().equals("foo"));
// should have a match for the name, id, description
assertTrue(searchResultsDTO.getParameterContextResults().get(0).getMatches().size() == 3);

assertTrue(searchResultsDTO.getParameterResults().size() == 1);

assertTrue(searchResultsDTO.getParameterResults().get(0).getParentGroup().getId().equals("fooId"));
assertTrue(searchResultsDTO.getParameterResults().get(0).getName().equals("foo_param_0"));
// and the parameter name, parameter description, and the parameter value
assertTrue(searchResultsDTO.getParameterResults().get(0).getMatches().size() == 3);
}

@Test
public void testSearchParameterContextNotAuthorized() {
final ParameterContext paramContext1 = setupMockedParameterContext("foo", "description for parameter context foo", 1, "foo_param", false);
final ParameterContext paramContext2 = setupMockedParameterContext("bar", "description for parameter context bar", 2, "bar_param", true);
final Set<ParameterContext> mockedParameterContexts = new HashSet<ParameterContext>();
mockedParameterContexts.add(paramContext1);
mockedParameterContexts.add(paramContext2);

Mockito.doReturn(mockedParameterContexts).when(parameterContextManager).getParameterContexts();

service.searchParameters(searchResultsDTO, "foo");

// the matching parameter context is not readable by the user, so there should not be any results
assertTrue(searchResultsDTO.getParameterContextResults().size() == 0);
assertTrue(searchResultsDTO.getParameterResults().size() == 0);
}

/**
* Sets up a mock Parameter Context including isAuthorized()
* @param name name of the parameter context
* @param description description of the parameter context
* @param numberOfParams number of parameters to include as part of this context
* @param parameterNamePrefix a prefix for the parameter names
* @param authorizedToRead whether or not the user can read the parameter context
* @return ParameterContext
*/
private ParameterContext setupMockedParameterContext(String name, String description, int numberOfParams, String parameterNamePrefix, boolean authorizedToRead) {
final ParameterContext parameterContext = mock(ParameterContext.class);
Mockito.doReturn(name + "Id").when(parameterContext).getIdentifier();
Mockito.doReturn(name).when(parameterContext).getName();
Mockito.doReturn(description).when(parameterContext).getDescription();
Mockito.doReturn(authorizedToRead).when(parameterContext).isAuthorized(any(Authorizer.class), eq(RequestAction.READ), any(NiFiUser.class));
Mockito.doReturn(authorizedToRead).when(parameterContext).isAuthorized(eq(null), eq(RequestAction.READ), eq(null));

Map<ParameterDescriptor, Parameter> parameters = new HashMap<>();
for (int i = 0; i < numberOfParams; i++) {
final ParameterDescriptor descriptor = new ParameterDescriptor.Builder()
.name(parameterNamePrefix + "_" + i)
.description("Description for " + parameterNamePrefix + "_" + i)
.sensitive(false)
.build();

final Parameter param = new Parameter(descriptor, parameterNamePrefix + "_" + i + " value");
parameters.put(descriptor, param);
}

Mockito.doReturn(parameters).when(parameterContext).getParameters();

return parameterContext;
}

/**
* Mocks Processor including isAuthorized() and its name & id.
*
Expand Down
Loading