HHH-7527 Enterprise OSGi JPA support
This commit is contained in:
parent
18f0bd2f4a
commit
56867417e2
57
build.gradle
57
build.gradle
|
@ -68,6 +68,8 @@ subprojects { subProject ->
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
apply plugin: 'maven' // for install task as well as deploy dependencies
|
apply plugin: 'maven' // for install task as well as deploy dependencies
|
||||||
apply plugin: 'uploadAuth'
|
apply plugin: 'uploadAuth'
|
||||||
|
apply plugin: 'osgi'
|
||||||
|
apply from: "../utilities.gradle"
|
||||||
|
|
||||||
configurations {
|
configurations {
|
||||||
provided {
|
provided {
|
||||||
|
@ -169,13 +171,54 @@ subprojects { subProject ->
|
||||||
compileJava.options.define(compilerArgs: ["-proc:none", "-encoding", "UTF-8"])
|
compileJava.options.define(compilerArgs: ["-proc:none", "-encoding", "UTF-8"])
|
||||||
compileTestJava.options.define(compilerArgs: ["-proc:none", "-encoding", "UTF-8"])
|
compileTestJava.options.define(compilerArgs: ["-proc:none", "-encoding", "UTF-8"])
|
||||||
|
|
||||||
manifest.mainAttributes(
|
jar {
|
||||||
provider: 'gradle',
|
Set<String> exportPackages = new HashSet<String>()
|
||||||
'Implementation-Url': 'http://hibernate.org',
|
Set<String> privatePackages = new HashSet<String>()
|
||||||
'Implementation-Version': version,
|
|
||||||
'Implementation-Vendor': 'Hibernate.org',
|
// TODO: Could more of this be pulled into utilities.gradle?
|
||||||
'Implementation-Vendor-Id': 'org.hibernate'
|
sourceSets.each { SourceSet sourceSet ->
|
||||||
)
|
// skip certain source sets
|
||||||
|
if ( ! ['test','matrix'].contains( sourceSet.name ) ) {
|
||||||
|
sourceSet.java.each { javaFile ->
|
||||||
|
// - org.hibernate.boot.registry.classloading.internal
|
||||||
|
// until EntityManagerFactoryBuilderImpl no longer imports ClassLoaderServiceImpl
|
||||||
|
// - .util for external module use (especially envers)
|
||||||
|
final String[] temporaryExports = [
|
||||||
|
'org.hibernate.boot.registry.classloading.internal',
|
||||||
|
'org.hibernate.internal.util' ]
|
||||||
|
|
||||||
|
final String packageName = determinePackageName( sourceSet.java, javaFile );
|
||||||
|
if ( ! temporaryExports.contains( packageName )
|
||||||
|
&& ( packageName.endsWith( ".internal" )
|
||||||
|
|| packageName.contains( ".internal." )
|
||||||
|
|| packageName.endsWith( ".test" )
|
||||||
|
|| packageName.contains( ".test." ) ) ) {
|
||||||
|
privatePackages.add( packageName );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
exportPackages.add( packageName );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
manifest = osgiManifest {
|
||||||
|
// GRADLE-1411: Even if we override Imports and Exports
|
||||||
|
// auto-generation with instructions, classesDir and classpath
|
||||||
|
// need to be here (temporarily).
|
||||||
|
classesDir = sourceSets.main.output.classesDir
|
||||||
|
classpath = configurations.runtime
|
||||||
|
|
||||||
|
instruction 'Export-Package', exportPackages.toArray(new String[0])
|
||||||
|
instruction 'Private-Package', privatePackages.toArray(new String[0])
|
||||||
|
instruction 'Bundle-Vendor', 'Hibernate.org'
|
||||||
|
|
||||||
|
instruction 'Implementation-Url', 'http://hibernate.org'
|
||||||
|
instruction 'Implementation-Version', version
|
||||||
|
instruction 'Implementation-Vendor', 'Hibernate.org'
|
||||||
|
instruction 'Implementation-Vendor-Id', 'org.hibernate'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
test {
|
test {
|
||||||
systemProperties['hibernate.test.validatefailureexpected'] = true
|
systemProperties['hibernate.test.validatefailureexpected'] = true
|
||||||
|
|
|
@ -9,3 +9,10 @@ dependencies {
|
||||||
}
|
}
|
||||||
testCompile project( ':hibernate-testing' )
|
testCompile project( ':hibernate-testing' )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM C3P0'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.c3p0'
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,6 +37,19 @@ manifest.mainAttributes(
|
||||||
'Main-Class': 'org.hibernate.Version'
|
'Main-Class': 'org.hibernate.Version'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM Core'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.core'
|
||||||
|
|
||||||
|
// TODO: Uncomment once EntityManagerFactoryBuilderImpl no longer
|
||||||
|
// uses ClassLoaderServiceImpl.
|
||||||
|
instruction 'Export-Package',
|
||||||
|
'org.hibernate.boot.registry.classloading.internal',
|
||||||
|
'*'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sourceSets.main {
|
sourceSets.main {
|
||||||
ext.jaxbTargetDir = file( "${buildDir}/generated-src/jaxb/main" )
|
ext.jaxbTargetDir = file( "${buildDir}/generated-src/jaxb/main" )
|
||||||
java.srcDir jaxbTargetDir
|
java.srcDir jaxbTargetDir
|
||||||
|
|
|
@ -33,12 +33,14 @@ import org.hibernate.boot.registry.selector.AvailabilityAnnouncer;
|
||||||
import org.hibernate.integrator.internal.IntegratorServiceImpl;
|
import org.hibernate.integrator.internal.IntegratorServiceImpl;
|
||||||
import org.hibernate.integrator.spi.Integrator;
|
import org.hibernate.integrator.spi.Integrator;
|
||||||
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
|
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
|
||||||
|
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
||||||
import org.hibernate.boot.registry.selector.internal.StrategySelectorBuilder;
|
import org.hibernate.boot.registry.selector.internal.StrategySelectorBuilder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builder for bootstrap {@link org.hibernate.service.ServiceRegistry} instances.
|
* Builder for bootstrap {@link org.hibernate.service.ServiceRegistry} instances.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
* @author Brett Meyer
|
||||||
*
|
*
|
||||||
* @see BootstrapServiceRegistryImpl
|
* @see BootstrapServiceRegistryImpl
|
||||||
* @see StandardServiceRegistryBuilder#StandardServiceRegistryBuilder(org.hibernate.boot.registry.BootstrapServiceRegistry)
|
* @see StandardServiceRegistryBuilder#StandardServiceRegistryBuilder(org.hibernate.boot.registry.BootstrapServiceRegistry)
|
||||||
|
@ -46,9 +48,11 @@ import org.hibernate.boot.registry.selector.internal.StrategySelectorBuilder;
|
||||||
public class BootstrapServiceRegistryBuilder {
|
public class BootstrapServiceRegistryBuilder {
|
||||||
private final LinkedHashSet<Integrator> providedIntegrators = new LinkedHashSet<Integrator>();
|
private final LinkedHashSet<Integrator> providedIntegrators = new LinkedHashSet<Integrator>();
|
||||||
private List<ClassLoader> providedClassLoaders;
|
private List<ClassLoader> providedClassLoaders;
|
||||||
|
private ClassLoaderService providedClassLoaderService;
|
||||||
private StrategySelectorBuilder strategySelectorBuilder = new StrategySelectorBuilder();
|
private StrategySelectorBuilder strategySelectorBuilder = new StrategySelectorBuilder();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an {@link Integrator} to be applied to the bootstrap registry.
|
* Add an {@link Integrator} to be applied to the bootstrap registry.
|
||||||
*
|
*
|
||||||
|
@ -75,6 +79,18 @@ public class BootstrapServiceRegistryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a provided {@link ClassLoaderService} for use in class-loading and resource-lookup
|
||||||
|
*
|
||||||
|
* @param classLoader The class loader to use
|
||||||
|
*
|
||||||
|
* @return {@code this}, for method chaining
|
||||||
|
*/
|
||||||
|
public BootstrapServiceRegistryBuilder with(ClassLoaderService classLoaderService) {
|
||||||
|
providedClassLoaderService = classLoaderService;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies the specified {@link ClassLoader} as the application class loader for the bootstrap registry
|
* Applies the specified {@link ClassLoader} as the application class loader for the bootstrap registry
|
||||||
*
|
*
|
||||||
|
@ -171,7 +187,12 @@ public class BootstrapServiceRegistryBuilder {
|
||||||
* @return The built bootstrap registry
|
* @return The built bootstrap registry
|
||||||
*/
|
*/
|
||||||
public BootstrapServiceRegistry build() {
|
public BootstrapServiceRegistry build() {
|
||||||
final ClassLoaderServiceImpl classLoaderService = new ClassLoaderServiceImpl( providedClassLoaders );
|
final ClassLoaderService classLoaderService;
|
||||||
|
if ( providedClassLoaderService == null ) {
|
||||||
|
classLoaderService = new ClassLoaderServiceImpl( providedClassLoaders );
|
||||||
|
} else {
|
||||||
|
classLoaderService = providedClassLoaderService;
|
||||||
|
}
|
||||||
|
|
||||||
final IntegratorServiceImpl integratorService = new IntegratorServiceImpl(
|
final IntegratorServiceImpl integratorService = new IntegratorServiceImpl(
|
||||||
providedIntegrators,
|
providedIntegrators,
|
||||||
|
|
|
@ -26,9 +26,7 @@ package org.hibernate.boot.registry.selector.internal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
||||||
|
|
||||||
import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl;
|
|
||||||
import org.hibernate.boot.registry.selector.Availability;
|
import org.hibernate.boot.registry.selector.Availability;
|
||||||
import org.hibernate.boot.registry.selector.AvailabilityAnnouncer;
|
import org.hibernate.boot.registry.selector.AvailabilityAnnouncer;
|
||||||
import org.hibernate.boot.registry.selector.SimpleAvailabilityImpl;
|
import org.hibernate.boot.registry.selector.SimpleAvailabilityImpl;
|
||||||
|
@ -97,6 +95,7 @@ import org.hibernate.engine.transaction.spi.TransactionFactory;
|
||||||
import org.hibernate.hql.spi.MultiTableBulkIdStrategy;
|
import org.hibernate.hql.spi.MultiTableBulkIdStrategy;
|
||||||
import org.hibernate.hql.spi.PersistentTableBulkIdStrategy;
|
import org.hibernate.hql.spi.PersistentTableBulkIdStrategy;
|
||||||
import org.hibernate.hql.spi.TemporaryTableBulkIdStrategy;
|
import org.hibernate.hql.spi.TemporaryTableBulkIdStrategy;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
@ -127,7 +126,7 @@ public class StrategySelectorBuilder {
|
||||||
explicitAvailabilities.add( availability );
|
explicitAvailabilities.add( availability );
|
||||||
}
|
}
|
||||||
|
|
||||||
public StrategySelector buildSelector(ClassLoaderServiceImpl classLoaderService) {
|
public StrategySelector buildSelector(ClassLoaderService classLoaderService) {
|
||||||
StrategySelectorImpl strategySelector = new StrategySelectorImpl( classLoaderService );
|
StrategySelectorImpl strategySelector = new StrategySelectorImpl( classLoaderService );
|
||||||
|
|
||||||
// build the baseline...
|
// build the baseline...
|
||||||
|
|
|
@ -30,6 +30,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.CacheMode;
|
import org.hibernate.CacheMode;
|
||||||
|
import org.hibernate.Criteria;
|
||||||
import org.hibernate.FlushMode;
|
import org.hibernate.FlushMode;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.Interceptor;
|
import org.hibernate.Interceptor;
|
||||||
|
@ -170,11 +171,11 @@ public interface SessionImplementor extends Serializable, LobCreationContext {
|
||||||
/**
|
/**
|
||||||
* Execute a criteria query
|
* Execute a criteria query
|
||||||
*/
|
*/
|
||||||
public ScrollableResults scroll(CriteriaImpl criteria, ScrollMode scrollMode);
|
public ScrollableResults scroll(Criteria criteria, ScrollMode scrollMode);
|
||||||
/**
|
/**
|
||||||
* Execute a criteria query
|
* Execute a criteria query
|
||||||
*/
|
*/
|
||||||
public List list(CriteriaImpl criteria);
|
public List list(Criteria criteria);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a filter
|
* Execute a filter
|
||||||
|
|
|
@ -74,8 +74,6 @@ import org.hibernate.ScrollableResults;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.SessionBuilder;
|
import org.hibernate.SessionBuilder;
|
||||||
import org.hibernate.SessionException;
|
import org.hibernate.SessionException;
|
||||||
import org.hibernate.procedure.ProcedureCall;
|
|
||||||
import org.hibernate.engine.spi.SessionOwner;
|
|
||||||
import org.hibernate.SharedSessionBuilder;
|
import org.hibernate.SharedSessionBuilder;
|
||||||
import org.hibernate.SimpleNaturalIdLoadAccess;
|
import org.hibernate.SimpleNaturalIdLoadAccess;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
|
@ -100,6 +98,7 @@ import org.hibernate.engine.spi.NonFlushedChanges;
|
||||||
import org.hibernate.engine.spi.PersistenceContext;
|
import org.hibernate.engine.spi.PersistenceContext;
|
||||||
import org.hibernate.engine.spi.QueryParameters;
|
import org.hibernate.engine.spi.QueryParameters;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.engine.spi.SessionOwner;
|
||||||
import org.hibernate.engine.spi.Status;
|
import org.hibernate.engine.spi.Status;
|
||||||
import org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl;
|
import org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl;
|
||||||
import org.hibernate.engine.transaction.spi.TransactionCoordinator;
|
import org.hibernate.engine.transaction.spi.TransactionCoordinator;
|
||||||
|
@ -150,6 +149,7 @@ import org.hibernate.persister.collection.CollectionPersister;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.persister.entity.OuterJoinLoadable;
|
import org.hibernate.persister.entity.OuterJoinLoadable;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
|
import org.hibernate.procedure.ProcedureCall;
|
||||||
import org.hibernate.proxy.HibernateProxy;
|
import org.hibernate.proxy.HibernateProxy;
|
||||||
import org.hibernate.proxy.LazyInitializer;
|
import org.hibernate.proxy.LazyInitializer;
|
||||||
import org.hibernate.stat.SessionStatistics;
|
import org.hibernate.stat.SessionStatistics;
|
||||||
|
@ -1562,14 +1562,17 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
|
||||||
return new CriteriaImpl(entityName, this);
|
return new CriteriaImpl(entityName, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScrollableResults scroll(CriteriaImpl criteria, ScrollMode scrollMode) {
|
public ScrollableResults scroll(Criteria criteria, ScrollMode scrollMode) {
|
||||||
|
// TODO: Is this guaranteed to always be CriteriaImpl?
|
||||||
|
CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
|
||||||
|
|
||||||
errorIfClosed();
|
errorIfClosed();
|
||||||
checkTransactionSynchStatus();
|
checkTransactionSynchStatus();
|
||||||
String entityName = criteria.getEntityOrClassName();
|
String entityName = criteriaImpl.getEntityOrClassName();
|
||||||
CriteriaLoader loader = new CriteriaLoader(
|
CriteriaLoader loader = new CriteriaLoader(
|
||||||
getOuterJoinLoadable(entityName),
|
getOuterJoinLoadable(entityName),
|
||||||
factory,
|
factory,
|
||||||
criteria,
|
criteriaImpl,
|
||||||
entityName,
|
entityName,
|
||||||
getLoadQueryInfluencers()
|
getLoadQueryInfluencers()
|
||||||
);
|
);
|
||||||
|
@ -1583,8 +1586,11 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List list(CriteriaImpl criteria) throws HibernateException {
|
public List list(Criteria criteria) throws HibernateException {
|
||||||
final NaturalIdLoadAccess naturalIdLoadAccess = this.tryNaturalIdLoadAccess( criteria );
|
// TODO: Is this guaranteed to always be CriteriaImpl?
|
||||||
|
CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
|
||||||
|
|
||||||
|
final NaturalIdLoadAccess naturalIdLoadAccess = this.tryNaturalIdLoadAccess( criteriaImpl );
|
||||||
if ( naturalIdLoadAccess != null ) {
|
if ( naturalIdLoadAccess != null ) {
|
||||||
// EARLY EXIT!
|
// EARLY EXIT!
|
||||||
return Arrays.asList( naturalIdLoadAccess.load() );
|
return Arrays.asList( naturalIdLoadAccess.load() );
|
||||||
|
@ -1592,7 +1598,7 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
|
||||||
|
|
||||||
errorIfClosed();
|
errorIfClosed();
|
||||||
checkTransactionSynchStatus();
|
checkTransactionSynchStatus();
|
||||||
String[] implementors = factory.getImplementors( criteria.getEntityOrClassName() );
|
String[] implementors = factory.getImplementors( criteriaImpl.getEntityOrClassName() );
|
||||||
int size = implementors.length;
|
int size = implementors.length;
|
||||||
|
|
||||||
CriteriaLoader[] loaders = new CriteriaLoader[size];
|
CriteriaLoader[] loaders = new CriteriaLoader[size];
|
||||||
|
@ -1602,7 +1608,7 @@ public final class SessionImpl extends AbstractSessionImpl implements EventSourc
|
||||||
loaders[i] = new CriteriaLoader(
|
loaders[i] = new CriteriaLoader(
|
||||||
getOuterJoinLoadable( implementors[i] ),
|
getOuterJoinLoadable( implementors[i] ),
|
||||||
factory,
|
factory,
|
||||||
criteria,
|
criteriaImpl,
|
||||||
implementors[i],
|
implementors[i],
|
||||||
getLoadQueryInfluencers()
|
getLoadQueryInfluencers()
|
||||||
);
|
);
|
||||||
|
|
|
@ -30,8 +30,6 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jboss.logging.Logger;
|
|
||||||
|
|
||||||
import org.hibernate.CacheMode;
|
import org.hibernate.CacheMode;
|
||||||
import org.hibernate.ConnectionReleaseMode;
|
import org.hibernate.ConnectionReleaseMode;
|
||||||
import org.hibernate.Criteria;
|
import org.hibernate.Criteria;
|
||||||
|
@ -73,6 +71,7 @@ import org.hibernate.persister.entity.OuterJoinLoadable;
|
||||||
import org.hibernate.pretty.MessageHelper;
|
import org.hibernate.pretty.MessageHelper;
|
||||||
import org.hibernate.proxy.HibernateProxy;
|
import org.hibernate.proxy.HibernateProxy;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
|
@ -618,13 +617,16 @@ public class StatelessSessionImpl extends AbstractSessionImpl implements Statele
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ScrollableResults scroll(CriteriaImpl criteria, ScrollMode scrollMode) {
|
public ScrollableResults scroll(Criteria criteria, ScrollMode scrollMode) {
|
||||||
|
// TODO: Is this guaranteed to always be CriteriaImpl?
|
||||||
|
CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
|
||||||
|
|
||||||
errorIfClosed();
|
errorIfClosed();
|
||||||
String entityName = criteria.getEntityOrClassName();
|
String entityName = criteriaImpl.getEntityOrClassName();
|
||||||
CriteriaLoader loader = new CriteriaLoader(
|
CriteriaLoader loader = new CriteriaLoader(
|
||||||
getOuterJoinLoadable( entityName ),
|
getOuterJoinLoadable( entityName ),
|
||||||
factory,
|
factory,
|
||||||
criteria,
|
criteriaImpl,
|
||||||
entityName,
|
entityName,
|
||||||
getLoadQueryInfluencers()
|
getLoadQueryInfluencers()
|
||||||
);
|
);
|
||||||
|
@ -633,9 +635,12 @@ public class StatelessSessionImpl extends AbstractSessionImpl implements Statele
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings( {"unchecked"})
|
@SuppressWarnings( {"unchecked"})
|
||||||
public List list(CriteriaImpl criteria) throws HibernateException {
|
public List list(Criteria criteria) throws HibernateException {
|
||||||
|
// TODO: Is this guaranteed to always be CriteriaImpl?
|
||||||
|
CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
|
||||||
|
|
||||||
errorIfClosed();
|
errorIfClosed();
|
||||||
String[] implementors = factory.getImplementors( criteria.getEntityOrClassName() );
|
String[] implementors = factory.getImplementors( criteriaImpl.getEntityOrClassName() );
|
||||||
int size = implementors.length;
|
int size = implementors.length;
|
||||||
|
|
||||||
CriteriaLoader[] loaders = new CriteriaLoader[size];
|
CriteriaLoader[] loaders = new CriteriaLoader[size];
|
||||||
|
@ -643,7 +648,7 @@ public class StatelessSessionImpl extends AbstractSessionImpl implements Statele
|
||||||
loaders[i] = new CriteriaLoader(
|
loaders[i] = new CriteriaLoader(
|
||||||
getOuterJoinLoadable( implementors[i] ),
|
getOuterJoinLoadable( implementors[i] ),
|
||||||
factory,
|
factory,
|
||||||
criteria,
|
criteriaImpl,
|
||||||
implementors[i],
|
implementors[i],
|
||||||
getLoadQueryInfluencers()
|
getLoadQueryInfluencers()
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,3 +4,10 @@ dependencies {
|
||||||
|
|
||||||
testCompile project( ':hibernate-testing' )
|
testCompile project( ':hibernate-testing' )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM EHCache'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.ehcache'
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,25 @@ dependencies {
|
||||||
testRuntime( "org.jboss.ejb3:jboss-ejb3-api:3.1.0" )
|
testRuntime( "org.jboss.ejb3:jboss-ejb3-api:3.1.0" )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM JPA Entity Manager'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.entitymanager'
|
||||||
|
|
||||||
|
// A cdi-api OSGi bundle does not currently exist. For now, explicitly
|
||||||
|
// ignore its packages. This will only cause issues if an app tries
|
||||||
|
// to use the BeanManagerListenerFactory functionality.
|
||||||
|
// NOTE: The "!" negates the package, keeping it out of Import-Package
|
||||||
|
// and including it in Ignore-Package. Also note that '*' does not mean
|
||||||
|
// <Import-Package>*</ImportPackage> will occur. This is simply a
|
||||||
|
// BND instruction -- the auto-discovery of imported packages still
|
||||||
|
// occurs.
|
||||||
|
instruction 'Import-Package',
|
||||||
|
'!javax.enterprise*',
|
||||||
|
'*'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// JPA model-gen set up
|
// JPA model-gen set up
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -23,15 +23,16 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa;
|
package org.hibernate.jpa;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.persistence.EntityManagerFactory;
|
import javax.persistence.EntityManagerFactory;
|
||||||
import javax.persistence.PersistenceException;
|
import javax.persistence.PersistenceException;
|
||||||
import javax.persistence.spi.LoadState;
|
import javax.persistence.spi.LoadState;
|
||||||
import javax.persistence.spi.PersistenceProvider;
|
import javax.persistence.spi.PersistenceProvider;
|
||||||
import javax.persistence.spi.PersistenceUnitInfo;
|
import javax.persistence.spi.PersistenceUnitInfo;
|
||||||
import javax.persistence.spi.ProviderUtil;
|
import javax.persistence.spi.ProviderUtil;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
|
import org.hibernate.jpa.boot.internal.ParsedPersistenceXmlDescriptor;
|
||||||
import org.hibernate.jpa.boot.internal.PersistenceXmlParser;
|
import org.hibernate.jpa.boot.internal.PersistenceXmlParser;
|
||||||
|
@ -45,6 +46,7 @@ import org.hibernate.jpa.internal.util.PersistenceUtilHelper;
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
* @author Brett Meyer
|
||||||
*/
|
*/
|
||||||
public class HibernatePersistenceProvider implements PersistenceProvider {
|
public class HibernatePersistenceProvider implements PersistenceProvider {
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,8 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
|
|
||||||
private static EntityNotFoundDelegate jpaEntityNotFoundDelegate = new JpaEntityNotFoundDelegate();
|
private static EntityNotFoundDelegate jpaEntityNotFoundDelegate = new JpaEntityNotFoundDelegate();
|
||||||
|
|
||||||
|
private ClassLoader providedClassLoader;
|
||||||
|
|
||||||
private static class JpaEntityNotFoundDelegate implements EntityNotFoundDelegate, Serializable {
|
private static class JpaEntityNotFoundDelegate implements EntityNotFoundDelegate, Serializable {
|
||||||
public void handleEntityNotFound(String entityName, Serializable id) {
|
public void handleEntityNotFound(String entityName, Serializable id) {
|
||||||
throw new EntityNotFoundException( "Unable to find " + entityName + " with id " + id );
|
throw new EntityNotFoundException( "Unable to find " + entityName + " with id " + id );
|
||||||
|
@ -164,6 +166,14 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityManagerFactoryBuilderImpl(PersistenceUnitDescriptor persistenceUnit, Map integrationSettings) {
|
public EntityManagerFactoryBuilderImpl(PersistenceUnitDescriptor persistenceUnit, Map integrationSettings) {
|
||||||
|
this( persistenceUnit, integrationSettings, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityManagerFactoryBuilderImpl(
|
||||||
|
PersistenceUnitDescriptor persistenceUnit,
|
||||||
|
Map integrationSettings,
|
||||||
|
ClassLoader providedClassLoader ) {
|
||||||
|
|
||||||
LogHelper.logPersistenceUnitInformation( persistenceUnit );
|
LogHelper.logPersistenceUnitInformation( persistenceUnit );
|
||||||
|
|
||||||
this.persistenceUnit = persistenceUnit;
|
this.persistenceUnit = persistenceUnit;
|
||||||
|
@ -172,6 +182,8 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
integrationSettings = Collections.emptyMap();
|
integrationSettings = Collections.emptyMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.providedClassLoader = providedClassLoader;
|
||||||
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
// First we build the boot-strap service registry, which mainly handles class loader interactions
|
// First we build the boot-strap service registry, which mainly handles class loader interactions
|
||||||
final BootstrapServiceRegistry bootstrapServiceRegistry = buildBootstrapServiceRegistry( integrationSettings );
|
final BootstrapServiceRegistry bootstrapServiceRegistry = buildBootstrapServiceRegistry( integrationSettings );
|
||||||
|
@ -346,14 +358,22 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassLoader classLoader = (ClassLoader) integrationSettings.get( org.hibernate.cfg.AvailableSettings.APP_CLASSLOADER );
|
// TODO: If providedClassLoader is present (OSGi, etc.) *and*
|
||||||
if ( classLoader != null ) {
|
// an APP_CLASSLOADER is provided, should throw an exception or
|
||||||
|
// warn?
|
||||||
|
ClassLoader classLoader;
|
||||||
|
ClassLoader appClassLoader = (ClassLoader) integrationSettings.get( org.hibernate.cfg.AvailableSettings.APP_CLASSLOADER );
|
||||||
|
if ( providedClassLoader != null ) {
|
||||||
|
classLoader = providedClassLoader;
|
||||||
|
}
|
||||||
|
else if ( appClassLoader != null ) {
|
||||||
|
classLoader = appClassLoader;
|
||||||
integrationSettings.remove( org.hibernate.cfg.AvailableSettings.APP_CLASSLOADER );
|
integrationSettings.remove( org.hibernate.cfg.AvailableSettings.APP_CLASSLOADER );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
classLoader = persistenceUnit.getClassLoader();
|
classLoader = persistenceUnit.getClassLoader();
|
||||||
}
|
}
|
||||||
bootstrapServiceRegistryBuilder.withApplicationClassLoader( classLoader );
|
bootstrapServiceRegistryBuilder.with( classLoader );
|
||||||
|
|
||||||
return bootstrapServiceRegistryBuilder.build();
|
return bootstrapServiceRegistryBuilder.build();
|
||||||
}
|
}
|
||||||
|
@ -664,6 +684,12 @@ public class EntityManagerFactoryBuilderImpl implements EntityManagerFactoryBuil
|
||||||
LOG.containerProvidingNullPersistenceUnitRootUrl();
|
LOG.containerProvidingNullPersistenceUnitRootUrl();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ( scanningContext.getUrl().getProtocol().equalsIgnoreCase( "bundle" ) ) {
|
||||||
|
// TODO: Is there a way to scan the root bundle URL in OSGi containers?
|
||||||
|
// Although the URL provides a stream handler that works for finding
|
||||||
|
// resources in a specific Bundle, the root one does not work.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ( scanningContext.isDetectClasses() ) {
|
if ( scanningContext.isDetectClasses() ) {
|
||||||
|
|
|
@ -23,9 +23,10 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.jpa.boot.spi;
|
package org.hibernate.jpa.boot.spi;
|
||||||
|
|
||||||
import javax.persistence.spi.PersistenceUnitInfo;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.persistence.spi.PersistenceUnitInfo;
|
||||||
|
|
||||||
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
|
||||||
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
|
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
|
||||||
* Entry into the bootstrap process.
|
* Entry into the bootstrap process.
|
||||||
*
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
|
* @author Brett Meyer
|
||||||
*/
|
*/
|
||||||
public final class Bootstrap {
|
public final class Bootstrap {
|
||||||
public static EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
|
public static EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
|
||||||
|
@ -40,10 +42,23 @@ public final class Bootstrap {
|
||||||
Map integration) {
|
Map integration) {
|
||||||
return new EntityManagerFactoryBuilderImpl( persistenceUnitDescriptor, integration );
|
return new EntityManagerFactoryBuilderImpl( persistenceUnitDescriptor, integration );
|
||||||
}
|
}
|
||||||
|
public static EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
|
||||||
|
PersistenceUnitDescriptor persistenceUnitDescriptor,
|
||||||
|
Map integration,
|
||||||
|
ClassLoader providedClassLoader) {
|
||||||
|
return new EntityManagerFactoryBuilderImpl( persistenceUnitDescriptor, integration, providedClassLoader );
|
||||||
|
}
|
||||||
|
|
||||||
public static EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
|
public static EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
|
||||||
PersistenceUnitInfo persistenceUnitInfo,
|
PersistenceUnitInfo persistenceUnitInfo,
|
||||||
Map integration) {
|
Map integration) {
|
||||||
return getEntityManagerFactoryBuilder( new PersistenceUnitInfoDescriptor( persistenceUnitInfo ), integration );
|
return getEntityManagerFactoryBuilder( new PersistenceUnitInfoDescriptor( persistenceUnitInfo ), integration );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static EntityManagerFactoryBuilder getEntityManagerFactoryBuilder(
|
||||||
|
PersistenceUnitInfo persistenceUnitInfo,
|
||||||
|
Map integration,
|
||||||
|
ClassLoader providedClassLoader) {
|
||||||
|
return getEntityManagerFactoryBuilder( new PersistenceUnitInfoDescriptor( persistenceUnitInfo ), integration, providedClassLoader );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,3 +48,9 @@ task generateJpaMetamodelClasses(type: Compile) {
|
||||||
}
|
}
|
||||||
compileJava.dependsOn generateJpaMetamodelClasses
|
compileJava.dependsOn generateJpaMetamodelClasses
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM Envers'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.envers'
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.hibernate.CacheMode;
|
import org.hibernate.CacheMode;
|
||||||
|
import org.hibernate.Criteria;
|
||||||
import org.hibernate.FlushMode;
|
import org.hibernate.FlushMode;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.Interceptor;
|
import org.hibernate.Interceptor;
|
||||||
|
@ -48,7 +49,6 @@ import org.hibernate.engine.spi.QueryParameters;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.engine.spi.SessionImplementor;
|
import org.hibernate.engine.spi.SessionImplementor;
|
||||||
import org.hibernate.engine.transaction.spi.TransactionCoordinator;
|
import org.hibernate.engine.transaction.spi.TransactionCoordinator;
|
||||||
import org.hibernate.internal.CriteriaImpl;
|
|
||||||
import org.hibernate.loader.custom.CustomQuery;
|
import org.hibernate.loader.custom.CustomQuery;
|
||||||
import org.hibernate.persister.entity.EntityPersister;
|
import org.hibernate.persister.entity.EntityPersister;
|
||||||
import org.hibernate.type.Type;
|
import org.hibernate.type.Type;
|
||||||
|
@ -160,12 +160,12 @@ public abstract class AbstractDelegateSessionImplementor implements SessionImple
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ScrollableResults scroll(CriteriaImpl criteria, ScrollMode scrollMode) {
|
public ScrollableResults scroll(Criteria criteria, ScrollMode scrollMode) {
|
||||||
return delegate.scroll(criteria, scrollMode);
|
return delegate.scroll(criteria, scrollMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List list(CriteriaImpl criteria) {
|
public List list(Criteria criteria) {
|
||||||
return delegate.list(criteria);
|
return delegate.list(criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,3 +40,10 @@ task sourcesTestJar(type: Jar, dependsOn:classes) {
|
||||||
|
|
||||||
artifacts.archives packageTests
|
artifacts.archives packageTests
|
||||||
artifacts.archives sourcesTestJar
|
artifacts.archives sourcesTestJar
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM Infinispan'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.infinispan'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
dependencies {
|
||||||
|
compile( project( ':hibernate-core' ) )
|
||||||
|
compile( project( ':hibernate-entitymanager' ) )
|
||||||
|
compile( "org.osgi:org.osgi.core:4.2.0" )
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Activator', 'org.hibernate.osgi.HibernateBundleActivator'
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM OSGi'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.osgi'
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.osgi;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManagerFactory;
|
||||||
|
import javax.persistence.spi.PersistenceProvider;
|
||||||
|
import javax.persistence.spi.PersistenceUnitInfo;
|
||||||
|
import javax.persistence.spi.PersistenceUnitTransactionType;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.jpa.HibernatePersistenceProvider;
|
||||||
|
import org.hibernate.jpa.boot.spi.Bootstrap;
|
||||||
|
import org.osgi.framework.Bundle;
|
||||||
|
import org.osgi.framework.BundleActivator;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
import org.osgi.framework.BundleEvent;
|
||||||
|
import org.osgi.framework.BundleListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Brett Meyer
|
||||||
|
* @author Martin Neimeier
|
||||||
|
*/
|
||||||
|
public class HibernateBundleActivator
|
||||||
|
extends HibernatePersistenceProvider
|
||||||
|
implements BundleActivator, /*ServiceListener,*/ BundleListener {
|
||||||
|
|
||||||
|
private BundleContext context;
|
||||||
|
|
||||||
|
private OsgiClassLoader osgiClassLoader;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(BundleContext context) throws Exception {
|
||||||
|
|
||||||
|
this.context = context;
|
||||||
|
|
||||||
|
// register this instance as a bundle listener to get informed about all
|
||||||
|
// bundle live cycle events
|
||||||
|
context.addBundleListener(this);
|
||||||
|
|
||||||
|
osgiClassLoader = new OsgiClassLoader();
|
||||||
|
|
||||||
|
for ( Bundle bundle : context.getBundles() ) {
|
||||||
|
handleBundleChange( bundle );
|
||||||
|
}
|
||||||
|
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.put( "javax.persistence.provider", HibernateBundleActivator.class.getName() );
|
||||||
|
context.registerService(
|
||||||
|
PersistenceProvider.class.getName(),
|
||||||
|
this,
|
||||||
|
properties
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop(BundleContext context) throws Exception {
|
||||||
|
context.removeBundleListener(this);
|
||||||
|
|
||||||
|
// Nothing else to do. When re-activated, this Activator will be
|
||||||
|
// re-started and the EMF re-created.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bundleChanged(BundleEvent event) {
|
||||||
|
handleBundleChange( event.getBundle() );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleBundleChange( Bundle bundle ) {
|
||||||
|
if ( bundle.getState() == Bundle.ACTIVE ) {
|
||||||
|
osgiClassLoader.registerBundle(bundle);
|
||||||
|
} else {
|
||||||
|
osgiClassLoader.unregisterBundle(bundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) {
|
||||||
|
if ( info.getTransactionType().equals( PersistenceUnitTransactionType.JTA ) ) {
|
||||||
|
map.put( AvailableSettings.JTA_PLATFORM, new OsgiJtaPlatform( context ) );
|
||||||
|
}
|
||||||
|
return Bootstrap.getEntityManagerFactoryBuilder( info, map, osgiClassLoader ).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,168 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.osgi;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.osgi.framework.Bundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom OSGI ClassLoader helper which knows all the "interesting" bundles and
|
||||||
|
* encapsulates the OSGi related capabilities.
|
||||||
|
*
|
||||||
|
* @author Brett Meyer
|
||||||
|
*/
|
||||||
|
public class OsgiClassLoader extends ClassLoader {
|
||||||
|
|
||||||
|
private HashMap<String, Bundle> bundles;
|
||||||
|
|
||||||
|
public OsgiClassLoader() {
|
||||||
|
bundles = new HashMap<String, Bundle>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the class and break on first found match.
|
||||||
|
* TODO: Should this throw a different exception or warn if multiple
|
||||||
|
* classes were found? Naming collisions can and do happen in OSGi...
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
@Override
|
||||||
|
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
||||||
|
// TODO: This is horrible -- we shouldn't iterate over all the
|
||||||
|
// classloaders every time we need to construct an entity, etc. Instead,
|
||||||
|
// keep references to all classes/resources found in active bundles
|
||||||
|
// in memory? Find a way to identify what we "care about" and keep
|
||||||
|
// only those? Discover them the first time and then cache the
|
||||||
|
// reference?
|
||||||
|
for ( Bundle bundle : bundles.values() ) {
|
||||||
|
try {
|
||||||
|
Class clazz = bundle.loadClass( name );
|
||||||
|
if ( clazz != null ) {
|
||||||
|
return clazz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( Exception ignore ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ClassNotFoundException( "Could not load requested class : " + name );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the class and break on first found match.
|
||||||
|
* TODO: Should this throw a different exception or warn if multiple
|
||||||
|
* classes were found? Naming collisions can and do happen in OSGi...
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected URL findResource(String name) {
|
||||||
|
// TODO: This is horrible -- we shouldn't iterate over all the
|
||||||
|
// classloaders every time we need to construct an entity, etc. Instead,
|
||||||
|
// keep references to all classes/resources found in active bundles
|
||||||
|
// in memory? Find a way to identify what we "care about" and keep
|
||||||
|
// only those? Discover them the first time and then cache the
|
||||||
|
// reference?
|
||||||
|
for ( Bundle bundle : bundles.values() ) {
|
||||||
|
try {
|
||||||
|
URL resource = bundle.getResource( name );
|
||||||
|
if ( resource != null ) {
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( Exception ignore ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Error?
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the class and break on first found match.
|
||||||
|
* TODO: Should this throw a different exception or warn if multiple
|
||||||
|
* classes were found? Naming collisions can and do happen in OSGi...
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
protected Enumeration<URL> findResources(String name) {
|
||||||
|
// TODO: This is horrible -- we shouldn't iterate over all the
|
||||||
|
// classloaders every time we need to construct an entity, etc. Instead,
|
||||||
|
// keep references to all classes/resources found in active bundles
|
||||||
|
// in memory? Find a way to identify what we "care about" and keep
|
||||||
|
// only those? Discover them the first time and then cache the
|
||||||
|
// reference?
|
||||||
|
for ( Bundle bundle : bundles.values() ) {
|
||||||
|
try {
|
||||||
|
Enumeration<URL> resources = bundle.getResources( name );
|
||||||
|
if ( resources != null ) {
|
||||||
|
return resources;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch ( Exception ignore ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Error?
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register the bundle with this class loader
|
||||||
|
*/
|
||||||
|
public void registerBundle(Bundle bundle) {
|
||||||
|
if ( bundle != null ) {
|
||||||
|
synchronized ( bundles ) {
|
||||||
|
// create a bundle classloader and add it to the list of
|
||||||
|
// classloaders
|
||||||
|
String key = getBundleKey( bundle );
|
||||||
|
if ( !bundles.containsKey( key ) ) {
|
||||||
|
bundles.put( key, bundle );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister the bundle from this class loader
|
||||||
|
*/
|
||||||
|
public void unregisterBundle(Bundle bundle) {
|
||||||
|
if ( bundle != null ) {
|
||||||
|
synchronized ( bundles ) {
|
||||||
|
// remove a bundle classloader for a given bundle
|
||||||
|
String key = getBundleKey( bundle );
|
||||||
|
if ( bundles.containsKey( key ) ) {
|
||||||
|
bundles.remove( key );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
bundles.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static String getBundleKey(Bundle bundle) {
|
||||||
|
return bundle.getSymbolicName() + " " + bundle.getVersion().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* JBoss, Home of Professional Open Source
|
||||||
|
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
|
||||||
|
* as indicated by the @authors tag. All rights reserved.
|
||||||
|
* See the copyright.txt in the distribution for a
|
||||||
|
* full listing of individual contributors.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use,
|
||||||
|
* modify, copy, or redistribute it subject to the terms and conditions
|
||||||
|
* of the GNU Lesser General Public License, v. 2.1.
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT A
|
||||||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License,
|
||||||
|
* v.2.1 along with this distribution; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
package org.hibernate.osgi;
|
||||||
|
|
||||||
|
import javax.transaction.Synchronization;
|
||||||
|
import javax.transaction.SystemException;
|
||||||
|
import javax.transaction.Transaction;
|
||||||
|
import javax.transaction.TransactionManager;
|
||||||
|
import javax.transaction.UserTransaction;
|
||||||
|
|
||||||
|
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
import org.osgi.framework.ServiceReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offers the JTA Platform provided by the OSGi container. The Enterprise
|
||||||
|
* OSGi spec requires all containers to register UserTransaction
|
||||||
|
* and TransactionManager OSGi services.
|
||||||
|
*
|
||||||
|
* @author Brett Meyer
|
||||||
|
*/
|
||||||
|
public class OsgiJtaPlatform implements JtaPlatform {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private BundleContext bundleContext;
|
||||||
|
|
||||||
|
public OsgiJtaPlatform(BundleContext bundleContext) {
|
||||||
|
this.bundleContext = bundleContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TransactionManager retrieveTransactionManager() {
|
||||||
|
ServiceReference sr = bundleContext.getServiceReference( TransactionManager.class.getName() );
|
||||||
|
return (TransactionManager) bundleContext.getService( sr );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UserTransaction retrieveUserTransaction() {
|
||||||
|
ServiceReference sr = bundleContext.getServiceReference( UserTransaction.class.getName() );
|
||||||
|
return (UserTransaction) bundleContext.getService( sr );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getTransactionIdentifier(Transaction transaction) {
|
||||||
|
// AbstractJtaPlatform just uses the transaction itself.
|
||||||
|
return transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canRegisterSynchronization() {
|
||||||
|
// TODO
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerSynchronization(Synchronization synchronization) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCurrentStatus() throws SystemException {
|
||||||
|
return retrieveTransactionManager().getStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,12 @@
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project( ':hibernate-core' )
|
compile project( ':hibernate-core' )
|
||||||
compile( libraries.proxool )
|
compile( libraries.proxool )
|
||||||
testCompile project( ':hibernate-testing' )
|
testCompile project( ':hibernate-testing' )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM Proxool'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.proxool'
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,3 +9,10 @@ dependencies {
|
||||||
transitive=false;
|
transitive=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
instruction 'Bundle-Description', 'Hibernate ORM Testing'
|
||||||
|
instruction 'Bundle-SymbolicName', 'org.hibernate.testing'
|
||||||
|
}
|
||||||
|
}
|
|
@ -57,7 +57,7 @@ ext {
|
||||||
jpa: 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Draft-10',
|
jpa: 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Draft-10',
|
||||||
jta: 'org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.0.Final',
|
jta: 'org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec:1.0.0.Final',
|
||||||
validation: 'javax.validation:validation-api:1.0.0.GA',
|
validation: 'javax.validation:validation-api:1.0.0.GA',
|
||||||
jacc: 'org.jboss.spec.javax.security.jacc:jboss-jacc-api_1.4_spec:1.0.0.Final',
|
jacc: 'org.jboss.spec.javax.security.jacc:jboss-jacc-api_1.4_spec:1.0.2.Final',
|
||||||
|
|
||||||
// logging
|
// logging
|
||||||
logging: 'org.jboss.logging:jboss-logging:3.1.0.GA',
|
logging: 'org.jboss.logging:jboss-logging:3.1.0.GA',
|
||||||
|
@ -102,7 +102,7 @@ ext {
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ c3p0
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ c3p0
|
||||||
c3p0: "c3p0:c3p0:0.9.1",
|
c3p0: "c3p0:c3p0:0.9.1",
|
||||||
ehcache: "net.sf.ehcache:ehcache-core:2.4.3",
|
ehcache: "net.sf.ehcache:ehcache-core:2.4.3",
|
||||||
proxool: "proxool:proxool:0.8.3",
|
proxool: "proxool:proxool:0.8.3"
|
||||||
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
apply plugin: 'base'
|
apply plugin: 'base'
|
||||||
apply plugin: 'idea'
|
apply plugin: 'idea'
|
||||||
|
apply from: "../utilities.gradle"
|
||||||
|
|
||||||
buildDir = "target"
|
buildDir = "target"
|
||||||
|
|
||||||
|
@ -83,21 +84,6 @@ task aggregateJavadocs(type: Javadoc) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String determinePackageName(SourceDirectorySet sourceDirectorySet, File javaFile) {
|
|
||||||
final javaFileAbsolutePath = javaFile.absolutePath;
|
|
||||||
for ( File sourceDirectory : sourceDirectorySet.srcDirs ) {
|
|
||||||
final String sourceDirectoryAbsolutePath = sourceDirectory.absolutePath;
|
|
||||||
if ( javaFileAbsolutePath.startsWith( sourceDirectoryAbsolutePath ) ) {
|
|
||||||
final String javaFileRelativePath = javaFileAbsolutePath.substring(
|
|
||||||
sourceDirectoryAbsolutePath.length() + 1,
|
|
||||||
javaFileAbsolutePath.lastIndexOf( File.separator )
|
|
||||||
);
|
|
||||||
return javaFileRelativePath.replace( File.separator, "." );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new RuntimeException( "ugh" );
|
|
||||||
}
|
|
||||||
|
|
||||||
aggregateJavadocs.doLast {
|
aggregateJavadocs.doLast {
|
||||||
copy {
|
copy {
|
||||||
from new File( projectDir, 'src/javadoc/images' )
|
from new File( projectDir, 'src/javadoc/images' )
|
||||||
|
|
|
@ -3,6 +3,8 @@ include 'hibernate-testing'
|
||||||
include 'hibernate-entitymanager'
|
include 'hibernate-entitymanager'
|
||||||
include 'hibernate-envers'
|
include 'hibernate-envers'
|
||||||
|
|
||||||
|
include 'hibernate-osgi'
|
||||||
|
|
||||||
include 'hibernate-c3p0'
|
include 'hibernate-c3p0'
|
||||||
include 'hibernate-proxool'
|
include 'hibernate-proxool'
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2012, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
apply plugin: UtilitiesPlugin
|
||||||
|
|
||||||
|
class UtilitiesPlugin implements Plugin {
|
||||||
|
def void apply(Object project) {
|
||||||
|
project.convention.plugins.utilities = new UtilitiesPluginDef()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UtilitiesPluginDef {
|
||||||
|
public String determinePackageName(SourceDirectorySet sourceDirectorySet, File javaFile) {
|
||||||
|
final javaFileAbsolutePath = javaFile.absolutePath;
|
||||||
|
for ( File sourceDirectory : sourceDirectorySet.srcDirs ) {
|
||||||
|
final String sourceDirectoryAbsolutePath = sourceDirectory.absolutePath;
|
||||||
|
if ( javaFileAbsolutePath.startsWith( sourceDirectoryAbsolutePath ) ) {
|
||||||
|
final String javaFileRelativePath = javaFileAbsolutePath.substring(
|
||||||
|
sourceDirectoryAbsolutePath.length() + 1,
|
||||||
|
javaFileAbsolutePath.lastIndexOf( File.separator )
|
||||||
|
);
|
||||||
|
return javaFileRelativePath.replace( File.separator, "." );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException( "ugh" );
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue