Skip to content
Open
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 @@ -1882,14 +1882,14 @@ public void synchronize(final ParameterContext parameterContext, final Versioned
}

private void collectValueAndReferences(final ParameterContext parameterContext, final Map<String, ParameterValueAndReferences> valueAndRef) {
parameterContext.getEffectiveParameters()
parameterContext.getRawEffectiveParameters()
.forEach((pd, param) -> valueAndRef.put(pd.getName(), getValueAndReferences(param)));
}

protected Set<String> getUpdatedParameterNames(final ParameterContext parameterContext, final VersionedParameterContext proposed) {
final Map<String, ParameterValueAndReferences> originalValues = new HashMap<>();
collectValueAndReferences(parameterContext, originalValues);
parameterContext.getEffectiveParameters().forEach((pd, param) -> originalValues.put(pd.getName(), getValueAndReferences(param)));
parameterContext.getRawEffectiveParameters().forEach((pd, param) -> originalValues.put(pd.getName(), getValueAndReferences(param)));

final Map<String, ParameterValueAndReferences> proposedValues = new HashMap<>();
if (proposed != null) {
Expand All @@ -1899,7 +1899,7 @@ protected Set<String> getUpdatedParameterNames(final ParameterContext parameterC
final ParameterContext inheritedContext = getParameterContextByName(name);
if (inheritedContext != null) {
collectValueAndReferences(inheritedContext, proposedValues);
inheritedContext.getEffectiveParameters().forEach((pd, param) -> proposedValues.put(pd.getName(), getValueAndReferences(param)));
inheritedContext.getRawEffectiveParameters().forEach((pd, param) -> proposedValues.put(pd.getName(), getValueAndReferences(param)));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,11 @@ public Map<ParameterDescriptor, Parameter> getEffectiveParameters() {
}
}

@Override
public Map<ParameterDescriptor, Parameter> getRawEffectiveParameters() {
return getMergedEffectiveParametersReadLocked();
}

@Override
public Map<String, Parameter> getEffectiveParameterUpdates(final Map<String, Parameter> parameterUpdates, final List<ParameterContext> inheritedParameterContexts) {
Objects.requireNonNull(parameterUpdates, "Parameter Updates must be specified");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,50 @@ public void testParameterValueReferenceResolution() {
assertEquals("myserver.example.com", effective.get(new ParameterDescriptor.Builder().name("db_host").build()).getValue());
}

@Test
public void testGetRawEffectiveParametersPreservesAliasValue() {
final StandardParameterContextManager parameterContextLookup = new StandardParameterContextManager();

final ParameterContext s = createParameterContext("s", parameterContextLookup);
addProvidedParameter(s, "db_host", "myserver.example.com");
addProvidedParameter(s, "db_port", "3306");

final ParameterContext p = createParameterContext("p", parameterContextLookup);
addParameter(p, "host", "#{db_host}");
addParameter(p, "port", "#{db_port}");
addParameter(p, "plain", "literal_value");

p.setInheritedParameterContexts(List.of(s));

final Map<ParameterDescriptor, Parameter> raw = p.getRawEffectiveParameters();
assertEquals("#{db_host}", raw.get(new ParameterDescriptor.Builder().name("host").build()).getValue());
assertEquals("#{db_port}", raw.get(new ParameterDescriptor.Builder().name("port").build()).getValue());
assertEquals("literal_value", raw.get(new ParameterDescriptor.Builder().name("plain").build()).getValue());

assertEquals("myserver.example.com", raw.get(new ParameterDescriptor.Builder().name("db_host").build()).getValue());
assertEquals("3306", raw.get(new ParameterDescriptor.Builder().name("db_port").build()).getValue());

final Map<ParameterDescriptor, Parameter> effective = p.getEffectiveParameters();
assertEquals("myserver.example.com", effective.get(new ParameterDescriptor.Builder().name("host").build()).getValue());
assertEquals("3306", effective.get(new ParameterDescriptor.Builder().name("port").build()).getValue());
}

@Test
public void testGetRawEffectiveParametersWithNoInheritance() {
final StandardParameterContextManager parameterContextLookup = new StandardParameterContextManager();

final ParameterContext p = createParameterContext("p", parameterContextLookup);
addParameter(p, "a", "#{b}");
addParameter(p, "b", "concrete");

final Map<ParameterDescriptor, Parameter> raw = p.getRawEffectiveParameters();
assertEquals("#{b}", raw.get(new ParameterDescriptor.Builder().name("a").build()).getValue());
assertEquals("concrete", raw.get(new ParameterDescriptor.Builder().name("b").build()).getValue());

final Map<ParameterDescriptor, Parameter> effective = p.getEffectiveParameters();
assertEquals("concrete", effective.get(new ParameterDescriptor.Builder().name("a").build()).getValue());
}

@Test
public void testParameterValueReferenceResolvesQuotedName() {
final StandardParameterContextManager parameterContextLookup = new StandardParameterContextManager();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,20 @@ public interface ParameterContext extends ParameterLookup, ComponentAuthorizable
*/
Map<ParameterDescriptor, Parameter> getEffectiveParameters();

/**
* Returns the merged effective parameter map -- identical in shape to {@link #getEffectiveParameters()} --
* but WITHOUT resolving one-to-one parameter value references. Local aliases retain their literal
* <code>#{otherName}</code> values. Use this method for display, persistence comparison, or any other
* read-side use where the raw, user-authored value matters. Use {@link #getEffectiveParameters()}
* when components require fully-resolved values for runtime substitution.
*
* @return a Map that contains all Parameters in the context and all nested ParameterContexts, keyed by their
* descriptors, without parameter value reference resolution applied
*/
default Map<ParameterDescriptor, Parameter> getRawEffectiveParameters() {
return getEffectiveParameters();
}

/**
* Returns a map from parameter name to Parameter, representing all parameters that would be effectively
* updated if the provided configuration was applied. Only parameters that would be effectively updated or added are
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1522,7 +1522,7 @@ public ParameterContextDTO createParameterContextDto(final ParameterContext para
dto.setBoundProcessGroups(boundGroups);

final Set<ParameterEntity> parameterEntities = new LinkedHashSet<>();
final Map<ParameterDescriptor, Parameter> parameters = includeInheritedParameters ? parameterContext.getEffectiveParameters()
final Map<ParameterDescriptor, Parameter> parameters = includeInheritedParameters ? parameterContext.getRawEffectiveParameters()
: parameterContext.getParameters();
for (final Parameter parameter : parameters.values()) {
parameterEntities.add(createParameterEntity(parameterContext, parameter, revisionManager, parameterContextLookup));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1406,6 +1406,42 @@ public void testParameterValueReferenceUserManagedUpdatePropagation() throws NiF
}
}

@Test
public void testParameterAliasDisplayedAsRawValue() throws NiFiClientException, IOException {
final Set<ParameterEntity> sParams = new HashSet<>();
sParams.add(createParameterEntity("db_host", null, false, "myserver.example.com"));
final ParameterContextEntity sContextEntity = createParameterContextEntity("S_RawDisplay", "Inherited context",
sParams, Collections.emptyList(), null, null);
final ParameterContextEntity createdS = getNifiClient().getParamContextClient().createParamContext(sContextEntity);

final Set<ParameterEntity> pParams = new HashSet<>();
pParams.add(createParameterEntity("host", null, false, "#{db_host}"));
final ParameterContextEntity pContextEntity = createParameterContextEntity("P_RawDisplay", "Parent context with alias",
pParams, Collections.singletonList(createdS), null, null);
final ParameterContextEntity createdP = getNifiClient().getParamContextClient().createParamContext(pContextEntity);

final ParameterContextEntity fetched = getNifiClient().getParamContextClient().getParamContext(createdP.getId(), true);
final Set<ParameterEntity> parameters = fetched.getComponent().getParameters();

final ParameterDTO hostDto = parameters.stream()
.map(ParameterEntity::getParameter)
.filter(p -> "host".equals(p.getName()))
.findFirst()
.orElse(null);
assertNotNull(hostDto);
assertFalse(hostDto.getInherited() != null && hostDto.getInherited());
assertEquals("#{db_host}", hostDto.getValue());

final ParameterDTO dbHostDto = parameters.stream()
.map(ParameterEntity::getParameter)
.filter(p -> "db_host".equals(p.getName()))
.findFirst()
.orElse(null);
assertNotNull(dbHostDto);
assertTrue(dbHostDto.getInherited());
assertEquals("myserver.example.com", dbHostDto.getValue());
}

protected void assertAsset(final AssetEntity asset, final String expectedName) {
assertNotNull(asset);
assertNotNull(asset.getAsset());
Expand Down
Loading