Skip to content

Commit

Permalink
HHH-10669 - Allow to add SF-scoped services through a ServiceContributor
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed May 6, 2016
1 parent 60dd635 commit 5e30247
Show file tree
Hide file tree
Showing 8 changed files with 147 additions and 7 deletions.
@@ -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
);
}
}
Expand Up @@ -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;

/**
Expand All @@ -25,9 +28,16 @@ public SessionFactoryServiceRegistryFactoryImpl(ServiceRegistryImplementor theBa
}

@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 );
}
}
Expand Up @@ -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;
Expand All @@ -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 );
Expand All @@ -34,10 +38,15 @@ public SessionFactoryServiceRegistryImpl(
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
Expand Down
Expand Up @@ -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 );
Expand Down
Expand Up @@ -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);
}
Expand Up @@ -9,7 +9,6 @@
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.
Expand All @@ -29,7 +28,7 @@ public interface SessionFactoryServiceRegistryFactory extends Service {
*
* @return The registry
*/
public SessionFactoryServiceRegistryImpl buildServiceRegistry(
SessionFactoryServiceRegistry buildServiceRegistry(
SessionFactoryImplementor sessionFactory,
SessionFactoryOptions sessionFactoryOptions);

Expand Down

0 comments on commit 5e30247

Please sign in to comment.