HHH-6237 - Remove Service proxy code

This commit is contained in:
Steve Ebersole 2011-05-19 17:29:21 -05:00
parent dcc3546378
commit 5385cc5cc0
17 changed files with 184 additions and 504 deletions

View File

@ -23,11 +23,8 @@
*/
package org.hibernate.service;
import org.hibernate.service.spi.BasicServiceInitiator;
/**
* @author Steve Ebersole
*/
public interface BasicServiceRegistry extends ServiceRegistry {
public void registerServiceInitiator(BasicServiceInitiator initiator);
}

View File

@ -31,32 +31,29 @@ import java.util.concurrent.ConcurrentHashMap;
import org.jboss.logging.Logger;
import org.hibernate.HibernateException;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.service.Service;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.internal.proxy.javassist.ServiceProxyFactoryFactoryImpl;
import org.hibernate.service.UnknownServiceException;
import org.hibernate.service.jmx.spi.JmxService;
import org.hibernate.service.spi.InjectService;
import org.hibernate.service.spi.Manageable;
import org.hibernate.service.spi.ServiceBinding;
import org.hibernate.service.spi.ServiceException;
import org.hibernate.service.spi.ServiceInitiator;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.Startable;
import org.hibernate.service.spi.Stoppable;
import org.hibernate.service.UnknownServiceException;
import org.hibernate.service.spi.proxy.ServiceProxyFactory;
/**
* @author Steve Ebersole
*/
public abstract class AbstractServiceRegistryImpl implements ServiceRegistryImplementor {
public abstract class AbstractServiceRegistryImpl implements ServiceRegistryImplementor, ServiceBinding.OwningRegistry {
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, AbstractServiceRegistryImpl.class.getName() );
private final ServiceRegistryImplementor parent;
// for now just hard-code the javassist factory
private ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactoryFactoryImpl().makeServiceProxyFactory( this );
private ConcurrentHashMap<Class,ServiceBinding> serviceBindingMap;
// IMPL NOTE : the list used for ordered destruction. Cannot used map above because we need to
// iterate it in reverse order which is only available through ListIterator
@ -73,6 +70,20 @@ public abstract class AbstractServiceRegistryImpl implements ServiceRegistryImpl
this.serviceList = CollectionHelper.arrayList( 20 );
}
@SuppressWarnings({ "unchecked" })
protected <R extends Service> void createServiceBinding(ServiceInitiator<R> initiator) {
serviceBindingMap.put( initiator.getServiceInitiated(), new ServiceBinding( this, initiator ) );
}
protected <R extends Service> void createServiceBinding(ProvidedService<R> providedService) {
ServiceBinding<R> binding = locateServiceBinding( providedService.getServiceRole(), false );
if ( binding == null ) {
binding = new ServiceBinding<R>( this, providedService.getServiceRole(), providedService.getService() );
serviceBindingMap.put( providedService.getServiceRole(), binding );
}
registerService( binding, providedService.getService() );
}
@Override
@SuppressWarnings( {"unchecked"})
public ServiceRegistry getParentServiceRegistry() {
@ -97,40 +108,33 @@ public abstract class AbstractServiceRegistryImpl implements ServiceRegistryImpl
@Override
public <R extends Service> R getService(Class<R> serviceRole) {
return locateOrCreateServiceBinding( serviceRole, true ).getProxy();
}
@SuppressWarnings({ "unchecked" })
protected <R extends Service> ServiceBinding<R> locateOrCreateServiceBinding(Class<R> serviceRole, boolean checkParent) {
ServiceBinding<R> serviceBinding = locateServiceBinding( serviceRole, checkParent );
final ServiceBinding<R> serviceBinding = locateServiceBinding( serviceRole );
if ( serviceBinding == null ) {
createServiceBinding( serviceRole );
throw new UnknownServiceException( serviceRole );
}
return serviceBinding;
R service = serviceBinding.getService();
if ( service == null ) {
service = initializeService( serviceBinding );
}
return service;
}
protected <R extends Service> ServiceBinding<R> createServiceBinding(Class<R> serviceRole) {
R proxy = serviceProxyFactory.makeProxy( serviceRole );
ServiceBinding<R> serviceBinding = new ServiceBinding<R>( proxy );
serviceBindingMap.put( serviceRole, serviceBinding );
return serviceBinding;
}
protected <R extends Service> void registerService(Class<R> serviceRole, R service) {
ServiceBinding<R> serviceBinding = locateOrCreateServiceBinding( serviceRole, false );
R priorServiceInstance = serviceBinding.getTarget();
serviceBinding.setTarget( service );
protected <R extends Service> void registerService(ServiceBinding<R> serviceBinding, R service) {
R priorServiceInstance = serviceBinding.getService();
serviceBinding.setService( service );
if ( priorServiceInstance != null ) {
serviceList.remove( priorServiceInstance );
}
serviceList.add( service );
}
private <R extends Service> R initializeService(Class<R> serviceRole) {
LOG.trace("Initializing service [role=" + serviceRole.getName() + "]");
private <R extends Service> R initializeService(ServiceBinding<R> serviceBinding) {
LOG.trace( "Initializing service [role=" + serviceBinding.getServiceRole().getName() + "]" );
// PHASE 1 : create service
R service = createService( serviceRole );
R service = createService( serviceBinding );
if ( service == null ) {
return null;
}
@ -139,12 +143,34 @@ public abstract class AbstractServiceRegistryImpl implements ServiceRegistryImpl
configureService( service );
// PHASE 3 : Start service
startService( service, serviceRole );
startService( serviceBinding );
return service;
}
protected abstract <T extends Service> T createService(Class<T> serviceRole);
@SuppressWarnings( {"unchecked"})
protected <R extends Service> R createService(ServiceBinding<R> serviceBinding) {
final ServiceInitiator<R> serviceInitiator = serviceBinding.getServiceInitiator();
if ( serviceInitiator == null ) {
// this condition should never ever occur
throw new UnknownServiceException( serviceBinding.getServiceRole() );
}
try {
R service = serviceBinding.getServiceRegistry().initiateService( serviceInitiator );
// IMPL NOTE : the register call here is important to avoid potential stack overflow issues
// from recursive calls through #configureService
registerService( serviceBinding, service );
return service;
}
catch ( ServiceException e ) {
throw e;
}
catch ( Exception e ) {
throw new ServiceException( "Unable to create requested service [" + serviceBinding.getServiceRole().getName() + "]", e );
}
}
protected abstract <T extends Service> void configureService(T service);
protected <T extends Service> void applyInjections(T service) {
@ -197,36 +223,19 @@ public abstract class AbstractServiceRegistryImpl implements ServiceRegistryImpl
}
@SuppressWarnings({ "unchecked" })
protected <T extends Service> void startService(T service, Class serviceRole) {
if ( Startable.class.isInstance( service ) ) {
( (Startable) service ).start();
protected <R extends Service> void startService(ServiceBinding<R> serviceBinding) {
if ( Startable.class.isInstance( serviceBinding.getService() ) ) {
( (Startable) serviceBinding.getService() ).start();
}
if ( Manageable.class.isInstance( service ) ) {
getService( JmxService.class ).registerService( (Manageable) service, serviceRole );
if ( Manageable.class.isInstance( serviceBinding.getService() ) ) {
getService( JmxService.class ).registerService(
(Manageable) serviceBinding.getService(),
serviceBinding.getServiceRole()
);
}
}
@Override
@SuppressWarnings( {"unchecked"})
public <R extends Service> R getServiceInternal(Class<R> serviceRole) {
// this call comes from the binding proxy, we most definitely do not want to look up into the parent
// in this case!
ServiceBinding<R> serviceBinding = locateServiceBinding( serviceRole, false );
if ( serviceBinding == null ) {
throw new HibernateException( "Only proxies should invoke #getServiceInternal" );
}
R service = serviceBinding.getTarget();
if ( service == null ) {
service = initializeService( serviceRole );
serviceBinding.setTarget( service );
}
if ( service == null ) {
throw new UnknownServiceException( serviceRole );
}
return service;
}
public void destroy() {
ListIterator<Service> serviceIterator = serviceList.listIterator( serviceList.size() );
while ( serviceIterator.hasPrevious() ) {

View File

@ -23,19 +23,14 @@
*/
package org.hibernate.service.internal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.logging.Logger;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.service.BasicServiceRegistry;
import org.hibernate.service.Service;
import org.hibernate.service.UnknownServiceException;
import org.hibernate.service.spi.BasicServiceInitiator;
import org.hibernate.service.spi.Configurable;
import org.hibernate.service.spi.ServiceException;
import org.hibernate.service.spi.ServiceInitiator;
import org.hibernate.service.spi.ServiceRegistryAwareService;
/**
@ -44,86 +39,33 @@ import org.hibernate.service.spi.ServiceRegistryAwareService;
* @author Steve Ebersole
*/
public class BasicServiceRegistryImpl extends AbstractServiceRegistryImpl implements BasicServiceRegistry {
private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, BasicServiceRegistryImpl.class.getName());
private final Map<Class,BasicServiceInitiator> serviceInitiatorMap;
private final Map configurationValues;
@SuppressWarnings( {"unchecked"})
public BasicServiceRegistryImpl(
List<BasicServiceInitiator> serviceInitiators,
List<ProvidedService> providedServices,
Map configurationValues) {
final List<BasicServiceInitiator> serviceInitiators,
final List<ProvidedService> providedServices,
final Map configurationValues) {
super();
this.configurationValues = configurationValues;
this.serviceInitiatorMap = toMap( serviceInitiators );
for ( BasicServiceInitiator initiator : serviceInitiatorMap.values() ) {
// create the bindings up front to help identify to which registry services belong
createServiceBinding( initiator.getServiceInitiated() );
// process initiators
for ( ServiceInitiator initiator : serviceInitiators ) {
createServiceBinding( initiator );
}
// then, explicitly provided service instances
for ( ProvidedService providedService : providedServices ) {
ServiceBinding binding = locateOrCreateServiceBinding( providedService.getServiceRole(), false );
binding.setTarget( providedService.getService() );
}
}
/**
* We convert the incoming list of initiators to a map for 2 reasons:<ul>
* <li>to make it easier to look up the initiator we need for a given service role</li>
* <li>to make sure there is only one initiator for a given service role (last wins)</li>
* </ul>
*
* @param serviceInitiators The list of individual initiators
*
* @return The map of initiators keyed by the service rle they initiate.
*/
private static Map<Class, BasicServiceInitiator> toMap(List<BasicServiceInitiator> serviceInitiators) {
final Map<Class, BasicServiceInitiator> result = new HashMap<Class, BasicServiceInitiator>();
for ( BasicServiceInitiator initiator : serviceInitiators ) {
result.put( initiator.getServiceInitiated(), initiator );
}
return result;
}
@Override
@SuppressWarnings( {"unchecked"})
public void registerServiceInitiator(BasicServiceInitiator initiator) {
ServiceBinding serviceBinding = locateServiceBinding( initiator.getServiceInitiated(), false );
if ( serviceBinding != null ) {
serviceBinding.setTarget( null );
}
else {
createServiceBinding( initiator.getServiceInitiated() );
}
final Object previous = serviceInitiatorMap.put( initiator.getServiceInitiated(), initiator );
if ( previous != null ) {
LOG.debugf( "Over-wrote existing service initiator [role=%s]", initiator.getServiceInitiated().getName() );
createServiceBinding( providedService );
}
}
@Override
@SuppressWarnings({ "unchecked" })
protected <T extends Service> T createService(Class<T> serviceRole) {
BasicServiceInitiator<T> initiator = serviceInitiatorMap.get( serviceRole );
if ( initiator == null ) {
throw new UnknownServiceException( serviceRole );
}
try {
T service = initiator.initiateService( configurationValues, this );
// IMPL NOTE : the register call here is important to avoid potential stack overflow issues
// from recursive calls through #configureService
registerService( serviceRole, service );
return service;
}
catch ( ServiceException e ) {
throw e;
}
catch ( Exception e ) {
throw new ServiceException( "Unable to create requested service [" + serviceRole.getName() + "]", e );
}
public <R extends Service> R initiateService(ServiceInitiator<R> serviceInitiator) {
// todo : add check/error for unexpected initiator types?
return ( (BasicServiceInitiator<R>) serviceInitiator ).initiateService( configurationValues, this );
}
@Override

View File

@ -28,20 +28,20 @@ package org.hibernate.service.internal;
*
* @author Steve Ebersole
*/
public class ProvidedService<T> {
private final Class<T> serviceRole;
private final T service;
public class ProvidedService<R> {
private final Class<R> serviceRole;
private final R service;
public ProvidedService(Class<T> serviceRole, T service) {
public ProvidedService(Class<R> serviceRole, R service) {
this.serviceRole = serviceRole;
this.service = service;
}
public Class<T> getServiceRole() {
public Class<R> getServiceRole() {
return serviceRole;
}
public T getService() {
public R getService() {
return service;
}
}

View File

@ -23,19 +23,11 @@
*/
package org.hibernate.service.internal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jboss.logging.Logger;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.service.Service;
import org.hibernate.service.StandardSessionFactoryServiceInitiators;
import org.hibernate.service.UnknownServiceException;
import org.hibernate.service.spi.ServiceException;
import org.hibernate.service.spi.ServiceInitiator;
import org.hibernate.service.spi.ServiceRegistryAwareService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceInitiator;
@ -44,13 +36,7 @@ import org.hibernate.service.spi.SessionFactoryServiceRegistry;
/**
* @author Steve Ebersole
*/
public class SessionFactoryServiceRegistryImpl
extends AbstractServiceRegistryImpl
implements SessionFactoryServiceRegistry {
private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, SessionFactoryServiceRegistryImpl.class.getName() );
private final Map<Class,SessionFactoryServiceInitiator> serviceInitiatorMap;
public class SessionFactoryServiceRegistryImpl extends AbstractServiceRegistryImpl implements SessionFactoryServiceRegistry {
// for now we need to hold on to the Configuration... :(
private Configuration configuration;
@ -62,62 +48,21 @@ public class SessionFactoryServiceRegistryImpl
SessionFactoryImplementor sessionFactory,
Configuration configuration) {
super( parent );
// for now, just use the standard initiator list
this.serviceInitiatorMap = toMap( StandardSessionFactoryServiceInitiators.LIST );
this.sessionFactory = sessionFactory;
this.configuration = configuration;
for ( SessionFactoryServiceInitiator initiator : serviceInitiatorMap.values() ) {
// for now, just use the standard initiator list
for ( SessionFactoryServiceInitiator initiator : StandardSessionFactoryServiceInitiators.LIST ) {
// create the bindings up front to help identify to which registry services belong
createServiceBinding( initiator.getServiceInitiated() );
}
}
private static Map<Class, SessionFactoryServiceInitiator> toMap(List<SessionFactoryServiceInitiator> serviceInitiators) {
final Map<Class, SessionFactoryServiceInitiator> result = new HashMap<Class, SessionFactoryServiceInitiator>();
for ( SessionFactoryServiceInitiator initiator : serviceInitiators ) {
result.put( initiator.getServiceInitiated(), initiator );
}
return result;
}
@Override
@SuppressWarnings( {"unchecked"})
public void registerServiceInitiator(SessionFactoryServiceInitiator initiator) {
ServiceBinding serviceBinding = locateServiceBinding( initiator.getServiceInitiated(), false );
if ( serviceBinding != null ) {
serviceBinding.setTarget( null );
}
else {
createServiceBinding( initiator.getServiceInitiated() );
}
final Object previous = serviceInitiatorMap.put( initiator.getServiceInitiated(), initiator );
if ( previous != null ) {
LOG.debugf( "Over-wrote existing service initiator [role=%s]", initiator.getServiceInitiated().getName() );
createServiceBinding( initiator );
}
}
@Override
@SuppressWarnings({ "unchecked" })
protected <T extends Service> T createService(Class<T> serviceRole) {
SessionFactoryServiceInitiator<T> initiator = serviceInitiatorMap.get( serviceRole );
if ( initiator == null ) {
throw new UnknownServiceException( serviceRole );
}
try {
T service = initiator.initiateService( sessionFactory, configuration, this );
// IMPL NOTE : the register call here is important to avoid potential stack overflow issues
// from recursive calls through #configureService
registerService( serviceRole, service );
return service;
}
catch ( ServiceException e ) {
throw e;
}
catch ( Exception e ) {
throw new ServiceException( "Unable to create requested service [" + serviceRole.getName() + "]", e );
}
public <R extends Service> R initiateService(ServiceInitiator<R> serviceInitiator) {
// todo : add check/error for unexpected initiator types?
return ( (SessionFactoryServiceInitiator<R>) serviceInitiator ).initiateService( sessionFactory, configuration, this );
}
@Override

View File

@ -1,40 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.service.internal.proxy.javassist;
import org.hibernate.service.spi.proxy.ServiceProxyFactory;
import org.hibernate.service.spi.proxy.ServiceProxyFactoryFactory;
import org.hibernate.service.spi.proxy.ServiceProxyTargetSource;
/**
* Javassist-based implementation of a {@link ServiceProxyFactoryFactory}
*
* @author Steve Ebersole
*/
public class ServiceProxyFactoryFactoryImpl implements ServiceProxyFactoryFactory {
@Override
public ServiceProxyFactory makeServiceProxyFactory(ServiceProxyTargetSource registry) {
return new ServiceProxyFactoryImpl( registry );
}
}

View File

@ -1,124 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.service.internal.proxy.javassist;
import javassist.util.proxy.MethodFilter;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;
import javassist.util.proxy.ProxyObject;
import org.hibernate.service.internal.ServiceProxy;
import org.hibernate.service.internal.ServiceProxyGenerationException;
import org.hibernate.service.Service;
import org.hibernate.service.spi.proxy.ServiceProxyFactory;
import org.hibernate.service.spi.proxy.ServiceProxyTargetSource;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Javassist-based implementation of a {@link ServiceProxyFactory}
*
* @author Steve Ebersole
*/
public class ServiceProxyFactoryImpl implements ServiceProxyFactory {
private final ServiceProxyTargetSource serviceRegistry;
public ServiceProxyFactoryImpl(ServiceProxyTargetSource serviceRegistry) {
this.serviceRegistry = serviceRegistry;
}
private static final MethodFilter FINALIZE_FILTER = new MethodFilter() {
public boolean isHandled(Method m) {
// skip finalize methods
return !( m.getParameterTypes().length == 0 && m.getName().equals( "finalize" ) );
}
};
@Override
@SuppressWarnings( {"unchecked"})
public <T extends Service> T makeProxy(Class<T> serviceRole) {
try {
ProxyFactory factory = new ProxyFactory();
factory.setFilter( FINALIZE_FILTER );
Class[] interfaces = new Class[2];
interfaces[0] = serviceRole;
interfaces[1] = ServiceProxy.class;
factory.setInterfaces( interfaces );
Class proxyClass = factory.createClass();
ProxyObject proxyObject = (ProxyObject) proxyClass.newInstance();
proxyObject.setHandler( new ServiceProxyMethodInterceptor<T>( (T)proxyObject, serviceRole, serviceRegistry ) );
return (T) proxyObject;
}
catch (Exception e) {
throw new ServiceProxyGenerationException( "Unable to make service proxy", e );
}
}
private static class ServiceProxyMethodInterceptor<T extends Service> implements MethodHandler {
private final T proxy;
private final Class<T> serviceRole;
private final ServiceProxyTargetSource serviceRegistry;
private ServiceProxyMethodInterceptor(T proxy, Class<T> serviceRole, ServiceProxyTargetSource serviceRegistry) {
this.proxy = proxy;
this.serviceRole = serviceRole;
this.serviceRegistry = serviceRegistry;
}
@Override
@SuppressWarnings( {"UnnecessaryBoxing"} )
public Object invoke(
Object object,
Method method,
Method method1,
Object[] args) throws Exception {
String name = method.getName();
if ( "toString".equals( name ) ) {
return serviceRole.getName() + "_$$_Proxy@" + System.identityHashCode( object );
}
else if ( "equals".equals( name ) ) {
return proxy == object ? Boolean.TRUE : Boolean.FALSE;
}
else if ( "hashCode".equals( name ) ) {
return Integer.valueOf( System.identityHashCode( object ) );
}
else if ( "getTargetInstance".equals( name ) && ServiceProxy.class.equals( method.getDeclaringClass() ) ) {
return serviceRegistry.getServiceInternal( serviceRole );
}
else {
try {
T target = serviceRegistry.getServiceInternal( serviceRole );
return method.invoke( target, args );
}
catch (InvocationTargetException e) {
throw (Exception) e.getTargetException();
}
}
}
}
}

View File

@ -32,14 +32,7 @@ import org.hibernate.service.Service;
*
* @author Steve Ebersole
*/
public interface BasicServiceInitiator<R extends Service> {
/**
* Obtains the service role initiated by this initiator. Should be unique within a registry
*
* @return The service role.
*/
public Class<R> getServiceInitiated();
public interface BasicServiceInitiator<R extends Service> extends ServiceInitiator<R> {
/**
* Initiates the managed service.
*

View File

@ -0,0 +1,81 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.service.spi;
import org.jboss.logging.Logger;
import org.hibernate.service.Service;
/**
* Models a binding for a particular service
* @author Steve Ebersole
*/
public final class ServiceBinding<R extends Service> {
private static final Logger log = Logger.getLogger( ServiceBinding.class );
public static interface OwningRegistry {
public <R extends Service> R initiateService(ServiceInitiator<R> serviceInitiator);
}
private final OwningRegistry serviceRegistry;
private final Class<R> serviceRole;
private final ServiceInitiator<R> serviceInitiator;
private R service;
public ServiceBinding(OwningRegistry serviceRegistry, Class<R> serviceRole, R service) {
this.serviceRegistry = serviceRegistry;
this.serviceRole = serviceRole;
this.serviceInitiator = null;
this.service = service;
}
public ServiceBinding(OwningRegistry serviceRegistry, ServiceInitiator<R> serviceInitiator) {
this.serviceRegistry = serviceRegistry;
this.serviceRole = serviceInitiator.getServiceInitiated();
this.serviceInitiator = serviceInitiator;
}
public OwningRegistry getServiceRegistry() {
return serviceRegistry;
}
public Class<R> getServiceRole() {
return serviceRole;
}
public ServiceInitiator<R> getServiceInitiator() {
return serviceInitiator;
}
public R getService() {
return service;
}
public void setService(R service) {
if ( this.service != null ) {
log.debug( "Overriding existing service binding [" + serviceRole.getName() + "]" );
}
this.service = service;
}
}

View File

@ -21,23 +21,18 @@
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.hibernate.service.spi.proxy;
package org.hibernate.service.spi;
import org.hibernate.service.Service;
/**
* Contract for creating proxy instances for {@link Service} instances.
*
* @author Steve Ebersole
*/
public interface ServiceProxyFactory {
public interface ServiceInitiator<R extends Service> {
/**
* Create a proxy for the given service role.
* Obtains the service role initiated by this initiator. Should be unique within a registry
*
* @param serviceRole The service role for which to create a proxy.
* @param <T> The type of the service
*
* @return The service proxy
* @return The service role.
*/
public <T extends Service> T makeProxy(Class<T> serviceRole);
public Class<R> getServiceInitiated();
}

View File

@ -25,34 +25,11 @@ package org.hibernate.service.spi;
import org.hibernate.service.Service;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.spi.proxy.ServiceProxyTargetSource;
/**
* @author Steve Ebersole
*/
public interface ServiceRegistryImplementor extends ServiceRegistry, ServiceProxyTargetSource {
public interface ServiceRegistryImplementor extends ServiceRegistry {
public <R extends Service> ServiceBinding<R> locateServiceBinding(Class<R> serviceRole);
public void destroy();
public final class ServiceBinding<R> {
private final R proxy;
private R target;
public ServiceBinding(R proxy) {
this.proxy = proxy;
}
public R getProxy() {
return proxy;
}
public R getTarget() {
return target;
}
public void setTarget(R target) {
this.target = target;
}
}
}

View File

@ -30,14 +30,7 @@ import org.hibernate.service.Service;
/**
* @author Steve Ebersole
*/
public interface SessionFactoryServiceInitiator<R extends Service> {
/**
* Obtains the service role initiated by this initiator. Should be unique within a registry
*
* @return The service role.
*/
public Class<R> getServiceInitiated();
public interface SessionFactoryServiceInitiator<R extends Service> extends ServiceInitiator<R>{
/**
* Initiates the managed service.
* <p/>

View File

@ -30,5 +30,4 @@ package org.hibernate.service.spi;
* @author Steve Ebersole
*/
public interface SessionFactoryServiceRegistry extends ServiceRegistryImplementor {
public void registerServiceInitiator(SessionFactoryServiceInitiator initiator);
}

View File

@ -1,40 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.service.spi.proxy;
/**
* Contract for making a {@link ServiceProxyFactory}.
*
* @author Steve Ebersole
*/
public interface ServiceProxyFactoryFactory {
/**
* Make an instance of the service proxy factory.
*
* @param registry The registry of actual service instances
*
* @return The created service proxy factory
*/
public ServiceProxyFactory makeServiceProxyFactory(ServiceProxyTargetSource registry);
}

View File

@ -1,46 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2011, 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.service.spi.proxy;
import org.hibernate.service.Service;
import org.hibernate.service.ServiceRegistry;
/**
* Additional contract for service proxies. This allows the proxies access to their actual service instances.
*
* @author Steve Ebersole
*/
public interface ServiceProxyTargetSource extends ServiceRegistry {
/**
* Retrieve a service by role. Unlike {@link ServiceRegistry#getService}, this version will never return a proxy.
*
* @param serviceRole The service role
* @param <R> The service role type
*
* @return The requested service.
*
* @throws org.hibernate.service.UnknownServiceException Indicates the service was not known.
*/
public <R extends Service> R getServiceInternal(Class<R> serviceRole);
}

View File

@ -26,9 +26,9 @@ package org.hibernate.stat.internal;
import org.jboss.logging.Logger;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.classloading.spi.ClassLoaderService;
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.service.spi.SessionFactoryServiceInitiator;
@ -90,7 +90,6 @@ public class StatisticsInitiator implements SessionFactoryServiceInitiator<Stati
statistics.setStatisticsEnabled( enabled );
LOG.debugf( "Statistics initialized [enabled=%s]", enabled );
return statistics;
}
private static StatisticsFactory DEFAULT_STATS_BUILDER = new StatisticsFactory() {

View File

@ -112,7 +112,7 @@ public class ManagedDrivingTest extends BaseUnitTestCase {
fail( "incorrect exception type : SQLException" );
}
JtaPlatform instance = ( (ServiceProxy) serviceRegistry.getService( JtaPlatform.class ) ).getTargetInstance();
JtaPlatform instance = serviceRegistry.getService( JtaPlatform.class );
TransactionManager transactionManager = instance.retrieveTransactionManager();
// start the cmt