HHH-8225 EMF cannot be created, closed, then re-created in OSGi

This commit is contained in:
Brett Meyer 2013-05-06 19:56:13 -04:00
parent 1bf647b7eb
commit d67a96e813
2 changed files with 11 additions and 12 deletions

View File

@ -27,9 +27,11 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import org.osgi.framework.Bundle;
@ -41,12 +43,13 @@ import org.osgi.framework.Bundle;
* @author Tim Ward
*/
public class OsgiClassLoader extends ClassLoader {
private List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
private List<Bundle> bundles = new ArrayList<Bundle>();
// Leave these as Sets -- addClassLoader or addBundle may be called more
// than once if a SF or EMF is closed and re-created.
private Set<ClassLoader> classLoaders = new HashSet<ClassLoader>();
private Set<Bundle> bundles = new HashSet<Bundle>();
private Map<String, Class<?>> classCache = new HashMap<String, Class<?>>();
private Map<String, URL> resourceCache = new HashMap<String, URL>();
private Map<String, Enumeration<URL>> resourceListCache = new HashMap<String, Enumeration<URL>>();
/**
* Load the class and break on first found match.
@ -128,16 +131,15 @@ public class OsgiClassLoader extends ClassLoader {
/**
* Load the class and break on first found match.
*
* Note: Since they're Enumerations, do not cache these results!
*
* TODO: Should this throw a different exception or warn if multiple
* classes were found? Naming collisions can and do happen in OSGi...
*/
@Override
@SuppressWarnings("unchecked")
protected Enumeration<URL> findResources(String name) {
if ( resourceListCache.containsKey( name ) ) {
return resourceListCache.get( name );
}
final List<Enumeration<URL>> enumerations = new ArrayList<Enumeration<URL>>();
for ( Bundle bundle : bundles ) {
@ -184,8 +186,6 @@ public class OsgiClassLoader extends ClassLoader {
}
};
resourceListCache.put( name, aggEnumeration );
return aggEnumeration;
}
@ -213,7 +213,6 @@ public class OsgiClassLoader extends ClassLoader {
public void clear() {
classCache.clear();
resourceCache.clear();
resourceListCache.clear();
}
}

View File

@ -90,7 +90,7 @@ public class OsgiPersistenceProvider extends HibernatePersistenceProvider {
osgiClassLoader.addBundle( requestingBundle );
return super.createEntityManagerFactory( persistenceUnitName, properties );
return super.createEntityManagerFactory( persistenceUnitName, settings );
}
@Override
@ -106,7 +106,7 @@ public class OsgiPersistenceProvider extends HibernatePersistenceProvider {
osgiClassLoader.addClassLoader( info.getClassLoader() );
return super.createContainerEntityManagerFactory( info, properties );
return super.createContainerEntityManagerFactory( info, settings );
}
@SuppressWarnings("unchecked")