package org.atricore.idbus.bundles.datanucleus.core; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.atricore.idbus.kernel.common.support.osgi.OsgiBundleClassLoader; import org.atricore.idbus.kernel.common.support.osgi.OsgiBundlespaceClassLoader; import org.osgi.framework.BundleContext; import org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean; import org.springframework.osgi.context.BundleContextAware; import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory; import java.util.Map; /** * @author <a href="mailto:sgonzalez@atricore.org">Sebastian Gonzalez Oyuela</a> * @version $Id$ */ public class OsgiJDOPersistenceManagerFactoryBean extends LocalPersistenceManagerFactoryBean implements BundleContextAware { private static final Log logger = LogFactory.getLog(OsgiJDOPersistenceManagerFactoryBean.class); private BundleContext bundleContext; @Override protected PersistenceManagerFactory newPersistenceManagerFactory(Map props) { if (logger.isDebugEnabled()) logger.debug("Creating new PersistenceManagerFactory based on properties"); /* TODO : DO NOT USE THE ENTIRE BUNDLESPACE, try local bundle classloader instead */ ClassLoader osgiCl = new OsgiBundlespaceClassLoader(bundleContext, new OsgiBundleClassLoader(bundleContext.getBundle()), bundleContext.getBundle()); // TODO : This does not work well ... check it // ClassLoader osgiCl = new OsgiBundleClassLoader(bundleContext.getBundle()); if (props.get("datanucleus.primaryClassLoader") == null) { if (logger.isDebugEnabled()) logger.debug("Setting primary Classloader!"); props.put("datanucleus.primaryClassLoader", osgiCl); } else { if (logger.isDebugEnabled()) logger.debug("Replacing primary Classloader!"); props.put("datanucleus.primaryClassLoader", osgiCl); } return JDOHelper.getPersistenceManagerFactory(props, osgiCl); } @Override protected PersistenceManagerFactory newPersistenceManagerFactory(String name) { /* DO NOT USE THE ENTIRE BUNDLESPACE, instead embed datanucleus in your own bundle. ClassLoader osgiCl = new OsgiBundlespaceClassLoader(bundleContext, new OsgiBundleClassLoader(bundleContext.getBundle()), bundleContext.getBundle()); */ ClassLoader osgiCl = new OsgiBundleClassLoader(bundleContext.getBundle()); if (logger.isDebugEnabled()) logger.debug("Creating new PersistenceManagerFactory based on name"); return JDOHelper.getPersistenceManagerFactory(name, osgiCl); } public void setBundleContext(BundleContext bundleContext) { if (logger.isDebugEnabled()) logger.debug("Recieved BundleContext " + bundleContext); this.bundleContext = bundleContext; setBeanClassLoader(Thread.currentThread().getContextClassLoader()); } }