help: OSGi ClassLoader and ressources

C

CHAFIK Wassime

Hi
well first sorry for the english that you are about to read :)
i'm actually trying to make OpenJPA as an OSGi bundle
first step:
make a big big jar containing all the packages the OpenJPA may need and
add them naturally to the bundle classpath (this may change later by
inflating this monolith into more flexible plugable smaller bundles)
second step:
write this ServiceFactory implementation
/**
* @(#)JPAServiceFactory.java
*
*
* @author
* @version 1.00 2008/4/10
*/
package jpa.impl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;

public class JPAServiceFactory implements ServiceFactory {
/**
* Method getService
*
* @param bundle
* @param registration
*
* @return
*
*/
public Object getService(Bundle bundle, ServiceRegistration registration) {
URL[] url = new URL[1];
url[0] = bundle.getResource("META-INF/persistence.xml");
if (url[0] == null)
throw new IllegalStateException(
"bundle "
+ bundle.getBundleId()
+ " called the JPAService, META-INF/persistence.xml not found");
//make a ClassLoader able to :
// 1-bootstrap JPA (all jars needed by OpenJPA)
// 2-find META-INF/persistence.xml
ClassLoader bundleCL = this.getClass().getClassLoader();
URLClassLoader newCL = new URLClassLoader(url, bundleCL);
Thread.currentThread().setContextClassLoader(newCL);
//this print OK the ressource exist
System.out.println("conf url from bundle:" + url[0]);
Object result=null;
try {
Class persistence = newCL.loadClass("javax.persistence.Persistence");
//WHY IS THIS printing null
System.out.println("conf seen in bootstrap
"+newCL.getResource("META-INF/persistence.xml"));
Method createFacory =
persistence.getDeclaredMethod("createEntityManagerFactory", new
Class[]{String.class});
result = createFacory.invoke(null, new String[]{null});
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}

/**
* Method ungetService
*
*
* @param bundle
* @param registration
* @param service
*
*/
public void ungetService(Bundle bundle, ServiceRegistration registration,
Object serv) {
if (serv != null && ((EntityManagerFactory) serv).isOpen())
((EntityManagerFactory) serv).close();
}

}

here is the Activator

package jpa.impl;

import java.util.Hashtable;

import javax.persistence.EntityManagerFactory;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

/* (non-Javadoc)
* @see
org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
JPAServiceFactory factory = new JPAServiceFactory();
Hashtable<String, String> properties = new Hashtable<String, String>();
properties.put("impl", "OpenJPA");
properties.put("vendor", "apache");
context.registerService(EntityManagerFactory.class.getName(),
factory, properties);
}

/* (non-Javadoc)
* @see
org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
}
}


even when i create a URLClassLoader (newCL) above the bundle ClassLoader
(aka the bootstraping ClassLoader) by adding the URL of
"META-INF/persistence.xml" (aka JPA configuration file)
newCL.getResource("META-INF/persistence.xml") still returns null ????
..............
i can't bootstrap OpenJPA in this conditions :-(
reaaaaaaaaaaaaaaaaaaally need some help here
 
C

CHAFIK Wassime

CHAFIK said:
Hi
well first sorry for the english that you are about to read :)
i'm actually trying to make OpenJPA as an OSGi bundle
first step:
make a big big jar containing all the packages the OpenJPA may need and
add them naturally to the bundle classpath (this may change later by
inflating this monolith into more flexible plugable smaller bundles)
second step:
write this ServiceFactory implementation
/**
* @(#)JPAServiceFactory.java
*
*
* @author
* @version 1.00 2008/4/10
*/
package jpa.impl;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;

public class JPAServiceFactory implements ServiceFactory {
/**
* Method getService
*
* @param bundle
* @param registration
*
* @return
*
*/
public Object getService(Bundle bundle, ServiceRegistration
registration) {
URL[] url = new URL[1];
url[0] = bundle.getResource("META-INF/persistence.xml");
if (url[0] == null)
throw new IllegalStateException(
"bundle "
+ bundle.getBundleId()
+ " called the JPAService,
META-INF/persistence.xml not found");
//make a ClassLoader able to :
// 1-bootstrap JPA (all jars needed by OpenJPA)
// 2-find META-INF/persistence.xml
ClassLoader bundleCL = this.getClass().getClassLoader();
URLClassLoader newCL = new URLClassLoader(url, bundleCL);
Thread.currentThread().setContextClassLoader(newCL);
//this print OK the ressource exist
System.out.println("conf url from bundle:" + url[0]);
Object result=null;
try {
Class persistence =
newCL.loadClass("javax.persistence.Persistence");
//WHY IS THIS printing null
System.out.println("conf seen in bootstrap
"+newCL.getResource("META-INF/persistence.xml"));
Method createFacory =
persistence.getDeclaredMethod("createEntityManagerFactory", new
Class[]{String.class});
result = createFacory.invoke(null, new String[]{null});
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}

/**
* Method ungetService
*
*
* @param bundle
* @param registration
* @param service
*
*/
public void ungetService(Bundle bundle, ServiceRegistration
registration,
Object serv) {
if (serv != null && ((EntityManagerFactory) serv).isOpen())
((EntityManagerFactory) serv).close();
}

}

here is the Activator

package jpa.impl;

import java.util.Hashtable;

import javax.persistence.EntityManagerFactory;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

/* (non-Javadoc)
* @see
org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
JPAServiceFactory factory = new JPAServiceFactory();
Hashtable<String, String> properties = new Hashtable<String,
String>();
properties.put("impl", "OpenJPA");
properties.put("vendor", "apache");
context.registerService(EntityManagerFactory.class.getName(),
factory, properties);
}

/* (non-Javadoc)
* @see
org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
}
}


even when i create a URLClassLoader (newCL) above the bundle ClassLoader
(aka the bootstraping ClassLoader) by adding the URL of
"META-INF/persistence.xml" (aka JPA configuration file)
newCL.getResource("META-INF/persistence.xml") still returns null ????
.............
i can't bootstrap OpenJPA in this conditions :-(
reaaaaaaaaaaaaaaaaaaally need some help here

so there is no help on that :)
i'm really stuck here :p
guess i'll have to change the design a little bit :p
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top