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"}
+  ]
+}

Reply via email to