org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.java

Source

/*
 * 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.boot.registry.internal;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.boot.registry.BootstrapServiceRegistry;
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.service.Service;
import org.hibernate.service.internal.AbstractServiceRegistryImpl;
import org.hibernate.service.internal.ProvidedService;
import org.hibernate.service.spi.Configurable;
import org.hibernate.service.spi.ServiceBinding;
import org.hibernate.service.spi.ServiceInitiator;

/**
 * Standard Hibernate implementation of the standard service registry.
 *
 * @author Steve Ebersole
 */
public class StandardServiceRegistryImpl extends AbstractServiceRegistryImpl implements StandardServiceRegistry {

    //Access to this field requires synchronization on -this-
    private Map configurationValues;

    /**
     * Constructs a StandardServiceRegistryImpl.  Should not be instantiated directly; use
     * {@link org.hibernate.boot.registry.StandardServiceRegistryBuilder} instead
     *
     * @param bootstrapServiceRegistry The bootstrap service registry.
     * @param serviceInitiators Any StandardServiceInitiators provided by the user to the builder
     * @param providedServices Any standard services provided directly to the builder
     * @param configurationValues Configuration values
     *
     * @see org.hibernate.boot.registry.StandardServiceRegistryBuilder
     */
    @SuppressWarnings({ "unchecked" })
    public StandardServiceRegistryImpl(BootstrapServiceRegistry bootstrapServiceRegistry,
            List<StandardServiceInitiator> serviceInitiators, List<ProvidedService> providedServices,
            Map<?, ?> configurationValues) {
        this(true, bootstrapServiceRegistry, serviceInitiators, providedServices, configurationValues);
    }

    /**
     * Constructs a StandardServiceRegistryImpl.  Should not be instantiated directly; use
     * {@link org.hibernate.boot.registry.StandardServiceRegistryBuilder} instead
     *
     * @param autoCloseRegistry See discussion on
     * {@link org.hibernate.boot.registry.StandardServiceRegistryBuilder#disableAutoClose}
     * @param bootstrapServiceRegistry The bootstrap service registry.
     * @param serviceInitiators Any StandardServiceInitiators provided by the user to the builder
     * @param providedServices Any standard services provided directly to the builder
     * @param configurationValues Configuration values
     *
     * @see org.hibernate.boot.registry.StandardServiceRegistryBuilder
     */
    @SuppressWarnings({ "unchecked" })
    public StandardServiceRegistryImpl(boolean autoCloseRegistry, BootstrapServiceRegistry bootstrapServiceRegistry,
            List<StandardServiceInitiator> serviceInitiators, List<ProvidedService> providedServices,
            Map<?, ?> configurationValues) {
        super(bootstrapServiceRegistry, autoCloseRegistry);

        this.configurationValues = configurationValues;

        applyServiceRegistrations(serviceInitiators, providedServices);
    }

    private void applyServiceRegistrations(List<StandardServiceInitiator> serviceInitiators,
            List<ProvidedService> providedServices) {
        try {
            // process initiators
            for (ServiceInitiator initiator : serviceInitiators) {
                createServiceBinding(initiator);
            }

            // then, explicitly provided service instances
            for (ProvidedService providedService : providedServices) {
                createServiceBinding(providedService);
            }
        } catch (RuntimeException e) {
            visitServiceBindings(binding -> binding.getLifecycleOwner().stopService(binding));
            throw e;
        }
    }

    @Override
    public synchronized <R extends Service> R initiateService(ServiceInitiator<R> serviceInitiator) {
        // todo : add check/error for unexpected initiator types?
        return ((StandardServiceInitiator<R>) serviceInitiator).initiateService(configurationValues, this);
    }

    @Override
    public synchronized <R extends Service> void configureService(ServiceBinding<R> serviceBinding) {
        if (Configurable.class.isInstance(serviceBinding.getService())) {
            ((Configurable) serviceBinding.getService()).configure(configurationValues);
        }
    }

    /**
     * Very advanced and tricky to handle: not designed for this. Intended for experiments only!
     */
    public synchronized void resetAndReactivate(BootstrapServiceRegistry bootstrapServiceRegistry,
            List<StandardServiceInitiator> serviceInitiators, List<ProvidedService> providedServices,
            Map<?, ?> configurationValues) {
        if (super.isActive()) {
            throw new IllegalStateException("Can't reactivate an active registry!");
        }
        super.resetParent(bootstrapServiceRegistry);
        this.configurationValues = new HashMap(configurationValues);
        super.reactivate();
        applyServiceRegistrations(serviceInitiators, providedServices);
    }

    @Override
    public synchronized void destroy() {
        super.destroy();
        this.configurationValues = null;
    }
}