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>