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

jungm pushed a commit to branch xbean-4.30-SNAPSHOT
in repository https://gitbox.apache.org/repos/asf/tomee.git


The following commit(s) were added to refs/heads/xbean-4.30-SNAPSHOT by this 
push:
     new f562e364b4 configurable constructor-types for ServiceProvider
f562e364b4 is described below

commit f562e364b448223cdddf210c45930cb293542b89
Author: Markus Jung <[email protected]>
AuthorDate: Sun Jan 4 17:55:53 2026 +0100

    configurable constructor-types for ServiceProvider
---
 .../openejb/assembler/classic/Assembler.java       | 13 ++++++++++--
 .../openejb/assembler/classic/ServiceInfo.java     |  1 +
 .../java/org/apache/openejb/config/AutoConfig.java |  1 +
 .../openejb/config/ConfigurationFactory.java       | 24 +++++++++++++++++-----
 .../openejb/config/provider/ProviderManager.java   |  3 +++
 .../apache/openejb/config/sys/ServiceProvider.java | 22 ++++++++++++++++++++
 .../src/main/resources/schema/service-jar.xsd      |  1 +
 7 files changed, 58 insertions(+), 7 deletions(-)

diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index 5ec42cd583..15222b8324 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -261,6 +261,7 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Collectors;
 
 import static org.apache.openejb.util.Classes.ancestors;
 
@@ -1409,6 +1410,13 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
                 if (si.constructorArgs != null && 
!si.constructorArgs.isEmpty()) {
                     query.put("constructor", Join.join(",", 
si.constructorArgs));
                 }
+                if (si.constructorArgTypes != null && 
!si.constructorArgTypes.isEmpty()) {
+                    String rawConstructorArgTypes = 
si.constructorArgTypes.stream()
+                            .map(Class::getName)
+                            .collect(Collectors.joining(","));
+
+                    query.put("constructor-types", Join.join(",", 
rawConstructorArgTypes));
+                }
                 appInfo.properties.put(si.id, "new://Service?" + 
URISupport.createQueryString(query));
                 if (si.properties != null) {
                     for (final String k : si.properties.stringPropertyNames()) 
{
@@ -3750,8 +3758,9 @@ public class Assembler extends AssemblerTool implements 
org.apache.openejb.spi.A
     }
 
     public static ObjectRecipe prepareRecipe(final ServiceInfo info) {
-        final String[] constructorArgs = info.constructorArgs.toArray(new 
String[info.constructorArgs.size()]);
-        final ObjectRecipe serviceRecipe = new ObjectRecipe(info.className, 
info.factoryMethod, constructorArgs, null);
+        final String[] constructorArgs = info.constructorArgs.toArray(new 
String[0]);
+        final Class[] constructorArgTypes = 
info.constructorArgTypes.toArray(new Class[0]);
+        final ObjectRecipe serviceRecipe = new ObjectRecipe(info.className, 
info.factoryMethod, constructorArgs, constructorArgTypes);
         serviceRecipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);
         serviceRecipe.allow(Option.IGNORE_MISSING_PROPERTIES);
         serviceRecipe.allow(Option.PRIVATE_PROPERTIES);
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java
index 429a134eb2..619ab0822c 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ServiceInfo.java
@@ -35,6 +35,7 @@ public class ServiceInfo extends InfoObject {
     public String classpathAPI;
     public Properties properties;
     public final List<String> constructorArgs = new ArrayList<>();
+    public final List<Class<?>> constructorArgTypes = new ArrayList<>();
     public Properties unsetProperties; // keep it in the model to be able to 
investigate it dumping Infos
 
     /**
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
index c247580bb6..eb3567dd44 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
@@ -1922,6 +1922,7 @@ public class AutoConfig implements DynamicDeployer, 
JndiConstants {
         b.description = a.description;
         b.factoryMethod = a.factoryMethod;
         b.constructorArgs.addAll(a.constructorArgs);
+        b.constructorArgTypes.addAll(a.constructorArgTypes);
         b.originAppName = a.originAppName;
         b.types.addAll(a.types);
         b.properties = new SuperProperties();
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
index 0e0f8b6033..5428f049b8 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
@@ -19,6 +19,7 @@ package org.apache.openejb.config;
 
 import org.apache.openejb.Extensions;
 import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.Vendor;
 import org.apache.openejb.api.Proxy;
 import org.apache.openejb.api.resource.PropertiesResourceProvider;
@@ -122,6 +123,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import static 
org.apache.openejb.config.DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY;
 import static org.apache.openejb.config.ServiceUtils.implies;
@@ -1289,7 +1291,8 @@ public class ConfigurationFactory implements 
OpenEjbConfigurationFactory {
             info.factoryMethod = provider.getFactoryName();
             info.id = service.getId();
             info.properties = props;
-            info.constructorArgs.addAll(parseConstructorArgs(provider));
+            info.constructorArgs.addAll(parseList(provider.getConstructor()));
+            
info.constructorArgTypes.addAll(parseConstructorArgTypes(provider));
             if (info instanceof ResourceInfo && service instanceof Resource) {
                 final ResourceInfo ri = ResourceInfo.class.cast(info);
                 final Resource resource = Resource.class.cast(service);
@@ -1598,12 +1601,23 @@ public class ConfigurationFactory implements 
OpenEjbConfigurationFactory {
         return containerTypes.get(ctype);
     }
 
-    private List<String> parseConstructorArgs(final ServiceProvider service) {
-        final String constructor = service.getConstructor();
-        if (constructor == null) {
+    private List<String> parseList(final String raw) {
+        if (raw == null) {
             return Collections.emptyList();
         }
-        return Arrays.asList(constructor.split("[ ,]+"));
+        return Arrays.asList(raw.split("[ ,]+"));
+    }
+
+    private List<Class<?>> parseConstructorArgTypes(final ServiceProvider 
service) {
+        return parseList(service.getConstructorTypes()).stream()
+                .map(it -> {
+                    try {
+                        return Class.forName(it);
+                    } catch (final ClassNotFoundException e) {
+                        throw new OpenEJBRuntimeException(e);
+                    }
+                })
+                .collect(Collectors.toUnmodifiableList());
     }
 
     protected List<String> getResourceIds() {
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
index 2f4616900d..d5885d2da4 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/config/provider/ProviderManager.java
@@ -130,6 +130,9 @@ public class ProviderManager {
         if (n(child.getConstructor())) {
             child.setConstructor(parent.getConstructor());
         }
+        if (n(child.getConstructorTypes())) {
+            child.setConstructor(parent.getConstructorTypes());
+        }
         if (n(child.getFactoryName())) {
             child.setFactoryName(parent.getFactoryName());
         }
diff --git 
a/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
 
b/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
index 7c92f3adb5..cfcf8a6c71 100644
--- 
a/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
+++ 
b/container/openejb-core/src/main/java/org/apache/openejb/config/sys/ServiceProvider.java
@@ -64,6 +64,8 @@ public class ServiceProvider {
     protected String className;
     @XmlAttribute(name = "constructor")
     protected String constructor;
+    @XmlAttribute(name = "constructor-types")
+    protected String constructorTypes;
     @XmlAttribute
     protected String description;
     @XmlAttribute(name = "display-name")
@@ -162,6 +164,26 @@ public class ServiceProvider {
         this.constructor = value;
     }
 
+    /**
+     * Gets the value of the constructorTypes property.
+     *
+     * @return possible object is
+     * {@link String }
+     */
+    public String getConstructorTypes() {
+        return constructorTypes;
+    }
+
+    /**
+     * Sets the value of the constructorTypes property.
+     *
+     * @param value allowed object is
+     *              {@link String }
+     */
+    public void setConstructorTypes(final String value) {
+        this.constructorTypes = value;
+    }
+
     /**
      * Gets the value of the description property.
      *
diff --git a/container/openejb-core/src/main/resources/schema/service-jar.xsd 
b/container/openejb-core/src/main/resources/schema/service-jar.xsd
index 232e7a9254..726e16e1a0 100644
--- a/container/openejb-core/src/main/resources/schema/service-jar.xsd
+++ b/container/openejb-core/src/main/resources/schema/service-jar.xsd
@@ -46,6 +46,7 @@
           <xsd:attribute name="description" type="xsd:string" use="optional"/>
           <xsd:attribute name="class-name" type="ClassName"/>
           <xsd:attribute name="constructor" type="xsd:string" use="optional"/>
+          <xsd:attribute name="constructor-types" type="xsd:string" 
use="optional"/>
           <xsd:attribute name="factory-name" type="xsd:string" use="optional"/>
         </xsd:extension>
       </xsd:simpleContent>

Reply via email to