diff --git a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java index 692fdf1eaa..6a73acca0a 100644 --- a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java +++ b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptor.java @@ -20,9 +20,12 @@ */ package org.hibernate.osgi; +import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import javax.persistence.PersistenceException; + import org.hibernate.internal.CoreMessageLogger; import org.hibernate.jpa.boot.archive.spi.ArchiveContext; import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; @@ -55,50 +58,63 @@ public class OsgiArchiveDescriptor implements ArchiveDescriptor { public void visitArchive(ArchiveContext context) { Collection resources = bundleWiring.listResources( "/", "*", BundleWiring.LISTRESOURCES_RECURSE ); for ( final String resource : resources ) { - try { - final InputStream inputStream = persistenceBundle.getResource( resource ).openStream(); - - // TODO: Is using resource as the names correct? - - final InputStreamAccess inputStreamAccess = new InputStreamAccess() { - @Override - public String getStreamName() { - return resource; - } - - @Override - public InputStream accessInputStream() { - return inputStream; - } - - @Override - public NamedInputStream asNamedInputStream() { - return new NamedInputStream( resource, inputStream ); - } + // TODO: Is there a better way to check this? Karaf is including + // directories. + if ( !resource.endsWith( "/" ) ) { + try { + // TODO: Is using resource as the names correct? - }; - - final ArchiveEntry entry = new ArchiveEntry() { - @Override - public String getName() { - return resource; - } - - @Override - public String getNameWithinArchive() { - return resource; - } - - @Override - public InputStreamAccess getStreamAccess() { - return inputStreamAccess; - } - }; - - context.obtainArchiveEntryHandler( entry ).handleEntry( entry, context ); - } - catch ( Exception e ) { - LOG.unableToLoadScannedClassOrResource( e ); + final InputStreamAccess inputStreamAccess = new InputStreamAccess() { + @Override + public String getStreamName() { + return resource; + } + + @Override + public InputStream accessInputStream() { + return openInputStream(); + } + + @Override + public NamedInputStream asNamedInputStream() { + return new NamedInputStream( resource, openInputStream() ); + } + + private InputStream openInputStream() { + try { + return persistenceBundle.getResource( resource ).openStream(); + } + catch ( IOException e ) { + throw new PersistenceException( + "Unable to open an InputStream on the OSGi Bundle resource!", + e ); + } + } + + }; + + final ArchiveEntry entry = new ArchiveEntry() { + @Override + public String getName() { + return resource; + } + + @Override + public String getNameWithinArchive() { + return resource; + } + + @Override + public InputStreamAccess getStreamAccess() { + return inputStreamAccess; + } + }; + + context.obtainArchiveEntryHandler( entry ).handleEntry( entry, context ); + } + catch ( Exception e ) { + LOG.unableToLoadScannedClassOrResource( e ); + } } } } diff --git a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java index bf10ef12bf..97264cf5b4 100644 --- a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java +++ b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiArchiveDescriptorFactory.java @@ -22,15 +22,15 @@ package org.hibernate.osgi; import java.net.URL; -import org.hibernate.jpa.boot.archive.internal.StandardArchiveDescriptorFactory; import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptor; +import org.hibernate.jpa.boot.archive.spi.ArchiveDescriptorFactory; import org.osgi.framework.Bundle; /** * @author Brett Meyer * @author Tim Ward */ -public class OsgiArchiveDescriptorFactory extends StandardArchiveDescriptorFactory { +public class OsgiArchiveDescriptorFactory implements ArchiveDescriptorFactory { private Bundle persistenceBundle; @@ -38,12 +38,25 @@ public class OsgiArchiveDescriptorFactory extends StandardArchiveDescriptorFacto this.persistenceBundle = persistenceBundle; } + @Override + public ArchiveDescriptor buildArchiveDescriptor(URL url) { + return buildArchiveDescriptor( url, "" ); + } + @Override public ArchiveDescriptor buildArchiveDescriptor(URL url, String entry) { - final String protocol = url.getProtocol(); - if ( "bundle".equals( protocol ) ) { - return new OsgiArchiveDescriptor( persistenceBundle ); - } - return super.buildArchiveDescriptor( url, entry ); + return new OsgiArchiveDescriptor( persistenceBundle ); + } + + @Override + public URL getJarURLFromURLEntry(URL url, String entry) throws IllegalArgumentException { + // not used + return null; + } + + @Override + public URL getURLFromPath(String jarPath) { + // not used + return null; } } diff --git a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiPersistenceProvider.java b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiPersistenceProvider.java index dfe4b26954..2f07e75aee 100644 --- a/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiPersistenceProvider.java +++ b/hibernate-osgi/src/main/java/org/hibernate/osgi/OsgiPersistenceProvider.java @@ -64,7 +64,7 @@ public class OsgiPersistenceProvider extends HibernatePersistenceProvider { } properties.put( AvailableSettings.JTA_PLATFORM, osgiJtaPlatform ); // TODO: This needs tested. - properties.put( org.hibernate.ejb.AvailableSettings.SCANNER, + properties.put( org.hibernate.jpa.AvailableSettings.SCANNER, new OsgiScanner( requestingBundle ) ); osgiClassLoader.addBundle( requestingBundle ); @@ -79,7 +79,7 @@ public class OsgiPersistenceProvider extends HibernatePersistenceProvider { } properties.put( AvailableSettings.JTA_PLATFORM, osgiJtaPlatform ); // OSGi ClassLoaders must implement BundleReference - properties.put( org.hibernate.ejb.AvailableSettings.SCANNER, + properties.put( org.hibernate.jpa.AvailableSettings.SCANNER, new OsgiScanner( ( (BundleReference) info.getClassLoader() ).getBundle() ) ); osgiClassLoader.addClassLoader( info.getClassLoader() );