/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use * this file except in compliance with the License. You may obtain a copy of the License at the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package org.apereo.portal.hibernate; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; import org.hibernate.cfg.Configuration; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.integrator.spi.Integrator; import org.hibernate.metamodel.source.MetadataImplementor; import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Works with {@link HibernateConfigurationAware} beans to provide configuration information from * hibernate to other beans. * * <p>Configured via the {@link ServiceLoader} mechanism. * */ public class DelegatingHibernateIntegrator implements Integrator { private static final Set<HibernateConfigurationAwareInjector> configurationAwareBeans = new HashSet<HibernateConfigurationAwareInjector>(); private static final Map<String, HibernateConfiguration> hibernateInfoMap = new HashMap<String, DelegatingHibernateIntegrator.HibernateConfiguration>(); protected final Logger logger = LoggerFactory.getLogger(getClass()); public static void registerConfigurationAwareBeans( HibernateConfigurationAwareInjector configurationAwareBean) { synchronized (configurationAwareBeans) { //make sure any hibernate configs already loaded get injected for (final Map.Entry<String, HibernateConfiguration> configEntry : hibernateInfoMap.entrySet()) { configurationAwareBean.setConfiguration( configEntry.getKey(), configEntry.getValue()); } configurationAwareBeans.add(configurationAwareBean); } } public static void unregisterConfigurationAwareBeans( HibernateConfigurationAwareInjector configurationAwareBean) { configurationAwareBeans.remove(configurationAwareBean); } @Override public void integrate( Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { final String persistenceUnitName = configuration.getProperty("persistenceUnitName"); if (persistenceUnitName == null) { logger.warn( "Hibernate Configuration does not have '" + persistenceUnitName + "' set. It will not be considered for injecting into HibernateConfigurationAware beans: " + configuration); return; } final HibernateConfiguration hibernateConfiguration = new HibernateConfiguration(configuration, sessionFactory, serviceRegistry); synchronized (configurationAwareBeans) { hibernateInfoMap.put(persistenceUnitName, hibernateConfiguration); for (final HibernateConfigurationAwareInjector configurationAwareBean : configurationAwareBeans) { configurationAwareBean.setConfiguration( persistenceUnitName, hibernateConfiguration); } } } @Override public void integrate( MetadataImplementor metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { throw new UnsupportedOperationException( "TODO REWRITE CODE AFTER HIBERNATE SWITCHES TO METAMODEL"); } @Override public void disintegrate( SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { //ignore } public static final class HibernateConfiguration { private final Configuration configuration; private final SessionFactoryImplementor sessionFactory; private final SessionFactoryServiceRegistry serviceRegistry; public HibernateConfiguration( Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { this.configuration = configuration; this.sessionFactory = sessionFactory; this.serviceRegistry = serviceRegistry; } public Configuration getConfiguration() { return configuration; } public SessionFactoryImplementor getSessionFactory() { return sessionFactory; } public SessionFactoryServiceRegistry getServiceRegistry() { return serviceRegistry; } } }