sten-navie commented on issue #60:
URL: https://github.com/apache/felix-atomos/issues/60#issuecomment-1164154832
This does not seem to be related the equinox metatype implementation. I was
able to repeat the same problem, by writing a simple Activator that just tracks
javax.xml.parsers.SAXParserFactory. When receiving the reference I print out
some info about the received class vs the wanted class and then try to cast the
result, which again results in a ClassCastException:
```
g! lb
START LEVEL 1
ID|State |Level|Name
0|Active | 0|OSGi System Bundle
(3.17.200.v20220215-2237)|3.17.200.v20220215-2237
1|Active | 1|java.base (11.0.14)|11.0.14
2|Active | 1|java.compiler (11.0.14)|11.0.14
3|Active | 1|java.datatransfer (11.0.14)|11.0.14
4|Active | 1|java.desktop (11.0.14)|11.0.14
5|Active | 1|java.logging (11.0.14)|11.0.14
6|Active | 1|java.management (11.0.14)|11.0.14
7|Active | 1|java.management.rmi (11.0.14)|11.0.14
8|Active | 1|java.naming (11.0.14)|11.0.14
9|Active | 1|java.prefs (11.0.14)|11.0.14
10|Active | 1|java.rmi (11.0.14)|11.0.14
11|Active | 1|java.security.jgss (11.0.14)|11.0.14
12|Active | 1|java.security.sasl (11.0.14)|11.0.14
13|Active | 1|java.smartcardio (11.0.14)|11.0.14
14|Active | 1|java.xml (11.0.14)|11.0.14
15|Active | 1|java.xml.crypto (11.0.14)|11.0.14
16|Active | 1|jdk.charsets (11.0.14)|11.0.14
17|Active | 1|jdk.compiler (11.0.14)|11.0.14
18|Active | 1|jdk.crypto.cryptoki (11.0.14)|11.0.14
19|Active | 1|jdk.crypto.ec (11.0.14)|11.0.14
20|Active | 1|jdk.internal.opt (11.0.14)|11.0.14
21|Active | 1|jdk.jartool (11.0.14)|11.0.14
22|Active | 1|jdk.javadoc (11.0.14)|11.0.14
23|Active | 1|jdk.jdeps (11.0.14)|11.0.14
24|Active | 1|jdk.jfr (11.0.14)|11.0.14
25|Active | 1|jdk.jlink (11.0.14)|11.0.14
26|Active | 1|jdk.localedata (11.0.14)|11.0.14
27|Active | 1|jdk.management (11.0.14)|11.0.14
28|Active | 1|jdk.management.jfr (11.0.14)|11.0.14
29|Active | 1|jdk.naming.dns (11.0.14)|11.0.14
30|Active | 1|jdk.naming.rmi (11.0.14)|11.0.14
31|Active | 1|jdk.security.auth (11.0.14)|11.0.14
32|Active | 1|jdk.security.jgss (11.0.14)|11.0.14
33|Active | 1|jdk.unsupported.desktop (11.0.14)|11.0.14
34|Active | 1|jdk.zipfs (11.0.14)|11.0.14
35|Active | 1|atomos (1.0.0)|1.0.0
36|Active | 1|Apache Felix Gogo Command (1.1.0)|1.1.0
37|Active | 1|Apache Felix Gogo Runtime (1.1.2)|1.1.2
38|Active | 1|Apache Felix Gogo Shell (1.1.2)|1.1.2
39|Active | 1|osgi.core (0.0.0)|0.0.0
g! felix:install
file:///<REDACTED-PATH>/tmp/atomos-test/atomos-saxparser-test-1.0.0-SNAPSHOT.jar
Bundle ID: 40
g! felix:start 40
Starting SAX Test
Start tracking.
Wanted class : javax.xml.parsers.SAXParserFactory Module = unnamed module
@554f5786, Loader =
org.eclipse.osgi.internal.loader.EquinoxClassLoader@2097740[java.xml:11.0.14(id=14)]
Received impl class :
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl Module = module
java.xml, Loader = null
Super class : javax.xml.parsers.SAXParserFactory Module = module java.xml,
Loader = null
Super class : java.lang.Object Module = module java.base, Loader = null
Trying to cast
java.lang.ClassCastException: Cannot cast
com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl to
javax.xml.parsers.SAXParserFactory
```
The relevant code (full code here
https://gist.github.com/sten-navie/278b2efa077d170fb530083c0648b2dd):
```
System.out.println("Starting SAX Test");
Class<SAXParserFactory> wantedClass = SAXParserFactory.class;
// use raw types, so that we do not immediately trigger a class-cast
exception via an implicit cast
serviceTracker = new ServiceTracker(bundleContext, wantedClass, new
ServiceTrackerCustomizer() {
@Override
public Object addingService(ServiceReference serviceReference) {
Object s = bundleContext.getService(serviceReference);
if (s == null) {
System.out.println("Got null ref!!!");
return null;
}
Class<?> implcl = s.getClass();
printClass("Wanted class", wantedClass);
printClass("Received impl class", implcl);
Class<?> supercl = implcl.getSuperclass();
while (supercl != null) {
printClass("Super class", supercl);
supercl = supercl.getSuperclass();
}
// try to cast
System.out.println("Trying to cast");
SAXParserFactory f = wantedClass.cast(s);
System.out.println("Cast successful. Done!");
return f;
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]