Skip to content

ConfigurationMetadataProperty name not stripped with same source types #16549

Closed
@jvalkeal

Description

@jvalkeal

Sample for this issue is in https://github.com/jvalkeal/randomstuff/tree/master/metadatanaming which uses 2.1.4.RELEASE.

Running a sample app prints (ConfigurationMetadataProperty.getId() / ConfigurationMetadataProperty.getName()):

spring.rabbitmq.listener.direct.acknowledge-mode / acknowledge-mode
spring.rabbitmq.listener.direct.auto-startup / auto-startup
spring.rabbitmq.listener.direct.consumers-per-queue / consumers-per-queue
spring.rabbitmq.listener.direct.default-requeue-rejected / default-requeue-rejected
spring.rabbitmq.listener.direct.idle-event-interval / idle-event-interval
spring.rabbitmq.listener.direct.missing-queues-fatal / missing-queues-fatal
spring.rabbitmq.listener.direct.prefetch / prefetch
spring.rabbitmq.listener.direct.retry.enabled / enabled
spring.rabbitmq.listener.direct.retry.initial-interval / initial-interval
spring.rabbitmq.listener.direct.retry.max-attempts / max-attempts
spring.rabbitmq.listener.direct.retry.max-interval / max-interval
spring.rabbitmq.listener.direct.retry.multiplier / multiplier
spring.rabbitmq.listener.direct.retry.stateless / stateless
spring.rabbitmq.listener.simple.acknowledge-mode / acknowledge-mode
spring.rabbitmq.listener.simple.auto-startup / auto-startup
spring.rabbitmq.listener.simple.concurrency / concurrency
spring.rabbitmq.listener.simple.default-requeue-rejected / default-requeue-rejected
spring.rabbitmq.listener.simple.idle-event-interval / idle-event-interval
spring.rabbitmq.listener.simple.max-concurrency / max-concurrency
spring.rabbitmq.listener.simple.missing-queues-fatal / missing-queues-fatal
spring.rabbitmq.listener.simple.prefetch / prefetch
spring.rabbitmq.listener.simple.retry.enabled / spring.rabbitmq.listener.simple.retry.enabled
spring.rabbitmq.listener.simple.retry.initial-interval / spring.rabbitmq.listener.simple.retry.initial-interval
spring.rabbitmq.listener.simple.retry.max-attempts / spring.rabbitmq.listener.simple.retry.max-attempts
spring.rabbitmq.listener.simple.retry.max-interval / spring.rabbitmq.listener.simple.retry.max-interval
spring.rabbitmq.listener.simple.retry.multiplier / spring.rabbitmq.listener.simple.retry.multiplier
spring.rabbitmq.listener.simple.retry.stateless / spring.rabbitmq.listener.simple.retry.stateless
spring.rabbitmq.listener.simple.transaction-size / transaction-size

As you can see every property under spring.rabbitmq.listener.simple.retry group will not strip groupId from its name.

When you i.e. use ConfigurationMetadataRepositoryJsonBuilder manually to build repository to get access to ConfigurationMetadataProperty's, RawConfigurationMetadata is getting slightly confused when it's trying to strip group id from a fully qualified property name to set a simple name.

Below is metadata for spring.rabbitmq.listener.direct.retry.enabled and spring.rabbitmq.listener.simple.retry.enabled which have a same sourceType.

{
  "properties": [
    {
      "name": "spring.rabbitmq.listener.direct.retry.enabled",
      "type": "java.lang.Boolean",
      "description": "Whether publishing retries are enabled.",
      "sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
      "defaultValue": false
    },
    {
      "name": "spring.rabbitmq.listener.simple.retry.enabled",
      "type": "java.lang.Boolean",
      "description": "Whether publishing retries are enabled.",
      "sourceType": "org.springframework.boot.autoconfigure.amqp.RabbitProperties$ListenerRetry",
      "defaultValue": false
    }
  ]
}

Issue seem to be RawConfigurationMetadata.getSource() which returns first ConfigurationMetadataSource matching a source type. As seen above, these two properties have different group but same sourceType, thus first match is returned. However as seen in below, when actual ConfigurationMetadataItem name is tried to re-set to a simple name(stripping group id), group prefix doesn't match, thus stripping doesn't happen.

if (hasLength(groupId) && id.startsWith(dottedPrefix)) {
String name = id.substring(dottedPrefix.length());
item.setName(name);
}

I created this issue from spring-attic/spring-cloud-dataflow-ui#769 and as @snicoll asked to create a sample to provide more details. MetadataResolver class in a sample is pretty much how we're using boot metadata in a dataflow space.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions