    001// Copyright 2007-2013 The Apache Software Foundation
    002//
    003// Licensed under the Apache License, Version 2.0 (the "License");
    004// you may not use this file except in compliance with the License.
    005// You may obtain a copy of the License at
    006//
    007// http://www.apache.org/licenses/LICENSE-2.0
    008//
    009// Unless required by applicable law or agreed to in writing, software
    010// distributed under the License is distributed on an "AS IS" BASIS,
    011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012// See the License for the specific language governing permissions and
    013// limitations under the License.
    014
    015package org.apache.tapestry5.internal.hibernate;
    016
    017import org.apache.tapestry5.hibernate.HibernateConfigurer;
    018import org.apache.tapestry5.hibernate.HibernateSessionSource;
    019import org.apache.tapestry5.ioc.annotations.PostInjection;
    020import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    021import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
    022import org.hibernate.Session;
    023import org.hibernate.SessionFactory;
    024import org.hibernate.cfg.Configuration;
    025import org.slf4j.Logger;
    026
    027import java.util.List;
    028
    029public class HibernateSessionSourceImpl implements HibernateSessionSource
    030{
    031    private final SessionFactory sessionFactory;
    032
    033    private final Configuration configuration;
    034
    035    public HibernateSessionSourceImpl(Logger logger, List<HibernateConfigurer> hibernateConfigurers)
    036    {
    037        long startTime = System.currentTimeMillis();
    038
    039        configuration = new Configuration();
    040
    041        for (HibernateConfigurer configurer : hibernateConfigurers)
    042            configurer.configure(configuration);
    043
    044        long configurationComplete = System.currentTimeMillis();
    045
    046        sessionFactory = configuration.buildSessionFactory();
    047
    048        long factoryCreated = System.currentTimeMillis();
    049
    050        logger.info(String.format("Hibernate startup: %,d ms to configure, %,d ms overall.", configurationComplete - startTime, factoryCreated - startTime));
    051
    052        logger.info(String.format("Configured Hibernate entities: %s", InternalUtils.joinSorted(sessionFactory.getAllClassMetadata().keySet())));
    053    }
    054
    055    @PostInjection
    056    public void listenForShutdown(RegistryShutdownHub hub)
    057    {
    058        hub.addRegistryShutdownListener(new Runnable()
    059        {
    060            @Override
    061            public void run()
    062            {
    063                sessionFactory.close();
    064            }
    065        });
    066    }
    067
    068    @Override
    069    public Session create()
    070    {
    071        return sessionFactory.openSession();
    072    }
    073
    074    @Override
    075    public SessionFactory getSessionFactory()
    076    {
    077        return sessionFactory;
    078    }
    079
    080    @Override
    081    public Configuration getConfiguration()
    082    {
    083        return configuration;
    084    }
    085
    086}