carlesarnal commented on code in PR #24844:
URL: https://github.com/apache/camel/pull/24844#discussion_r4204138858


##########
components/camel-apicurio-registry/src/main/java/org/apache/camel/component/apicurioregistry/ApicurioRegistryEndpoint.java:
##########
@@ -0,0 +1,139 @@
+/*
+ * 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.camel.component.apicurioregistry;
+
+import io.apicurio.registry.client.RegistryClientFactory;
+import io.apicurio.registry.client.common.RegistryClientOptions;
+import io.apicurio.registry.rest.client.RegistryClient;
+import org.apache.camel.Category;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.EndpointServiceLocation;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriPath;
+import org.apache.camel.support.ScheduledPollEndpoint;
+
+/**
+ * Manage artifacts, versions, and groups in Apicurio Registry v3.
+ */
+@UriEndpoint(firstVersion = "4.23.0", scheme = "apicurio-registry", title = 
"Apicurio Registry",
+             syntax = "apicurio-registry:groupId/artifactId",
+             category = { Category.CLOUD, Category.API }, headersClass = 
ApicurioRegistryConstants.class)
+public class ApicurioRegistryEndpoint extends ScheduledPollEndpoint implements 
EndpointServiceLocation {
+
+    @UriPath(description = "The artifact group ID")
+    private String groupId;
+
+    @UriPath(description = "The artifact ID")
+    private String artifactId;
+
+    @UriParam
+    private ApicurioRegistryConfiguration configuration;
+
+    @UriParam(label = "advanced", description = "To use a pre-configured 
RegistryClient instance")
+    private RegistryClient registryClient;
+
+    private boolean managedRegistryClient;
+
+    ApicurioRegistryEndpoint(String uri, ApicurioRegistryComponent component,
+                             ApicurioRegistryConfiguration configuration,
+                             String groupId, String artifactId) {
+        super(uri, component);
+        this.configuration = configuration;
+        this.groupId = groupId;
+        this.artifactId = artifactId;
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new ApicurioRegistryProducer(this, configuration);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        ApicurioRegistryConsumer consumer = new ApicurioRegistryConsumer(this, 
processor, configuration);
+        configureConsumer(consumer);
+        return consumer;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+        if (registryClient == null) {
+            registryClient = createRegistryClient();
+            managedRegistryClient = true;
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+        if (managedRegistryClient) {
+            registryClient = null;

Review Comment:
   Good catch, fixed in 9ef714c5d5b. The endpoint now builds its own WebClient 
(plain, Basic or OAuth2) on the shared Vert.x and hands it to the SDK with 
customWebClient(). doStop() closes the WebClient and, for OIDC, the OAuth2Auth 
provider. A test checks that each endpoint gets its own client, that stopping 
one endpoint closes only its client, and that a restart creates a new one.
   
   _AI-assisted response prepared with OpenCode on behalf of @carlesarnal._



##########
components/camel-apicurio-registry/src/main/java/org/apache/camel/component/apicurioregistry/ApicurioRegistryComponent.java:
##########
@@ -0,0 +1,107 @@
+/*
+ * 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.camel.component.apicurioregistry;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import io.vertx.core.Vertx;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+@Component("apicurio-registry")
+public class ApicurioRegistryComponent extends DefaultComponent {
+
+    @Metadata(label = "advanced", description = "The component configuration")
+    private ApicurioRegistryConfiguration configuration = new 
ApicurioRegistryConfiguration();
+
+    @Metadata(label = "advanced", autowired = true,
+              description = "To use an existing Vert.x instance for the 
registry clients. If not set, the component creates"
+                            + " one shared Vert.x instance on first use and 
closes it when the component stops.")
+    private Vertx vertx;
+
+    private boolean managedVertx;
+
+    public ApicurioRegistryComponent() {
+    }
+
+    public ApicurioRegistryComponent(CamelContext context) {
+        super(context);
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
+        ApicurioRegistryConfiguration config = this.configuration.copy();
+
+        String groupId = null;
+        String artifactId = null;
+        if (remaining != null && !remaining.isEmpty()) {
+            String[] parts = remaining.split("/", 2);
+            groupId = parts[0].isEmpty() ? null : parts[0];
+            if (parts.length > 1 && !parts[1].isEmpty()) {
+                artifactId = parts[1];
+            }
+        }
+
+        ApicurioRegistryEndpoint endpoint = new ApicurioRegistryEndpoint(uri, 
this, config, groupId, artifactId);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+
+    synchronized Vertx getOrCreateVertx() {
+        if (vertx == null) {
+            vertx = Vertx.vertx();
+            managedVertx = true;
+        }
+        return vertx;
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+        Vertx toClose = null;
+        synchronized (this) {
+            if (managedVertx && vertx != null) {
+                toClose = vertx;
+                vertx = null;
+                managedVertx = false;
+            }
+        }
+        if (toClose != null) {
+            toClose.close().toCompletionStage().toCompletableFuture().get(30, 
TimeUnit.SECONDS);
+        }
+    }
+
+    public Vertx getVertx() {
+        return vertx;
+    }
+
+    public void setVertx(Vertx vertx) {

Review Comment:
   Fixed in 9ef714c5d5b. getVertx() and setVertx() are synchronized now, and 
setVertx() clears managedVertx, so the component never closes an instance the 
user set. If the component had already created its own instance, it remembers 
it and still closes it on stop. There is a test for that sequence.
   
   _AI-assisted response prepared with OpenCode on behalf of @carlesarnal._



##########
components/camel-apicurio-registry/src/main/java/org/apache/camel/component/apicurioregistry/ApicurioRegistryConsumer.java:
##########
@@ -0,0 +1,147 @@
+/*
+ * 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.camel.component.apicurioregistry;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import io.apicurio.registry.rest.client.RegistryClient;
+import io.apicurio.registry.rest.client.models.SearchedVersion;
+import io.apicurio.registry.rest.client.models.SortOrder;
+import io.apicurio.registry.rest.client.models.VersionSearchResults;
+import io.apicurio.registry.rest.client.models.VersionSortBy;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.Processor;
+import org.apache.camel.support.ScheduledPollConsumer;
+
+public class ApicurioRegistryConsumer extends ScheduledPollConsumer {
+
+    static final int PAGE_SIZE = 100;
+
+    private final ApicurioRegistryEndpoint endpoint;
+    private final ApicurioRegistryConfiguration configuration;
+    private volatile Long lastSeenGlobalId;
+
+    public ApicurioRegistryConsumer(ApicurioRegistryEndpoint endpoint, 
Processor processor,
+                                    ApicurioRegistryConfiguration 
configuration) {
+        super(endpoint, processor);
+        this.endpoint = endpoint;
+        this.configuration = configuration;
+    }
+
+    @Override
+    protected int poll() throws Exception {
+        String groupId = endpoint.getGroupId();
+        String artifactId = endpoint.getArtifactId();
+
+        if (groupId == null || artifactId == null) {
+            throw new IllegalArgumentException(
+                    "Both groupId and artifactId are required for the 
consumer");
+        }
+
+        RegistryClient client = endpoint.getRegistryClient();
+        List<SearchedVersion> versions = fetchNewVersions(client, groupId, 
artifactId);
+
+        int count = 0;
+        for (SearchedVersion version : versions) {
+            Long globalId = version.getGlobalId();
+            if (lastSeenGlobalId == null || globalId > lastSeenGlobalId) {
+                Exchange exchange = createExchange(false);
+                try {
+                    Message message = exchange.getIn();
+
+                    
message.setHeader(ApicurioRegistryConstants.HEADER_GROUP_ID, groupId);
+                    
message.setHeader(ApicurioRegistryConstants.HEADER_ARTIFACT_ID, artifactId);
+                    
message.setHeader(ApicurioRegistryConstants.HEADER_VERSION, 
version.getVersion());
+                    
message.setHeader(ApicurioRegistryConstants.HEADER_GLOBAL_ID, globalId);
+                    
message.setHeader(ApicurioRegistryConstants.HEADER_CONTENT_ID, 
version.getContentId());
+                    
message.setHeader(ApicurioRegistryConstants.HEADER_ARTIFACT_TYPE, 
version.getArtifactType());
+                    if (version.getState() != null) {
+                        
message.setHeader(ApicurioRegistryConstants.HEADER_VERSION_STATE,
+                                version.getState().getValue());
+                    }
+
+                    if (configuration.isFetchContent()) {
+                        try (InputStream content = 
client.groups().byGroupId(groupId).artifacts()

Review Comment:
   Thanks, fixed in 9ef714c5d5b. With fetchContent=true, DISABLED versions are 
skipped and the watermark moves past them. A 404 from the content call (a 
version disabled or deleted after the list was read) is skipped the same way. 
Other errors still stop the poll and retry. Tests cover 1 enabled, 2 disabled, 
3 returning 404, 4 enabled (only 1 and 4 delivered, no content call for 2), 
plus a 503 that is retried. The docs also mention the DRAFT and 
content-mutability behaviour.
   
   _AI-assisted response prepared with OpenCode on behalf of @carlesarnal._



##########
components/camel-apicurio-registry/src/main/java/org/apache/camel/component/apicurioregistry/ApicurioRegistryProducer.java:
##########
@@ -0,0 +1,275 @@
+/*
+ * 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.camel.component.apicurioregistry;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import io.apicurio.registry.rest.client.RegistryClient;
+import io.apicurio.registry.rest.client.models.ArtifactMetaData;
+import io.apicurio.registry.rest.client.models.CreateArtifact;
+import io.apicurio.registry.rest.client.models.CreateArtifactResponse;
+import io.apicurio.registry.rest.client.models.CreateGroup;
+import io.apicurio.registry.rest.client.models.CreateVersion;
+import io.apicurio.registry.rest.client.models.GroupMetaData;
+import io.apicurio.registry.rest.client.models.IfArtifactExists;
+import io.apicurio.registry.rest.client.models.RuleViolationProblemDetails;
+import io.apicurio.registry.rest.client.models.SearchedVersion;
+import io.apicurio.registry.rest.client.models.SortOrder;
+import io.apicurio.registry.rest.client.models.VersionContent;
+import io.apicurio.registry.rest.client.models.VersionMetaData;
+import io.apicurio.registry.rest.client.models.VersionSearchResults;
+import io.apicurio.registry.rest.client.models.VersionSortBy;
+import org.apache.camel.Message;
+import org.apache.camel.spi.InvokeOnHeader;
+import org.apache.camel.support.HeaderSelectorProducer;
+
+public class ApicurioRegistryProducer extends HeaderSelectorProducer {
+
+    private static final int PAGE_SIZE = 100;
+
+    private final ApicurioRegistryEndpoint endpoint;
+    private final ApicurioRegistryConfiguration configuration;
+
+    public ApicurioRegistryProducer(ApicurioRegistryEndpoint endpoint,
+                                    ApicurioRegistryConfiguration 
configuration) {
+        super(endpoint, ApicurioRegistryConstants.HEADER_OPERATION, 
configuration::getOperation);
+        this.endpoint = endpoint;
+        this.configuration = configuration;
+    }
+
+    private RegistryClient getClient() {
+        return endpoint.getRegistryClient();
+    }
+
+    private String resolveGroupId(Message message) {
+        String gid = 
message.getHeader(ApicurioRegistryConstants.HEADER_GROUP_ID, String.class);
+        return gid != null ? gid : endpoint.getGroupId();
+    }
+
+    private String resolveArtifactId(Message message) {
+        String aid = 
message.getHeader(ApicurioRegistryConstants.HEADER_ARTIFACT_ID, String.class);
+        return aid != null ? aid : endpoint.getArtifactId();
+    }
+
+    @InvokeOnHeader(ApicurioRegistryConstants.OPERATION_CREATE_ARTIFACT)
+    public void createArtifact(Message message) {
+        String groupId = resolveGroupId(message);
+        String artifactId = resolveArtifactId(message);
+        String artifactType = message.getHeader(
+                ApicurioRegistryConstants.HEADER_ARTIFACT_TYPE, 
configuration.getArtifactType(), String.class);
+        String name = 
message.getHeader(ApicurioRegistryConstants.HEADER_ARTIFACT_NAME, String.class);
+        String description = 
message.getHeader(ApicurioRegistryConstants.HEADER_ARTIFACT_DESCRIPTION, 
String.class);
+        String content = message.getBody(String.class);
+        String contentType = message.getHeader(
+                ApicurioRegistryConstants.HEADER_CONTENT_TYPE, 
"application/json", String.class);
+        String ifExistsVal = message.getHeader(
+                ApicurioRegistryConstants.HEADER_IF_EXISTS, 
configuration.getIfExists(), String.class);
+
+        CreateArtifact createArtifact = new CreateArtifact();
+        createArtifact.setArtifactId(artifactId);
+        createArtifact.setArtifactType(artifactType);
+        createArtifact.setName(name);
+        createArtifact.setDescription(description);
+
+        if (content != null) {
+            CreateVersion firstVersion = new CreateVersion();
+            VersionContent vc = new VersionContent();
+            vc.setContent(content);
+            vc.setContentType(contentType);
+            firstVersion.setContent(vc);
+            createArtifact.setFirstVersion(firstVersion);
+        }
+
+        CreateArtifactResponse result = 
getClient().groups().byGroupId(groupId).artifacts()
+                .post(createArtifact, config -> {
+                    if (ifExistsVal != null) {
+                        config.queryParameters.ifExists = 
IfArtifactExists.forValue(ifExistsVal);
+                    }
+                });
+        message.setBody(result);
+    }
+
+    @InvokeOnHeader(ApicurioRegistryConstants.OPERATION_UPDATE_ARTIFACT)
+    public void updateArtifact(Message message) {
+        String groupId = resolveGroupId(message);
+        String artifactId = resolveArtifactId(message);
+        String content = message.getBody(String.class);
+        String version = 
message.getHeader(ApicurioRegistryConstants.HEADER_VERSION, String.class);
+        String contentType = message.getHeader(
+                ApicurioRegistryConstants.HEADER_CONTENT_TYPE, 
"application/json", String.class);
+
+        CreateVersion createVersion = new CreateVersion();
+        createVersion.setVersion(version);
+        VersionContent vc = new VersionContent();
+        vc.setContent(content);
+        vc.setContentType(contentType);
+        createVersion.setContent(vc);
+
+        VersionMetaData result = 
getClient().groups().byGroupId(groupId).artifacts()
+                .byArtifactId(artifactId).versions().post(createVersion);
+        message.setBody(result);
+    }
+
+    @InvokeOnHeader(ApicurioRegistryConstants.OPERATION_DELETE_ARTIFACT)
+    public void deleteArtifact(Message message) {
+        String groupId = resolveGroupId(message);
+        String artifactId = resolveArtifactId(message);
+        
getClient().groups().byGroupId(groupId).artifacts().byArtifactId(artifactId).delete();
+    }
+
+    @InvokeOnHeader(ApicurioRegistryConstants.OPERATION_GET_ARTIFACT_CONTENT)
+    public void getArtifactContent(Message message) throws Exception {
+        String groupId = resolveGroupId(message);
+        String artifactId = resolveArtifactId(message);
+        String version = message.getHeader(
+                ApicurioRegistryConstants.HEADER_VERSION, "branch=latest", 
String.class);
+
+        try (InputStream content = 
getClient().groups().byGroupId(groupId).artifacts()
+                
.byArtifactId(artifactId).versions().byVersionExpression(version).content().get())
 {
+            message.setBody(content.readAllBytes());
+        }
+    }
+
+    @InvokeOnHeader(ApicurioRegistryConstants.OPERATION_GET_ARTIFACT_METADATA)
+    public void getArtifactMetadata(Message message) {
+        String groupId = resolveGroupId(message);
+        String artifactId = resolveArtifactId(message);
+
+        ArtifactMetaData metadata = 
getClient().groups().byGroupId(groupId).artifacts()
+                .byArtifactId(artifactId).get();
+        message.setBody(metadata);
+    }
+
+    @InvokeOnHeader(ApicurioRegistryConstants.OPERATION_SEARCH_ARTIFACTS)
+    public void searchArtifacts(Message message) {
+        var results = getClient().search().artifacts().get(config -> {

Review Comment:
   Fixed in 9ef714c5d5b. searchArtifacts now filters by the artifact ID from 
the header or path, and supports artifact type and labels too. New headers 
expose offset, limit, order and orderby, and invalid sort values fail with a 
clear message. The docs explain that the registry returns 20 results unless a 
limit is set. I also rewrote the IT: it creates three artifacts and checks the 
artifact ID filter and two sorted pages, so it no longer passes just because 
the group has one artifact.
   
   _AI-assisted response prepared with OpenCode on behalf of @carlesarnal._



##########
components/camel-apicurio-registry/src/main/java/org/apache/camel/component/apicurioregistry/ApicurioRegistryConfiguration.java:
##########
@@ -0,0 +1,188 @@
+/*
+ * 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.camel.component.apicurioregistry;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+@UriParams
+public class ApicurioRegistryConfiguration implements Cloneable {
+
+    @UriParam(label = "common", description = "The Apicurio Registry base URL")
+    @Metadata(required = true)
+    private String registryUrl;
+
+    @UriParam(label = "producer",
+              enums = 
"createArtifact,updateArtifact,deleteArtifact,getArtifactContent,getArtifactMetadata,searchArtifacts,listVersions,createGroup,testCompatibility,validate",
+              description = "The operation to perform")
+    private String operation;
+
+    @UriParam(label = "producer", description = "The default artifact type", 
defaultValue = "JSON")
+    private String artifactType = "JSON";
+
+    @UriParam(label = "security", enums = "none,basic,oidc", defaultValue = 
"none",
+              description = "The authentication type to use")
+    private String authType = "none";
+
+    @UriParam(label = "security", description = "Username for basic 
authentication")
+    private String username;
+
+    @UriParam(label = "security", secret = true, description = "Password for 
basic authentication")

Review Comment:
   Done in 9ef714c5d5b: password and clientSecret use security = "secret". The 
new proxyPassword option uses it as well.
   
   _AI-assisted response prepared with OpenCode on behalf of @carlesarnal._



##########
components/camel-apicurio-registry/src/main/java/org/apache/camel/component/apicurioregistry/ApicurioRegistryProducer.java:
##########
@@ -0,0 +1,275 @@
+/*
+ * 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.camel.component.apicurioregistry;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import io.apicurio.registry.rest.client.RegistryClient;
+import io.apicurio.registry.rest.client.models.ArtifactMetaData;
+import io.apicurio.registry.rest.client.models.CreateArtifact;
+import io.apicurio.registry.rest.client.models.CreateArtifactResponse;
+import io.apicurio.registry.rest.client.models.CreateGroup;
+import io.apicurio.registry.rest.client.models.CreateVersion;
+import io.apicurio.registry.rest.client.models.GroupMetaData;
+import io.apicurio.registry.rest.client.models.IfArtifactExists;
+import io.apicurio.registry.rest.client.models.RuleViolationProblemDetails;
+import io.apicurio.registry.rest.client.models.SearchedVersion;
+import io.apicurio.registry.rest.client.models.SortOrder;
+import io.apicurio.registry.rest.client.models.VersionContent;
+import io.apicurio.registry.rest.client.models.VersionMetaData;
+import io.apicurio.registry.rest.client.models.VersionSearchResults;
+import io.apicurio.registry.rest.client.models.VersionSortBy;
+import org.apache.camel.Message;
+import org.apache.camel.spi.InvokeOnHeader;
+import org.apache.camel.support.HeaderSelectorProducer;
+
+public class ApicurioRegistryProducer extends HeaderSelectorProducer {
+
+    private static final int PAGE_SIZE = 100;
+
+    private final ApicurioRegistryEndpoint endpoint;
+    private final ApicurioRegistryConfiguration configuration;
+
+    public ApicurioRegistryProducer(ApicurioRegistryEndpoint endpoint,
+                                    ApicurioRegistryConfiguration 
configuration) {
+        super(endpoint, ApicurioRegistryConstants.HEADER_OPERATION, 
configuration::getOperation);
+        this.endpoint = endpoint;
+        this.configuration = configuration;
+    }
+
+    private RegistryClient getClient() {
+        return endpoint.getRegistryClient();
+    }
+
+    private String resolveGroupId(Message message) {
+        String gid = 
message.getHeader(ApicurioRegistryConstants.HEADER_GROUP_ID, String.class);
+        return gid != null ? gid : endpoint.getGroupId();

Review Comment:
   I documented this in 9ef714c5d5b, with a promotion-route example that uses 
removeHeaders("CamelApicurioRegistry*") before the producer. Changing the 
header precedence would be a larger behaviour change, so I left it as is for 
now.
   
   _AI-assisted response prepared with OpenCode on behalf of @carlesarnal._



-- 
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.

To unsubscribe, e-mail: [email protected]

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

Reply via email to