in tx-control-providers/jpa/tx-control-provider-jpa-xa/src/main/java/org/apache/aries/tx/control/jpa/xa/impl/JPAEntityManagerProviderFactoryImpl.java [436:478]
private ClassLoader getPluginLoader(Bundle providerBundle, Bundle txControlProviderBundle) {
return new ClassLoader() {
ConcurrentMap<String, Class<?>> loaded = new ConcurrentHashMap<>();
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if(name.startsWith("org.apache.aries.tx.control.jpa.xa.plugin")) {
Class<?> c = loaded.get(name);
if(c != null) {
return c;
}
String resource = name.replace('.', '/') + ".class";
try (InputStream is = txControlProviderBundle.getResource(resource).openStream()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
byte[] b = new byte[4096];
int read;
while ((read = is.read(b)) != -1) {
baos.write(b, 0, read);
}
byte[] clazzBytes = baos.toByteArray();
c = defineClass(name, clazzBytes, 0, clazzBytes.length,
XAJPAEMFLocator.class.getProtectionDomain());
loaded.putIfAbsent(name, c);
return c;
} catch (IOException e) {
throw new ClassNotFoundException("Unable to load class " + name, e);
}
}
if(name.startsWith("org.apache.aries.tx.control") ||
name.startsWith("org.osgi.service.transaction.control") ||
name.startsWith("org.slf4j")) {
return txControlProviderBundle.loadClass(name);
}
return providerBundle.loadClass(name);
}
};
}