This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch fhir
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a413615f4a0fdac421bd961227ab347375b8d64c
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Feb 6 12:32:34 2026 +0100

    Add apiSrcDir option to maven tooling that generates code fromApis that 
should load source code from another folder than its own classpath.
---
 components/camel-fhir/camel-fhir-component/pom.xml |   1 +
 .../camel/maven/ApiComponentGeneratorMojo.java     |   8 ++
 .../java/org/apache/camel/maven/HashHelper.java    |   3 +
 .../maven/JavaSourceApiMethodGeneratorMojo.java    | 103 ++++++++++++---------
 4 files changed, 71 insertions(+), 44 deletions(-)

diff --git a/components/camel-fhir/camel-fhir-component/pom.xml 
b/components/camel-fhir/camel-fhir-component/pom.xml
index 3e25aaac6d38..659102791fc0 100644
--- a/components/camel-fhir/camel-fhir-component/pom.xml
+++ b/components/camel-fhir/camel-fhir-component/pom.xml
@@ -191,6 +191,7 @@
                             <goal>fromApis</goal>
                         </goals>
                         <configuration>
+                            
<apiSrcDir>../camel-fhir-api/src/main/java</apiSrcDir>
                             <apis>
                                 <api>
                                     <apiName>capabilities</apiName>
diff --git 
a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/ApiComponentGeneratorMojo.java
 
