HHH-10669 - Allow to add SF-scoped services through a ServiceContributor
This commit is contained in:
parent
60dd63536e
commit
5e30247c6f
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.service.internal;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.boot.spi.SessionFactoryOptions;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.service.Service;
|
||||
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||
import org.hibernate.service.spi.SessionFactoryServiceInitiator;
|
||||
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
|
||||
import org.hibernate.service.spi.SessionFactoryServiceRegistryBuilder;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class SessionFactoryServiceRegistryBuilderImpl implements SessionFactoryServiceRegistryBuilder {
|
||||
private final ServiceRegistryImplementor parent;
|
||||
|
||||
private final List<SessionFactoryServiceInitiator> initiators = standardInitiatorList();
|
||||
private final List<ProvidedService> providedServices = new ArrayList<>();
|
||||
|
||||
public SessionFactoryServiceRegistryBuilderImpl(ServiceRegistryImplementor parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used from the {@link #initiators} variable initializer
|
||||
*
|
||||
* @return List of standard initiators
|
||||
*/
|
||||
private static List<SessionFactoryServiceInitiator> standardInitiatorList() {
|
||||
final List<SessionFactoryServiceInitiator> initiators = new ArrayList<>();
|
||||
initiators.addAll( StandardSessionFactoryServiceInitiators.LIST );
|
||||
return initiators;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a service initiator.
|
||||
*
|
||||
* @param initiator The initiator to be added
|
||||
*
|
||||
* @return this, for method chaining
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings( {"UnusedDeclaration"})
|
||||
public SessionFactoryServiceRegistryBuilder addInitiator(SessionFactoryServiceInitiator initiator) {
|
||||
initiators.add( initiator );
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a user-provided service.
|
||||
*
|
||||
* @param serviceRole The role of the service being added
|
||||
* @param service The service implementation
|
||||
*
|
||||
* @return this, for method chaining
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
public SessionFactoryServiceRegistryBuilder addService(final Class serviceRole, final Service service) {
|
||||
providedServices.add( new ProvidedService( serviceRole, service ) );
|
||||
return this;
|
||||
}
|
||||
|
||||
public SessionFactoryServiceRegistry buildSessionFactoryServiceRegistry(
|
||||
SessionFactoryImplementor sessionFactory,
|
||||
SessionFactoryOptions options) {
|
||||
return new SessionFactoryServiceRegistryImpl(
|
||||
parent,
|
||||
initiators,
|
||||
providedServices,
|
||||
sessionFactory,
|
||||
options
|
||||
);
|
||||
}
|
||||
}
|
|
@ -6,9 +6,12 @@
|
|||
*/
|
||||
package org.hibernate.service.internal;
|
||||
|
||||
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
|
||||
import org.hibernate.boot.spi.SessionFactoryOptions;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||
import org.hibernate.service.spi.SessionFactoryServiceContributor;
|
||||
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
|
||||
import org.hibernate.service.spi.SessionFactoryServiceRegistryFactory;
|
||||
|
||||
/**
|
||||
|
@ -25,9 +28,16 @@ public class SessionFactoryServiceRegistryFactoryImpl implements SessionFactoryS
|
|||
}
|
||||
|
||||
@Override
|
||||
public SessionFactoryServiceRegistryImpl buildServiceRegistry(
|
||||
public SessionFactoryServiceRegistry buildServiceRegistry(
|
||||
SessionFactoryImplementor sessionFactory,
|
||||
SessionFactoryOptions options) {
|
||||
return new SessionFactoryServiceRegistryImpl( theBasicServiceRegistry, sessionFactory, options );
|
||||
final ClassLoaderService cls = options.getServiceRegistry().getService( ClassLoaderService.class );
|
||||
final SessionFactoryServiceRegistryBuilderImpl builder = new SessionFactoryServiceRegistryBuilderImpl( theBasicServiceRegistry );
|
||||
|
||||
for ( SessionFactoryServiceContributor contributor : cls.loadJavaServices( SessionFactoryServiceContributor.class ) ) {
|
||||
contributor.contribute( builder );
|
||||
}
|
||||
|
||||
return builder.buildSessionFactoryServiceRegistry( sessionFactory, options );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
*/
|
||||
package org.hibernate.service.internal;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.boot.spi.SessionFactoryOptions;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.service.Service;
|
||||
|
@ -26,6 +28,8 @@ public class SessionFactoryServiceRegistryImpl extends AbstractServiceRegistryIm
|
|||
@SuppressWarnings( {"unchecked"})
|
||||
public SessionFactoryServiceRegistryImpl(
|
||||
ServiceRegistryImplementor parent,
|
||||
List<SessionFactoryServiceInitiator> initiators,
|
||||
List<ProvidedService> providedServices,
|
||||
SessionFactoryImplementor sessionFactory,
|
||||
SessionFactoryOptions sessionFactoryOptions) {
|
||||
super( parent );
|
||||
|
@ -34,10 +38,15 @@ public class SessionFactoryServiceRegistryImpl extends AbstractServiceRegistryIm
|
|||
this.sessionFactoryOptions = sessionFactoryOptions;
|
||||
|
||||
// for now, just use the standard initiator list
|
||||
for ( SessionFactoryServiceInitiator initiator : StandardSessionFactoryServiceInitiators.LIST ) {
|
||||
for ( SessionFactoryServiceInitiator initiator : initiators ) {
|
||||
// create the bindings up front to help identify to which registry services belong
|
||||
createServiceBinding( initiator );
|
||||
}
|
||||
|
||||
for ( ProvidedService providedService : providedServices ) {
|
||||
createServiceBinding( providedService );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -26,7 +26,7 @@ public class StandardSessionFactoryServiceInitiators {
|
|||
public static List<SessionFactoryServiceInitiator> LIST = buildStandardServiceInitiatorList();
|
||||
|
||||
private static List<SessionFactoryServiceInitiator> buildStandardServiceInitiatorList() {
|
||||
final List<SessionFactoryServiceInitiator> serviceInitiators = new ArrayList<SessionFactoryServiceInitiator>();
|
||||
final List<SessionFactoryServiceInitiator> serviceInitiators = new ArrayList<>();
|
||||
|
||||
serviceInitiators.add( EventListenerServiceInitiator.INSTANCE );
|
||||
serviceInitiators.add( StatisticsInitiator.INSTANCE );
|
||||
|
|
|
@ -19,5 +19,5 @@ public interface ServiceContributor {
|
|||
*
|
||||
* @param serviceRegistryBuilder The builder to which services (or initiators) should be contributed.
|
||||
*/
|
||||
public void contribute(StandardServiceRegistryBuilder serviceRegistryBuilder);
|
||||
void contribute(StandardServiceRegistryBuilder serviceRegistryBuilder);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.service.spi;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface SessionFactoryServiceContributor {
|
||||
/**
|
||||
* Contribute services to the indicated registry builder.
|
||||
*
|
||||
* @param serviceRegistryBuilder The builder to which services (or initiators) should be contributed.
|
||||
*/
|
||||
void contribute(SessionFactoryServiceRegistryBuilder serviceRegistryBuilder);
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.service.spi;
|
||||
|
||||
import org.hibernate.service.Service;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public interface SessionFactoryServiceRegistryBuilder {
|
||||
SessionFactoryServiceRegistryBuilder addInitiator(SessionFactoryServiceInitiator initiator);
|
||||
|
||||
@SuppressWarnings( {"unchecked"})
|
||||
SessionFactoryServiceRegistryBuilder addService(Class serviceRole, Service service);
|
||||
}
|
|
@ -9,7 +9,6 @@ package org.hibernate.service.spi;
|
|||
import org.hibernate.boot.spi.SessionFactoryOptions;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.service.Service;
|
||||
import org.hibernate.service.internal.SessionFactoryServiceRegistryImpl;
|
||||
|
||||
/**
|
||||
* Contract for builder of {@link SessionFactoryServiceRegistry} instances.
|
||||
|
@ -29,7 +28,7 @@ public interface SessionFactoryServiceRegistryFactory extends Service {
|
|||
*
|
||||
* @return The registry
|
||||
*/
|
||||
public SessionFactoryServiceRegistryImpl buildServiceRegistry(
|
||||
SessionFactoryServiceRegistry buildServiceRegistry(
|
||||
SessionFactoryImplementor sessionFactory,
|
||||
SessionFactoryOptions sessionFactoryOptions);
|
||||
|
||||
|
|
Loading…
Reference in New Issue