This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch connect
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/connect by this push:
new 30ba7b8 Add a native-image config to make the framework work in a
native image ootb.
30ba7b8 is described below
commit 30ba7b81ede0033640fdd91fbcf7aa3eeaa1b40f
Author: Karl Pauls <[email protected]>
AuthorDate: Wed Sep 23 00:00:15 2020 +0200
Add a native-image config to make the framework work in a native image ootb.
---
framework/pom.xml | 2 +-
.../java/org/apache/felix/framework/Felix.java | 7 ++++--
.../felix/framework/ServiceRegistrationImpl.java | 9 +++++---
.../java/org/apache/felix/framework/util/Util.java | 25 ++++++++++++++++++++
.../native-image.properties | 5 ++++
.../org.apache.felix.framework/reflect-config.json | 27 ++++++++++++++++++++++
.../resource-config.json | 9 ++++++++
7 files changed, 78 insertions(+), 6 deletions(-)
diff --git a/framework/pom.xml b/framework/pom.xml
index 52b0b24..ed0dc32 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -90,7 +90,7 @@
<excludes>
<exclude>src/main/appended-resources/**</exclude>
<exclude>src/**/packageinfo</exclude>
- <exclude>src/main/resources/META-INF/services/*</exclude>
+ <exclude>src/main/resources/META-INF/**</exclude>
<exclude>src/main/resources/org/apache/felix/framework/Felix.properties</exclude>
</excludes>
</configuration>
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java
b/framework/src/main/java/org/apache/felix/framework/Felix.java
index 2bc5865..8df2c5d 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -3777,8 +3777,11 @@ public class Felix extends BundleImpl implements
Framework
Class clazz = Util.loadClassUsingClass(svcObj.getClass(),
classNames[i], m_secureAction);
if (clazz == null)
{
- throw new IllegalArgumentException(
- "Cannot cast service: " + classNames[i]);
+ if (!Util.checkImplementsWithName(svcObj.getClass(),
classNames[i]))
+ {
+ throw new IllegalArgumentException(
+ "Cannot cast service: " + classNames[i]);
+ }
}
else if (!clazz.isAssignableFrom(svcObj.getClass()))
{
diff --git
a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
index 7a38c67..ac14d4d 100644
---
a/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
+++
b/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java
@@ -364,9 +364,12 @@ class ServiceRegistrationImpl implements
ServiceRegistration
{
if (clazz == null)
{
- throw new ServiceException(
- "Service cannot be cast due to missing class: " +
m_classes[i],
- ServiceException.FACTORY_ERROR);
+ if (!Util.checkImplementsWithName(svcObj.getClass(),
m_classes[i]))
+ {
+ throw new ServiceException(
+ "Service cannot be cast due to missing
class: " + m_classes[i],
+ ServiceException.FACTORY_ERROR);
+ }
}
else
{
diff --git a/framework/src/main/java/org/apache/felix/framework/util/Util.java
b/framework/src/main/java/org/apache/felix/framework/util/Util.java
index 46e6649..b18439f 100644
--- a/framework/src/main/java/org/apache/felix/framework/util/Util.java
+++ b/framework/src/main/java/org/apache/felix/framework/util/Util.java
@@ -459,6 +459,31 @@ public class Util
return null;
}
+ public static boolean checkImplementsWithName(Class<?> clazz, String name)
+ {
+ while (clazz != null)
+ {
+ if (clazz.getName().equals(name))
+ {
+ return true;
+ }
+ // Try to see if
+ // one of the class's implemented interface
+ // is the name.
+ Class[] ifcs = clazz.getInterfaces();
+ for (int i = 0; i < ifcs.length; i++)
+ {
+ if (checkImplementsWithName(ifcs[i], name)) {
+ return true;
+ }
+ }
+
+ // Try the super class class loader.
+ clazz = clazz.getSuperclass();
+ }
+ return false;
+ }
+
/**
* This method determines if the requesting bundle is able to cast
* the specified service reference based on class visibility rules
diff --git
a/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/native-image.properties
b/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/native-image.properties
new file mode 100644
index 0000000..85eb4e1
--- /dev/null
+++
b/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/native-image.properties
@@ -0,0 +1,5 @@
+Args = --initialize-at-build-time=\
+org.apache.felix.framework.util.Util,\
+org.apache.felix.framework.util.SecureAction,\
+org.apache.felix.framework.BundleWiringImpl,\
+org.apache.felix.framework.BundleRevisionImpl
diff --git
a/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/reflect-config.json
b/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/reflect-config.json
new file mode 100644
index 0000000..b1bc8ad
--- /dev/null
+++
b/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/reflect-config.json
@@ -0,0 +1,27 @@
+[
+ {
+ "name":"org.osgi.framework.Version",
+ "allPublicConstructors" : true,
+ "allPublicMethods" : true
+ },
+ {
+ "name":"org.osgi.framework.VersionRange",
+ "allPublicConstructors" : true,
+ "allPublicMethods" : true
+ },
+ {
+ "name" : "java.net.URL",
+ "allPublicConstructors" : true,
+ "allPublicMethods" : true,
+ "allDeclaredMethods" : true,
+ "allPublicFields" : true,
+ "allDeclaredFields" : true
+ },
+ {
+ "name" : "java.net.URLStreamHandler",
+ "allPublicMethods" : true,
+ "allDeclaredMethods" : true,
+ "allPublicFields" : true,
+ "allDeclaredFields" : true
+ }
+]
diff --git
a/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/resource-config.json
b/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/resource-config.json
new file mode 100644
index 0000000..cfeeac1
--- /dev/null
+++
b/framework/src/main/resources/META-INF/native-image/org.apache.felix/org.apache.felix.framework/resource-config.json
@@ -0,0 +1,9 @@
+{
+ "resources":[
+
{"pattern":"META-INF/services/org.osgi.framework.connect.ConnectFrameworkFactory"},
+ {"pattern":"META-INF/services/org.osgi.framework.launch.FrameworkFactory"},
+ {"pattern":"default.properties"},
+ {"pattern":"org/apache/felix/framework/Felix.properties"},
+ {"pattern":"org/apache/felix/framework/util/accessor.bytes"}
+ ]
+}