b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/ApiComponentGeneratorMojo.java
index 45d2eaa24521..5cc69df433d0 100644
--- 
a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/ApiComponentGeneratorMojo.java
+++ 
b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/ApiComponentGeneratorMojo.java
@@ -82,6 +82,12 @@ public class ApiComponentGeneratorMojo extends 
AbstractApiMethodBaseMojo {
     @Parameter(defaultValue = "${project.build.directory}")
     private File cachedir;
 
+    /**
+     * To use a file system for the api source code location, instead of 
attempting to load from classpath -source JARs
+     */
+    @Parameter
+    protected File apiSrcDir;
+
     /**
      * Names of options that can be set to null value if not specified.
      */
@@ -108,6 +114,7 @@ public class ApiComponentGeneratorMojo extends 
AbstractApiMethodBaseMojo {
         String newHash = new HashHelper()
                 .hash("ApiComponentGeneratorMojo")
                 .hash("apis", apis)
+                .hash("apiSrcDir", apiSrcDir)
                 .hash("fromJavasource", fromJavasource)
                 .hash("nullableOptions", nullableOptions)
                 .hash("aliases", aliases)
@@ -278,6 +285,7 @@ public class ApiComponentGeneratorMojo extends 
AbstractApiMethodBaseMojo {
                     ? apiFromJavasource.getIncludeSetters() : 
fromJavasource.getIncludeSetters();
             mojo.aliases = api.getAliases().isEmpty() ? aliases : 
api.getAliases();
             mojo.nullableOptions = api.getNullableOptions() != null ? 
api.getNullableOptions() : nullableOptions;
+            mojo.apiSrcDir = apiSrcDir;
             apiMethodGenerator = mojo;
         }
 
diff --git 
a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/HashHelper.java
 
b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/HashHelper.java
index 4a966543376f..39e044b22a03 100644
--- 
a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/HashHelper.java
+++ 
b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/HashHelper.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.maven;
 
+import java.io.File;
 import java.util.Arrays;
 
 import com.google.common.hash.Hasher;
@@ -39,6 +40,8 @@ public class HashHelper {
                 hasher.putUnencodedChars((String) f);
             } else if (f instanceof Boolean) {
                 hasher.putBoolean((Boolean) f);
+            } else if (f instanceof File file) {
+                hasher.putUnencodedChars(file.getAbsolutePath());
             } else if (f instanceof Iterable) {
                 for (Object a : (Iterable<?>) f) {
                     hash(a);
diff --git 
a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
 
b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
index 2a42fd7472dd..4caaaf7c0ed8 100644
--- 
a/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
+++ 
b/tooling/maven/camel-api-component-maven-plugin/src/main/java/org/apache/camel/maven/JavaSourceApiMethodGeneratorMojo.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.maven;
 
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -23,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
+import org.apache.camel.util.IOHelper;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -61,6 +64,9 @@ public class JavaSourceApiMethodGeneratorMojo extends 
AbstractApiMethodGenerator
     @Parameter(property = PREFIX + "includeSetters")
     protected Boolean includeSetters;
 
+    @Parameter
+    protected File apiSrcDir;
+
     @Override
     public List<SignatureModel> getSignatureList() throws 
MojoExecutionException {
         // signatures as map from signature with no arg names to arg names 
from JavadocParser
@@ -89,60 +95,69 @@ public class JavaSourceApiMethodGeneratorMojo extends 
AbstractApiMethodGenerator
 
             // read source java text for class
             log.debug("Loading source: {}", sourcePath);
-            JavaSourceParser parser;
-            try (InputStream inputStream = 
getProjectClassLoader().getResourceAsStream(sourcePath)) {
-                if (inputStream == null) {
-                    log.debug("Java source not found on classpath for {}", 
aClass.getName());
-                    break;
-                }
+            JavaSourceParser parser = null;
 
-                parser = new JavaSourceParser(projectClassLoader);
-                parser.parse(inputStream, nestedClass, includeSetters != null 
&& includeSetters);
+            InputStream inputStream = 
getProjectClassLoader().getResourceAsStream(sourcePath);
+            if (inputStream == null) {
+                log.debug("Java source not found on classpath for {}", 
aClass.getName());
+            }
+            try {
+                if (inputStream == null && apiSrcDir != null) {
+                    log.debug("Using file location for source: {}", apiSrcDir);
+                    inputStream = new FileInputStream(new File(apiSrcDir, 
sourcePath));
+                }
+                if (inputStream != null) {
+                    parser = new JavaSourceParser(projectClassLoader);
+                    parser.parse(inputStream, nestedClass, includeSetters != 
null && includeSetters);
+                }
             } catch (Exception e) {
                 throw new MojoExecutionException(e.getMessage(), e);
+            } finally {
+                IOHelper.close(inputStream);
             }
 
-            // look for parse errors
-            final String parseError = parser.getErrorMessage();
-            if (parseError != null) {
-                throw new MojoExecutionException(parseError);
-            }
+            if (parser != null) {
+                // look for parse errors
+                final String parseError = parser.getErrorMessage();
+                if (parseError != null) {
+                    throw new MojoExecutionException(parseError);
+                }
 
-            // get public method signature
-            for (String method : parser.getMethodSignatures()) {
-                if (!result.containsKey(method)
-                        && (includeMethodPatterns == null || 
includeMethodPatterns.matcher(method).find())
-                        && (excludeMethodPatterns == null || 
!excludeMethodPatterns.matcher(method).find())) {
-
-                    String signature = method;
-                    method = method.replace("public ", "");
-                    int whitespace = method.indexOf(' ');
-                    int leftBracket = method.indexOf('(');
-                    String name = method.substring(whitespace + 1, 
leftBracket);
-
-                    SignatureModel model = new SignatureModel();
-                    model.setSignature(method);
-                    model.setApiDescription(parser.getClassDoc());
-                    
model.setMethodDescription(parser.getMethodDocs().get(name));
-                    
model.setParameterDescriptions(parser.getParameterDocs().get(name));
-                    
model.setParameterTypes(parser.getParameterTypes().get(signature));
-
-                    // include getter/setters
-                    if (includeSetters != null && includeSetters && 
!parser.getSetterMethods().isEmpty()) {
-                        var m = parser.getSetterMethods().get(signature);
-                        var d = parser.getSetterDocs().get(signature);
-                        if (getLog().isDebugEnabled()) {
-                            getLog().debug("There are " + m.size() + " 
optional properties as setters for: " + name);
-                            getLog().debug("" + m);
+                // get public method signature
+                for (String method : parser.getMethodSignatures()) {
+                    if (!result.containsKey(method)
+                            && (includeMethodPatterns == null || 
includeMethodPatterns.matcher(method).find())
+                            && (excludeMethodPatterns == null || 
!excludeMethodPatterns.matcher(method).find())) {
+
+                        String signature = method;
+                        method = method.replace("public ", "");
+                        int whitespace = method.indexOf(' ');
+                        int leftBracket = method.indexOf('(');
+                        String name = method.substring(whitespace + 1, 
leftBracket);
+
+                        SignatureModel model = new SignatureModel();
+                        model.setSignature(method);
+                        model.setApiDescription(parser.getClassDoc());
+                        
model.setMethodDescription(parser.getMethodDocs().get(name));
+                        
model.setParameterDescriptions(parser.getParameterDocs().get(name));
+                        
model.setParameterTypes(parser.getParameterTypes().get(signature));
+
+                        // include getter/setters
+                        if (includeSetters != null && includeSetters && 
!parser.getSetterMethods().isEmpty()) {
+                            var m = parser.getSetterMethods().get(signature);
+                            var d = parser.getSetterDocs().get(signature);
+                            if (getLog().isDebugEnabled()) {
+                                getLog().debug("There are " + m.size() + " 
optional properties as setters for: " + name);
+                                getLog().debug("" + m);
+                            }
+                            model.setSetterTypes(m);
+                            model.setSetterDescriptions(d);
                         }
-                        model.setSetterTypes(m);
-                        model.setSetterDescriptions(d);
-                    }
 
-                    result.put(method, model);
+                        result.put(method, model);
+                    }
                 }
             }
-
         }
 
         if (result.isEmpty()) {

Reply via email to